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()