diff --git a/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml b/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml
index 419139f2c..7a9207c9c 100644
--- a/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml
+++ b/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml
@@ -34,5 +34,9 @@
org.apache.maven.archiva
archiva-model
+
+ commons-collections
+ commons-collections
+
diff --git a/archiva-base/archiva-consumers/archiva-consumer-api/src/main/java/org/apache/maven/archiva/consumers/functors/PermanentConsumerPredicate.java b/archiva-base/archiva-consumers/archiva-consumer-api/src/main/java/org/apache/maven/archiva/consumers/functors/PermanentConsumerPredicate.java
new file mode 100644
index 000000000..66c94501b
--- /dev/null
+++ b/archiva-base/archiva-consumers/archiva-consumer-api/src/main/java/org/apache/maven/archiva/consumers/functors/PermanentConsumerPredicate.java
@@ -0,0 +1,48 @@
+package org.apache.maven.archiva.consumers.functors;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.collections.Predicate;
+import org.apache.maven.archiva.consumers.BaseConsumer;
+
+/**
+ * Selects Consumers that are flaged as 'permanent'.
+ *
+ * @author Joakim Erdfelt
+ * @version $Id$
+ */
+public class PermanentConsumerPredicate
+ implements Predicate
+{
+
+ public boolean evaluate( Object object )
+ {
+ boolean satisfies = false;
+
+ if ( object instanceof BaseConsumer )
+ {
+ BaseConsumer consumer = (BaseConsumer) object;
+ satisfies = consumer.isPermanent();
+ }
+
+ return satisfies;
+ }
+
+}
diff --git a/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java b/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
index 8ac936639..cc4558d9d 100644
--- a/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
+++ b/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
@@ -19,11 +19,25 @@ package org.apache.maven.archiva.consumers.database;
* under the License.
*/
+import org.apache.commons.lang.StringUtils;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.RepositoryConfiguration;
import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
import org.apache.maven.archiva.consumers.ConsumerException;
import org.apache.maven.archiva.consumers.DatabaseUnprocessedArtifactConsumer;
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.apache.maven.archiva.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.RepositoryURL;
+import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
+import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.ProjectModelReader;
+import java.io.File;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -50,6 +64,39 @@ public class ProjectModelToDatabaseConsumer
*/
private String description;
+ /**
+ * @plexus.requirement role-hint="jdo"
+ */
+ private ArchivaDAO dao;
+
+ /**
+ * @plexus.requirement
+ */
+ private ArchivaConfiguration archivaConfiguration;
+
+ /**
+ * @plexus.requirement
+ */
+ private BidirectionalRepositoryLayoutFactory layoutFactory;
+
+ /**
+ * @plexus.requirement role-hint="model400"
+ */
+ private ProjectModelReader project400Reader;
+
+ /**
+ * @plexus.requirement role-hint="model300"
+ */
+ private ProjectModelReader project300Reader;
+
+ private List includes;
+
+ public ProjectModelToDatabaseConsumer()
+ {
+ includes = new ArrayList();
+ includes.add( "pom" );
+ }
+
public void beginScan()
{
// TODO Auto-generated method stub
@@ -64,15 +111,65 @@ public class ProjectModelToDatabaseConsumer
public List getIncludedTypes()
{
- // TODO Auto-generated method stub
- return null;
+ return includes;
}
public void processArchivaArtifact( ArchivaArtifact artifact )
throws ConsumerException
{
- // TODO Auto-generated method stub
+ if ( !StringUtils.equals( "pom", artifact.getType() ) )
+ {
+ return;
+ }
+ File artifactFile = toFile( artifact );
+ RepositoryConfiguration repo = getRepository( artifact );
+
+ if ( StringUtils.equals( "default", repo.getLayout() ) )
+ {
+ try
+ {
+ ArchivaProjectModel model = project400Reader.read( artifactFile );
+ dao.getProjectModelDAO().saveProjectModel( model );
+ }
+ catch ( ProjectModelException e )
+ {
+ getLogger().warn( "Unable to read project model " + artifactFile + " : " + e.getMessage(), e );
+ }
+ catch ( ArchivaDatabaseException e )
+ {
+ getLogger().warn(
+ "Unable to save project model " + artifactFile + " to the database : "
+ + e.getMessage(), e );
+ }
+ }
+ }
+
+ private RepositoryConfiguration getRepository( ArchivaArtifact artifact )
+ {
+ String repoId = artifact.getModel().getRepositoryId();
+ return archivaConfiguration.getConfiguration().findRepositoryById( repoId );
+ }
+
+ private File toFile( ArchivaArtifact artifact )
+ {
+ RepositoryConfiguration repoConfig = getRepository( artifact );
+
+ BidirectionalRepositoryLayout layout = null;
+
+ try
+ {
+ layout = layoutFactory.getLayout( artifact );
+ }
+ catch ( LayoutException e )
+ {
+ getLogger().warn( "Unable to determine layout of " + artifact + ": " + e.getMessage(), e );
+ return null;
+ }
+
+ String path = layout.toPath( artifact );
+ RepositoryURL url = new RepositoryURL( repoConfig.getUrl() );
+ return new File( url.getPath(), path );
}
public String getDescription()
@@ -87,7 +184,7 @@ public class ProjectModelToDatabaseConsumer
public boolean isPermanent()
{
- return false;
+ return true;
}
}
diff --git a/archiva-base/archiva-model/src/main/mdo/archiva-base.xml b/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
index 17198a828..02089dbad 100644
--- a/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
+++ b/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
@@ -1601,7 +1601,7 @@
classifier
1.0.0+
String
- true
+ false
Joakim Erdfelt
* @version $Id$
+ *
+ * @plexus.component
+ * role="org.apache.maven.archiva.repository.project.ProjectModelReader"
+ * role-hint="model300"
*/
public class ProjectModel300Reader implements ProjectModelReader
{
diff --git a/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java b/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java
index b0f34b31a..9d8033f0c 100644
--- a/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java
+++ b/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java
@@ -52,6 +52,10 @@ import java.util.Properties;
*
* @author Joakim Erdfelt
* @version $Id$
+ *
+ * @plexus.component
+ * role="org.apache.maven.archiva.repository.project.ProjectModelReader"
+ * role-hint="model400"
*/
public class ProjectModel400Reader
implements ProjectModelReader
diff --git a/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryContentConsumers.java b/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryContentConsumers.java
index e57c633c1..5e5c325e5 100644
--- a/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryContentConsumers.java
+++ b/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryContentConsumers.java
@@ -23,11 +23,13 @@ import org.apache.commons.collections.Closure;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.functors.IfClosure;
+import org.apache.commons.collections.functors.OrPredicate;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration;
import org.apache.maven.archiva.consumers.InvalidRepositoryContentConsumer;
import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
import org.apache.maven.archiva.consumers.RepositoryContentConsumer;
+import org.apache.maven.archiva.consumers.functors.PermanentConsumerPredicate;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
@@ -64,9 +66,9 @@ public class RepositoryContentConsumers
*/
private List availableInvalidConsumers;
- private SelectedKnownRepoConsumersPredicate selectedKnownPredicate;
+ private Predicate selectedKnownPredicate;
- private SelectedInvalidRepoConsumersPredicate selectedInvalidPredicate;
+ private Predicate selectedInvalidPredicate;
class SelectedKnownRepoConsumersPredicate
implements Predicate
@@ -131,8 +133,11 @@ public class RepositoryContentConsumers
public void initialize()
throws InitializationException
{
- this.selectedKnownPredicate = new SelectedKnownRepoConsumersPredicate();
- this.selectedInvalidPredicate = new SelectedInvalidRepoConsumersPredicate();
+ Predicate permanentConsumers = new PermanentConsumerPredicate();
+
+ this.selectedKnownPredicate = new OrPredicate( permanentConsumers, new SelectedKnownRepoConsumersPredicate() );
+ this.selectedInvalidPredicate = new OrPredicate( permanentConsumers,
+ new SelectedInvalidRepoConsumersPredicate() );
}
public List getSelectedKnownConsumerIds()
diff --git a/archiva-database/src/main/java/org/apache/maven/archiva/database/updater/DatabaseConsumers.java b/archiva-database/src/main/java/org/apache/maven/archiva/database/updater/DatabaseConsumers.java
index 6c4f65ffb..7b17528f4 100644
--- a/archiva-database/src/main/java/org/apache/maven/archiva/database/updater/DatabaseConsumers.java
+++ b/archiva-database/src/main/java/org/apache/maven/archiva/database/updater/DatabaseConsumers.java
@@ -21,10 +21,12 @@ package org.apache.maven.archiva.database.updater;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.functors.OrPredicate;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.DatabaseScanningConfiguration;
import org.apache.maven.archiva.consumers.DatabaseCleanupConsumer;
import org.apache.maven.archiva.consumers.DatabaseUnprocessedArtifactConsumer;
+import org.apache.maven.archiva.consumers.functors.PermanentConsumerPredicate;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
@@ -58,9 +60,9 @@ public class DatabaseConsumers
*/
private List availableCleanupConsumers;
- private SelectedCleanupConsumersPredicate selectedCleanupConsumers;
+ private Predicate selectedCleanupConsumers;
- private SelectedUnprocessedConsumersPredicate selectedUnprocessedConsumers;
+ private Predicate selectedUnprocessedConsumers;
class SelectedUnprocessedConsumersPredicate
implements Predicate
@@ -103,8 +105,10 @@ public class DatabaseConsumers
public void initialize()
throws InitializationException
{
- selectedCleanupConsumers = new SelectedCleanupConsumersPredicate();
- selectedUnprocessedConsumers = new SelectedUnprocessedConsumersPredicate();
+ Predicate permanentConsumers = new PermanentConsumerPredicate();
+
+ selectedCleanupConsumers = new OrPredicate( permanentConsumers, new SelectedCleanupConsumersPredicate() );
+ selectedUnprocessedConsumers = new OrPredicate( permanentConsumers, new SelectedUnprocessedConsumersPredicate() );
}
/**
@@ -132,7 +136,7 @@ public class DatabaseConsumers
ret.addAll( CollectionUtils.select( availableCleanupConsumers, selectedCleanupConsumers ) );
return ret;
}
-
+
/**
* Get the complete {@link List} of {@link DatabaseUnprocessedArtifactConsumer} objects
* that are available in the system, regardless of configuration.
@@ -143,7 +147,7 @@ public class DatabaseConsumers
{
return Collections.unmodifiableList( this.availableUnprocessedConsumers );
}
-
+
/**
* Get the complete {@link List} of {@link DatabaseCleanupConsumer} objects
* that are available in the system, regardless of configuration.
diff --git a/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java b/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
index 5b8a9dbe7..1c759087e 100644
--- a/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
+++ b/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
@@ -19,27 +19,17 @@ package org.apache.maven.archiva.web.action;
* under the License.
*/
+import com.opensymphony.xwork.Validateable;
+
import org.apache.commons.lang.StringUtils;
-import org.apache.maven.archiva.configuration.ArchivaConfiguration;
-import org.apache.maven.archiva.configuration.Configuration;
-import org.apache.maven.archiva.database.ArchivaDAO;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.database.ObjectNotFoundException;
import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
import org.apache.maven.archiva.model.ArchivaProjectModel;
-import org.apache.maven.archiva.web.util.VersionMerger;
-import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
-import java.util.Set;
/**
* Browse the repository.
@@ -49,6 +39,7 @@ import java.util.Set;
*/
public class ShowArtifactAction
extends PlexusActionSupport
+ implements Validateable
{
/* .\ Not Exposed \._____________________________________________ */
@@ -90,12 +81,7 @@ public class ShowArtifactAction
public String artifact()
throws ObjectNotFoundException, ArchivaDatabaseException
{
- if ( !checkParameters() )
- {
- return ERROR;
- }
-
- this.model = readProject();
+ this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
return SUCCESS;
}
@@ -106,12 +92,7 @@ public class ShowArtifactAction
public String dependencies()
throws ObjectNotFoundException, ArchivaDatabaseException
{
- if ( !checkParameters() )
- {
- return ERROR;
- }
-
- this.model = readProject();
+ this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
// TODO: should this be the whole set of artifacts, and be more like the maven dependencies report?
// this.dependencies = VersionMerger.wrap( project.getModel().getDependencies() );
@@ -125,12 +106,7 @@ public class ShowArtifactAction
public String mailingLists()
throws ObjectNotFoundException, ArchivaDatabaseException
{
- if ( !checkParameters() )
- {
- return ERROR;
- }
-
- this.model = readProject();
+ this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
return SUCCESS;
}
@@ -141,11 +117,6 @@ public class ShowArtifactAction
public String reports()
throws ObjectNotFoundException, ArchivaDatabaseException
{
- if ( !checkParameters() )
- {
- return ERROR;
- }
-
System.out.println("#### In reports.");
// TODO: hook up reports on project - this.reports = artifactsDatabase.findArtifactResults( groupId, artifactId, version );
System.out.println("#### Found " + reports.size() + " reports.");
@@ -159,12 +130,7 @@ public class ShowArtifactAction
public String dependees()
throws ObjectNotFoundException, ArchivaDatabaseException
{
- if ( !checkParameters() )
- {
- return ERROR;
- }
-
- this.model = readProject();
+ this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
// TODO: create depends on collector.
this.dependees = Collections.EMPTY_LIST;
@@ -178,47 +144,27 @@ public class ShowArtifactAction
public String dependencyTree()
throws ObjectNotFoundException, ArchivaDatabaseException
{
- if ( !checkParameters() )
- {
- return ERROR;
- }
-
- this.model = readProject();
+ this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
return SUCCESS;
}
- private ArchivaProjectModel readProject()
- throws ArchivaDatabaseException
+ public void validate()
{
- return repoBrowsing.selectVersion( groupId, artifactId, version );
- }
-
- private boolean checkParameters()
- {
- boolean result = true;
-
- if ( StringUtils.isEmpty( groupId ) )
+ if ( StringUtils.isBlank( groupId ) )
{
- // TODO: i18n
addActionError( "You must specify a group ID to browse" );
- result = false;
}
- else if ( StringUtils.isEmpty( artifactId ) )
+ if ( StringUtils.isBlank( artifactId ) )
{
- // TODO: i18n
addActionError( "You must specify a artifact ID to browse" );
- result = false;
}
- else if ( StringUtils.isEmpty( version ) )
+ if ( StringUtils.isBlank( version ) )
{
- // TODO: i18n
addActionError( "You must specify a version to browse" );
- result = false;
}
- return result;
}
public ArchivaProjectModel getModel()