From: Brett Porter Date: Wed, 29 Dec 2010 06:14:04 +0000 (+0000) Subject: [MRM-1330] refactor access around the concept of a "repository session". See Javadoc... X-Git-Tag: archiva-1.4-M1~856 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f56609efad6393b10c861446ec11ddda00f9a218;p=archiva.git [MRM-1330] refactor access around the concept of a "repository session". See Javadoc for some notes. This should be a single entry point for application users of either the metadata repository, resolution, or storage access. The session needs to be explicitly closed (and modifications saved) to facilitate some storage mechanisms. git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1053542 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml index a0edd975f..ce7c1409d 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml @@ -78,5 +78,10 @@ xmlunit test + + org.mockito + mockito-all + test + diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurge.java index 7f0abf5ce..41f56b512 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurge.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurge.java @@ -20,6 +20,8 @@ package org.apache.maven.archiva.consumers.core.repository; */ import org.apache.archiva.audit.AuditEvent; +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.repository.events.RepositoryListener; import org.apache.maven.archiva.model.ArtifactReference; import org.apache.maven.archiva.repository.ManagedRepositoryContent; @@ -41,15 +43,19 @@ public abstract class AbstractRepositoryPurge protected final ManagedRepositoryContent repository; + protected final RepositorySession repositorySession; + protected final List listeners; private Logger logger = LoggerFactory.getLogger( "org.apache.archiva.AuditLog" ); private static final char DELIM = ' '; - public AbstractRepositoryPurge( ManagedRepositoryContent repository, List listeners ) + public AbstractRepositoryPurge( ManagedRepositoryContent repository, RepositorySession repositorySession, + List listeners ) { this.repository = repository; + this.repositorySession = repositorySession; this.listeners = listeners; } @@ -62,6 +68,7 @@ public abstract class AbstractRepositoryPurge { if ( references != null && !references.isEmpty() ) { + MetadataRepository metadataRepository = repositorySession.getRepository(); for ( ArtifactReference reference : references ) { File artifactFile = repository.toFile( reference ); @@ -69,12 +76,15 @@ public abstract class AbstractRepositoryPurge // FIXME: looks incomplete, might not delete related metadata? for ( RepositoryListener listener : listeners ) { - listener.deleteArtifact( repository.getId(), reference.getGroupId(), reference.getArtifactId(), - reference.getVersion(), artifactFile.getName() ); + listener.deleteArtifact( metadataRepository, repository.getId(), reference.getGroupId(), + reference.getArtifactId(), reference.getVersion(), + artifactFile.getName() ); } // TODO: this needs to be logged artifactFile.delete(); + repositorySession.save(); + triggerAuditEvent( repository.getRepository().getId(), ArtifactReference.toKey( reference ), AuditEvent.PURGE_ARTIFACT ); purgeSupportFiles( artifactFile ); diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java index e6f218ff6..9179dfcc3 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java @@ -19,6 +19,8 @@ package org.apache.maven.archiva.consumers.core.repository; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.repository.events.RepositoryListener; import org.apache.maven.archiva.common.utils.VersionComparator; import org.apache.maven.archiva.common.utils.VersionUtil; @@ -79,9 +81,10 @@ public class CleanupReleasedSnapshotsRepositoryPurge public CleanupReleasedSnapshotsRepositoryPurge( ManagedRepositoryContent repository, MetadataTools metadataTools, ArchivaConfiguration archivaConfig, RepositoryContentFactory repoContentFactory, + RepositorySession repositorySession, List listeners ) { - super( repository, listeners ); + super( repository, repositorySession, listeners ); this.metadataTools = metadataTools; this.archivaConfig = archivaConfig; this.repoContentFactory = repoContentFactory; @@ -168,6 +171,7 @@ public class CleanupReleasedSnapshotsRepositoryPurge artifactRef.getVersion(), artifactRef.getClassifier(), artifactRef.getType(), repository.getId() ); + MetadataRepository metadataRepository = repositorySession.getRepository(); for ( String version : snapshotVersions ) { if ( releasedVersions.contains( VersionUtil.getReleaseVersion( version ) ) ) @@ -178,8 +182,9 @@ public class CleanupReleasedSnapshotsRepositoryPurge // FIXME: looks incomplete, might not delete related metadata? for ( RepositoryListener listener : listeners ) { - listener.deleteArtifact( repository.getId(), artifact.getGroupId(), artifact.getArtifactId(), - artifact.getVersion(), artifactFile.getName() ); + listener.deleteArtifact( metadataRepository, repository.getId(), artifact.getGroupId(), + artifact.getArtifactId(), artifact.getVersion(), + artifactFile.getName() ); } needsMetadataUpdate = true; diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurge.java index 42eee8103..3c8c65708 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurge.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurge.java @@ -19,6 +19,7 @@ package org.apache.maven.archiva.consumers.core.repository; * under the License. */ +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.repository.events.RepositoryListener; import org.apache.commons.lang.time.DateUtils; import org.apache.maven.archiva.common.utils.VersionComparator; @@ -42,7 +43,6 @@ import java.util.regex.Matcher; /** * Purge from repository all snapshots older than the specified days in the repository configuration. - * */ public class DaysOldRepositoryPurge extends AbstractRepositoryPurge @@ -53,10 +53,10 @@ public class DaysOldRepositoryPurge private int retentionCount; - public DaysOldRepositoryPurge( ManagedRepositoryContent repository, int daysOlder, - int retentionCount, List listeners ) + public DaysOldRepositoryPurge( ManagedRepositoryContent repository, int daysOlder, int retentionCount, + RepositorySession repositorySession, List listeners ) { - super( repository, listeners ); + super( repository, repositorySession, listeners ); this.daysOlder = daysOlder; this.retentionCount = retentionCount; timestampParser = new SimpleDateFormat( "yyyyMMdd.HHmmss" ); @@ -105,8 +105,8 @@ public class DaysOldRepositoryPurge break; } - ArtifactReference newArtifactReference = - repository.toArtifactReference( artifactFile.getAbsolutePath() ); + ArtifactReference newArtifactReference = repository.toArtifactReference( + artifactFile.getAbsolutePath() ); newArtifactReference.setVersion( version ); File newArtifactFile = repository.toFile( newArtifactReference ); diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumer.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumer.java index ecc845991..e27b261f5 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumer.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumer.java @@ -19,6 +19,8 @@ package org.apache.maven.archiva.consumers.core.repository; * under the License. */ +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.repository.events.RepositoryListener; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.ConfigurationNames; @@ -46,11 +48,9 @@ import java.util.List; * Consumer for removing old snapshots in the repository based on the criteria * specified by the user. * - * - * @plexus.component - * role="org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer" - * role-hint="repository-purge" - * instantiation-strategy="per-lookup" + * @plexus.component role="org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer" + * role-hint="repository-purge" + * instantiation-strategy="per-lookup" */ public class RepositoryPurgeConsumer extends AbstractMonitoredConsumer @@ -94,9 +94,20 @@ public class RepositoryPurgeConsumer private boolean deleteReleasedSnapshots; - /** @plexus.requirement role="org.apache.archiva.repository.events.RepositoryListener" */ + /** + * @plexus.requirement role="org.apache.archiva.repository.events.RepositoryListener" + */ private List listeners = Collections.emptyList(); - + + /** + * TODO: this could be multiple implementations and needs to be configured. + * + * @plexus.requirement + */ + private RepositorySessionFactory repositorySessionFactory; + + private RepositorySession repositorySession; + public String getId() { return this.id; @@ -125,27 +136,10 @@ public class RepositoryPurgeConsumer public void beginScan( ManagedRepositoryConfiguration repository, Date whenGathered ) throws ConsumerException { + ManagedRepositoryContent repositoryContent; try { - ManagedRepositoryContent repositoryContent = repositoryFactory.getManagedRepositoryContent( repository - .getId() ); - - if ( repository.getDaysOlder() != 0 ) - { - repoPurge = new DaysOldRepositoryPurge( repositoryContent, repository.getDaysOlder(), - repository.getRetentionCount(), listeners ); - } - else - { - repoPurge = new RetentionCountRepositoryPurge( repositoryContent, repository.getRetentionCount(), - listeners ); - } - - cleanUp = - new CleanupReleasedSnapshotsRepositoryPurge( repositoryContent, metadataTools, configuration, - repositoryFactory, listeners ); - - deleteReleasedSnapshots = repository.isDeleteReleasedSnapshots(); + repositoryContent = repositoryFactory.getManagedRepositoryContent( repository.getId() ); } catch ( RepositoryNotFoundException e ) { @@ -155,6 +149,24 @@ public class RepositoryPurgeConsumer { throw new ConsumerException( "Can't run repository purge: " + e.getMessage(), e ); } + + repositorySession = repositorySessionFactory.createSession(); + + if ( repository.getDaysOlder() != 0 ) + { + repoPurge = new DaysOldRepositoryPurge( repositoryContent, repository.getDaysOlder(), + repository.getRetentionCount(), repositorySession, listeners ); + } + else + { + repoPurge = new RetentionCountRepositoryPurge( repositoryContent, repository.getRetentionCount(), + repositorySession, listeners ); + } + + cleanUp = new CleanupReleasedSnapshotsRepositoryPurge( repositoryContent, metadataTools, configuration, + repositoryFactory, repositorySession, listeners ); + + deleteReleasedSnapshots = repository.isDeleteReleasedSnapshots(); } public void beginScan( ManagedRepositoryConfiguration repository, Date whenGathered, boolean executeOnEntireRepo ) @@ -189,7 +201,7 @@ public class RepositoryPurgeConsumer public void completeScan() { - /* do nothing */ + repositorySession.close(); } public void completeScan( boolean executeOnEntireRepo ) diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java index d7798758c..63a362c76 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java @@ -19,6 +19,7 @@ package org.apache.maven.archiva.consumers.core.repository; * under the License. */ +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.repository.events.RepositoryListener; import org.apache.maven.archiva.common.utils.VersionComparator; import org.apache.maven.archiva.common.utils.VersionUtil; @@ -36,17 +37,16 @@ import java.util.Set; /** * Purge the repository by retention count. Retain only the specified number of snapshots. - * */ public class RetentionCountRepositoryPurge extends AbstractRepositoryPurge { private int retentionCount; - public RetentionCountRepositoryPurge( ManagedRepositoryContent repository, - int retentionCount, List listeners ) + public RetentionCountRepositoryPurge( ManagedRepositoryContent repository, int retentionCount, + RepositorySession repositorySession, List listeners ) { - super( repository, listeners ); + super( repository, repositorySession, listeners ); this.retentionCount = retentionCount; } @@ -61,7 +61,7 @@ public class RetentionCountRepositoryPurge { return; } - + ArtifactReference artifact = repository.toArtifactReference( path ); if ( VersionUtil.isSnapshot( artifact.getVersion() ) ) @@ -114,7 +114,7 @@ public class RetentionCountRepositoryPurge artifact.setVersion( version ); artifact.setClassifier( reference.getClassifier() ); artifact.setType( reference.getType() ); - + try { Set related = repository.getRelatedArtifacts( artifact ); diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java new file mode 100644 index 000000000..3a96aaa92 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java @@ -0,0 +1,43 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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. + */ + +public class TestRepositorySessionFactory + implements RepositorySessionFactory +{ + private MetadataRepository repository; + + private MetadataResolver resolver; + + public RepositorySession createSession() + { + return new RepositorySession( repository, resolver ); + } + + public void setRepository( MetadataRepository repository ) + { + this.repository = repository; + } + + public void setResolver( MetadataResolver resolver ) + { + this.resolver = resolver; + } +} diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java index 6ef310fbc..a7a49faf5 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java @@ -19,10 +19,11 @@ package org.apache.maven.archiva.consumers.core.repository; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.repository.events.RepositoryListener; import org.apache.commons.io.FileUtils; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; -import org.apache.maven.archiva.model.ArchivaArtifact; import org.apache.maven.archiva.repository.ManagedRepositoryContent; import org.codehaus.plexus.spring.PlexusInSpringTestCase; import org.easymock.MockControl; @@ -30,6 +31,9 @@ import org.easymock.MockControl; import java.io.File; import java.io.IOException; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** */ public abstract class AbstractRepositoryPurgeTest @@ -43,15 +47,20 @@ public abstract class AbstractRepositoryPurgeTest public static final int TEST_DAYS_OLDER = 30; - public static final String PATH_TO_BY_DAYS_OLD_ARTIFACT = "org/apache/maven/plugins/maven-install-plugin/2.2-SNAPSHOT/maven-install-plugin-2.2-20061118.060401-2.jar"; + public static final String PATH_TO_BY_DAYS_OLD_ARTIFACT = + "org/apache/maven/plugins/maven-install-plugin/2.2-SNAPSHOT/maven-install-plugin-2.2-20061118.060401-2.jar"; - public static final String PATH_TO_BY_DAYS_OLD_METADATA_DRIVEN_ARTIFACT = "org/codehaus/plexus/plexus-utils/1.4.3-SNAPSHOT/plexus-utils-1.4.3-20070113.163208-4.jar"; + public static final String PATH_TO_BY_DAYS_OLD_METADATA_DRIVEN_ARTIFACT = + "org/codehaus/plexus/plexus-utils/1.4.3-SNAPSHOT/plexus-utils-1.4.3-20070113.163208-4.jar"; - public static final String PATH_TO_BY_RETENTION_COUNT_ARTIFACT = "org/jruby/plugins/jruby-rake-plugin/1.0RC1-SNAPSHOT/jruby-rake-plugin-1.0RC1-20070504.153317-1.jar"; + public static final String PATH_TO_BY_RETENTION_COUNT_ARTIFACT = + "org/jruby/plugins/jruby-rake-plugin/1.0RC1-SNAPSHOT/jruby-rake-plugin-1.0RC1-20070504.153317-1.jar"; - public static final String PATH_TO_BY_RETENTION_COUNT_POM = "org/codehaus/castor/castor-anttasks/1.1.2-SNAPSHOT/castor-anttasks-1.1.2-20070506.163513-2.pom"; + public static final String PATH_TO_BY_RETENTION_COUNT_POM = + "org/codehaus/castor/castor-anttasks/1.1.2-SNAPSHOT/castor-anttasks-1.1.2-20070506.163513-2.pom"; - public static final String PATH_TO_TEST_ORDER_OF_DELETION = "org/apache/maven/plugins/maven-assembly-plugin/1.1.2-SNAPSHOT/maven-assembly-plugin-1.1.2-20070615.105019-3.jar"; + public static final String PATH_TO_TEST_ORDER_OF_DELETION = + "org/apache/maven/plugins/maven-assembly-plugin/1.1.2-SNAPSHOT/maven-assembly-plugin-1.1.2-20070615.105019-3.jar"; protected static final String RELEASES_TEST_REPO_ID = "releases-test-repo-one"; @@ -67,17 +76,25 @@ public abstract class AbstractRepositoryPurgeTest protected RepositoryListener listener; + protected RepositorySession repositorySession; + + protected MetadataRepository metadataRepository; + @Override protected void setUp() throws Exception { super.setUp(); - + listenerControl = MockControl.createControl( RepositoryListener.class ); listener = (RepositoryListener) listenerControl.getMock(); + + repositorySession = mock( RepositorySession.class ); + metadataRepository = mock( MetadataRepository.class ); + when( repositorySession.getRepository() ).thenReturn( metadataRepository ); } - + @Override protected void tearDown() throws Exception @@ -98,7 +115,7 @@ public abstract class AbstractRepositoryPurgeTest config.setSnapshots( true ); config.setDeleteReleasedSnapshots( true ); config.setRetentionCount( TEST_RETENTION_COUNT ); - + return config; } @@ -107,7 +124,7 @@ public abstract class AbstractRepositoryPurgeTest { if ( repo == null ) { - repo = (ManagedRepositoryContent) lookup( ManagedRepositoryContent.class, "default" ); + repo = (ManagedRepositoryContent) lookup( ManagedRepositoryContent.class, "default" ); repo.setRepository( getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ) ); } @@ -123,7 +140,7 @@ public abstract class AbstractRepositoryPurgeTest { assertTrue( "File should exist: " + path, new File( path ).exists() ); } - + protected File getTestRepoRoot() { return getTestFile( "target/test-" + getName() + "/" + TEST_REPO_ID ); @@ -135,16 +152,11 @@ public abstract class AbstractRepositoryPurgeTest File testDir = getTestRepoRoot(); FileUtils.deleteDirectory( testDir ); FileUtils.copyDirectory( getTestFile( "target/test-classes/" + TEST_REPO_ID ), testDir ); - + File releasesTestDir = getTestFile( "target/test-" + getName() + "/" + RELEASES_TEST_REPO_ID ); FileUtils.deleteDirectory( releasesTestDir ); FileUtils.copyDirectory( getTestFile( "target/test-classes/" + RELEASES_TEST_REPO_ID ), releasesTestDir ); - - return testDir.getAbsolutePath(); - } - protected ArchivaArtifact createArtifact( String groupId, String artifactId, String version, String type ) - { - return new ArchivaArtifact( groupId, artifactId, version, null, type, TEST_REPO_ID ); + return testDir.getAbsolutePath(); } } diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java index f5282e23c..e2dbd9121 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java @@ -30,6 +30,7 @@ import org.easymock.MockControl; import java.io.File; import java.util.Collections; +import java.util.List; /** @@ -43,29 +44,32 @@ public class CleanupReleasedSnapshotsRepositoryPurgeTest public static final String PATH_TO_RELEASED_SNAPSHOT_IN_DIFF_REPO = "org/apache/archiva/released-artifact-in-diff-repo/1.0-SNAPSHOT/released-artifact-in-diff-repo-1.0-SNAPSHOT.jar"; - - public static final String PATH_TO_HIGHER_SNAPSHOT_EXISTS_IN_SAME_REPO = "org/apache/maven/plugins/maven-source-plugin/2.0.3-SNAPSHOT/maven-source-plugin-2.0.3-SNAPSHOT.jar"; - public static final String PATH_TO_RELEASED_SNAPSHOT_IN_SAME_REPO = "org/apache/maven/plugins/maven-plugin-plugin/2.3-SNAPSHOT/maven-plugin-plugin-2.3-SNAPSHOT.jar"; - + public static final String PATH_TO_HIGHER_SNAPSHOT_EXISTS_IN_SAME_REPO = + "org/apache/maven/plugins/maven-source-plugin/2.0.3-SNAPSHOT/maven-source-plugin-2.0.3-SNAPSHOT.jar"; + + public static final String PATH_TO_RELEASED_SNAPSHOT_IN_SAME_REPO = + "org/apache/maven/plugins/maven-plugin-plugin/2.3-SNAPSHOT/maven-plugin-plugin-2.3-SNAPSHOT.jar"; + @Override protected void setUp() throws Exception { super.setUp(); - + MetadataTools metadataTools = (MetadataTools) lookup( MetadataTools.class ); - RepositoryContentFactory factory = (RepositoryContentFactory) lookup( RepositoryContentFactory.class, "cleanup-released-snapshots"); - - archivaConfiguration = - (ArchivaConfiguration) lookup( ArchivaConfiguration.class, "cleanup-released-snapshots" ); + RepositoryContentFactory factory = (RepositoryContentFactory) lookup( RepositoryContentFactory.class, + "cleanup-released-snapshots" ); + + archivaConfiguration = (ArchivaConfiguration) lookup( ArchivaConfiguration.class, + "cleanup-released-snapshots" ); listenerControl = MockControl.createControl( RepositoryListener.class ); - + listener = (RepositoryListener) listenerControl.getMock(); - repoPurge = - new CleanupReleasedSnapshotsRepositoryPurge( getRepository(), metadataTools, archivaConfiguration, factory, - Collections.singletonList( listener ) ); + List listeners = Collections.singletonList( listener ); + repoPurge = new CleanupReleasedSnapshotsRepositoryPurge( getRepository(), metadataTools, archivaConfiguration, + factory, repositorySession, listeners ); } public void testReleasedSnapshotsExistsInSameRepo() @@ -74,20 +78,20 @@ public class CleanupReleasedSnapshotsRepositoryPurgeTest Configuration config = archivaConfiguration.getConfiguration(); config.removeManagedRepository( config.findManagedRepositoryById( TEST_REPO_ID ) ); config.addManagedRepository( getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ) ); - - String repoRoot = prepareTestRepos(); + + String repoRoot = prepareTestRepos(); // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-plugin-plugin", - "2.3-SNAPSHOT", "maven-plugin-plugin-2.3-SNAPSHOT.jar" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-plugin-plugin", "2.3-SNAPSHOT", "maven-plugin-plugin-2.3-SNAPSHOT.jar" ); listenerControl.replay(); - + repoPurge.process( PATH_TO_RELEASED_SNAPSHOT_IN_SAME_REPO ); - + listenerControl.verify(); String projectRoot = repoRoot + "/org/apache/maven/plugins/maven-plugin-plugin"; - + // check if the snapshot was removed assertDeleted( projectRoot + "/2.3-SNAPSHOT" ); assertDeleted( projectRoot + "/2.3-SNAPSHOT/maven-plugin-plugin-2.3-SNAPSHOT.jar" ); @@ -111,19 +115,19 @@ public class CleanupReleasedSnapshotsRepositoryPurgeTest // check if metadata file was updated File artifactMetadataFile = new File( projectRoot + "/maven-metadata.xml" ); - + String metadataXml = FileUtils.readFileToString( artifactMetadataFile, null ); - - String expectedVersions = "2.2" + - "2.3"; - + + String expectedVersions = + "2.2" + "2.3"; + XMLAssert.assertXpathEvaluatesTo( "2.3", "//metadata/versioning/release", metadataXml ); XMLAssert.assertXpathEvaluatesTo( "2.3", "//metadata/versioning/latest", metadataXml ); XMLAssert.assertXpathsEqual( "//expected/versions/version", expectedVersions, "//metadata/versioning/versions/version", metadataXml ); XMLAssert.assertXpathEvaluatesTo( "20070315032817", "//metadata/versioning/lastUpdated", metadataXml ); } - + public void testNonArtifactFile() throws Exception { @@ -149,25 +153,26 @@ public class CleanupReleasedSnapshotsRepositoryPurgeTest public void testReleasedSnapshotsExistsInDifferentRepo() throws Exception - { + { Configuration config = archivaConfiguration.getConfiguration(); config.removeManagedRepository( config.findManagedRepositoryById( TEST_REPO_ID ) ); config.addManagedRepository( getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ) ); config.addManagedRepository( getRepoConfiguration( RELEASES_TEST_REPO_ID, RELEASES_TEST_REPO_NAME ) ); - - String repoRoot = prepareTestRepos(); + + String repoRoot = prepareTestRepos(); // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.apache.archiva", "released-artifact-in-diff-repo", - "1.0-SNAPSHOT", "released-artifact-in-diff-repo-1.0-SNAPSHOT.jar" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.archiva", + "released-artifact-in-diff-repo", "1.0-SNAPSHOT", + "released-artifact-in-diff-repo-1.0-SNAPSHOT.jar" ); listenerControl.replay(); - + repoPurge.process( PATH_TO_RELEASED_SNAPSHOT_IN_DIFF_REPO ); listenerControl.verify(); - + String projectRoot = repoRoot + "/org/apache/archiva/released-artifact-in-diff-repo"; - + // check if the snapshot was removed assertDeleted( projectRoot + "/1.0-SNAPSHOT" ); assertDeleted( projectRoot + "/1.0-SNAPSHOT/released-artifact-in-diff-repo-1.0-SNAPSHOT.jar" ); @@ -177,38 +182,38 @@ public class CleanupReleasedSnapshotsRepositoryPurgeTest assertDeleted( projectRoot + "/1.0-SNAPSHOT/released-artifact-in-diff-repo-1.0-SNAPSHOT.pom.md5" ); assertDeleted( projectRoot + "/1.0-SNAPSHOT/released-artifact-in-diff-repo-1.0-SNAPSHOT.pom.sha1" ); - String releasesProjectRoot = - getTestFile( "target/test-" + getName() + "/releases-test-repo-one" ).getAbsolutePath() + - "/org/apache/archiva/released-artifact-in-diff-repo"; - + String releasesProjectRoot = getTestFile( + "target/test-" + getName() + "/releases-test-repo-one" ).getAbsolutePath() + + "/org/apache/archiva/released-artifact-in-diff-repo"; + // check if the released version was not removed - assertExists( releasesProjectRoot + "/1.0" ); + assertExists( releasesProjectRoot + "/1.0" ); assertExists( releasesProjectRoot + "/1.0/released-artifact-in-diff-repo-1.0.jar" ); assertExists( releasesProjectRoot + "/1.0/released-artifact-in-diff-repo-1.0.jar.md5" ); assertExists( releasesProjectRoot + "/1.0/released-artifact-in-diff-repo-1.0.jar.sha1" ); assertExists( releasesProjectRoot + "/1.0/released-artifact-in-diff-repo-1.0.pom" ); assertExists( releasesProjectRoot + "/1.0/released-artifact-in-diff-repo-1.0.pom.md5" ); - assertExists( releasesProjectRoot + "/1.0/released-artifact-in-diff-repo-1.0.pom.sha1" ); + assertExists( releasesProjectRoot + "/1.0/released-artifact-in-diff-repo-1.0.pom.sha1" ); } public void testHigherSnapshotExistsInSameRepo() throws Exception - { + { Configuration config = archivaConfiguration.getConfiguration(); config.removeManagedRepository( config.findManagedRepositoryById( TEST_REPO_ID ) ); config.addManagedRepository( getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ) ); - + String repoRoot = prepareTestRepos(); // test listeners for the correct artifacts - no deletions listenerControl.replay(); - + repoPurge.process( CleanupReleasedSnapshotsRepositoryPurgeTest.PATH_TO_HIGHER_SNAPSHOT_EXISTS_IN_SAME_REPO ); listenerControl.verify(); - + String projectRoot = repoRoot + "/org/apache/maven/plugins/maven-source-plugin"; - + // check if the snapshot was not removed assertExists( projectRoot + "/2.0.3-SNAPSHOT" ); assertExists( projectRoot + "/2.0.3-SNAPSHOT/maven-source-plugin-2.0.3-SNAPSHOT.jar" ); @@ -231,10 +236,10 @@ public class CleanupReleasedSnapshotsRepositoryPurgeTest File artifactMetadataFile = new File( projectRoot + "/maven-metadata.xml" ); String metadataXml = FileUtils.readFileToString( artifactMetadataFile, null ); - + String expectedVersions = "2.0.3-SNAPSHOT" + - "2.0.4-SNAPSHOT"; - + "2.0.4-SNAPSHOT"; + XMLAssert.assertXpathEvaluatesTo( "2.0.4-SNAPSHOT", "//metadata/versioning/latest", metadataXml ); XMLAssert.assertXpathsEqual( "//expected/versions/version", expectedVersions, "//metadata/versioning/versions/version", metadataXml ); diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java index 6db918d6a..b1ef22183 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java @@ -19,12 +19,15 @@ package org.apache.maven.archiva.consumers.core.repository; * under the License. */ +import org.apache.archiva.repository.events.RepositoryListener; import org.apache.commons.lang.time.DateUtils; +import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collections; +import java.util.List; /** */ @@ -46,11 +49,10 @@ public class DaysOldRepositoryPurgeTest public void testByLastModified() throws Exception { - repoPurge = - new DaysOldRepositoryPurge( getRepository(), - getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ).getDaysOlder(), - getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ).getRetentionCount(), - Collections.singletonList( listener ) ); + ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); + repoPurge = new DaysOldRepositoryPurge( getRepository(), repoConfiguration.getDaysOlder(), + repoConfiguration.getRetentionCount(), repositorySession, + Collections.singletonList( listener ) ); String repoRoot = prepareTestRepos(); @@ -59,14 +61,16 @@ public class DaysOldRepositoryPurgeTest setLastModified( projectRoot + "/2.2-SNAPSHOT/", OLD_TIMESTAMP ); // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-install-plugin", - "2.2-SNAPSHOT", "maven-install-plugin-2.2-SNAPSHOT.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-install-plugin", - "2.2-SNAPSHOT", "maven-install-plugin-2.2-SNAPSHOT.pom" ); - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-install-plugin", - "2.2-20061118.060401-2", "maven-install-plugin-2.2-20061118.060401-2.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-install-plugin", - "2.2-20061118.060401-2", "maven-install-plugin-2.2-20061118.060401-2.pom" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-install-plugin", "2.2-SNAPSHOT", "maven-install-plugin-2.2-SNAPSHOT.jar" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-install-plugin", "2.2-SNAPSHOT", "maven-install-plugin-2.2-SNAPSHOT.pom" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-install-plugin", "2.2-20061118.060401-2", + "maven-install-plugin-2.2-20061118.060401-2.jar" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-install-plugin", "2.2-20061118.060401-2", + "maven-install-plugin-2.2-20061118.060401-2.pom" ); listenerControl.replay(); repoPurge.process( PATH_TO_BY_DAYS_OLD_ARTIFACT ); @@ -106,10 +110,10 @@ public class DaysOldRepositoryPurgeTest public void testOrderOfDeletion() throws Exception { - repoPurge = - new DaysOldRepositoryPurge( getRepository(), getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ).getDaysOlder(), - getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ).getRetentionCount(), - Collections.singletonList( listener ) ); + ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); + List listeners = Collections.singletonList( listener ); + repoPurge = new DaysOldRepositoryPurge( getRepository(), repoConfiguration.getDaysOlder(), + repoConfiguration.getRetentionCount(), repositorySession, listeners ); String repoRoot = prepareTestRepos(); @@ -118,10 +122,12 @@ public class DaysOldRepositoryPurgeTest setLastModified( projectRoot + "/1.1.2-SNAPSHOT/", OLD_TIMESTAMP ); // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-assembly-plugin", - "1.1.2-20070427.065136-1", "maven-assembly-plugin-1.1.2-20070427.065136-1.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-assembly-plugin", - "1.1.2-20070427.065136-1", "maven-assembly-plugin-1.1.2-20070427.065136-1.pom" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-assembly-plugin", "1.1.2-20070427.065136-1", + "maven-assembly-plugin-1.1.2-20070427.065136-1.jar" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-assembly-plugin", "1.1.2-20070427.065136-1", + "maven-assembly-plugin-1.1.2-20070427.065136-1.pom" ); listenerControl.replay(); repoPurge.process( PATH_TO_TEST_ORDER_OF_DELETION ); @@ -154,11 +160,10 @@ public class DaysOldRepositoryPurgeTest public void testMetadataDrivenSnapshots() throws Exception { - repoPurge = - new DaysOldRepositoryPurge( getRepository(), - getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ).getDaysOlder(), - getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ).getRetentionCount(), - Collections.singletonList( listener ) ); + ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); + List listeners = Collections.singletonList( listener ); + repoPurge = new DaysOldRepositoryPurge( getRepository(), repoConfiguration.getDaysOlder(), + repoConfiguration.getRetentionCount(), repositorySession, listeners ); String repoRoot = prepareTestRepos(); @@ -185,9 +190,9 @@ public class DaysOldRepositoryPurgeTest } // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.codehaus.plexus", "plexus-utils", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.codehaus.plexus", "plexus-utils", "1.4.3-20070113.163208-4", "plexus-utils-1.4.3-20070113.163208-4.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.codehaus.plexus", "plexus-utils", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.codehaus.plexus", "plexus-utils", "1.4.3-20070113.163208-4", "plexus-utils-1.4.3-20070113.163208-4.pom" ); listenerControl.replay(); diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java index 4dbf95da6..5fd83812b 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java @@ -19,6 +19,8 @@ package org.apache.maven.archiva.consumers.core.repository; * under the License. */ +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.archiva.metadata.repository.TestRepositorySessionFactory; import org.apache.commons.io.FileUtils; import org.apache.maven.archiva.common.utils.BaseFile; import org.apache.maven.archiva.configuration.ArchivaConfiguration; @@ -62,13 +64,12 @@ public class RepositoryPurgeConsumerTest FileTypes fileTypes = (FileTypes) lookup( FileTypes.class ); fileTypes.afterConfigurationChange( null, "repositoryScanning.fileTypes", null ); - KnownRepositoryContentConsumer repoPurgeConsumer = - (KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class, "repository-purge" ); + KnownRepositoryContentConsumer repoPurgeConsumer = (KnownRepositoryContentConsumer) lookup( + KnownRepositoryContentConsumer.class, "repository-purge" ); File repoLocation = getTestFile( "target/test-" + getName() + "/test-repo" ); - File localFile = - new File( repoLocation, path ); + File localFile = new File( repoLocation, path ); ConsumerWantsFilePredicate predicate = new ConsumerWantsFilePredicate(); BaseFile baseFile = new BaseFile( repoLocation, localFile ); @@ -83,16 +84,15 @@ public class RepositoryPurgeConsumerTest File[] contents = dir.listFiles(); for ( int i = 0; i < contents.length; i++ ) { - contents[i].setLastModified( 1179382029 ); + contents[i].setLastModified( 1179382029 ); } } public void testConsumerByRetentionCount() throws Exception { - KnownRepositoryContentConsumer repoPurgeConsumer = - (KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class, - "repo-purge-consumer-by-retention-count" ); + KnownRepositoryContentConsumer repoPurgeConsumer = (KnownRepositoryContentConsumer) lookup( + KnownRepositoryContentConsumer.class, "repo-purge-consumer-by-retention-count" ); ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); repoConfiguration.setDaysOlder( 0 ); // force days older off to allow retention count purge to execute. @@ -141,8 +141,8 @@ public class RepositoryPurgeConsumerTest private void addRepoToConfiguration( String configHint, ManagedRepositoryConfiguration repoConfiguration ) throws Exception { - ArchivaConfiguration archivaConfiguration = - (ArchivaConfiguration) lookup( ArchivaConfiguration.class, configHint ); + ArchivaConfiguration archivaConfiguration = (ArchivaConfiguration) lookup( ArchivaConfiguration.class, + configHint ); Configuration configuration = archivaConfiguration.getConfiguration(); configuration.removeManagedRepository( configuration.findManagedRepositoryById( repoConfiguration.getId() ) ); configuration.addManagedRepository( repoConfiguration ); @@ -151,9 +151,8 @@ public class RepositoryPurgeConsumerTest public void testConsumerByDaysOld() throws Exception { - KnownRepositoryContentConsumer repoPurgeConsumer = - (KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class, - "repo-purge-consumer-by-days-old" ); + KnownRepositoryContentConsumer repoPurgeConsumer = (KnownRepositoryContentConsumer) lookup( + KnownRepositoryContentConsumer.class, "repo-purge-consumer-by-days-old" ); ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); repoConfiguration.setDaysOlder( TEST_DAYS_OLDER ); @@ -182,7 +181,7 @@ public class RepositoryPurgeConsumerTest assertExists( projectRoot + "/2.2-SNAPSHOT/maven-install-plugin-2.2-20070513.034619-5.pom" ); assertExists( projectRoot + "/2.2-SNAPSHOT/maven-install-plugin-2.2-20070513.034619-5.pom.md5" ); assertExists( projectRoot + "/2.2-SNAPSHOT/maven-install-plugin-2.2-20070513.034619-5.pom.sha1" ); - + assertExists( projectRoot + "/2.2-SNAPSHOT/maven-install-plugin-2.2-20070510.010101-4.jar" ); assertExists( projectRoot + "/2.2-SNAPSHOT/maven-install-plugin-2.2-20070510.010101-4.jar.md5" ); assertExists( projectRoot + "/2.2-SNAPSHOT/maven-install-plugin-2.2-20070510.010101-4.jar.sha1" ); @@ -206,9 +205,8 @@ public class RepositoryPurgeConsumerTest public void testReleasedSnapshotsWereNotCleaned() throws Exception { - KnownRepositoryContentConsumer repoPurgeConsumer = - (KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class, - "repo-purge-consumer-by-retention-count" ); + KnownRepositoryContentConsumer repoPurgeConsumer = (KnownRepositoryContentConsumer) lookup( + KnownRepositoryContentConsumer.class, "repo-purge-consumer-by-retention-count" ); ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); repoConfiguration.setDeleteReleasedSnapshots( false ); // Set to NOT delete released snapshots. @@ -218,7 +216,8 @@ public class RepositoryPurgeConsumerTest String repoRoot = prepareTestRepos(); - repoPurgeConsumer.processFile( CleanupReleasedSnapshotsRepositoryPurgeTest.PATH_TO_RELEASED_SNAPSHOT_IN_SAME_REPO ); + repoPurgeConsumer.processFile( + CleanupReleasedSnapshotsRepositoryPurgeTest.PATH_TO_RELEASED_SNAPSHOT_IN_SAME_REPO ); // check if the snapshot wasn't removed String projectRoot = repoRoot + "/org/apache/maven/plugins/maven-plugin-plugin"; @@ -247,9 +246,8 @@ public class RepositoryPurgeConsumerTest public void testReleasedSnapshotsWereCleaned() throws Exception { - KnownRepositoryContentConsumer repoPurgeConsumer = - (KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class, - "repo-purge-consumer-by-days-old" ); + KnownRepositoryContentConsumer repoPurgeConsumer = (KnownRepositoryContentConsumer) lookup( + KnownRepositoryContentConsumer.class, "repo-purge-consumer-by-days-old" ); ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); repoConfiguration.setDeleteReleasedSnapshots( true ); @@ -259,7 +257,8 @@ public class RepositoryPurgeConsumerTest String repoRoot = prepareTestRepos(); - repoPurgeConsumer.processFile( CleanupReleasedSnapshotsRepositoryPurgeTest.PATH_TO_RELEASED_SNAPSHOT_IN_SAME_REPO ); + repoPurgeConsumer.processFile( + CleanupReleasedSnapshotsRepositoryPurgeTest.PATH_TO_RELEASED_SNAPSHOT_IN_SAME_REPO ); String projectRoot = repoRoot + "/org/apache/maven/plugins/maven-plugin-plugin"; @@ -285,4 +284,14 @@ public class RepositoryPurgeConsumerTest "//metadata/versioning/versions/version", metadataXml ); XMLAssert.assertXpathEvaluatesTo( "20070315032817", "//metadata/versioning/lastUpdated", metadataXml ); } + + @Override + protected void setUp() + throws Exception + { + super.setUp(); + + TestRepositorySessionFactory factory = (TestRepositorySessionFactory) lookup( RepositorySessionFactory.class ); + factory.setRepository( metadataRepository ); + } } diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java index 2f488a7c9..06ffbc8f7 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/maven/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java @@ -1,7 +1,5 @@ package org.apache.maven.archiva.consumers.core.repository; -import java.util.Collections; - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -11,7 +9,7 @@ import java.util.Collections; * "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 + * 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 @@ -21,24 +19,27 @@ import java.util.Collections; * under the License. */ +import org.apache.archiva.repository.events.RepositoryListener; +import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; + +import java.util.Collections; +import java.util.List; + /** * Test RetentionsCountRepositoryPurgeTest - * */ public class RetentionCountRepositoryPurgeTest extends AbstractRepositoryPurgeTest { - protected void setUp() throws Exception { super.setUp(); - repoPurge = - new RetentionCountRepositoryPurge( - getRepository(), - getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ).getRetentionCount(), - Collections.singletonList( listener ) ); + ManagedRepositoryConfiguration repoConfiguration = getRepoConfiguration( TEST_REPO_ID, TEST_REPO_NAME ); + List listeners = Collections.singletonList( listener ); + repoPurge = new RetentionCountRepositoryPurge( getRepository(), repoConfiguration.getRetentionCount(), + repositorySession, listeners ); } /** @@ -50,18 +51,18 @@ public class RetentionCountRepositoryPurgeTest String repoRoot = prepareTestRepos(); // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", "1.0RC1-20070504.153317-1", "jruby-rake-plugin-1.0RC1-20070504.153317-1.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", "1.0RC1-20070504.153317-1", "jruby-rake-plugin-1.0RC1-20070504.153317-1.pom" ); - listener.deleteArtifact( getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", "1.0RC1-20070504.160758-2", "jruby-rake-plugin-1.0RC1-20070504.160758-2.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.jruby.plugins", "jruby-rake-plugin", "1.0RC1-20070504.160758-2", "jruby-rake-plugin-1.0RC1-20070504.160758-2.pom" ); listenerControl.replay(); - + repoPurge.process( PATH_TO_BY_RETENTION_COUNT_ARTIFACT ); - + listenerControl.verify(); String versionRoot = repoRoot + "/org/jruby/plugins/jruby-rake-plugin/1.0RC1-SNAPSHOT"; @@ -106,18 +107,18 @@ public class RetentionCountRepositoryPurgeTest String repoRoot = prepareTestRepos(); // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.codehaus.castor", "castor-anttasks", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.codehaus.castor", "castor-anttasks", "1.1.2-20070427.065136-1", "castor-anttasks-1.1.2-20070427.065136-1.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.codehaus.castor", "castor-anttasks", + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.codehaus.castor", "castor-anttasks", "1.1.2-20070427.065136-1", "castor-anttasks-1.1.2-20070427.065136-1.pom" ); listenerControl.replay(); - + repoPurge.process( PATH_TO_BY_RETENTION_COUNT_POM ); - + listenerControl.verify(); String versionRoot = repoRoot + "/org/codehaus/castor/castor-anttasks/1.1.2-SNAPSHOT"; - + // assert if removed from repo assertDeleted( versionRoot + "/castor-anttasks-1.1.2-20070427.065136-1.jar" ); assertDeleted( versionRoot + "/castor-anttasks-1.1.2-20070427.065136-1.jar.md5" ); @@ -154,19 +155,20 @@ public class RetentionCountRepositoryPurgeTest String repoRoot = prepareTestRepos(); // test listeners for the correct artifacts - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-assembly-plugin", - "1.1.2-20070427.065136-1", "maven-assembly-plugin-1.1.2-20070427.065136-1.jar" ); - listener.deleteArtifact( getRepository().getId(), "org.apache.maven.plugins", "maven-assembly-plugin", - "1.1.2-20070427.065136-1", "maven-assembly-plugin-1.1.2-20070427.065136-1.pom" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-assembly-plugin", "1.1.2-20070427.065136-1", + "maven-assembly-plugin-1.1.2-20070427.065136-1.jar" ); + listener.deleteArtifact( metadataRepository, getRepository().getId(), "org.apache.maven.plugins", + "maven-assembly-plugin", "1.1.2-20070427.065136-1", + "maven-assembly-plugin-1.1.2-20070427.065136-1.pom" ); listenerControl.replay(); - + repoPurge.process( PATH_TO_TEST_ORDER_OF_DELETION ); listenerControl.verify(); - String versionRoot = repoRoot + - "/org/apache/maven/plugins/maven-assembly-plugin/1.1.2-SNAPSHOT"; - + String versionRoot = repoRoot + "/org/apache/maven/plugins/maven-assembly-plugin/1.1.2-SNAPSHOT"; + assertDeleted( versionRoot + "/maven-assembly-plugin-1.1.2-20070427.065136-1.jar" ); assertDeleted( versionRoot + "/maven-assembly-plugin-1.1.2-20070427.065136-1.jar.sha1" ); assertDeleted( versionRoot + "/maven-assembly-plugin-1.1.2-20070427.065136-1.jar.md5" ); diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.xml index 63f9b0d4d..4b46f0836 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.xml +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/org/apache/maven/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.xml @@ -42,6 +42,9 @@ org.apache.maven.archiva.configuration.FileTypes retention-count + + org.apache.archiva.metadata.repository.RepositorySessionFactory + repository-purge @@ -125,6 +128,9 @@ org.apache.maven.archiva.configuration.FileTypes days-old + + org.apache.archiva.metadata.repository.RepositorySessionFactory + repository-purge @@ -185,5 +191,9 @@ + + org.apache.archiva.metadata.repository.RepositorySessionFactory + org.apache.archiva.metadata.repository.TestRepositorySessionFactory + diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java b/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java index 8948f0f64..5d9af2893 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java @@ -24,8 +24,11 @@ import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; -import org.apache.archiva.metadata.repository.MetadataResolutionException; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.storage.RepositoryStorage; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException; import org.apache.maven.archiva.common.utils.VersionUtil; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.ConfigurationNames; @@ -81,9 +84,11 @@ public class ArchivaMetadataCreationConsumer private List includes = new ArrayList(); /** + * FIXME: can be of other types + * * @plexus.requirement */ - private MetadataRepository metadataRepository; + private RepositorySessionFactory repositorySessionFactory; /** * FIXME: this needs to be configurable based on storage type - and could also be instantiated per repo. Change to a @@ -149,31 +154,35 @@ public class ArchivaMetadataCreationConsumer project.setId( artifact.getProject() ); String projectVersion = VersionUtil.getBaseVersion( artifact.getVersion() ); - // FIXME: maybe not too efficient since it may have already been read and stored for this artifact - ProjectVersionMetadata versionMetadata = null; + + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { - versionMetadata = repositoryStorage.readProjectVersionMetadata( repoId, artifact.getNamespace(), - artifact.getProject(), projectVersion ); - } - catch ( MetadataResolutionException e ) - { - log.warn( "Error occurred resolving POM for artifact: " + path + "; message: " + e.getMessage() ); - } + MetadataRepository metadataRepository = repositorySession.getRepository(); - boolean createVersionMetadata = false; - if ( versionMetadata == null ) - { - log.warn( "Missing or invalid POM for artifact: " + path + "; creating empty metadata" ); - versionMetadata = new ProjectVersionMetadata(); - versionMetadata.setId( projectVersion ); - versionMetadata.setIncomplete( true ); - createVersionMetadata = true; - } + boolean createVersionMetadata = false; + + // FIXME: maybe not too efficient since it may have already been read and stored for this artifact + ProjectVersionMetadata versionMetadata = null; + try + { + versionMetadata = repositoryStorage.readProjectVersionMetadata( repoId, artifact.getNamespace(), + artifact.getProject(), projectVersion ); + } + catch ( RepositoryStorageMetadataNotFoundException e ) + { + log.warn( "Missing or invalid POM for artifact: " + path + "; creating empty metadata" ); + + versionMetadata = new ProjectVersionMetadata(); + versionMetadata.setId( projectVersion ); + versionMetadata.setIncomplete( true ); + createVersionMetadata = true; + } + catch ( RepositoryStorageMetadataInvalidException e ) + { + log.warn( "Error occurred resolving POM for artifact: " + path + "; message: " + e.getMessage() ); + } - try - { - // FIXME: transaction // read the metadata and update it if it is newer or doesn't exist artifact.setWhenGathered( whenGathered ); metadataRepository.updateArtifact( repoId, project.getNamespace(), project.getId(), projectVersion, @@ -184,10 +193,16 @@ public class ArchivaMetadataCreationConsumer versionMetadata ); } metadataRepository.updateProject( repoId, project ); + repositorySession.save(); } catch ( MetadataRepositoryException e ) { log.warn( "Error occurred persisting metadata for artifact: " + path + "; message: " + e.getMessage(), e ); + repositorySession.revert(); + } + finally + { + repositorySession.close(); } } diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java new file mode 100644 index 000000000..2082e724a --- /dev/null +++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java @@ -0,0 +1,36 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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. + */ + +public class TestRepositorySessionFactory + implements RepositorySessionFactory +{ + private MetadataResolver resolver; + + public RepositorySession createSession() + { + return new RepositorySession( new TestMetadataRepository(), resolver ); + } + + public void setResolver( MetadataResolver resolver ) + { + this.resolver = resolver; + } +} diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java index fe5760870..68185312f 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java @@ -19,17 +19,6 @@ package org.apache.maven.archiva.proxy; * under the License. */ -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Collection; -import java.util.Date; -import java.util.Locale; - import org.apache.commons.io.FileUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.maven.archiva.configuration.ArchivaConfiguration; @@ -48,6 +37,17 @@ import org.codehaus.plexus.spring.PlexusInSpringTestCase; import org.easymock.ArgumentsMatcher; import org.easymock.MockControl; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.Locale; + /** * AbstractProxyTestCase * @@ -88,52 +88,57 @@ public abstract class AbstractProxyTestCase protected static final String REPOPATH_LEGACY_MANAGED_TARGET = "target/test-repository/legacy-managed"; - protected static final ArgumentsMatcher customWagonGetIfNewerMatcher = new ArgumentsMatcher() { + protected static final ArgumentsMatcher customWagonGetIfNewerMatcher = new ArgumentsMatcher() + { - public boolean matches(Object[] expected, Object[] actual) { - if (expected.length < 1 || actual.length < 1) + public boolean matches( Object[] expected, Object[] actual ) + { + if ( expected.length < 1 || actual.length < 1 ) { return false; } - return MockControl.ARRAY_MATCHER.matches(ArrayUtils.remove(expected, 1), ArrayUtils.remove(actual, 1)); + return MockControl.ARRAY_MATCHER.matches( ArrayUtils.remove( expected, 1 ), ArrayUtils.remove( actual, + 1 ) ); } - public String toString(Object[] arguments) { - return ArrayUtils.toString(arguments); + public String toString( Object[] arguments ) + { + return ArrayUtils.toString( arguments ); } }; - protected static final ArgumentsMatcher customWagonGetMatcher = new ArgumentsMatcher() { + protected static final ArgumentsMatcher customWagonGetMatcher = new ArgumentsMatcher() + { - public boolean matches(Object[] expected, Object[] actual) + public boolean matches( Object[] expected, Object[] actual ) + { + if ( expected.length == 2 && actual.length == 2 ) { - if (expected.length == 2 && actual.length == 2) + if ( expected[0] == null && actual[0] == null ) { - if (expected[0] == null && actual[0] == null) - { - return true; - } - - if (expected[0] == null) - { - return actual[0] == null; - } + return true; + } - if (actual[0] == null) - { - return expected[0] == null; - } + if ( expected[0] == null ) + { + return actual[0] == null; + } - return expected[0].equals(actual[0]); + if ( actual[0] == null ) + { + return expected[0] == null; } - return false; - } - public String toString(Object[] arguments) - { - return ArrayUtils.toString(arguments); + return expected[0].equals( actual[0] ); } - }; + return false; + } + + public String toString( Object[] arguments ) + { + return ArrayUtils.toString( arguments ); + } + }; protected MockControl wagonMockControl; @@ -187,7 +192,8 @@ public abstract class AbstractProxyTestCase assertNotNull( "Actual File should not be null.", actualFile ); assertTrue( "Check actual file exists.", actualFile.exists() ); - assertEquals( "Check filename path is appropriate.", expectedFile.getCanonicalPath(), actualFile.getCanonicalPath() ); + assertEquals( "Check filename path is appropriate.", expectedFile.getCanonicalPath(), + actualFile.getCanonicalPath() ); assertEquals( "Check file path matches.", expectedFile.getAbsolutePath(), actualFile.getAbsolutePath() ); String expectedContents = FileUtils.readFileToString( sourceFile, null ); @@ -200,7 +206,7 @@ public abstract class AbstractProxyTestCase assertNull( "Found file: " + downloadedFile + "; but was expecting a failure", downloadedFile ); } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) protected void assertNoTempFiles( File expectedFile ) { File workingDir = expectedFile.getParentFile(); @@ -209,7 +215,7 @@ public abstract class AbstractProxyTestCase return; } - Collection tmpFiles = FileUtils.listFiles( workingDir, new String[] { "tmp" }, false ); + Collection tmpFiles = FileUtils.listFiles( workingDir, new String[]{"tmp"}, false ); if ( !tmpFiles.isEmpty() ) { StringBuffer emsg = new StringBuffer(); @@ -266,8 +272,8 @@ public abstract class AbstractProxyTestCase { if ( !destination.exists() && !destination.mkdirs() ) { - throw new IOException( "Could not create destination directory '" - + destination.getAbsolutePath() + "'." ); + throw new IOException( + "Could not create destination directory '" + destination.getAbsolutePath() + "'." ); } copyDirectoryStructure( file, destination ); @@ -340,8 +346,8 @@ public abstract class AbstractProxyTestCase protected void saveConnector( String sourceRepoId, String targetRepoId, boolean disabled ) { - saveConnector( sourceRepoId, targetRepoId, ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS, - SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, disabled ); + saveConnector( sourceRepoId, targetRepoId, ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS, SnapshotsPolicy.ALWAYS, + CachedFailuresPolicy.NO, disabled ); } protected void saveConnector( String sourceRepoId, String targetRepoId, String checksumPolicy, String releasePolicy, @@ -352,7 +358,8 @@ public abstract class AbstractProxyTestCase } protected void saveConnector( String sourceRepoId, String targetRepoId, String checksumPolicy, String releasePolicy, - String snapshotPolicy, String cacheFailuresPolicy, String errorPolicy, boolean disabled ) + String snapshotPolicy, String cacheFailuresPolicy, String errorPolicy, + boolean disabled ) { saveConnector( sourceRepoId, targetRepoId, checksumPolicy, releasePolicy, snapshotPolicy, cacheFailuresPolicy, errorPolicy, PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT, disabled ); @@ -371,7 +378,7 @@ public abstract class AbstractProxyTestCase connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CACHE_FAILURES, cacheFailuresPolicy ); connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS, errorPolicy ); connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS_ON_UPDATE, errorOnUpdatePolicy ); - connectorConfig.setDisabled(disabled); + connectorConfig.setDisabled( disabled ); int count = config.getConfiguration().getProxyConnectors().size(); config.getConfiguration().addProxyConnector( connectorConfig ); @@ -385,10 +392,10 @@ public abstract class AbstractProxyTestCase config.triggerChange( prefix + ".policies.checksum", connectorConfig.getPolicy( "checksum", "" ) ); config.triggerChange( prefix + ".policies.snapshots", connectorConfig.getPolicy( "snapshots", "" ) ); config.triggerChange( prefix + ".policies.cache-failures", connectorConfig.getPolicy( "cache-failures", "" ) ); - config.triggerChange( prefix + ".policies.propagate-errors", - connectorConfig.getPolicy( "propagate-errors", "" ) ); - config.triggerChange( prefix + ".policies.propagate-errors-on-update", - connectorConfig.getPolicy( "propagate-errors-on-update", "" ) ); + config.triggerChange( prefix + ".policies.propagate-errors", connectorConfig.getPolicy( "propagate-errors", + "" ) ); + config.triggerChange( prefix + ".policies.propagate-errors-on-update", connectorConfig.getPolicy( + "propagate-errors-on-update", "" ) ); } protected void saveManagedRepositoryConfig( String id, String name, String path, String layout ) @@ -444,6 +451,7 @@ public abstract class AbstractProxyTestCase /** * {@inheritDoc} + * * @see org.codehaus.plexus.spring.PlexusInSpringTestCase#getConfigLocation() */ @Override @@ -488,19 +496,28 @@ public abstract class AbstractProxyTestCase config.getConfiguration().addManagedRepository( repoConfig ); // Setup target (proxied to) repository. - saveRemoteRepositoryConfig( ID_PROXIED1, "Proxied Repository 1", new File( REPOPATH_PROXIED1 ).toURL() - .toExternalForm(), "default" ); + saveRemoteRepositoryConfig( ID_PROXIED1, "Proxied Repository 1", new File( + REPOPATH_PROXIED1 ).toURL().toExternalForm(), "default" ); // Setup target (proxied to) repository. - saveRemoteRepositoryConfig( ID_PROXIED2, "Proxied Repository 2", new File( REPOPATH_PROXIED2 ).toURL() - .toExternalForm(), "default" ); + saveRemoteRepositoryConfig( ID_PROXIED2, "Proxied Repository 2", new File( + REPOPATH_PROXIED2 ).toURL().toExternalForm(), "default" ); // Setup target (proxied to) repository using legacy layout. - saveRemoteRepositoryConfig( ID_LEGACY_PROXIED, "Proxied Legacy Repository", new File( REPOPATH_PROXIED_LEGACY ) - .toURL().toExternalForm(), "legacy" ); + saveRemoteRepositoryConfig( ID_LEGACY_PROXIED, "Proxied Legacy Repository", new File( + REPOPATH_PROXIED_LEGACY ).toURL().toExternalForm(), "legacy" ); // Setup the proxy handler. - proxyHandler = (RepositoryProxyConnectors) lookup( RepositoryProxyConnectors.class.getName() ); + try + { + proxyHandler = (RepositoryProxyConnectors) lookup( RepositoryProxyConnectors.class.getName() ); + } + catch ( Exception e ) + { + // TODO: handle in plexus-spring instead + applicationContext.close(); + throw e; + } // Setup the wagon mock. wagonMockControl = MockControl.createNiceControl( Wagon.class ); @@ -548,8 +565,8 @@ public abstract class AbstractProxyTestCase if ( !sourceDir.exists() ) { // This is just a warning. - System.err.println( "[WARN] Skipping setup of testable managed repository, source dir does not exist: " - + sourceDir ); + System.err.println( + "[WARN] Skipping setup of testable managed repository, source dir does not exist: " + sourceDir ); } else { @@ -583,8 +600,8 @@ public abstract class AbstractProxyTestCase protected void assertNotModified( File file, long expectedModificationTime ) { - assertEquals( "File <" + file.getAbsolutePath() + "> not have been modified.", - expectedModificationTime, file.lastModified() ); + assertEquals( "File <" + file.getAbsolutePath() + "> not have been modified.", expectedModificationTime, + file.lastModified() ); } protected void assertNotExistsInManagedLegacyRepo( File file ) @@ -593,9 +610,9 @@ public abstract class AbstractProxyTestCase String managedLegacyPath = managedLegacyDir.getCanonicalPath(); String testFile = file.getCanonicalPath(); - assertTrue( "Unit Test Failure: File <" + testFile - + "> should be have been defined within the legacy managed path of <" + managedLegacyPath + ">", testFile - .startsWith( managedLegacyPath ) ); + assertTrue( "Unit Test Failure: File <" + testFile + + "> should be have been defined within the legacy managed path of <" + managedLegacyPath + ">", + testFile.startsWith( managedLegacyPath ) ); assertFalse( "File < " + testFile + "> should not exist in managed legacy repository.", file.exists() ); } @@ -606,9 +623,9 @@ public abstract class AbstractProxyTestCase String managedDefaultPath = managedDefaultDir.getCanonicalPath(); String testFile = file.getCanonicalPath(); - assertTrue( "Unit Test Failure: File <" + testFile - + "> should be have been defined within the managed default path of <" + managedDefaultPath + ">", testFile - .startsWith( managedDefaultPath ) ); + assertTrue( "Unit Test Failure: File <" + testFile + + "> should be have been defined within the managed default path of <" + managedDefaultPath + ">", + testFile.startsWith( managedDefaultPath ) ); assertFalse( "File < " + testFile + "> should not exist in managed default repository.", file.exists() ); } diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java index fc377c439..39bd94a27 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java @@ -19,13 +19,6 @@ package org.apache.maven.archiva.proxy; * under the License. */ -import java.io.File; -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.apache.commons.io.FileUtils; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; @@ -46,9 +39,15 @@ import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.AbstractHandler; +import java.io.File; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + /** * Integration test for connecting over a HTTP proxy. - * + * * @version $Id: ManagedDefaultTransferTest.java 677852 2008-07-18 08:16:24Z brett $ */ public class HttpProxyTransferTest @@ -75,7 +74,7 @@ public class HttpProxyTransferTest throws Exception { super.setUp(); - + // Setup source repository (using default layout) String repoPath = "target/test-repository/managed/" + getName(); @@ -96,8 +95,8 @@ public class HttpProxyTransferTest repo.setLocation( repoPath ); repo.setLayout( "default" ); - ManagedRepositoryContent repoContent = - (ManagedRepositoryContent) lookup( ManagedRepositoryContent.class, "default" ); + ManagedRepositoryContent repoContent = (ManagedRepositoryContent) lookup( ManagedRepositoryContent.class, + "default" ); repoContent.setRepository( repo ); managedDefaultRepository = repoContent; @@ -113,7 +112,7 @@ public class HttpProxyTransferTest response.setStatus( HttpServletResponse.SC_OK ); response.getWriter().print( "get-default-layout-1.0.jar\n\n" ); assertNotNull( request.getHeader( "Proxy-Connection" ) ); - + ( (Request) request ).setHandled( true ); } }; @@ -130,7 +129,7 @@ public class HttpProxyTransferTest proxyConfig.setProtocol( "http" ); proxyConfig.setId( PROXY_ID ); config.getConfiguration().addNetworkProxy( proxyConfig ); - + // Setup target (proxied to) repository. RemoteRepositoryConfiguration repoConfig = new RemoteRepositoryConfiguration(); @@ -142,7 +141,16 @@ public class HttpProxyTransferTest config.getConfiguration().addRemoteRepository( repoConfig ); // Setup the proxy handler. - proxyHandler = (RepositoryProxyConnectors) lookup( RepositoryProxyConnectors.class.getName() ); + try + { + proxyHandler = (RepositoryProxyConnectors) lookup( RepositoryProxyConnectors.class.getName() ); + } + catch ( Exception e ) + { + server.stop(); + applicationContext.close(); + throw e; + } } @Override @@ -150,7 +158,7 @@ public class HttpProxyTransferTest throws Exception { super.tearDown(); - + server.stop(); } @@ -159,7 +167,7 @@ public class HttpProxyTransferTest { assertNull( System.getProperty( "http.proxyHost" ) ); assertNull( System.getProperty( "http.proxyPort" ) ); - + String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar"; // Configure Connector (usually done within archiva.xml configuration) @@ -183,7 +191,7 @@ public class HttpProxyTransferTest String expectedContents = FileUtils.readFileToString( sourceFile, null ); String actualContents = FileUtils.readFileToString( downloadedFile, null ); assertEquals( "Check file contents.", expectedContents, actualContents ); - + assertNull( System.getProperty( "http.proxyHost" ) ); assertNull( System.getProperty( "http.proxyPort" ) ); } diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml new file mode 100644 index 000000000..6a9baca85 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml index 489d3e0ad..19e9e377c 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 archiva-scheduler @@ -56,6 +57,11 @@ slf4j-simple test + + org.mockito + mockito-all + test + diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java index c4a8b8ec5..3c729c552 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java @@ -19,7 +19,10 @@ package org.apache.archiva.scheduler.repository; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.archiva.repository.scanner.RepositoryContentConsumers; @@ -75,6 +78,13 @@ public class ArchivaRepositoryScanningTaskExecutor */ private RepositoryStatisticsManager repositoryStatisticsManager; + /** + * TODO: may be different implementations + * + * @plexus.requirement + */ + private RepositorySessionFactory repositorySessionFactory; + public void initialize() throws InitializationException { @@ -127,48 +137,48 @@ public class ArchivaRepositoryScanningTaskExecutor long sinceWhen = RepositoryScanner.FRESH_SCAN; long previousFileCount = 0; - if ( !repoTask.isScanAll() ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + MetadataRepository metadataRepository = repositorySession.getRepository(); + try { - RepositoryStatistics previousStats; - try + if ( !repoTask.isScanAll() ) { - previousStats = repositoryStatisticsManager.getLastStatistics( repoId ); + RepositoryStatistics previousStats = repositoryStatisticsManager.getLastStatistics( + metadataRepository, repoId ); + if ( previousStats != null ) + { + sinceWhen = previousStats.getScanStartTime().getTime(); + previousFileCount = previousStats.getTotalFileCount(); + } } - catch ( MetadataRepositoryException e ) + + RepositoryScanStatistics stats; + try { - throw new TaskExecutionException( "Unable to get previous statistics: " + e.getMessage(), e ); + stats = repoScanner.scan( arepo, sinceWhen ); } - if ( previousStats != null ) + catch ( RepositoryScannerException e ) { - sinceWhen = previousStats.getScanStartTime().getTime(); - previousFileCount = previousStats.getTotalFileCount(); + throw new TaskExecutionException( "Repository error when executing repository job.", e ); } - } - RepositoryScanStatistics stats; - try - { - stats = repoScanner.scan( arepo, sinceWhen ); - } - catch ( RepositoryScannerException e ) - { - throw new TaskExecutionException( "Repository error when executing repository job.", e ); - } + log.info( "Finished first scan: " + stats.toDump( arepo ) ); - log.info( "Finished first scan: " + stats.toDump( arepo ) ); - - // further statistics will be populated by the following method - Date endTime = new Date( stats.getWhenGathered().getTime() + stats.getDuration() ); - try - { - repositoryStatisticsManager.addStatisticsAfterScan( repoId, stats.getWhenGathered(), endTime, - stats.getTotalFileCount(), + // further statistics will be populated by the following method + Date endTime = new Date( stats.getWhenGathered().getTime() + stats.getDuration() ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, repoId, stats.getWhenGathered(), + endTime, stats.getTotalFileCount(), stats.getTotalFileCount() - previousFileCount ); + repositorySession.save(); } catch ( MetadataRepositoryException e ) { throw new TaskExecutionException( "Unable to store updated statistics: " + e.getMessage(), e ); } + finally + { + repositorySession.close(); + } // log.info( "Scanning for removed repository content" ); diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java index ce02452a6..fa928cc49 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java @@ -19,7 +19,10 @@ package org.apache.archiva.scheduler.repository; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.archiva.scheduler.ArchivaTaskScheduler; import org.apache.maven.archiva.common.ArchivaException; @@ -77,6 +80,13 @@ public class RepositoryArchivaTaskScheduler */ private RepositoryStatisticsManager repositoryStatisticsManager; + /** + * TODO: could have multiple implementations + * + * @plexus.requirement + */ + private RepositorySessionFactory repositorySessionFactory; + private static final String REPOSITORY_SCAN_GROUP = "rg"; private static final String REPOSITORY_JOB = "rj"; @@ -114,33 +124,42 @@ public class RepositoryArchivaTaskScheduler List repositories = archivaConfiguration.getConfiguration().getManagedRepositories(); - for ( ManagedRepositoryConfiguration repoConfig : repositories ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - if ( repoConfig.isScanned() ) + MetadataRepository metadataRepository = repositorySession.getRepository(); + for ( ManagedRepositoryConfiguration repoConfig : repositories ) { - try + if ( repoConfig.isScanned() ) { - scheduleRepositoryJobs( repoConfig ); - } - catch ( SchedulerException e ) - { - throw new StartingException( "Unable to start scheduler: " + e.getMessage(), e ); - } + try + { + scheduleRepositoryJobs( repoConfig ); + } + catch ( SchedulerException e ) + { + throw new StartingException( "Unable to start scheduler: " + e.getMessage(), e ); + } - try - { - if ( !isPreviouslyScanned( repoConfig ) ) + try { - queueInitialRepoScan( repoConfig ); + if ( !isPreviouslyScanned( repoConfig, metadataRepository ) ) + { + queueInitialRepoScan( repoConfig ); + } + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to determine if a repository is already scanned, skipping initial scan: " + + e.getMessage(), e ); } - } - catch ( MetadataRepositoryException e ) - { - log.warn( "Unable to determine if a repository is already scanned, skipping initial scan: " + - e.getMessage(), e ); } } } + finally + { + repositorySession.close(); + } } public void stop() @@ -270,10 +289,11 @@ public class RepositoryArchivaTaskScheduler } @SuppressWarnings( "unchecked" ) - private boolean isPreviouslyScanned( ManagedRepositoryConfiguration repoConfig ) + private boolean isPreviouslyScanned( ManagedRepositoryConfiguration repoConfig, + MetadataRepository metadataRepository ) throws MetadataRepositoryException { - return repositoryStatisticsManager.getLastStatistics( repoConfig.getId() ) != null; + return repositoryStatisticsManager.getLastStatistics( metadataRepository, repoConfig.getId() ) != null; } // MRM-848: Pre-configured repository initially appear to be empty diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java new file mode 100644 index 000000000..3a96aaa92 --- /dev/null +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java @@ -0,0 +1,43 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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. + */ + +public class TestRepositorySessionFactory + implements RepositorySessionFactory +{ + private MetadataRepository repository; + + private MetadataResolver resolver; + + public RepositorySession createSession() + { + return new RepositorySession( repository, resolver ); + } + + public void setRepository( MetadataRepository repository ) + { + this.repository = repository; + } + + public void setResolver( MetadataResolver resolver ) + { + this.resolver = resolver; + } +} diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java index c3a44ac2b..f7b188c34 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java @@ -19,6 +19,7 @@ package org.apache.archiva.scheduler.repository; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; @@ -36,6 +37,8 @@ import java.util.Collection; import java.util.Date; import java.util.List; +import static org.mockito.Mockito.mock; + /** * ArchivaRepositoryScanningTaskExecutorTest * @@ -54,12 +57,23 @@ public class ArchivaRepositoryScanningTaskExecutorTest private TestConsumer testConsumer; + private MetadataRepository metadataRepository; + protected void setUp() throws Exception { super.setUp(); - taskExecutor = (TaskExecutor) lookup( TaskExecutor.class, "test-repository-scanning" ); + try + { + taskExecutor = (TaskExecutor) lookup( TaskExecutor.class, "test-repository-scanning" ); + } + catch ( Exception e ) + { + // TODO: handle cleanup in plexus-spring lookup method instead + applicationContext.close(); + throw e; + } File sourceRepoDir = new File( getBasedir(), "src/test/repositories/default-repository" ); repoDir = new File( getBasedir(), "target/default-repository" ); @@ -98,6 +112,8 @@ public class ArchivaRepositoryScanningTaskExecutorTest repositoryStatisticsManager = (RepositoryStatisticsManager) lookup( RepositoryStatisticsManager.class ); testConsumer = (TestConsumer) lookup( KnownRepositoryContentConsumer.class, "test-consumer" ); + + metadataRepository = mock( MetadataRepository.class ); } protected void tearDown() @@ -145,7 +161,8 @@ public class ArchivaRepositoryScanningTaskExecutorTest unprocessedResultList.size() ); // check correctness of new stats - RepositoryStatistics newStats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ); + RepositoryStatistics newStats = repositoryStatisticsManager.getLastStatistics( metadataRepository, + TEST_REPO_ID ); assertEquals( 0, newStats.getNewFileCount() ); assertEquals( 31, newStats.getTotalFileCount() ); // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation @@ -176,7 +193,8 @@ public class ArchivaRepositoryScanningTaskExecutorTest unprocessedResultList.size() ); // check correctness of new stats - RepositoryStatistics updatedStats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ); + RepositoryStatistics updatedStats = repositoryStatisticsManager.getLastStatistics( metadataRepository, + TEST_REPO_ID ); assertEquals( 2, updatedStats.getNewFileCount() ); assertEquals( 33, updatedStats.getTotalFileCount() ); // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation @@ -220,7 +238,8 @@ public class ArchivaRepositoryScanningTaskExecutorTest unprocessedResultList.size() ); // check correctness of new stats - RepositoryStatistics newStats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ); + RepositoryStatistics newStats = repositoryStatisticsManager.getLastStatistics( metadataRepository, + TEST_REPO_ID ); assertEquals( 2, newStats.getNewFileCount() ); assertEquals( 33, newStats.getTotalFileCount() ); // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation @@ -264,7 +283,8 @@ public class ArchivaRepositoryScanningTaskExecutorTest unprocessedResultList.size() ); // check correctness of new stats - RepositoryStatistics newStats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ); + RepositoryStatistics newStats = repositoryStatisticsManager.getLastStatistics( metadataRepository, + TEST_REPO_ID ); assertEquals( 2, newStats.getNewFileCount() ); assertEquals( 33, newStats.getTotalFileCount() ); // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation @@ -283,8 +303,8 @@ public class ArchivaRepositoryScanningTaskExecutorTest repoTask.setScanAll( true ); Date date = Calendar.getInstance().getTime(); - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, new Date( date.getTime() - 1234567 ), date, 8, - 8 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, new Date( + date.getTime() - 1234567 ), date, 8, 8 ); taskExecutor.executeTask( repoTask ); @@ -308,7 +328,7 @@ public class ArchivaRepositoryScanningTaskExecutorTest stats.setTotalProjectCount( 5 ); stats.setTotalArtifactFileSize( 38545 ); - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, new Date( date.getTime() - 1234567 ), date, - 31, 31 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, new Date( + date.getTime() - 1234567 ), date, 31, 31 ); } } diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/TestRepositoryStatisticsManager.java b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/TestRepositoryStatisticsManager.java index 155f927d5..2c1245060 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/TestRepositoryStatisticsManager.java +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/TestRepositoryStatisticsManager.java @@ -19,21 +19,22 @@ package org.apache.archiva.scheduler.repository; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; +import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; + import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; -import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; - public class TestRepositoryStatisticsManager implements RepositoryStatisticsManager { private Map> repoStats = new HashMap>(); - public RepositoryStatistics getLastStatistics( String repositoryId ) + public RepositoryStatistics getLastStatistics( MetadataRepository metadataRepository, String repositoryId ) { List repositoryStatisticsList = getStatsList( repositoryId ); return !repositoryStatisticsList.isEmpty() @@ -41,8 +42,8 @@ public class TestRepositoryStatisticsManager : null; } - public void addStatisticsAfterScan( String repositoryId, Date startTime, Date endTime, long totalFiles, - long newFiles ) + public void addStatisticsAfterScan( MetadataRepository metadataRepository, String repositoryId, Date startTime, + Date endTime, long totalFiles, long newFiles ) { List stats = getStatsList( repositoryId ); @@ -55,12 +56,13 @@ public class TestRepositoryStatisticsManager stats.add( repositoryStatistics ); } - public void deleteStatistics( String repositoryId ) + public void deleteStatistics( MetadataRepository metadataRepository, String repositoryId ) { repoStats.remove( repositoryId ); } - public List getStatisticsInRange( String repositoryId, Date startDate, Date endDate ) + public List getStatisticsInRange( MetadataRepository metadataRepository, String repositoryId, + Date startDate, Date endDate ) { throw new UnsupportedOperationException(); } diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.xml index d8bb6c288..48595aff4 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.xml +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.xml @@ -37,6 +37,9 @@ org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager + + org.apache.archiva.metadata.repository.RepositorySessionFactory + @@ -87,5 +90,10 @@ + + + org.apache.archiva.metadata.repository.RepositorySessionFactory + org.apache.archiva.metadata.repository.TestRepositorySessionFactory + diff --git a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/AbstractArtifactsRssFeedProcessor.java b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/AbstractArtifactsRssFeedProcessor.java index 0dca954c7..939bfd27e 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/AbstractArtifactsRssFeedProcessor.java +++ b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/AbstractArtifactsRssFeedProcessor.java @@ -19,22 +19,10 @@ package org.apache.archiva.rss.processor; * under the License. */ -import org.apache.archiva.metadata.repository.MetadataRepository; - public abstract class AbstractArtifactsRssFeedProcessor implements RssFeedProcessor { - /** - * @plexus.requirement - */ - protected MetadataRepository metadataRepository; - protected abstract String getTitle(); protected abstract String getDescription(); - - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } } diff --git a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java index 027ce4ee3..bac85d9c1 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java +++ b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java @@ -22,6 +22,7 @@ package org.apache.archiva.rss.processor; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; import org.apache.archiva.metadata.model.ArtifactMetadata; +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.rss.RssFeedEntry; import org.apache.archiva.rss.RssFeedGenerator; @@ -64,7 +65,7 @@ public class NewArtifactsRssFeedProcessor * Process the newly discovered artifacts in the repository. Generate feeds for new artifacts in the repository and * new versions of artifact. */ - public SyndFeed process( Map reqParams ) + public SyndFeed process( Map reqParams, MetadataRepository metadataRepository ) throws FeedException { log.debug( "Process new artifacts into rss feeds." ); @@ -72,20 +73,20 @@ public class NewArtifactsRssFeedProcessor String repoId = reqParams.get( RssFeedProcessor.KEY_REPO_ID ); if ( repoId != null ) { - return processNewArtifactsInRepo( repoId ); + return processNewArtifactsInRepo( repoId, metadataRepository ); } return null; } - private SyndFeed processNewArtifactsInRepo( String repoId ) + private SyndFeed processNewArtifactsInRepo( String repoId, MetadataRepository metadataRepository ) throws FeedException { Calendar greaterThanThisDate = Calendar.getInstance( GMT_TIME_ZONE ); greaterThanThisDate.add( Calendar.DATE, -( getNumberOfDaysBeforeNow() ) ); greaterThanThisDate.clear( Calendar.MILLISECOND ); - List artifacts = null; + List artifacts; try { artifacts = metadataRepository.getArtifactsByDateRange( repoId, greaterThanThisDate.getTime(), null ); diff --git a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java index f90b22a2a..b731b4f43 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java +++ b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java @@ -22,6 +22,7 @@ package org.apache.archiva.rss.processor; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; import org.apache.archiva.metadata.model.ArtifactMetadata; +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.rss.RssFeedEntry; @@ -59,7 +60,7 @@ public class NewVersionsOfArtifactRssFeedProcessor /** * Process all versions of the artifact which had a rss feed request. */ - public SyndFeed process( Map reqParams ) + public SyndFeed process( Map reqParams, MetadataRepository metadataRepository ) throws FeedException { String groupId = reqParams.get( RssFeedProcessor.KEY_GROUP_ID ); @@ -67,13 +68,14 @@ public class NewVersionsOfArtifactRssFeedProcessor if ( groupId != null && artifactId != null ) { - return processNewVersionsOfArtifact( groupId, artifactId ); + return processNewVersionsOfArtifact( groupId, artifactId, metadataRepository ); } return null; } - private SyndFeed processNewVersionsOfArtifact( String groupId, String artifactId ) + private SyndFeed processNewVersionsOfArtifact( String groupId, String artifactId, + MetadataRepository metadataRepository ) throws FeedException { List artifacts = new ArrayList(); diff --git a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java index d8d7cb878..c87689a24 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java +++ b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java @@ -21,6 +21,7 @@ package org.apache.archiva.rss.processor; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; +import org.apache.archiva.metadata.repository.MetadataRepository; import java.util.Map; @@ -35,6 +36,6 @@ public interface RssFeedProcessor public static final String KEY_ARTIFACT_ID = "artifactId"; - SyndFeed process( Map reqParams ) + SyndFeed process( Map reqParams, MetadataRepository metadataRepository ) throws FeedException; } diff --git a/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java b/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java index 686ea2663..f221ee5ee 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java +++ b/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java @@ -59,7 +59,6 @@ public class NewArtifactsRssFeedProcessorTest newArtifactsProcessor.setGenerator( new RssFeedGenerator() ); metadataRepository = new MetadataRepositoryMock(); - newArtifactsProcessor.setMetadataRepository( metadataRepository ); } @SuppressWarnings( "unchecked" ) @@ -83,7 +82,7 @@ public class NewArtifactsRssFeedProcessorTest Map reqParams = new HashMap(); reqParams.put( RssFeedProcessor.KEY_REPO_ID, TEST_REPO ); - SyndFeed feed = newArtifactsProcessor.process( reqParams ); + SyndFeed feed = newArtifactsProcessor.process( reqParams, metadataRepository ); // check that the date used in the call is close to the one passed (5 seconds difference at most) Calendar cal = Calendar.getInstance( TimeZone.getTimeZone( "GMT" ) ); diff --git a/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessorTest.java b/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessorTest.java index 043293db6..e36312b2b 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessorTest.java +++ b/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessorTest.java @@ -60,10 +60,9 @@ public class NewVersionsOfArtifactRssFeedProcessorTest metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); - newVersionsProcessor.setMetadataRepository( metadataRepository ); } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public void testProcess() throws Exception { @@ -80,23 +79,23 @@ public class NewVersionsOfArtifactRssFeedProcessorTest reqParams.put( RssFeedProcessor.KEY_GROUP_ID, GROUP_ID ); reqParams.put( RssFeedProcessor.KEY_ARTIFACT_ID, ARTIFACT_ID ); - metadataRepositoryControl.expectAndReturn( metadataRepository.getRepositories(), - Collections.singletonList( TEST_REPO ) ); - metadataRepositoryControl.expectAndReturn( - metadataRepository.getProjectVersions( TEST_REPO, GROUP_ID, ARTIFACT_ID ), - Arrays.asList( "1.0.1", "1.0.2", "1.0.3-SNAPSHOT" ) ); - metadataRepositoryControl.expectAndReturn( - metadataRepository.getArtifacts( TEST_REPO, GROUP_ID, ARTIFACT_ID, "1.0.1" ), - Collections.singletonList( artifact1 ) ); - metadataRepositoryControl.expectAndReturn( - metadataRepository.getArtifacts( TEST_REPO, GROUP_ID, ARTIFACT_ID, "1.0.2" ), - Collections.singletonList( artifact2 ) ); - metadataRepositoryControl.expectAndReturn( - metadataRepository.getArtifacts( TEST_REPO, GROUP_ID, ARTIFACT_ID, "1.0.3-SNAPSHOT" ), - Collections.singletonList( artifact3 ) ); + metadataRepositoryControl.expectAndReturn( metadataRepository.getRepositories(), Collections.singletonList( + TEST_REPO ) ); + metadataRepositoryControl.expectAndReturn( metadataRepository.getProjectVersions( TEST_REPO, GROUP_ID, + ARTIFACT_ID ), Arrays.asList( + "1.0.1", "1.0.2", "1.0.3-SNAPSHOT" ) ); + metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( TEST_REPO, GROUP_ID, ARTIFACT_ID, + "1.0.1" ), + Collections.singletonList( artifact1 ) ); + metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( TEST_REPO, GROUP_ID, ARTIFACT_ID, + "1.0.2" ), + Collections.singletonList( artifact2 ) ); + metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( TEST_REPO, GROUP_ID, ARTIFACT_ID, + "1.0.3-SNAPSHOT" ), + Collections.singletonList( artifact3 ) ); metadataRepositoryControl.replay(); - SyndFeed feed = newVersionsProcessor.process( reqParams ); + SyndFeed feed = newVersionsProcessor.process( reqParams, metadataRepository ); assertEquals( "New Versions of Artifact 'org.apache.archiva:artifact-two'", feed.getTitle() ); assertEquals( "New versions of artifact 'org.apache.archiva:artifact-two' found during repository scan.", @@ -108,8 +107,8 @@ public class NewVersionsOfArtifactRssFeedProcessorTest assertEquals( 2, entries.size() ); - assertEquals( "New Versions of Artifact 'org.apache.archiva:artifact-two' as of " + whenGathered, - entries.get( 0 ).getTitle() ); + assertEquals( "New Versions of Artifact 'org.apache.archiva:artifact-two' as of " + whenGathered, entries.get( + 0 ).getTitle() ); assertEquals( whenGathered, entries.get( 0 ).getPublishedDate() ); assertEquals( "New Versions of Artifact 'org.apache.archiva:artifact-two' as of " + whenGatheredNext, diff --git a/archiva-modules/archiva-web/archiva-webapp-test/pom.xml b/archiva-modules/archiva-web/archiva-webapp-test/pom.xml index d52b0c915..e39f84184 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/pom.xml +++ b/archiva-modules/archiva-web/archiva-webapp-test/pom.xml @@ -18,7 +18,7 @@ ~ under the License. --> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 org.apache.archiva @@ -41,7 +41,7 @@ commons-io commons-io 1.4 - + org.codehaus.plexus @@ -73,10 +73,10 @@ 1.0.1 test - - commons-logging - commons-logging - + + commons-logging + commons-logging + @@ -89,7 +89,7 @@ jaxen jaxen - + org.apache.derby @@ -143,7 +143,7 @@ - + org.apache.maven.plugins maven-surefire-plugin @@ -176,7 +176,7 @@ browser ${selenium.browser} - + baseUrl ${baseUrl} @@ -227,6 +227,7 @@ copy-dependencies + org.apache.derby,javax.mail,javax.activation false true @@ -247,22 +248,22 @@ - + - + - + - + - + - + @@ -273,12 +274,12 @@ - + + todir="${cargo.install.dir}/${container.name}/apache-tomcat-${tomcat5x.version}/apache-tomcat-${tomcat5x.version}/common/lib"> - + @@ -292,8 +293,8 @@ integration-test - - + + @@ -386,7 +387,7 @@ true ${seleniumPort} - true + true @@ -403,7 +404,9 @@ tomcat5x - http://archive.apache.org/dist/tomcat/tomcat-5/v${tomcat5x.version}/bin/apache-tomcat-${tomcat5x.version}.zip + + http://archive.apache.org/dist/tomcat/tomcat-5/v${tomcat5x.version}/bin/apache-tomcat-${tomcat5x.version}.zip + @@ -415,7 +418,7 @@ *firefox - + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java index bd7ef5155..c1da5be9f 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java @@ -22,6 +22,7 @@ package org.apache.maven.archiva.web.action; import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -42,11 +43,6 @@ import java.util.Set; public class BrowseAction extends AbstractRepositoryBasedAction { - /** - * @plexus.requirement - */ - private MetadataResolver metadataResolver; - private String groupId; private String artifactId; @@ -75,29 +71,40 @@ public class BrowseAction // TODO: this logic should be optional, particularly remembering we want to keep this code simple // it is located here to avoid the content repository implementation needing to do too much for what // is essentially presentation code - Set namespacesToCollapse = new LinkedHashSet(); - for ( String repoId : selectedRepos ) + Set namespacesToCollapse; + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - namespacesToCollapse.addAll( metadataResolver.resolveRootNamespaces( repoId ) ); - } + MetadataResolver metadataResolver = repositorySession.getResolver(); + namespacesToCollapse = new LinkedHashSet(); + for ( String repoId : selectedRepos ) + { + namespacesToCollapse.addAll( metadataResolver.resolveRootNamespaces( repositorySession, repoId ) ); + } - for ( String n : namespacesToCollapse ) + for ( String n : namespacesToCollapse ) + { + // TODO: check performance of this + namespaces.add( collapseNamespaces( repositorySession, metadataResolver, selectedRepos, n ) ); + } + } + finally { - // TODO: check performance of this - namespaces.add( collapseNamespaces( selectedRepos, n ) ); + repositorySession.close(); } this.namespaces = getSortedList( namespaces ); return SUCCESS; } - private String collapseNamespaces( Collection repoIds, String n ) + private String collapseNamespaces( RepositorySession repositorySession, MetadataResolver metadataResolver, + Collection repoIds, String n ) throws MetadataResolutionException { Set subNamespaces = new LinkedHashSet(); for ( String repoId : repoIds ) { - subNamespaces.addAll( metadataResolver.resolveNamespaces( repoId, n ) ); + subNamespaces.addAll( metadataResolver.resolveNamespaces( repositorySession, repoId, n ) ); } if ( subNamespaces.size() != 1 ) { @@ -111,7 +118,7 @@ public class BrowseAction { for ( String repoId : repoIds ) { - Collection projects = metadataResolver.resolveProjects( repoId, n ); + Collection projects = metadataResolver.resolveProjects( repositorySession, repoId, n ); if ( projects != null && !projects.isEmpty() ) { if ( log.isDebugEnabled() ) @@ -121,7 +128,8 @@ public class BrowseAction return n; } } - return collapseNamespaces( repoIds, n + "." + subNamespaces.iterator().next() ); + return collapseNamespaces( repositorySession, metadataResolver, repoIds, + n + "." + subNamespaces.iterator().next() ); } } @@ -143,22 +151,34 @@ public class BrowseAction Set projects = new LinkedHashSet(); - Set namespacesToCollapse = new LinkedHashSet(); - for ( String repoId : selectedRepos ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + Set namespaces; + try { - namespacesToCollapse.addAll( metadataResolver.resolveNamespaces( repoId, groupId ) ); + MetadataResolver metadataResolver = repositorySession.getResolver(); - projects.addAll( metadataResolver.resolveProjects( repoId, groupId ) ); - } + Set namespacesToCollapse = new LinkedHashSet(); + for ( String repoId : selectedRepos ) + { + namespacesToCollapse.addAll( metadataResolver.resolveNamespaces( repositorySession, repoId, groupId ) ); - // TODO: this logic should be optional, particularly remembering we want to keep this code simple - // it is located here to avoid the content repository implementation needing to do too much for what - // is essentially presentation code - Set namespaces = new LinkedHashSet(); - for ( String n : namespacesToCollapse ) + projects.addAll( metadataResolver.resolveProjects( repositorySession, repoId, groupId ) ); + } + + // TODO: this logic should be optional, particularly remembering we want to keep this code simple + // it is located here to avoid the content repository implementation needing to do too much for what + // is essentially presentation code + namespaces = new LinkedHashSet(); + for ( String n : namespacesToCollapse ) + { + // TODO: check performance of this + namespaces.add( collapseNamespaces( repositorySession, metadataResolver, selectedRepos, + groupId + "." + n ) ); + } + } + finally { - // TODO: check performance of this - namespaces.add( collapseNamespaces( selectedRepos, groupId + "." + n ) ); + repositorySession.close(); } this.namespaces = getSortedList( namespaces ); @@ -196,21 +216,33 @@ public class BrowseAction return GlobalResults.ACCESS_TO_NO_REPOS; } - Set versions = new LinkedHashSet(); - for ( String repoId : selectedRepos ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - versions.addAll( metadataResolver.resolveProjectVersions( repoId, groupId, artifactId ) ); - } + MetadataResolver metadataResolver = repositorySession.getResolver(); - // TODO: sort by known version ordering method - this.projectVersions = new ArrayList( versions ); + Set versions = new LinkedHashSet(); + for ( String repoId : selectedRepos ) + { + versions.addAll( metadataResolver.resolveProjectVersions( repositorySession, repoId, groupId, + artifactId ) ); + } - populateSharedModel( selectedRepos, versions ); + // TODO: sort by known version ordering method + this.projectVersions = new ArrayList( versions ); + + populateSharedModel( repositorySession, metadataResolver, selectedRepos, versions ); + } + finally + { + repositorySession.close(); + } return SUCCESS; } - private void populateSharedModel( Collection selectedRepos, Collection projectVersions ) + private void populateSharedModel( RepositorySession repositorySession, MetadataResolver metadataResolver, + Collection selectedRepos, Collection projectVersions ) { sharedModel = new ProjectVersionMetadata(); @@ -230,8 +262,8 @@ public class BrowseAction { try { - versionMetadata = metadataResolver.resolveProjectVersion( repoId, groupId, artifactId, - version ); + versionMetadata = metadataResolver.resolveProjectVersion( repositorySession, repoId, groupId, + artifactId, version ); } catch ( MetadataResolutionException e ) { @@ -351,11 +383,6 @@ public class BrowseAction return sharedModel; } - public MetadataResolver getMetadataResolver() - { - return metadataResolver; - } - public Collection getProjectIds() { return projectIds; diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java index ef608fa7c..3e8944d38 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java @@ -29,6 +29,7 @@ import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.metadata.repository.MetadataResolutionException; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.repository.events.RepositoryListener; import org.apache.maven.archiva.common.utils.VersionComparator; import org.apache.maven.archiva.common.utils.VersionUtil; @@ -117,11 +118,6 @@ public class DeleteArtifactAction private ChecksumAlgorithm[] algorithms = new ChecksumAlgorithm[]{ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5}; - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - public String getGroupId() { return groupId; @@ -194,21 +190,22 @@ public class DeleteArtifactAction public String doDelete() { - try - { - Date lastUpdatedTimestamp = Calendar.getInstance().getTime(); + Date lastUpdatedTimestamp = Calendar.getInstance().getTime(); - TimeZone timezone = TimeZone.getTimeZone( "UTC" ); - DateFormat fmt = new SimpleDateFormat( "yyyyMMdd.HHmmss" ); - fmt.setTimeZone( timezone ); - ManagedRepositoryConfiguration repoConfig = configuration.getConfiguration().findManagedRepositoryById( - repositoryId ); + TimeZone timezone = TimeZone.getTimeZone( "UTC" ); + DateFormat fmt = new SimpleDateFormat( "yyyyMMdd.HHmmss" ); + fmt.setTimeZone( timezone ); + ManagedRepositoryConfiguration repoConfig = configuration.getConfiguration().findManagedRepositoryById( + repositoryId ); - VersionedReference ref = new VersionedReference(); - ref.setArtifactId( artifactId ); - ref.setGroupId( groupId ); - ref.setVersion( version ); + VersionedReference ref = new VersionedReference(); + ref.setArtifactId( artifactId ); + ref.setGroupId( groupId ); + ref.setVersion( version ); + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { ManagedRepositoryContent repository = repositoryFactory.getManagedRepositoryContent( repositoryId ); String path = repository.toMetadataPath( ref ); @@ -230,6 +227,7 @@ public class DeleteArtifactAction updateMetadata( metadata, metadataFile, lastUpdatedTimestamp ); + MetadataRepository metadataRepository = repositorySession.getRepository(); Collection artifacts = metadataRepository.getArtifacts( repositoryId, groupId, artifactId, version ); @@ -245,21 +243,14 @@ public class DeleteArtifactAction // repository metadata to an artifact for ( RepositoryListener listener : listeners ) { - listener.deleteArtifact( repository.getId(), artifact.getNamespace(), artifact.getProject(), - artifact.getVersion(), artifact.getId() ); + listener.deleteArtifact( metadataRepository, repository.getId(), artifact.getNamespace(), + artifact.getProject(), artifact.getVersion(), artifact.getId() ); } triggerAuditEvent( repositoryId, path, AuditEvent.REMOVE_FILE ); } } - - String msg = "Artifact \'" + groupId + ":" + artifactId + ":" + version + - "\' was successfully deleted from repository \'" + repositoryId + "\'"; - - addActionMessage( msg ); - - reset(); - return SUCCESS; + repositorySession.save(); } catch ( ContentNotFoundException e ) { @@ -286,6 +277,18 @@ public class DeleteArtifactAction addActionError( "Repository exception: " + e.getMessage() ); return ERROR; } + finally + { + repositorySession.close(); + } + + String msg = "Artifact \'" + groupId + ":" + artifactId + ":" + version + + "\' was successfully deleted from repository \'" + repositoryId + "\'"; + + addActionMessage( msg ); + + reset(); + return SUCCESS; } private File getMetadata( String targetPath ) @@ -425,9 +428,4 @@ public class DeleteArtifactAction { this.configuration = configuration; } - - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/MergeAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/MergeAction.java index 9dc984d0d..c985f0e5b 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/MergeAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/MergeAction.java @@ -19,30 +19,30 @@ package org.apache.maven.archiva.web.action; * under the License. */ -import com.opensymphony.xwork2.Validateable; import com.opensymphony.xwork2.Preparable; -import org.apache.archiva.audit.Auditable; +import com.opensymphony.xwork2.Validateable; import org.apache.archiva.audit.AuditEvent; -import org.apache.archiva.stagerepository.merge.Maven2RepositoryMerger; +import org.apache.archiva.audit.Auditable; import org.apache.archiva.metadata.model.ArtifactMetadata; +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.filter.Filter; import org.apache.archiva.metadata.repository.filter.IncludesFilter; -import org.apache.archiva.metadata.repository.MetadataRepository; -import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; -import org.apache.maven.archiva.configuration.Configuration; +import org.apache.archiva.stagerepository.merge.Maven2RepositoryMerger; import org.apache.maven.archiva.configuration.ArchivaConfiguration; +import org.apache.maven.archiva.configuration.Configuration; +import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; import org.apache.maven.archiva.web.action.admin.SchedulerAction; -import java.util.List; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; /** * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="mergeAction" instantiation-strategy="per-lookup" */ -public class - MergeAction +public class MergeAction extends PlexusActionSupport implements Validateable, Preparable, Auditable @@ -57,11 +57,6 @@ public class */ protected ArchivaConfiguration archivaConfiguration; - /** - * @plexus.requirement role-hint="default" - */ - private MetadataRepository metadataRepository; - /** * @plexus.requirement role="com.opensymphony.xwork2.Action" role-hint="schedulerAction" */ @@ -101,17 +96,19 @@ public class public String doMerge() throws Exception { + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { + MetadataRepository metadataRepository = repositorySession.getRepository(); List sourceArtifacts = metadataRepository.getArtifacts( sourceRepoId ); if ( repository.isReleases() && !repository.isSnapshots() ) { - mergeWithOutSnapshots( sourceArtifacts, sourceRepoId, repoid ); + mergeWithOutSnapshots( metadataRepository, sourceArtifacts, sourceRepoId, repoid ); } else { - repositoryMerger.merge( sourceRepoId, repoid ); + repositoryMerger.merge( metadataRepository, sourceRepoId, repoid ); for ( ArtifactMetadata metadata : sourceArtifacts ) { @@ -130,25 +127,31 @@ public class addActionError( "Error occurred while merging the repositories." ); return ERROR; } + finally + { + repositorySession.close(); + } } public String mergeBySkippingConflicts() { + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { + MetadataRepository metadataRepository = repositorySession.getRepository(); List sourceArtifacts = metadataRepository.getArtifacts( sourceRepoId ); sourceArtifacts.removeAll( conflictSourceArtifacts ); if ( repository.isReleases() && !repository.isSnapshots() ) { - mergeWithOutSnapshots( sourceArtifacts, sourceRepoId, repoid ); + mergeWithOutSnapshots( metadataRepository, sourceArtifacts, sourceRepoId, repoid ); } else { - Filter artifactsWithOutConflicts = - new IncludesFilter( sourceArtifacts ); - repositoryMerger.merge( sourceRepoId, repoid, artifactsWithOutConflicts ); + Filter artifactsWithOutConflicts = new IncludesFilter( + sourceArtifacts ); + repositoryMerger.merge( metadataRepository, sourceRepoId, repoid, artifactsWithOutConflicts ); for ( ArtifactMetadata metadata : sourceArtifacts ) { triggerAuditEvent( repoid, metadata.getId(), AuditEvent.MERGING_REPOSITORIES ); @@ -165,22 +168,31 @@ public class addActionError( "Error occurred while merging the repositories." ); return ERROR; } + finally + { + repositorySession.close(); + } } - public String mergeWithOutConlficts() + public String mergeWithOutConlficts() { - sourceRepoId = repoid + "-stage"; + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { - conflictSourceArtifacts = repositoryMerger.getConflictingArtifacts( sourceRepoId, repoid ); + conflictSourceArtifacts = repositoryMerger.getConflictingArtifacts( repositorySession.getRepository(), + sourceRepoId, repoid ); } catch ( Exception e ) { addActionError( "Error occurred while merging the repositories." ); return ERROR; } + finally + { + repositorySession.close(); + } addActionMessage( "Repository '" + sourceRepoId + "' successfully merged to '" + repoid + "'." ); @@ -201,9 +213,18 @@ public class throws Exception { sourceRepoId = repoid + "-stage"; - conflictSourceArtifacts = repositoryMerger.getConflictingArtifacts( sourceRepoId, repoid ); + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + conflictSourceArtifacts = repositoryMerger.getConflictingArtifacts( repositorySession.getRepository(), + sourceRepoId, repoid ); + } + finally + { + repositorySession.close(); + } this.scheduler.setRepoid( repoid ); - + Configuration config = archivaConfiguration.getConfiguration(); this.repository = config.findManagedRepositoryById( repoid ); setConflictSourceArtifactsToBeDisplayed( conflictSourceArtifacts ); @@ -263,7 +284,8 @@ public class } } - private void mergeWithOutSnapshots( List sourceArtifacts, String sourceRepoId, String repoid ) + private void mergeWithOutSnapshots( MetadataRepository metadataRepository, List sourceArtifacts, + String sourceRepoId, String repoid ) throws Exception { List artifactsWithOutSnapshots = new ArrayList(); @@ -283,7 +305,7 @@ public class sourceArtifacts.removeAll( artifactsWithOutSnapshots ); Filter artifactListWithOutSnapShots = new IncludesFilter( sourceArtifacts ); - repositoryMerger.merge( sourceRepoId, repoid, artifactListWithOutSnapShots ); + repositoryMerger.merge( metadataRepository, sourceRepoId, repoid, artifactListWithOutSnapShots ); } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java index aadc0bd34..d42d78245 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java @@ -24,6 +24,7 @@ import com.opensymphony.xwork2.ActionSupport; import org.apache.archiva.audit.AuditEvent; import org.apache.archiva.audit.AuditListener; import org.apache.archiva.audit.Auditable; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.maven.archiva.security.ArchivaXworkUser; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.SessionAware; @@ -51,9 +52,14 @@ public abstract class PlexusActionSupport */ private List auditListeners = new ArrayList(); + /** + * @plexus.requirement + */ + protected RepositorySessionFactory repositorySessionFactory; + private String principal; - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public void setSession( Map map ) { this.session = map; @@ -78,7 +84,7 @@ public abstract class PlexusActionSupport { AuditEvent event = new AuditEvent( repositoryId, getPrincipal(), resource, action ); event.setRemoteIP( getRemoteAddr() ); - + for ( AuditListener listener : auditListeners ) { listener.auditEvent( event ); @@ -89,7 +95,7 @@ public abstract class PlexusActionSupport { AuditEvent event = new AuditEvent( null, getPrincipal(), resource, action ); event.setRemoteIP( getRemoteAddr() ); - + for ( AuditListener listener : auditListeners ) { listener.auditEvent( event ); @@ -100,7 +106,7 @@ public abstract class PlexusActionSupport { AuditEvent event = new AuditEvent( null, getPrincipal(), null, action ); event.setRemoteIP( getRemoteAddr() ); - + for ( AuditListener listener : auditListeners ) { listener.auditEvent( event ); @@ -122,7 +128,7 @@ public abstract class PlexusActionSupport } return ArchivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() ); } - + void setPrincipal( String principal ) { this.principal = principal; @@ -132,4 +138,9 @@ public abstract class PlexusActionSupport { this.auditListeners = auditListeners; } + + public void setRepositorySessionFactory( RepositorySessionFactory repositorySessionFactory ) + { + this.repositorySessionFactory = repositorySessionFactory; + } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java index b8da4fa53..c3c17048d 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java @@ -1,5 +1,5 @@ package org.apache.maven.archiva.web.action; - + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -19,12 +19,6 @@ package org.apache.maven.archiva.web.action; * under the License. */ -import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - import com.opensymphony.xwork2.Preparable; import org.apache.archiva.indexer.search.RepositorySearch; import org.apache.archiva.indexer.search.RepositorySearchException; @@ -34,6 +28,7 @@ import org.apache.archiva.indexer.search.SearchResultLimits; import org.apache.archiva.indexer.search.SearchResults; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.common.utils.VersionUtil; @@ -43,12 +38,18 @@ import org.apache.struts2.ServletActionContext; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + /** * Search all indexed fields by the given criteria. * * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="searchAction" instantiation-strategy="per-lookup" */ -public class SearchAction +public class SearchAction extends AbstractRepositoryBasedAction implements Preparable { @@ -70,15 +71,15 @@ public class SearchAction private static final String ARTIFACT = "artifact"; private List databaseResults; - + private int currentPage = 0; - + private int totalPages; - + private boolean searchResultsOnly; - + private String completeQueryString; - + private static final String COMPLETE_QUERY_STRING_SEPARATOR = ";"; private List managedRepositoryList; @@ -102,16 +103,11 @@ public class SearchAction private boolean fromResultsPage; private RepositorySearch nexusSearch; - + private Map searchFields; private String infoMessage; - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - public boolean isFromResultsPage() { return fromResultsPage; @@ -141,25 +137,25 @@ public class SearchAction { managedRepositoryList.add( "all" ); } - + searchFields = new LinkedHashMap(); searchFields.put( "groupId", "Group ID" ); searchFields.put( "artifactId", "Artifact ID" ); searchFields.put( "version", "Version" ); - searchFields.put( "className", "Class/Package Name" ); + searchFields.put( "className", "Class/Package Name" ); searchFields.put( "rowCount", "Row Count" ); - - super.clearErrorsAndMessages(); + + super.clearErrorsAndMessages(); clearSearchFields(); } - + private void clearSearchFields() { repositoryId = ""; artifactId = ""; groupId = ""; version = ""; - className = ""; + className = ""; rowCount = 30; currentPage = 0; } @@ -167,44 +163,42 @@ public class SearchAction // advanced search MRM-90 -- filtered search public String filteredSearch() throws MalformedURLException - { - if ( ( groupId == null || "".equals( groupId ) ) && - ( artifactId == null || "".equals( artifactId ) ) && ( className == null || "".equals( className ) ) && - ( version == null || "".equals( version ) ) ) - { + { + if ( ( groupId == null || "".equals( groupId ) ) && ( artifactId == null || "".equals( artifactId ) ) && + ( className == null || "".equals( className ) ) && ( version == null || "".equals( version ) ) ) + { addActionError( "Advanced Search - At least one search criteria must be provided." ); return INPUT; } - + fromFilterSearch = true; - + if ( CollectionUtils.isEmpty( managedRepositoryList ) ) - { + { return GlobalResults.ACCESS_TO_NO_REPOS; } SearchResultLimits limits = new SearchResultLimits( currentPage ); limits.setPageSize( rowCount ); List selectedRepos = new ArrayList(); - - if ( repositoryId == null || StringUtils.isBlank( repositoryId ) || - "all".equals( StringUtils.stripToEmpty( repositoryId ) ) ) + + if ( repositoryId == null || StringUtils.isBlank( repositoryId ) || "all".equals( StringUtils.stripToEmpty( + repositoryId ) ) ) { selectedRepos = getObservableRepos(); } else { selectedRepos.add( repositoryId ); - } + } if ( CollectionUtils.isEmpty( selectedRepos ) ) - { + { return GlobalResults.ACCESS_TO_NO_REPOS; } - SearchFields searchFields = - new SearchFields( groupId, artifactId, version, null, className, selectedRepos ); - + SearchFields searchFields = new SearchFields( groupId, artifactId, version, null, className, selectedRepos ); + // TODO: add packaging in the list of fields for advanced search (UI)? try { @@ -215,7 +209,7 @@ public class SearchAction addActionError( e.getMessage() ); return ERROR; } - + if ( results.isEmpty() ) { addActionError( "No results found" ); @@ -229,19 +223,19 @@ public class SearchAction totalPages = totalPages + 1; } - for (SearchResultHit hit : results.getHits()) + for ( SearchResultHit hit : results.getHits() ) { final String version = hit.getVersion(); - if (version != null) + if ( version != null ) { - hit.setVersion(VersionUtil.getBaseVersion(version)); + hit.setVersion( VersionUtil.getBaseVersion( version ) ); } } return SUCCESS; } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public String quickSearch() throws MalformedURLException { @@ -265,14 +259,15 @@ public class SearchAction try { - if( searchResultsOnly && !completeQueryString.equals( "" ) ) - { - results = getNexusSearch().search( getPrincipal(), selectedRepos, q, limits, parseCompleteQueryString() ); + if ( searchResultsOnly && !completeQueryString.equals( "" ) ) + { + results = getNexusSearch().search( getPrincipal(), selectedRepos, q, limits, + parseCompleteQueryString() ); } else { - completeQueryString = ""; - results = getNexusSearch().search( getPrincipal(), selectedRepos, q, limits, null ); + completeQueryString = ""; + results = getNexusSearch().search( getPrincipal(), selectedRepos, q, limits, null ); } } catch ( RepositorySearchException e ) @@ -289,16 +284,16 @@ public class SearchAction totalPages = results.getTotalHits() / limits.getPageSize(); - if( (results.getTotalHits() % limits.getPageSize()) != 0 ) + if ( ( results.getTotalHits() % limits.getPageSize() ) != 0 ) { totalPages = totalPages + 1; } - if( !isEqualToPreviousSearchTerm( q ) ) + if ( !isEqualToPreviousSearchTerm( q ) ) { buildCompleteQueryString( q ); } - + return SUCCESS; } @@ -314,9 +309,18 @@ public class SearchAction } databaseResults = new ArrayList(); - for ( String repoId : getObservableRepos() ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + MetadataRepository metadataRepository = repositorySession.getRepository(); + for ( String repoId : getObservableRepos() ) + { + databaseResults.addAll( metadataRepository.getArtifactsByChecksum( repoId, q ) ); + } + } + finally { - databaseResults.addAll( metadataRepository.getArtifactsByChecksum( repoId, q ) ); + repositorySession.close(); } if ( databaseResults.isEmpty() ) @@ -333,7 +337,7 @@ public class SearchAction return RESULTS; } - + public String doInput() { return INPUT; @@ -541,11 +545,11 @@ public class SearchAction public RepositorySearch getNexusSearch() { // no need to do this when wiring is already in spring - if( nexusSearch == null ) + if ( nexusSearch == null ) { - WebApplicationContext wac = - WebApplicationContextUtils.getRequiredWebApplicationContext( ServletActionContext.getServletContext() ); - nexusSearch = ( RepositorySearch ) wac.getBean( "nexusSearch" ); + WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext( + ServletActionContext.getServletContext() ); + nexusSearch = (RepositorySearch) wac.getBean( "nexusSearch" ); } return nexusSearch; } @@ -564,7 +568,7 @@ public class SearchAction { this.searchFields = searchFields; } - + public String getInfoMessage() { return infoMessage; @@ -574,9 +578,4 @@ public class SearchAction { this.infoMessage = infoMessage; } - - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java index f75229ec8..dfa486870 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java @@ -30,6 +30,7 @@ import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet; import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.model.ArtifactReference; @@ -63,21 +64,11 @@ public class ShowArtifactAction { /* .\ Not Exposed \._____________________________________________ */ - /** - * @plexus.requirement - */ - private MetadataResolver metadataResolver; - /** * @plexus.requirement */ private RepositoryContentFactory repositoryFactory; - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - /* .\ Exposed Output Objects \.__________________________________ */ private String groupId; @@ -120,15 +111,26 @@ public class ShowArtifactAction */ public String artifact() { + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + return handleArtifact( repositorySession ); + } + finally + { + repositorySession.close(); + } + } + private String handleArtifact( RepositorySession session ) + { // In the future, this should be replaced by the repository grouping mechanism, so that we are only making // simple resource requests here and letting the resolver take care of it - String errorMsg = null; - ProjectVersionMetadata versionMetadata = getProjectVersionMetadata(); + ProjectVersionMetadata versionMetadata = getProjectVersionMetadata( session ); if ( versionMetadata == null ) { - addActionError( errorMsg != null ? errorMsg : "Artifact not found" ); + addActionError( "Artifact not found" ); return ERROR; } @@ -142,13 +144,14 @@ public class ShowArtifactAction return SUCCESS; } - private ProjectVersionMetadata getProjectVersionMetadata() + private ProjectVersionMetadata getProjectVersionMetadata( RepositorySession session ) { ProjectVersionMetadata versionMetadata = null; artifacts = new LinkedHashMap>(); List repos = getObservableRepos(); + MetadataResolver metadataResolver = session.getResolver(); for ( String repoId : repos ) { if ( versionMetadata == null ) @@ -157,7 +160,8 @@ public class ShowArtifactAction // "just-in-time" nature of picking up the metadata (if appropriate for the repository type) is used try { - versionMetadata = metadataResolver.resolveProjectVersion( repoId, groupId, artifactId, version ); + versionMetadata = metadataResolver.resolveProjectVersion( session, repoId, groupId, artifactId, + version ); } catch ( MetadataResolutionException e ) { @@ -174,7 +178,8 @@ public class ShowArtifactAction List artifacts; try { - artifacts = new ArrayList( metadataResolver.resolveArtifacts( repoId, groupId, + artifacts = new ArrayList( metadataResolver.resolveArtifacts( session, repoId, + groupId, artifactId, version ) ); } @@ -262,10 +267,20 @@ public class ShowArtifactAction { List references = new ArrayList(); // TODO: what if we get duplicates across repositories? - for ( String repoId : getObservableRepos() ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - // TODO: what about if we want to see this irrespective of version? - references.addAll( metadataResolver.resolveProjectReferences( repoId, groupId, artifactId, version ) ); + MetadataResolver metadataResolver = repositorySession.getResolver(); + for ( String repoId : getObservableRepos() ) + { + // TODO: what about if we want to see this irrespective of version? + references.addAll( metadataResolver.resolveProjectReferences( repositorySession, repoId, groupId, + artifactId, version ) ); + } + } + finally + { + repositorySession.close(); } this.dependees = references; @@ -314,47 +329,57 @@ public class ShowArtifactAction public String addMetadataProperty() { - String errorMsg = null; - - ProjectVersionMetadata projectMetadata = getProjectVersionMetadata(); - if ( projectMetadata == null ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + ProjectVersionMetadata projectMetadata; + try { - addActionError( errorMsg != null ? errorMsg : "Artifact not found" ); - return ERROR; - } + MetadataRepository metadataRepository = repositorySession.getRepository(); + projectMetadata = getProjectVersionMetadata( repositorySession ); + if ( projectMetadata == null ) + { + addActionError( "Artifact not found" ); + return ERROR; + } - if ( projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ) == null ) - { - genericMetadata = new HashMap(); - } - else - { - genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties(); - } + if ( projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ) == null ) + { + genericMetadata = new HashMap(); + } + else + { + genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties(); + } - if ( propertyName == null || "".equals( propertyName.trim() ) || propertyValue == null || "".equals( - propertyValue.trim() ) ) - { - model = projectMetadata; - addActionError( errorMsg != null ? errorMsg : "Property Name and Property Value are required." ); - return INPUT; - } + if ( propertyName == null || "".equals( propertyName.trim() ) || propertyValue == null || "".equals( + propertyValue.trim() ) ) + { + model = projectMetadata; + addActionError( "Property Name and Property Value are required." ); + return INPUT; + } - genericMetadata.put( propertyName, propertyValue ); + genericMetadata.put( propertyName, propertyValue ); - try - { - updateProjectMetadata( projectMetadata ); + try + { + updateProjectMetadata( projectMetadata, metadataRepository ); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to persist modified project metadata after adding entry: " + e.getMessage(), e ); + addActionError( + "Unable to add metadata item to underlying content storage - consult application logs." ); + return ERROR; + } + + // TODO: why re-retrieve? + projectMetadata = getProjectVersionMetadata( repositorySession ); } - catch ( MetadataRepositoryException e ) + finally { - log.warn( "Unable to persist modified project metadata after adding entry: " + e.getMessage(), e ); - addActionError( "Unable to add metadata item to underlying content storage - consult application logs." ); - return ERROR; + repositorySession.close(); } - projectMetadata = getProjectVersionMetadata(); - genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties(); model = projectMetadata; @@ -367,57 +392,66 @@ public class ShowArtifactAction public String deleteMetadataEntry() { - ProjectVersionMetadata projectMetadata = getProjectVersionMetadata(); - String errorMsg = null; - - if ( projectMetadata == null ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - addActionError( "Artifact not found" ); - return ERROR; - } + MetadataRepository metadataRepository = repositorySession.getRepository(); + ProjectVersionMetadata projectMetadata = getProjectVersionMetadata( repositorySession ); - if ( projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ) != null ) - { - genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties(); + if ( projectMetadata == null ) + { + addActionError( "Artifact not found" ); + return ERROR; + } - if ( !StringUtils.isEmpty( deleteItem ) ) + if ( projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ) != null ) { - genericMetadata.remove( deleteItem ); + genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties(); - try - { - updateProjectMetadata( projectMetadata ); - } - catch ( MetadataRepositoryException e ) + if ( !StringUtils.isEmpty( deleteItem ) ) { - log.warn( "Unable to persist modified project metadata after removing entry: " + e.getMessage(), - e ); - addActionError( - "Unable to remove metadata item to underlying content storage - consult application logs." ); - return ERROR; - } + genericMetadata.remove( deleteItem ); - projectMetadata = getProjectVersionMetadata(); + try + { + updateProjectMetadata( projectMetadata, metadataRepository ); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to persist modified project metadata after removing entry: " + e.getMessage(), + e ); + addActionError( + "Unable to remove metadata item to underlying content storage - consult application logs." ); + return ERROR; + } - genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties(); + // TODO: why re-retrieve? + projectMetadata = getProjectVersionMetadata( repositorySession ); - model = projectMetadata; + genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties(); - addActionMessage( "Property successfully deleted." ); - } + model = projectMetadata; + + addActionMessage( "Property successfully deleted." ); + } - deleteItem = ""; + deleteItem = ""; + } + else + { + addActionError( "No generic metadata facet for this artifact." ); + return ERROR; + } } - else + finally { - addActionError( "No generic metadata facet for this artifact." ); - return ERROR; + repositorySession.close(); } return SUCCESS; } - private void updateProjectMetadata( ProjectVersionMetadata projectMetadata ) + private void updateProjectMetadata( ProjectVersionMetadata projectMetadata, MetadataRepository metadataRepository ) throws MetadataRepositoryException { GenericMetadataFacet genericMetadataFacet = new GenericMetadataFacet(); @@ -507,11 +541,6 @@ public class ShowArtifactAction this.repositoryId = repositoryId; } - public MetadataResolver getMetadataResolver() - { - return metadataResolver; - } - public Map> getArtifacts() { return artifacts; @@ -567,11 +596,6 @@ public class ShowArtifactAction this.repositoryFactory = repositoryFactory; } - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } - // TODO: move this into the artifact metadata itself via facets where necessary public class ArtifactDownloadInfo diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java index a4fe04d9a..3112a56d6 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java @@ -23,6 +23,7 @@ import com.opensymphony.xwork2.Preparable; import org.apache.archiva.audit.AuditEvent; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.Configuration; @@ -55,11 +56,6 @@ public class DeleteManagedRepositoryAction */ private RepositoryStatisticsManager repositoryStatisticsManager; - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - public void prepare() { if ( StringUtils.isNotBlank( repoid ) ) @@ -103,17 +99,18 @@ public class DeleteManagedRepositoryAction String result; + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { Configuration configuration = archivaConfiguration.getConfiguration(); if ( attachedStagingRepo != null ) { - cleanupRepositoryData( attachedStagingRepo ); + cleanupRepositoryData( attachedStagingRepo, repositorySession ); removeRepository( repoid + "-stage", configuration ); triggerAuditEvent( repoid + "-stage", null, AuditEvent.DELETE_MANAGED_REPO ); } - cleanupRepositoryData( existingRepository ); + cleanupRepositoryData( existingRepository, repositorySession ); removeRepository( repoid, configuration ); triggerAuditEvent( repoid, null, AuditEvent.DELETE_MANAGED_REPO ); result = saveConfiguration( configuration ); @@ -148,17 +145,24 @@ public class DeleteManagedRepositoryAction "Unable to delete repository, content may already be partially removed: " + e.getMessage() ); result = ERROR; } + finally + { + repositorySession.close(); + } return result; } - private void cleanupRepositoryData( ManagedRepositoryConfiguration cleanupRepository ) + private void cleanupRepositoryData( ManagedRepositoryConfiguration cleanupRepository, + RepositorySession repositorySession ) throws RoleManagerException, MetadataRepositoryException { removeRepositoryRoles( cleanupRepository ); - cleanupDatabase( cleanupRepository.getId() ); - repositoryStatisticsManager.deleteStatistics( cleanupRepository.getId() ); + MetadataRepository metadataRepository = repositorySession.getRepository(); + cleanupDatabase( metadataRepository, cleanupRepository.getId() ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, cleanupRepository.getId() ); // TODO: delete all content for a repository from the content API? + repositorySession.save(); List proxyConnectors = getProxyConnectors(); for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors ) @@ -184,7 +188,7 @@ public class DeleteManagedRepositoryAction } } - private void cleanupDatabase( String repoId ) + private void cleanupDatabase( MetadataRepository metadataRepository, String repoId ) throws MetadataRepositoryException { metadataRepository.removeRepository( repoId ); @@ -214,9 +218,4 @@ public class DeleteManagedRepositoryAction { this.repositoryStatisticsManager = repositoryStatisticsManager; } - - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java index b29d5dec0..4e193c17f 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java @@ -23,6 +23,7 @@ import com.opensymphony.xwork2.Preparable; import com.opensymphony.xwork2.Validateable; import org.apache.archiva.audit.AuditEvent; import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.Configuration; @@ -127,6 +128,7 @@ public class EditManagedRepositoryAction // Save the repository configuration. String result; + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { addRepository( repository, configuration ); @@ -154,7 +156,8 @@ public class EditManagedRepositoryAction result = saveConfiguration( configuration ); if ( resetStats ) { - resetStatistics(); + repositoryStatisticsManager.deleteStatistics( repositorySession.getRepository(), repository.getId() ); + repositorySession.save(); } } catch ( IOException e ) @@ -172,6 +175,10 @@ public class EditManagedRepositoryAction addActionError( "Metadata Exception: " + e.getMessage() ); result = ERROR; } + finally + { + repositorySession.close(); + } return result; } @@ -225,12 +232,6 @@ public class EditManagedRepositoryAction } } - private void resetStatistics() - throws MetadataRepositoryException - { - repositoryStatisticsManager.deleteStatistics( repository.getId() ); - } - public String getRepoid() { return repoid; diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java index caf61f06e..edd7cf820 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java @@ -20,7 +20,9 @@ package org.apache.maven.archiva.web.action.admin.repositories; */ import com.opensymphony.xwork2.Preparable; +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.maven.archiva.configuration.ArchivaConfiguration; @@ -107,24 +109,33 @@ public class RepositoriesAction Collections.sort( remoteRepositories, new RepositoryConfigurationComparator() ); repositoryStatistics = new HashMap(); - for ( ManagedRepositoryConfiguration repo : managedRepositories ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - RepositoryStatistics stats = null; - try + MetadataRepository metadataRepository = repositorySession.getRepository(); + for ( ManagedRepositoryConfiguration repo : managedRepositories ) { - stats = repositoryStatisticsManager.getLastStatistics( repo.getId() ); - } - catch ( MetadataRepositoryException e ) - { - addActionError( - "Error retrieving statistics for repository " + repo.getId() + " - consult application logs" ); - log.warn( "Error retrieving repository statistics: " + e.getMessage(), e ); - } - if ( stats != null ) - { - repositoryStatistics.put( repo.getId(), stats ); + RepositoryStatistics stats = null; + try + { + stats = repositoryStatisticsManager.getLastStatistics( metadataRepository, repo.getId() ); + } + catch ( MetadataRepositoryException e ) + { + addActionError( + "Error retrieving statistics for repository " + repo.getId() + " - consult application logs" ); + log.warn( "Error retrieving repository statistics: " + e.getMessage(), e ); + } + if ( stats != null ) + { + repositoryStatistics.put( repo.getId(), stats ); + } } } + finally + { + repositorySession.close(); + } } public List getManagedRepositories() diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java index abd346192..1037a0aca 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java @@ -22,6 +22,7 @@ package org.apache.maven.archiva.web.action.reports; import com.opensymphony.xwork2.Preparable; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.archiva.reports.RepositoryProblemFacet; @@ -110,11 +111,6 @@ public class GenerateReportAction private boolean lastPage; - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - @SuppressWarnings( "unchecked" ) public void prepare() { @@ -163,112 +159,123 @@ public class GenerateReportAction Date startDateInDF; Date endDateInDF; - if ( selectedRepositories.size() > 1 ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - numPages = 1; - - try + MetadataRepository metadataRepository = repositorySession.getRepository(); + if ( selectedRepositories.size() > 1 ) { - startDateInDF = getStartDateInDateFormat(); - endDateInDF = getEndDateInDateFormat(); - } - catch ( ParseException e ) - { - addActionError( "Error parsing date(s)." ); - return ERROR; - } + numPages = 1; - if ( startDateInDF != null && endDateInDF != null && startDateInDF.after( endDateInDF ) ) - { - addFieldError( "startDate", "Start Date must be earlier than the End Date" ); - return INPUT; - } - - // multiple repos - for ( String repo : selectedRepositories ) - { - List stats = null; try { - stats = repositoryStatisticsManager.getStatisticsInRange( repo, startDateInDF, endDateInDF ); - } - catch ( MetadataRepositoryException e ) - { - log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); + startDateInDF = getStartDateInDateFormat(); + endDateInDF = getEndDateInDateFormat(); } - if ( stats == null || stats.isEmpty() ) + catch ( ParseException e ) { - log.info( "No statistics available for repository '" + repo + "'." ); - // TODO set repo's stats to 0 - continue; + addActionError( "Error parsing date(s)." ); + return ERROR; } - repositoryStatistics.add( stats.get( 0 ) ); - } - } - else if ( selectedRepositories.size() == 1 ) - { - repositoryId = selectedRepositories.get( 0 ); - try - { - startDateInDF = getStartDateInDateFormat(); - endDateInDF = getEndDateInDateFormat(); - if ( startDateInDF != null && endDateInDF != null && startDateInDF.after( endDateInDF ) ) { addFieldError( "startDate", "Start Date must be earlier than the End Date" ); return INPUT; } - List stats = null; - try + // multiple repos + for ( String repo : selectedRepositories ) { - stats = repositoryStatisticsManager.getStatisticsInRange( repositoryId, startDateInDF, - endDateInDF ); + List stats = null; + try + { + stats = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, repo, + startDateInDF, endDateInDF ); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); + } + if ( stats == null || stats.isEmpty() ) + { + log.info( "No statistics available for repository '" + repo + "'." ); + // TODO set repo's stats to 0 + continue; + } + + repositoryStatistics.add( stats.get( 0 ) ); } - catch ( MetadataRepositoryException e ) + } + else if ( selectedRepositories.size() == 1 ) + { + repositoryId = selectedRepositories.get( 0 ); + try { - log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); + startDateInDF = getStartDateInDateFormat(); + endDateInDF = getEndDateInDateFormat(); + + if ( startDateInDF != null && endDateInDF != null && startDateInDF.after( endDateInDF ) ) + { + addFieldError( "startDate", "Start Date must be earlier than the End Date" ); + return INPUT; + } + + List stats = null; + try + { + stats = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, repositoryId, + startDateInDF, endDateInDF ); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); + } + if ( stats == null || stats.isEmpty() ) + { + addActionError( + "No statistics available for repository. Repository might not have been scanned." ); + return ERROR; + } + + int rowCount = getRowCount(); + int extraPage = ( stats.size() % rowCount ) != 0 ? 1 : 0; + int totalPages = ( stats.size() / rowCount ) + extraPage; + numPages = totalPages; + + int currentPage = getPage(); + if ( currentPage > totalPages ) + { + addActionError( + "Error encountered while generating report :: The requested page exceeds the total number of pages." ); + return ERROR; + } + + int start = rowCount * ( currentPage - 1 ); + int end = ( start + rowCount ) - 1; + + if ( end > stats.size() ) + { + end = stats.size() - 1; + } + + repositoryStatistics = stats.subList( start, end + 1 ); } - if ( stats == null || stats.isEmpty() ) + catch ( ParseException pe ) { - addActionError( "No statistics available for repository. Repository might not have been scanned." ); + addActionError( pe.getMessage() ); return ERROR; } - - int rowCount = getRowCount(); - int extraPage = ( stats.size() % rowCount ) != 0 ? 1 : 0; - int totalPages = ( stats.size() / rowCount ) + extraPage; - numPages = totalPages; - - int currentPage = getPage(); - if ( currentPage > totalPages ) - { - addActionError( - "Error encountered while generating report :: The requested page exceeds the total number of pages." ); - return ERROR; - } - - int start = rowCount * ( currentPage - 1 ); - int end = ( start + rowCount ) - 1; - - if ( end > stats.size() ) - { - end = stats.size() - 1; - } - - repositoryStatistics = stats.subList( start, end + 1 ); } - catch ( ParseException pe ) + else { - addActionError( pe.getMessage() ); - return ERROR; + addFieldError( "availableRepositories", "Please select a repository (or repositories) from the list." ); + return INPUT; } } - else + finally { - addFieldError( "availableRepositories", "Please select a repository (or repositories) from the list." ); - return INPUT; + repositorySession.close(); } if ( repositoryStatistics.isEmpty() ) @@ -293,102 +300,58 @@ public class GenerateReportAction List repositoryStatistics = new ArrayList(); StringBuffer input; - if ( selectedRepositories.size() > 1 ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - try - { - startDateInDF = getStartDateInDateFormat(); - endDateInDF = getEndDateInDateFormat(); - } - catch ( ParseException e ) + MetadataRepository metadataRepository = repositorySession.getRepository(); + if ( selectedRepositories.size() > 1 ) { - addActionError( "Error parsing date(s)." ); - return ERROR; - } - - if ( startDateInDF != null && endDateInDF != null && startDateInDF.after( endDateInDF ) ) - { - addFieldError( "startDate", "Start Date must be earlier than the End Date" ); - return INPUT; - } - - input = new StringBuffer( - "Repository,Total File Count,Total Size,Artifact Count,Group Count,Project Count,Plugins,Archetypes," + - "Jars,Wars\n" ); - - // multiple repos - for ( String repo : selectedRepositories ) - { - List stats = null; try { - stats = repositoryStatisticsManager.getStatisticsInRange( repo, startDateInDF, endDateInDF ); + startDateInDF = getStartDateInDateFormat(); + endDateInDF = getEndDateInDateFormat(); } - catch ( MetadataRepositoryException e ) + catch ( ParseException e ) { - log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); - } - if ( stats == null || stats.isEmpty() ) - { - log.info( "No statistics available for repository '" + repo + "'." ); - // TODO set repo's stats to 0 - continue; + addActionError( "Error parsing date(s)." ); + return ERROR; } - // only the first one - RepositoryStatistics repositoryStats = stats.get( 0 ); - repositoryStatistics.add( repositoryStats ); - - input.append( repo ).append( "," ); - input.append( repositoryStats.getTotalFileCount() ).append( "," ); - input.append( repositoryStats.getTotalArtifactFileSize() ).append( "," ); - input.append( repositoryStats.getTotalArtifactCount() ).append( "," ); - input.append( repositoryStats.getTotalGroupCount() ).append( "," ); - input.append( repositoryStats.getTotalProjectCount() ).append( "," ); - input.append( repositoryStats.getTotalCountForType( "maven-plugin" ) ).append( "," ); - input.append( repositoryStats.getTotalCountForType( "maven-archetype" ) ).append( "," ); - input.append( repositoryStats.getTotalCountForType( "jar" ) ).append( "," ); - input.append( repositoryStats.getTotalCountForType( "war" ) ); - input.append( "\n" ); - } - } - else if ( selectedRepositories.size() == 1 ) - { - repositoryId = selectedRepositories.get( 0 ); - try - { - startDateInDF = getStartDateInDateFormat(); - endDateInDF = getEndDateInDateFormat(); - if ( startDateInDF != null && endDateInDF != null && startDateInDF.after( endDateInDF ) ) { addFieldError( "startDate", "Start Date must be earlier than the End Date" ); return INPUT; } - List stats = null; - try - { - stats = repositoryStatisticsManager.getStatisticsInRange( repositoryId, startDateInDF, - endDateInDF ); - } - catch ( MetadataRepositoryException e ) - { - log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); - } - if ( stats == null || stats.isEmpty() ) - { - addActionError( "No statistics available for repository. Repository might not have been scanned." ); - return ERROR; - } - input = new StringBuffer( - "Date of Scan,Total File Count,Total Size,Artifact Count,Group Count,Project Count,Plugins," + - "Archetypes,Jars,Wars\n" ); + "Repository,Total File Count,Total Size,Artifact Count,Group Count,Project Count,Plugins,Archetypes," + + "Jars,Wars\n" ); - for ( RepositoryStatistics repositoryStats : stats ) + // multiple repos + for ( String repo : selectedRepositories ) { - input.append( repositoryStats.getScanStartTime() ).append( "," ); + List stats = null; + try + { + stats = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, repo, + startDateInDF, endDateInDF ); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); + } + if ( stats == null || stats.isEmpty() ) + { + log.info( "No statistics available for repository '" + repo + "'." ); + // TODO set repo's stats to 0 + continue; + } + + // only the first one + RepositoryStatistics repositoryStats = stats.get( 0 ); + repositoryStatistics.add( repositoryStats ); + + input.append( repo ).append( "," ); input.append( repositoryStats.getTotalFileCount() ).append( "," ); input.append( repositoryStats.getTotalArtifactFileSize() ).append( "," ); input.append( repositoryStats.getTotalArtifactCount() ).append( "," ); @@ -400,19 +363,74 @@ public class GenerateReportAction input.append( repositoryStats.getTotalCountForType( "war" ) ); input.append( "\n" ); } - - repositoryStatistics = stats; } - catch ( ParseException pe ) + else if ( selectedRepositories.size() == 1 ) + { + repositoryId = selectedRepositories.get( 0 ); + try + { + startDateInDF = getStartDateInDateFormat(); + endDateInDF = getEndDateInDateFormat(); + + if ( startDateInDF != null && endDateInDF != null && startDateInDF.after( endDateInDF ) ) + { + addFieldError( "startDate", "Start Date must be earlier than the End Date" ); + return INPUT; + } + + List stats = null; + try + { + stats = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, repositoryId, + startDateInDF, endDateInDF ); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e ); + } + if ( stats == null || stats.isEmpty() ) + { + addActionError( + "No statistics available for repository. Repository might not have been scanned." ); + return ERROR; + } + + input = new StringBuffer( + "Date of Scan,Total File Count,Total Size,Artifact Count,Group Count,Project Count,Plugins," + + "Archetypes,Jars,Wars\n" ); + + for ( RepositoryStatistics repositoryStats : stats ) + { + input.append( repositoryStats.getScanStartTime() ).append( "," ); + input.append( repositoryStats.getTotalFileCount() ).append( "," ); + input.append( repositoryStats.getTotalArtifactFileSize() ).append( "," ); + input.append( repositoryStats.getTotalArtifactCount() ).append( "," ); + input.append( repositoryStats.getTotalGroupCount() ).append( "," ); + input.append( repositoryStats.getTotalProjectCount() ).append( "," ); + input.append( repositoryStats.getTotalCountForType( "maven-plugin" ) ).append( "," ); + input.append( repositoryStats.getTotalCountForType( "maven-archetype" ) ).append( "," ); + input.append( repositoryStats.getTotalCountForType( "jar" ) ).append( "," ); + input.append( repositoryStats.getTotalCountForType( "war" ) ); + input.append( "\n" ); + } + + repositoryStatistics = stats; + } + catch ( ParseException pe ) + { + addActionError( pe.getMessage() ); + return ERROR; + } + } + else { - addActionError( pe.getMessage() ); - return ERROR; + addFieldError( "availableRepositories", "Please select a repository (or repositories) from the list." ); + return INPUT; } } - else + finally { - addFieldError( "availableRepositories", "Please select a repository (or repositories) from the list." ); - return INPUT; + repositorySession.close(); } if ( repositoryStatistics.isEmpty() ) @@ -528,20 +546,29 @@ public class GenerateReportAction } List problemArtifacts = new ArrayList(); - for ( String repoId : repoIds ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - // TODO: improve performance by navigating into a group subtree. Currently group is property, not part of name of item - for ( String name : metadataRepository.getMetadataFacets( repoId, RepositoryProblemFacet.FACET_ID ) ) + MetadataRepository metadataRepository = repositorySession.getRepository(); + for ( String repoId : repoIds ) { - RepositoryProblemFacet metadataFacet = (RepositoryProblemFacet) metadataRepository.getMetadataFacet( - repoId, RepositoryProblemFacet.FACET_ID, name ); - - if ( StringUtils.isEmpty( groupId ) || groupId.equals( metadataFacet.getNamespace() ) ) + // TODO: improve performance by navigating into a group subtree. Currently group is property, not part of name of item + for ( String name : metadataRepository.getMetadataFacets( repoId, RepositoryProblemFacet.FACET_ID ) ) { - problemArtifacts.add( metadataFacet ); + RepositoryProblemFacet metadataFacet = (RepositoryProblemFacet) metadataRepository.getMetadataFacet( + repoId, RepositoryProblemFacet.FACET_ID, name ); + + if ( StringUtils.isEmpty( groupId ) || groupId.equals( metadataFacet.getNamespace() ) ) + { + problemArtifacts.add( metadataFacet ); + } } } } + finally + { + repositorySession.close(); + } // TODO: getting range only after reading is not efficient for a large number of artifacts int lowerBound = ( page - 1 ) * rowCount; @@ -727,9 +754,4 @@ public class GenerateReportAction { this.repositoryStatisticsManager = repositoryStatisticsManager; } - - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java index 0030d1050..7aa735bbb 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java @@ -22,6 +22,7 @@ package org.apache.maven.archiva.web.action.reports; import com.opensymphony.xwork2.Preparable; import org.apache.archiva.audit.AuditEvent; import org.apache.archiva.audit.AuditManager; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.maven.archiva.security.AccessDeniedException; @@ -119,7 +120,7 @@ public class ViewAuditLogReportAction this.request = request; } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public void prepare() throws Exception { @@ -142,7 +143,15 @@ public class ViewAuditLogReportAction headerName = HEADER_RESULTS; } - auditLogs = auditManager.getMostRecentAuditEvents( repos ); + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + auditLogs = auditManager.getMostRecentAuditEvents( repositorySession.getRepository(), repos ); + } + finally + { + repositorySession.close(); + } } public String execute() @@ -205,7 +214,16 @@ public class ViewAuditLogReportAction } } - auditLogs = auditManager.getAuditEventsInRange( repos, resource, startDateInDF, endDateInDF ); + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + auditLogs = auditManager.getAuditEventsInRange( repositorySession.getRepository(), repos, resource, + startDateInDF, endDateInDF ); + } + finally + { + repositorySession.close(); + } if ( auditLogs.isEmpty() ) { diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/rss/RssFeedServlet.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/rss/RssFeedServlet.java index 093abb7d6..7ccbacc18 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/rss/RssFeedServlet.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/rss/RssFeedServlet.java @@ -19,20 +19,11 @@ package org.apache.maven.archiva.web.rss; * under the License. */ -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedOutput; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.rss.processor.RssFeedProcessor; import org.apache.commons.codec.Decoder; import org.apache.commons.codec.DecoderException; @@ -60,10 +51,19 @@ import org.slf4j.LoggerFactory; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + /** * Servlet for handling rss feed requests. - * - * @version */ public class RssFeedServlet extends HttpServlet @@ -87,18 +87,23 @@ public class RssFeedServlet private ServletAuthenticator servletAuth; private HttpAuthenticator httpAuth; - + + private RepositorySessionFactory repositorySessionFactory; + public void init( javax.servlet.ServletConfig servletConfig ) throws ServletException { super.init( servletConfig ); wac = WebApplicationContextUtils.getRequiredWebApplicationContext( servletConfig.getServletContext() ); - userRepositories = - (UserRepositories) wac.getBean( PlexusToSpringUtils.buildSpringId( UserRepositories.class.getName() ) ); - servletAuth = - (ServletAuthenticator) wac.getBean( PlexusToSpringUtils.buildSpringId( ServletAuthenticator.class.getName() ) ); - httpAuth = - (HttpAuthenticator) wac.getBean( PlexusToSpringUtils.buildSpringId( HttpAuthenticator.ROLE, "basic" ) ); + userRepositories = (UserRepositories) wac.getBean( PlexusToSpringUtils.buildSpringId( + UserRepositories.class.getName() ) ); + servletAuth = (ServletAuthenticator) wac.getBean( PlexusToSpringUtils.buildSpringId( + ServletAuthenticator.class.getName() ) ); + httpAuth = (HttpAuthenticator) wac.getBean( PlexusToSpringUtils.buildSpringId( HttpAuthenticator.ROLE, + "basic" ) ); + // TODO: what if there are other types? + repositorySessionFactory = (RepositorySessionFactory) wac.getBean( PlexusToSpringUtils.buildSpringId( + RepositorySessionFactory.class.getName() ) ); } public void doGet( HttpServletRequest req, HttpServletResponse res ) @@ -107,15 +112,15 @@ public class RssFeedServlet String repoId = null; String groupId = null; String artifactId = null; - - String url = StringUtils.removeEnd( req.getRequestURL().toString(), "/" ); - if( StringUtils.countMatches( StringUtils.substringAfter( url, "feeds/" ), "/" ) > 0 ) + + String url = StringUtils.removeEnd( req.getRequestURL().toString(), "/" ); + if ( StringUtils.countMatches( StringUtils.substringAfter( url, "feeds/" ), "/" ) > 0 ) { artifactId = StringUtils.substringAfterLast( url, "/" ); - groupId = StringUtils.substringBeforeLast( StringUtils.substringAfter( url, "feeds/" ), "/"); + groupId = StringUtils.substringBeforeLast( StringUtils.substringAfter( url, "feeds/" ), "/" ); groupId = StringUtils.replaceChars( groupId, '/', '.' ); } - else if( StringUtils.countMatches( StringUtils.substringAfter( url, "feeds/" ), "/" ) == 0 ) + else if ( StringUtils.countMatches( StringUtils.substringAfter( url, "feeds/" ), "/" ) == 0 ) { repoId = StringUtils.substringAfterLast( url, "/" ); } @@ -123,32 +128,28 @@ public class RssFeedServlet { res.sendError( HttpServletResponse.SC_BAD_REQUEST, "Invalid request url." ); return; - } - + } + try { Map map = new HashMap(); SyndFeed feed = null; - + if ( isAllowed( req, repoId, groupId, artifactId ) ) { if ( repoId != null ) { // new artifacts in repo feed request - processor = - (RssFeedProcessor) wac.getBean( PlexusToSpringUtils.buildSpringId( - RssFeedProcessor.class.getName(), - "new-artifacts" ) ); + processor = (RssFeedProcessor) wac.getBean( PlexusToSpringUtils.buildSpringId( + RssFeedProcessor.class.getName(), "new-artifacts" ) ); map.put( RssFeedProcessor.KEY_REPO_ID, repoId ); } else if ( ( groupId != null ) && ( artifactId != null ) ) { // TODO: this only works for guest - we could pass in the list of repos // new versions of artifact feed request - processor = - (RssFeedProcessor) wac.getBean( PlexusToSpringUtils.buildSpringId( - RssFeedProcessor.class.getName(), - "new-versions" ) ); + processor = (RssFeedProcessor) wac.getBean( PlexusToSpringUtils.buildSpringId( + RssFeedProcessor.class.getName(), "new-versions" ) ); map.put( RssFeedProcessor.KEY_GROUP_ID, groupId ); map.put( RssFeedProcessor.KEY_ARTIFACT_ID, artifactId ); } @@ -159,22 +160,30 @@ public class RssFeedServlet return; } - feed = processor.process( map ); - if( feed == null ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + feed = processor.process( map, repositorySession.getRepository() ); + } + finally + { + repositorySession.close(); + } + if ( feed == null ) { res.sendError( HttpServletResponse.SC_NO_CONTENT, "No information available." ); return; } - + res.setContentType( MIME_TYPE ); - + if ( repoId != null ) - { + { feed.setLink( req.getRequestURL().toString() ); } else if ( ( groupId != null ) && ( artifactId != null ) ) { - feed.setLink( req.getRequestURL().toString() ); + feed.setLink( req.getRequestURL().toString() ); } SyndFeedOutput output = new SyndFeedOutput(); @@ -186,11 +195,11 @@ public class RssFeedServlet res.sendError( HttpServletResponse.SC_UNAUTHORIZED, COULD_NOT_AUTHENTICATE_USER ); } catch ( AccountLockedException acce ) - { + { res.sendError( HttpServletResponse.SC_UNAUTHORIZED, COULD_NOT_AUTHENTICATE_USER ); } catch ( AuthenticationException authe ) - { + { log.debug( COULD_NOT_AUTHENTICATE_USER, authe ); res.sendError( HttpServletResponse.SC_UNAUTHORIZED, COULD_NOT_AUTHENTICATE_USER ); } @@ -200,7 +209,7 @@ public class RssFeedServlet res.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, COULD_NOT_GENERATE_FEED_ERROR ); } catch ( MustChangePasswordException e ) - { + { res.sendError( HttpServletResponse.SC_UNAUTHORIZED, COULD_NOT_AUTHENTICATE_USER ); } catch ( UnauthorizedException e ) @@ -208,24 +217,25 @@ public class RssFeedServlet log.debug( e.getMessage() ); if ( repoId != null ) { - res.setHeader("WWW-Authenticate", "Basic realm=\"Repository Archiva Managed " + repoId + " Repository" ); + res.setHeader( "WWW-Authenticate", + "Basic realm=\"Repository Archiva Managed " + repoId + " Repository" ); } else { - res.setHeader("WWW-Authenticate", "Basic realm=\"Artifact " + groupId + ":" + artifactId ); + res.setHeader( "WWW-Authenticate", "Basic realm=\"Artifact " + groupId + ":" + artifactId ); } - + res.sendError( HttpServletResponse.SC_UNAUTHORIZED, USER_NOT_AUTHORIZED ); } } /** * Basic authentication. - * + * * @param req * @param repositoryId TODO - * @param groupId TODO - * @param artifactId TODO + * @param groupId TODO + * @param artifactId TODO * @return */ private boolean isAllowed( HttpServletRequest req, String repositoryId, String groupId, String artifactId ) @@ -287,20 +297,20 @@ public class RssFeedServlet AuthenticationResult result = httpAuth.getAuthenticationResult( req, null ); SecuritySession securitySession = httpAuth.getSecuritySession( req.getSession( true ) ); - if ( servletAuth.isAuthenticated( req, result ) - && servletAuth.isAuthorized( req, securitySession, repoId, - ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ) + if ( servletAuth.isAuthenticated( req, result ) && servletAuth.isAuthorized( req, securitySession, + repoId, + ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ) { return true; } } catch ( AuthorizationException e ) { - + } catch ( UnauthorizedException e ) { - + } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml index 0cc09c392..6cf66939e 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml @@ -7,6 +7,8 @@ + + @@ -40,8 +42,7 @@ - - + @@ -51,7 +52,7 @@ - + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java index 2e94a4068..8a731908f 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java @@ -23,6 +23,7 @@ import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; import java.util.Collection; import java.util.Collections; @@ -48,24 +49,26 @@ public class TestMetadataResolver private Map> versionsInProject = new HashMap>(); - public ProjectVersionMetadata resolveProjectVersion( String repoId, String namespace, String projectId, - String projectVersion ) + public ProjectVersionMetadata resolveProjectVersion( RepositorySession repositorySession, String repoId, + String namespace, String projectId, String projectVersion ) { return projectVersions.get( createMapKey( repoId, namespace, projectId, projectVersion ) ); } - public Collection resolveProjectReferences( String repoId, String namespace, + public Collection resolveProjectReferences( RepositorySession repositorySession, + String repoId, String namespace, String projectId, String projectVersion ) { return references.get( createMapKey( repoId, namespace, projectId, projectVersion ) ); } - public Collection resolveRootNamespaces( String repoId ) + public Collection resolveRootNamespaces( RepositorySession repositorySession, String repoId ) { - return resolveNamespaces( repoId, null ); + return resolveNamespaces( repositorySession, repoId, null ); } - public Collection resolveNamespaces( String repoId, String baseNamespace ) + public Collection resolveNamespaces( RepositorySession repositorySession, String repoId, + String baseNamespace ) { Set namespaces = new LinkedHashSet(); int fromIndex = baseNamespace != null ? baseNamespace.length() + 1 : 0; @@ -87,20 +90,21 @@ public class TestMetadataResolver return namespaces; } - public Collection resolveProjects( String repoId, String namespace ) + public Collection resolveProjects( RepositorySession repositorySession, String repoId, String namespace ) { Collection list = projectsInNamespace.get( namespace ); return list != null ? list : Collections.emptyList(); } - public Collection resolveProjectVersions( String repoId, String namespace, String projectId ) + public Collection resolveProjectVersions( RepositorySession repositorySession, String repoId, + String namespace, String projectId ) { Collection list = versionsInProject.get( namespace + ":" + projectId ); return list != null ? list : Collections.emptyList(); } - public Collection resolveArtifacts( String repoId, String namespace, String projectId, - String projectVersion ) + public Collection resolveArtifacts( RepositorySession repositorySession, String repoId, + String namespace, String projectId, String projectVersion ) { List artifacts = this.artifacts.get( createMapKey( repoId, namespace, projectId, projectVersion ) ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestRepositorySessionFactory.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestRepositorySessionFactory.java new file mode 100644 index 000000000..233333ef1 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestRepositorySessionFactory.java @@ -0,0 +1,40 @@ +package org.apache.archiva.metadata.repository.memory; + +/* + * 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.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; + +public class TestRepositorySessionFactory + implements RepositorySessionFactory +{ + private RepositorySession repositorySession; + + public void setRepositorySession( RepositorySession repositorySession ) + { + this.repositorySession = repositorySession; + } + + public RepositorySession createSession() + { + return repositorySession != null ? repositorySession : new RepositorySession( new TestMetadataRepository(), + new TestMetadataResolver() ); + } +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java index bee91623c..3b46ee8cf 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java @@ -21,12 +21,18 @@ package org.apache.maven.archiva.web.action; import com.opensymphony.xwork2.Action; import org.apache.archiva.metadata.model.ProjectVersionMetadata; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.memory.TestMetadataResolver; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import java.util.Arrays; import java.util.Collections; import java.util.List; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + public class BrowseActionTest extends AbstractActionTestCase { @@ -385,6 +391,10 @@ public class BrowseActionTest { super.setUp(); action = (BrowseAction) lookup( Action.class, ACTION_HINT ); - metadataResolver = (TestMetadataResolver) action.getMetadataResolver(); + metadataResolver = new TestMetadataResolver(); + RepositorySession repositorySession = mock( RepositorySession.class ); + when( repositorySession.getResolver() ).thenReturn( metadataResolver ); + TestRepositorySessionFactory factory = (TestRepositorySessionFactory) lookup( RepositorySessionFactory.class ); + factory.setRepositorySession( repositorySession ); } } \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java index cc478358e..0d14c6cb3 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java @@ -22,6 +22,9 @@ package org.apache.maven.archiva.web.action; import com.opensymphony.xwork2.Action; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; @@ -35,7 +38,9 @@ import org.easymock.classextension.MockClassControl; import java.io.File; import java.util.ArrayList; -import java.util.Collection; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class DeleteArtifactActionTest extends PlexusInSpringTestCase @@ -74,17 +79,23 @@ public class DeleteArtifactActionTest assertNotNull( action ); configurationControl = MockControl.createControl( ArchivaConfiguration.class ); - configuration = ( ArchivaConfiguration ) configurationControl.getMock(); + configuration = (ArchivaConfiguration) configurationControl.getMock(); repositoryFactoryControl = MockClassControl.createControl( RepositoryContentFactory.class ); - repositoryFactory = ( RepositoryContentFactory ) repositoryFactoryControl.getMock(); + repositoryFactory = (RepositoryContentFactory) repositoryFactoryControl.getMock(); metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); - metadataRepository = ( MetadataRepository ) metadataRepositoryControl.getMock(); + metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); + + RepositorySession repositorySession = mock( RepositorySession.class ); + when( repositorySession.getRepository() ).thenReturn( metadataRepository ); + + TestRepositorySessionFactory repositorySessionFactory = (TestRepositorySessionFactory) lookup( + RepositorySessionFactory.class ); + repositorySessionFactory.setRepositorySession( repositorySession ); action.setConfiguration( configuration ); action.setRepositoryFactory( repositoryFactory ); - action.setMetadataRepository( metadataRepository ); } @Override @@ -92,7 +103,7 @@ public class DeleteArtifactActionTest throws Exception { action = null; - + super.tearDown(); } @@ -117,8 +128,10 @@ public class DeleteArtifactActionTest repoContent.setRepository( config.findManagedRepositoryById( REPOSITORY_ID ) ); configurationControl.expectAndReturn( configuration.getConfiguration(), config ); - repositoryFactoryControl.expectAndReturn( repositoryFactory.getManagedRepositoryContent( REPOSITORY_ID ), repoContent ); - metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( REPOSITORY_ID, GROUP_ID, ARTIFACT_ID, VERSION ), + repositoryFactoryControl.expectAndReturn( repositoryFactory.getManagedRepositoryContent( REPOSITORY_ID ), + repoContent ); + metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( REPOSITORY_ID, GROUP_ID, + ARTIFACT_ID, VERSION ), new ArrayList() ); configurationControl.replay(); @@ -133,7 +146,7 @@ public class DeleteArtifactActionTest assertFalse( new File( artifactPath + ".jar" ).exists() ); assertFalse( new File( artifactPath + ".jar.sha1" ).exists() ); assertFalse( new File( artifactPath + ".jar.md5" ).exists() ); - + assertFalse( new File( artifactPath + ".pom" ).exists() ); assertFalse( new File( artifactPath + ".pom.sha1" ).exists() ); assertFalse( new File( artifactPath + ".pom.md5" ).exists() ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java index 8063c92bd..dd9bce7ff 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java @@ -28,6 +28,9 @@ import org.apache.archiva.indexer.search.SearchResults; import org.apache.archiva.indexer.util.SearchUtil; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.security.UserRepositories; import org.codehaus.plexus.spring.PlexusInSpringTestCase; @@ -38,6 +41,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * */ @@ -60,6 +66,8 @@ public class SearchActionTest private static final String GUEST = "guest"; + private RepositorySession session; + @Override protected void setUp() throws Exception @@ -68,28 +76,26 @@ public class SearchActionTest action = new SearchAction(); + session = mock( RepositorySession.class ); + TestRepositorySessionFactory factory = (TestRepositorySessionFactory) lookup( RepositorySessionFactory.class ); + factory.setRepositorySession( session ); + action.setRepositorySessionFactory( factory ); + MockControl archivaConfigControl = MockControl.createControl( ArchivaConfiguration.class ); ArchivaConfiguration archivaConfig = (ArchivaConfiguration) archivaConfigControl.getMock(); userReposControl = MockControl.createControl( UserRepositories.class ); - userRepos = ( UserRepositories ) userReposControl.getMock(); + userRepos = (UserRepositories) userReposControl.getMock(); searchControl = MockControl.createControl( RepositorySearch.class ); searchControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER ); - search = ( RepositorySearch ) searchControl.getMock(); + search = (RepositorySearch) searchControl.getMock(); action.setArchivaConfiguration( archivaConfig ); action.setUserRepositories( userRepos ); action.setNexusSearch( search ); } - @Override - protected void tearDown() - throws Exception - { - super.tearDown(); - } - // quick search... public void testQuickSearch() @@ -372,7 +378,7 @@ public class SearchActionTest assertEquals( Action.INPUT, result ); assertFalse( action.getActionErrors().isEmpty() ); - assertEquals( "No results found",( String ) action.getActionErrors().iterator().next() ); + assertEquals( "No results found", (String) action.getActionErrors().iterator().next() ); searchControl.verify(); } @@ -413,14 +419,14 @@ public class SearchActionTest MockControl control = MockControl.createControl( MetadataRepository.class ); MetadataRepository metadataRepository = (MetadataRepository) control.getMock(); - action.setMetadataRepository( metadataRepository ); + when( session.getRepository() ).thenReturn( metadataRepository ); ArtifactMetadata artifact = createArtifact( "archiva-configuration", "1.0" ); control.expectAndReturn( metadataRepository.getArtifactsByChecksum( TEST_REPO, TEST_CHECKSUM ), Collections.singletonList( artifact ) ); - userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( GUEST ), - Collections.singletonList( TEST_REPO ) ); + userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( GUEST ), Collections.singletonList( + TEST_REPO ) ); control.replay(); userReposControl.replay(); @@ -441,14 +447,14 @@ public class SearchActionTest MockControl control = MockControl.createControl( MetadataRepository.class ); MetadataRepository metadataRepository = (MetadataRepository) control.getMock(); - action.setMetadataRepository( metadataRepository ); + when( session.getRepository() ).thenReturn( metadataRepository ); List artifacts = Arrays.asList( createArtifact( "archiva-configuration", "1.0" ), createArtifact( "archiva-indexer", "1.0" ) ); control.expectAndReturn( metadataRepository.getArtifactsByChecksum( TEST_REPO, TEST_CHECKSUM ), artifacts ); - userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( GUEST ), - Collections.singletonList( TEST_REPO ) ); + userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( GUEST ), Collections.singletonList( + TEST_REPO ) ); control.replay(); userReposControl.replay(); @@ -469,7 +475,7 @@ public class SearchActionTest assertEquals( Action.INPUT, result ); assertFalse( action.getActionErrors().isEmpty() ); - assertEquals( "Unable to search for a blank checksum", ( String ) action.getActionErrors().iterator().next() ); + assertEquals( "Unable to search for a blank checksum", (String) action.getActionErrors().iterator().next() ); } public void testFindArtifactNoResults() @@ -479,13 +485,13 @@ public class SearchActionTest MockControl control = MockControl.createControl( MetadataRepository.class ); MetadataRepository metadataRepository = (MetadataRepository) control.getMock(); - action.setMetadataRepository( metadataRepository ); + when( session.getRepository() ).thenReturn( metadataRepository ); control.expectAndReturn( metadataRepository.getArtifactsByChecksum( TEST_REPO, TEST_CHECKSUM ), Collections.emptyList() ); - userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( GUEST ), - Collections.singletonList( TEST_REPO ) ); + userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( GUEST ), Collections.singletonList( + TEST_REPO ) ); control.replay(); userReposControl.replay(); @@ -493,7 +499,7 @@ public class SearchActionTest String result = action.findArtifact(); assertEquals( Action.INPUT, result ); assertFalse( action.getActionErrors().isEmpty() ); - assertEquals( "No results found", ( String )action.getActionErrors().iterator().next() ); + assertEquals( "No results found", (String) action.getActionErrors().iterator().next() ); control.verify(); userReposControl.verify(); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java index 7685d1430..abbcf4f9b 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java @@ -26,7 +26,10 @@ import org.apache.archiva.metadata.model.MailingList; import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.memory.TestMetadataResolver; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet; import org.apache.maven.archiva.common.utils.VersionUtil; import org.apache.maven.archiva.configuration.ArchivaConfiguration; @@ -411,9 +414,6 @@ public class ShowArtifactActionTest action.setPropertyValue( "bar" ); action.setRepositoryId( TEST_REPO ); - MetadataRepository repo = mock( MetadataRepository.class ); - action.setMetadataRepository( repo ); - String result = action.addMetadataProperty(); assertActionSuccess( action, result ); @@ -631,7 +631,15 @@ public class ShowArtifactActionTest { super.setUp(); action = (ShowArtifactAction) lookup( Action.class, ACTION_HINT ); - metadataResolver = (TestMetadataResolver) action.getMetadataResolver(); + + metadataResolver = new TestMetadataResolver(); + MetadataRepository repo = mock( MetadataRepository.class ); + RepositorySession repositorySession = mock( RepositorySession.class ); + when( repositorySession.getResolver() ).thenReturn( metadataResolver ); + when( repositorySession.getRepository() ).thenReturn( repo ); + TestRepositorySessionFactory repositorySessionFactory = (TestRepositorySessionFactory) lookup( + RepositorySessionFactory.class ); + repositorySessionFactory.setRepositorySession( repositorySession ); RepositoryContentFactory factory = mock( RepositoryContentFactory.class ); action.setRepositoryFactory( factory ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java index dbe9aef7b..3ebc67947 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java @@ -23,7 +23,9 @@ import com.opensymphony.xwork2.Action; import org.apache.archiva.audit.AuditEvent; import org.apache.archiva.audit.AuditListener; import org.apache.archiva.metadata.repository.MetadataRepository; -import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; @@ -47,6 +49,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * DeleteManagedRepositoryActionTest * @@ -73,6 +78,12 @@ public class DeleteManagedRepositoryActionTest private RepositoryStatisticsManager repositoryStatisticsManager; + private MetadataRepository metadataRepository; + + private RepositorySession respositorySession; + + private MockControl metadataRepositoryControl; + protected void setUp() throws Exception { @@ -93,10 +104,15 @@ public class DeleteManagedRepositoryActionTest repositoryStatisticsManager = (RepositoryStatisticsManager) repositoryStatisticsManagerControl.getMock(); action.setRepositoryStatisticsManager( repositoryStatisticsManager ); - MockControl metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); - MetadataRepository metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); + metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); + metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); metadataRepository.removeRepository( REPO_ID ); - action.setMetadataRepository( metadataRepository ); + + respositorySession = mock( RepositorySession.class ); + when( respositorySession.getRepository() ).thenReturn( metadataRepository ); + TestRepositorySessionFactory factory = (TestRepositorySessionFactory) lookup( RepositorySessionFactory.class ); + factory.setRepositorySession( respositorySession ); + action.setRepositorySessionFactory( factory ); metadataRepositoryControl.replay(); } @@ -149,7 +165,7 @@ public class DeleteManagedRepositoryActionTest throws Exception { // even when we keep the content, we don't keep the metadata at this point - repositoryStatisticsManager.deleteStatistics( REPO_ID ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, REPO_ID ); repositoryStatisticsManagerControl.replay(); prepareRoleManagerMock(); @@ -158,7 +174,7 @@ public class DeleteManagedRepositoryActionTest MockControl control = mockAuditListeners(); - MockControl metadataRepositoryControl = mockMetadataRepository(); + when( respositorySession.getRepository() ).thenReturn( metadataRepository ); String status = action.deleteEntry(); @@ -173,17 +189,6 @@ public class DeleteManagedRepositoryActionTest metadataRepositoryControl.verify(); } - private MockControl mockMetadataRepository() - throws MetadataRepositoryException - { - MockControl metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); - MetadataRepository metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); - metadataRepository.removeRepository( REPO_ID ); - metadataRepositoryControl.replay(); - action.setMetadataRepository( metadataRepository ); - return metadataRepositoryControl; - } - private MockControl mockAuditListeners() { MockControl control = MockControl.createControl( AuditListener.class ); @@ -198,7 +203,7 @@ public class DeleteManagedRepositoryActionTest public void testDeleteRepositoryDeleteContent() throws Exception { - repositoryStatisticsManager.deleteStatistics( REPO_ID ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, REPO_ID ); repositoryStatisticsManagerControl.replay(); prepareRoleManagerMock(); @@ -207,7 +212,7 @@ public class DeleteManagedRepositoryActionTest MockControl control = mockAuditListeners(); - MockControl metadataRepositoryControl = mockMetadataRepository(); + when( respositorySession.getRepository() ).thenReturn( metadataRepository ); String status = action.deleteContents(); @@ -225,7 +230,7 @@ public class DeleteManagedRepositoryActionTest public void testDeleteRepositoryAndAssociatedProxyConnectors() throws Exception { - repositoryStatisticsManager.deleteStatistics( REPO_ID ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, REPO_ID ); repositoryStatisticsManagerControl.replay(); Configuration configuration = prepDeletionTest( createRepository(), 5 ); @@ -238,7 +243,7 @@ public class DeleteManagedRepositoryActionTest assertEquals( 1, configuration.getProxyConnectors().size() ); MockControl control = mockAuditListeners(); - MockControl metadataRepositoryControl = mockMetadataRepository(); + when( respositorySession.getRepository() ).thenReturn( metadataRepository ); String status = action.deleteContents(); assertEquals( Action.SUCCESS, status ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java index 7f2fc6ec3..2117184e9 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java @@ -19,11 +19,11 @@ package org.apache.maven.archiva.web.action.admin.repositories; * under the License. */ -import java.io.File; -import java.io.IOException; -import java.util.Collections; - import com.opensymphony.xwork2.Action; +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.commons.io.FileUtils; import org.apache.maven.archiva.configuration.ArchivaConfiguration; @@ -36,6 +36,13 @@ import org.codehaus.redback.integration.interceptor.SecureActionBundle; import org.codehaus.redback.integration.interceptor.SecureActionException; import org.easymock.MockControl; +import java.io.File; +import java.io.IOException; +import java.util.Collections; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * EditManagedRepositoryActionTest * @@ -58,6 +65,8 @@ public class EditManagedRepositoryActionTest private File location; + private MetadataRepository metadataRepository; + protected void setUp() throws Exception { @@ -73,6 +82,13 @@ public class EditManagedRepositoryActionTest roleManager = (RoleManager) roleManagerControl.getMock(); action.setRoleManager( roleManager ); location = getTestFile( "target/test/location" ); + + metadataRepository = mock( MetadataRepository.class ); + RepositorySession repositorySession = mock( RepositorySession.class ); + when( repositorySession.getRepository() ).thenReturn( metadataRepository ); + TestRepositorySessionFactory factory = (TestRepositorySessionFactory) lookup( RepositorySessionFactory.class ); + factory.setRepositorySession( repositorySession ); + action.setRepositorySessionFactory( factory ); } public void testSecureActionBundle() @@ -121,7 +137,7 @@ public class EditManagedRepositoryActionTest roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID ); roleManagerControl.setReturnValue( false ); - roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID +"-stage" ); + roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID + "-stage" ); roleManagerControl.setReturnValue( false ); roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID ); @@ -129,7 +145,7 @@ public class EditManagedRepositoryActionTest roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID ); roleManagerControl.setReturnValue( false ); - roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID +"-stage"); + roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID + "-stage" ); roleManagerControl.setReturnValue( false ); roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID ); @@ -184,7 +200,7 @@ public class EditManagedRepositoryActionTest roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID ); roleManagerControl.setReturnValue( false ); - roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID +"-stage"); + roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID + "-stage" ); roleManagerControl.setReturnValue( false ); roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID ); @@ -192,7 +208,7 @@ public class EditManagedRepositoryActionTest roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID ); roleManagerControl.setReturnValue( false ); - roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID +"-stage"); + roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID + "-stage" ); roleManagerControl.setReturnValue( false ); roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID ); @@ -207,7 +223,6 @@ public class EditManagedRepositoryActionTest stageRepoConfiguration.addManagedRepository( createStagingRepository() ); archivaConfigurationControl.setReturnValue( stageRepoConfiguration ); - archivaConfigurationControl.setReturnValue( configuration ); archivaConfigurationControl.setReturnValue( configuration ); @@ -219,7 +234,7 @@ public class EditManagedRepositoryActionTest RepositoryStatisticsManager repositoryStatisticsManager = (RepositoryStatisticsManager) repositoryStatisticsManagerControl.getMock(); action.setRepositoryStatisticsManager( repositoryStatisticsManager ); - repositoryStatisticsManager.deleteStatistics( REPO_ID ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, REPO_ID ); repositoryStatisticsManagerControl.replay(); action.setRepoid( REPO_ID ); @@ -300,10 +315,11 @@ public class EditManagedRepositoryActionTest repository.setScanned( false ); repository.setDeleteReleasedSnapshots( true ); } + private void populateStagingRepository( ManagedRepositoryConfiguration repository ) throws IOException { - repository.setId( REPO_ID + "-stage"); + repository.setId( REPO_ID + "-stage" ); repository.setName( "repo name" ); repository.setLocation( location.getCanonicalPath() ); repository.setLayout( "default" ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesActionTest.java index 3e8d28009..f8e2f0b33 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesActionTest.java @@ -19,20 +19,24 @@ package org.apache.maven.archiva.web.action.admin.repositories; * under the License. */ -import java.util.Arrays; - import com.meterware.servletunit.ServletRunner; import com.meterware.servletunit.ServletUnitClient; import com.opensymphony.xwork2.Action; import org.apache.archiva.metadata.repository.MetadataRepository; -import org.apache.archiva.metadata.repository.stats.DefaultRepositoryStatisticsManager; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; -import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.codehaus.plexus.spring.PlexusInSpringTestCase; import org.codehaus.redback.integration.interceptor.SecureActionBundle; import org.codehaus.redback.integration.interceptor.SecureActionException; import org.easymock.MockControl; +import java.util.Arrays; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * Test the repositories action returns the correct data. */ @@ -46,7 +50,16 @@ public class RepositoriesActionTest { super.setUp(); - action = (RepositoriesAction) lookup( Action.class.getName(), "repositoriesAction" ); + try + { + action = (RepositoriesAction) lookup( Action.class.getName(), "repositoriesAction" ); + } + catch ( Exception e ) + { + // clean up cache - TODO: move handling to plexus-spring + applicationContext.close(); + throw e; + } } public void testGetRepositories() @@ -56,19 +69,20 @@ public class RepositoriesActionTest MetadataRepository metadataRepository = (MetadataRepository) control.getMock(); control.expectAndReturn( metadataRepository.getMetadataFacets( "internal", RepositoryStatistics.FACET_ID ), Arrays.asList( "20091125.123456.678" ) ); - control.expectAndReturn( - metadataRepository.getMetadataFacet( "internal", RepositoryStatistics.FACET_ID, "20091125.123456.678" ), - new RepositoryStatistics() ); + control.expectAndReturn( metadataRepository.getMetadataFacet( "internal", RepositoryStatistics.FACET_ID, + "20091125.123456.678" ), + new RepositoryStatistics() ); control.expectAndReturn( metadataRepository.getMetadataFacets( "snapshots", RepositoryStatistics.FACET_ID ), Arrays.asList( "20091112.012345.012" ) ); - control.expectAndReturn( - metadataRepository.getMetadataFacet( "snapshots", RepositoryStatistics.FACET_ID, "20091112.012345.012" ), - new RepositoryStatistics() ); + control.expectAndReturn( metadataRepository.getMetadataFacet( "snapshots", RepositoryStatistics.FACET_ID, + "20091112.012345.012" ), + new RepositoryStatistics() ); control.replay(); - DefaultRepositoryStatisticsManager statsManager = - (DefaultRepositoryStatisticsManager) lookup( RepositoryStatisticsManager.class ); - statsManager.setMetadataRepository( metadataRepository ); + RepositorySession session = mock( RepositorySession.class ); + when( session.getRepository() ).thenReturn( metadataRepository ); + TestRepositorySessionFactory factory = (TestRepositorySessionFactory) lookup( RepositorySessionFactory.class ); + factory.setRepositorySession( session ); ServletRunner sr = new ServletRunner(); ServletUnitClient sc = sr.newClient(); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/reports/GenerateReportActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/reports/GenerateReportActionTest.java index bf309a170..3b9a45a16 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/reports/GenerateReportActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/reports/GenerateReportActionTest.java @@ -22,6 +22,9 @@ package org.apache.maven.archiva.web.action.reports; import com.opensymphony.xwork2.Action; import org.apache.archiva.metadata.model.MetadataFacet; import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.archiva.metadata.repository.stats.RepositoryStatistics; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; import org.apache.archiva.reports.RepositoryProblemFacet; @@ -36,6 +39,9 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * Test the GenerationReportAction. Note that we are testing for current behaviour, however there are several * instances below where other behaviour may actually be more appropriate (eg the error handling, download stats should @@ -68,7 +74,16 @@ public class GenerateReportActionTest { super.setUp(); - action = (GenerateReportAction) lookup( Action.class, "generateReport" ); + try + { + action = (GenerateReportAction) lookup( Action.class, "generateReport" ); + } + catch ( Exception e ) + { + // clean up cache - TODO: move handling to plexus-spring + applicationContext.close(); + throw e; + } repositoryStatisticsManagerControl = MockControl.createControl( RepositoryStatisticsManager.class ); repositoryStatisticsManager = (RepositoryStatisticsManager) repositoryStatisticsManagerControl.getMock(); @@ -76,7 +91,12 @@ public class GenerateReportActionTest metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); - action.setMetadataRepository( metadataRepository ); + + RepositorySession repositorySession = mock( RepositorySession.class ); + when( repositorySession.getRepository() ).thenReturn( metadataRepository ); + + TestRepositorySessionFactory factory = (TestRepositorySessionFactory) lookup( RepositorySessionFactory.class ); + factory.setRepositorySession( repositorySession ); } private void prepareAction( List selectedRepositories, List availableRepositories ) @@ -169,10 +189,8 @@ public class GenerateReportActionTest public void testGenerateStatisticsSingleRepo() throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.singletonList( createDefaultStats() ) ); repositoryStatisticsManagerControl.replay(); prepareAction( Collections.singletonList( INTERNAL ), Collections.singletonList( SNAPSHOTS ) ); @@ -186,10 +204,8 @@ public class GenerateReportActionTest throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.emptyList() ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.emptyList() ); repositoryStatisticsManagerControl.replay(); prepareAction( Collections.singletonList( INTERNAL ), Collections.singletonList( SNAPSHOTS ) ); @@ -204,10 +220,8 @@ public class GenerateReportActionTest throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.singletonList( createDefaultStats() ) ); repositoryStatisticsManagerControl.replay(); action.setPage( 2 ); prepareAction( Collections.singletonList( INTERNAL ), Collections.singletonList( SNAPSHOTS ) ); @@ -222,14 +236,10 @@ public class GenerateReportActionTest throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( SNAPSHOTS, - null, - null ), - Collections.emptyList() ); - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.emptyList() ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, SNAPSHOTS, null, null ), Collections.emptyList() ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.emptyList() ); repositoryStatisticsManagerControl.replay(); prepareAction( Arrays.asList( SNAPSHOTS, INTERNAL ), Collections.emptyList() ); @@ -246,14 +256,10 @@ public class GenerateReportActionTest throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( SNAPSHOTS, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, SNAPSHOTS, null, null ), Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.singletonList( createDefaultStats() ) ); repositoryStatisticsManagerControl.replay(); prepareAction( Arrays.asList( SNAPSHOTS, INTERNAL ), Collections.emptyList() ); @@ -267,10 +273,8 @@ public class GenerateReportActionTest throws Exception { Date date = new Date(); - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( SNAPSHOTS, - null, - null ), - Collections.singletonList( createStats( date ) ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, SNAPSHOTS, null, null ), Collections.singletonList( createStats( date ) ) ); repositoryStatisticsManagerControl.replay(); prepareAction( Arrays.asList( SNAPSHOTS ), Arrays.asList( INTERNAL ) ); @@ -289,14 +293,10 @@ public class GenerateReportActionTest public void testDownloadStatisticsMultipleRepos() throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( SNAPSHOTS, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, SNAPSHOTS, null, null ), Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.singletonList( createDefaultStats() ) ); repositoryStatisticsManagerControl.replay(); prepareAction( Arrays.asList( SNAPSHOTS, INTERNAL ), Collections.emptyList() ); @@ -367,10 +367,8 @@ public class GenerateReportActionTest throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.emptyList() ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.emptyList() ); repositoryStatisticsManagerControl.replay(); prepareAction( Collections.singletonList( INTERNAL ), Collections.singletonList( SNAPSHOTS ) ); @@ -395,14 +393,10 @@ public class GenerateReportActionTest throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( SNAPSHOTS, - null, - null ), - Collections.emptyList() ); - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.emptyList() ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, SNAPSHOTS, null, null ), Collections.emptyList() ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.emptyList() ); repositoryStatisticsManagerControl.replay(); prepareAction( Arrays.asList( SNAPSHOTS, INTERNAL ), Collections.emptyList() ); @@ -417,14 +411,10 @@ public class GenerateReportActionTest public void testDownloadStatisticsMultipleRepoInStrutsFormat() throws Exception { - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( SNAPSHOTS, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); - repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( INTERNAL, - null, - null ), - Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, SNAPSHOTS, null, null ), Collections.singletonList( createDefaultStats() ) ); + repositoryStatisticsManagerControl.expectAndReturn( repositoryStatisticsManager.getStatisticsInRange( + metadataRepository, INTERNAL, null, null ), Collections.singletonList( createDefaultStats() ) ); repositoryStatisticsManagerControl.replay(); prepareAction( Arrays.asList( SNAPSHOTS, INTERNAL ), Collections.emptyList() ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/rss/RssFeedServletTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/rss/RssFeedServletTest.java index 3bb93c7f5..92027daca 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/rss/RssFeedServletTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/rss/RssFeedServletTest.java @@ -19,8 +19,6 @@ package org.apache.maven.archiva.web.rss; * under the License. */ -import javax.servlet.http.HttpServletResponse; - import com.meterware.httpunit.GetMethodWebRequest; import com.meterware.httpunit.HttpException; import com.meterware.httpunit.WebRequest; @@ -32,6 +30,8 @@ import org.apache.commons.codec.binary.Base64; import org.codehaus.plexus.spring.PlexusInSpringTestCase; import sun.misc.BASE64Encoder; +import javax.servlet.http.HttpServletResponse; + public class RssFeedServletTest extends PlexusInSpringTestCase { @@ -49,16 +49,16 @@ public class RssFeedServletTest public void testRetrieveServlet() throws Exception { - RssFeedServlet servlet = - (RssFeedServlet) client.newInvocation( "http://localhost/feeds/test-repo" ).getServlet(); + RssFeedServlet servlet = (RssFeedServlet) client.newInvocation( + "http://localhost/feeds/test-repo" ).getServlet(); assertNotNull( servlet ); } public void testRequestNewArtifactsInRepo() throws Exception { - RssFeedServlet servlet = - (RssFeedServlet) client.newInvocation( "http://localhost/feeds/test-repo" ).getServlet(); + RssFeedServlet servlet = (RssFeedServlet) client.newInvocation( + "http://localhost/feeds/test-repo" ).getServlet(); assertNotNull( servlet ); WebRequest request = new GetMethodWebRequest( "http://localhost/feeds/test-repo" ); @@ -97,8 +97,8 @@ public class RssFeedServletTest public void XXX_testInvalidRequest() throws Exception { - RssFeedServlet servlet = - (RssFeedServlet) client.newInvocation( "http://localhost/feeds?invalid_param=xxx" ).getServlet(); + RssFeedServlet servlet = (RssFeedServlet) client.newInvocation( + "http://localhost/feeds?invalid_param=xxx" ).getServlet(); assertNotNull( servlet ); try @@ -116,8 +116,8 @@ public class RssFeedServletTest public void XXX_testInvalidAuthenticationRequest() throws Exception { - RssFeedServlet servlet = - (RssFeedServlet) client.newInvocation( "http://localhost/feeds/unauthorized-repo" ).getServlet(); + RssFeedServlet servlet = (RssFeedServlet) client.newInvocation( + "http://localhost/feeds/unauthorized-repo" ).getServlet(); assertNotNull( servlet ); WebRequest request = new GetMethodWebRequest( "http://localhost/feeds/unauthorized-repo" ); @@ -142,8 +142,8 @@ public class RssFeedServletTest public void XXX_testUnauthorizedRequest() throws Exception { - RssFeedServlet servlet = - (RssFeedServlet) client.newInvocation( "http://localhost/feeds/unauthorized-repo" ).getServlet(); + RssFeedServlet servlet = (RssFeedServlet) client.newInvocation( + "http://localhost/feeds/unauthorized-repo" ).getServlet(); assertNotNull( servlet ); WebRequest request = new GetMethodWebRequest( "http://localhost/feeds/unauthorized-repo" ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/tags/DependencyTreeTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/tags/DependencyTreeTest.java index 3b6f6a799..36311d7ee 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/tags/DependencyTreeTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/tags/DependencyTreeTest.java @@ -19,11 +19,12 @@ package org.apache.maven.archiva.web.tags; * under the License. */ -import java.util.List; - import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.memory.TestMetadataResolver; +import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.maven.archiva.common.ArchivaException; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; @@ -32,6 +33,11 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.codehaus.plexus.spring.PlexusInSpringTestCase; +import java.util.List; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + public class DependencyTreeTest extends PlexusInSpringTestCase { @@ -70,6 +76,12 @@ public class DependencyTreeTest ProjectVersionMetadata metadata = new ProjectVersionMetadata(); metadata.setId( TEST_VERSION ); metadataResolver.setProjectVersion( TEST_REPO_ID, TEST_GROUP_ID, TEST_ARTIFACT_ID, metadata ); + + RepositorySession repositorySession = mock( RepositorySession.class ); + when( repositorySession.getResolver() ).thenReturn( metadataResolver ); + TestRepositorySessionFactory repositorySessionFactory = (TestRepositorySessionFactory) lookup( + RepositorySessionFactory.class ); + repositorySessionFactory.setRepositorySession( repositorySession ); } public void testTree() diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/META-INF/plexus/components.xml b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/META-INF/plexus/components.xml index 921c1cca1..6a6e174a2 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/META-INF/plexus/components.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/META-INF/plexus/components.xml @@ -29,5 +29,10 @@ archiva-mime-types.txt + + org.apache.archiva.metadata.repository.RepositorySessionFactory + default + org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory + \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml index 1517bca30..d791ce053 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml @@ -24,11 +24,5 @@ default org.apache.maven.archiva.security.UserRepositoriesStub - - org.apache.archiva.metadata.repository.MetadataResolver - default - org.apache.archiva.metadata.repository.memory.TestMetadataResolver - per-lookup - diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml index 90565d149..a38222d17 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml @@ -24,11 +24,5 @@ default org.apache.maven.archiva.security.UserRepositoriesStub - - org.apache.archiva.metadata.repository.MetadataResolver - default - org.apache.archiva.metadata.repository.memory.TestMetadataResolver - per-lookup - diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java new file mode 100644 index 000000000..2082e724a --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java @@ -0,0 +1,36 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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. + */ + +public class TestRepositorySessionFactory + implements RepositorySessionFactory +{ + private MetadataResolver resolver; + + public RepositorySession createSession() + { + return new RepositorySession( new TestMetadataRepository(), resolver ); + } + + public void setResolver( MetadataResolver resolver ) + { + this.resolver = resolver; + } +} diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/resources/META-INF/plexus/components.xml b/archiva-modules/archiva-web/archiva-webdav/src/test/resources/META-INF/plexus/components.xml index 4601bf1e4..74ecdc0b9 100644 --- a/archiva-modules/archiva-web/archiva-webdav/src/test/resources/META-INF/plexus/components.xml +++ b/archiva-modules/archiva-web/archiva-webdav/src/test/resources/META-INF/plexus/components.xml @@ -34,5 +34,9 @@ org.apache.archiva.metadata.repository.MetadataRepository org.apache.archiva.metadata.repository.TestMetadataRepository + + org.apache.archiva.metadata.repository.RepositorySessionFactory + org.apache.archiva.metadata.repository.TestRepositorySessionFactory + \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml index 06377c24d..2d6742b88 100644 --- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml +++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml @@ -18,7 +18,8 @@ ~ under the License. --> - + 4.0.0 org.apache.archiva @@ -49,7 +50,7 @@ org.apache.archiva audit - + org.apache.archiva archiva-repository-scanner @@ -83,6 +84,11 @@ org.slf4j slf4j-simple test - + + + org.mockito + mockito-all + test + diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java index 1250ec447..422960e22 100644 --- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java +++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java @@ -23,6 +23,8 @@ import org.apache.archiva.audit.AuditEvent; import org.apache.archiva.audit.AuditListener; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.filter.Filter; import org.apache.archiva.metadata.repository.filter.IncludesFilter; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; @@ -84,8 +86,6 @@ public class AdministrationServiceImpl private Collection listeners; - private MetadataRepository metadataRepository; - private RepositoryStatisticsManager repositoryStatisticsManager; private RepositoryMerger repositoryMerger; @@ -94,8 +94,11 @@ public class AdministrationServiceImpl private AuditListener auditListener; + private RepositorySessionFactory repositorySessionFactory; + public AdministrationServiceImpl( ArchivaConfiguration archivaConfig, RepositoryContentConsumers repoConsumersUtil, - RepositoryContentFactory repoFactory, MetadataRepository metadataRepository, + RepositoryContentFactory repoFactory, + RepositorySessionFactory repositorySessionFactory, RepositoryArchivaTaskScheduler repositoryTaskScheduler, Collection listeners, RepositoryStatisticsManager repositoryStatisticsManager, @@ -106,7 +109,7 @@ public class AdministrationServiceImpl this.repoFactory = repoFactory; this.repositoryTaskScheduler = repositoryTaskScheduler; this.listeners = listeners; - this.metadataRepository = metadataRepository; + this.repositorySessionFactory = repositorySessionFactory; this.repositoryStatisticsManager = repositoryStatisticsManager; this.repositoryMerger = repositoryMerger; this.auditListener = auditListener; @@ -186,6 +189,7 @@ public class AdministrationServiceImpl throw new Exception( "Repository does not exist." ); } + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { ManagedRepositoryContent repoContent = repoFactory.getManagedRepositoryContent( repoId ); @@ -197,6 +201,7 @@ public class AdministrationServiceImpl // delete from file system repoContent.deleteVersion( ref ); + MetadataRepository metadataRepository = repositorySession.getRepository(); Collection artifacts = metadataRepository.getArtifacts( repoId, groupId, artifactId, version ); @@ -212,11 +217,12 @@ public class AdministrationServiceImpl // repository metadata to an artifact for ( RepositoryListener listener : listeners ) { - listener.deleteArtifact( repoId, artifact.getNamespace(), artifact.getProject(), - artifact.getVersion(), artifact.getId() ); + listener.deleteArtifact( metadataRepository, repoId, artifact.getNamespace(), + artifact.getProject(), artifact.getVersion(), artifact.getId() ); } } } + repositorySession.save(); } catch ( ContentNotFoundException e ) { @@ -230,6 +236,10 @@ public class AdministrationServiceImpl { throw new Exception( "Repository exception occurred." ); } + finally + { + repositorySession.close(); + } return true; } @@ -407,8 +417,18 @@ public class AdministrationServiceImpl throw new Exception( "A repository with that id does not exist" ); } - metadataRepository.removeRepository( repository.getId() ); - repositoryStatisticsManager.deleteStatistics( repository.getId() ); + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + MetadataRepository metadataRepository = repositorySession.getRepository(); + metadataRepository.removeRepository( repository.getId() ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, repository.getId() ); + repositorySession.save(); + } + finally + { + repositorySession.close(); + } config.removeManagedRepository( repository ); try @@ -476,108 +496,116 @@ public class AdministrationServiceImpl log.debug( "Retrieved repository configuration for repo '" + repoId + "'" ); - if ( repoConfig != null ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - stagingConfig = config.findManagedRepositoryById( stagingId ); - - if ( stagingConfig != null ) + MetadataRepository metadataRepository = repositorySession.getRepository(); + if ( repoConfig != null ) { - List sourceArtifacts = metadataRepository.getArtifacts( stagingId ); + stagingConfig = config.findManagedRepositoryById( stagingId ); - if ( repoConfig.isReleases() && !repoConfig.isSnapshots() ) + if ( stagingConfig != null ) { - log.info( "Repository to be merged contains releases only.." ); - if ( skipConflicts ) - { - List conflicts = repositoryMerger.getConflictingArtifacts( repoId, - stagingId ); + List sourceArtifacts = metadataRepository.getArtifacts( stagingId ); - if ( log.isDebugEnabled() ) + if ( repoConfig.isReleases() && !repoConfig.isSnapshots() ) + { + log.info( "Repository to be merged contains releases only.." ); + if ( skipConflicts ) { - log.debug( "Artifacts in conflict.." ); - for ( ArtifactMetadata metadata : conflicts ) + List conflicts = repositoryMerger.getConflictingArtifacts( + metadataRepository, repoId, stagingId ); + + if ( log.isDebugEnabled() ) { - log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" + - metadata.getProjectVersion() ); + log.debug( "Artifacts in conflict.." ); + for ( ArtifactMetadata metadata : conflicts ) + { + log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" + + metadata.getProjectVersion() ); + } } - } - sourceArtifacts.removeAll( conflicts ); + sourceArtifacts.removeAll( conflicts ); - log.debug( "Source artifacts size :: " + sourceArtifacts.size() ); - mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId ); + log.debug( "Source artifacts size :: " + sourceArtifacts.size() ); + mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId, null ); + } + else + { + log.debug( "Source artifacts size :: " + sourceArtifacts.size() ); + mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId, null ); + } } else { - log.debug( "Source artifacts size :: " + sourceArtifacts.size() ); - mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId ); - } - } - else - { - log.info( "Repository to be merged has snapshot artifacts.." ); - if ( skipConflicts ) - { - List conflicts = repositoryMerger.getConflictingArtifacts( repoId, - stagingId ); - - if ( log.isDebugEnabled() ) + log.info( "Repository to be merged has snapshot artifacts.." ); + if ( skipConflicts ) { - log.debug( "Artifacts in conflict.." ); - for ( ArtifactMetadata metadata : conflicts ) + List conflicts = repositoryMerger.getConflictingArtifacts( + metadataRepository, repoId, stagingId ); + + if ( log.isDebugEnabled() ) { - log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" + - metadata.getProjectVersion() ); + log.debug( "Artifacts in conflict.." ); + for ( ArtifactMetadata metadata : conflicts ) + { + log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" + + metadata.getProjectVersion() ); + } } - } - sourceArtifacts.removeAll( conflicts ); + sourceArtifacts.removeAll( conflicts ); - log.debug( "Source artifacts size :: " + sourceArtifacts.size() ); + log.debug( "Source artifacts size :: " + sourceArtifacts.size() ); - Filter artifactsWithOutConflicts = new IncludesFilter( - sourceArtifacts ); - repositoryMerger.merge( stagingId, repoId, artifactsWithOutConflicts ); + Filter artifactsWithOutConflicts = new IncludesFilter( + sourceArtifacts ); + repositoryMerger.merge( metadataRepository, stagingId, repoId, artifactsWithOutConflicts ); - log.info( - "Staging repository '" + stagingId + "' merged successfully with managed repo '" + repoId + - "'." ); - } - else - { - repositoryMerger.merge( stagingId, repoId ); + log.info( "Staging repository '" + stagingId + "' merged successfully with managed repo '" + + repoId + "'." ); + } + else + { + repositoryMerger.merge( metadataRepository, stagingId, repoId ); - log.info( - "Staging repository '" + stagingId + "' merged successfully with managed repo '" + repoId + - "'." ); + log.info( "Staging repository '" + stagingId + "' merged successfully with managed repo '" + + repoId + "'." ); + } } } + else + { + throw new Exception( "Staging Id : " + stagingId + " not found." ); + } } else { - throw new Exception( "Staging Id : " + stagingId + " not found." ); + throw new Exception( "Repository Id : " + repoId + " not found." ); } - } - else - { - throw new Exception( "Repository Id : " + repoId + " not found." ); - } - if ( !repositoryTaskScheduler.isProcessingRepositoryTask( repoId ) ) - { - RepositoryTask task = new RepositoryTask(); - task.setRepositoryId( repoId ); + if ( !repositoryTaskScheduler.isProcessingRepositoryTask( repoId ) ) + { + RepositoryTask task = new RepositoryTask(); + task.setRepositoryId( repoId ); - repositoryTaskScheduler.queueTask( task ); - } + repositoryTaskScheduler.queueTask( task ); + } - AuditEvent event = createAuditEvent( repoConfig ); + AuditEvent event = createAuditEvent( repoConfig ); - // add event for audit log reports - metadataRepository.addMetadataFacet( event.getRepositoryId(), event ); + // add event for audit log reports + metadataRepository.addMetadataFacet( event.getRepositoryId(), event ); - // log event in archiva audit log - auditListener.auditEvent( createAuditEvent( repoConfig ) ); + // log event in archiva audit log + auditListener.auditEvent( createAuditEvent( repoConfig ) ); + repositorySession.save(); + } + finally + { + repositorySession.close(); + } return true; } @@ -614,7 +642,8 @@ public class AdministrationServiceImpl return event; } - private void mergeWithOutSnapshots( List sourceArtifacts, String sourceRepoId, String repoid ) + private void mergeWithOutSnapshots( List sourceArtifacts, String sourceRepoId, String repoid, + MetadataRepository metadataRepository ) throws Exception { List artifactsWithOutSnapshots = new ArrayList(); @@ -631,7 +660,7 @@ public class AdministrationServiceImpl Filter artifactListWithOutSnapShots = new IncludesFilter( sourceArtifacts ); - repositoryMerger.merge( sourceRepoId, repoid, artifactListWithOutSnapShots ); + repositoryMerger.merge( metadataRepository, sourceRepoId, repoid, artifactListWithOutSnapShots ); } private ManagedRepositoryConfiguration getStageRepoConfig( ManagedRepositoryConfiguration repository ) diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java index 2f998f406..316fe6aac 100644 --- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java +++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java @@ -29,6 +29,8 @@ import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet; import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet; import org.apache.archiva.web.xmlrpc.api.SearchService; @@ -48,17 +50,14 @@ public class SearchServiceImpl private XmlRpcUserRepositories xmlRpcUserRepositories; - private MetadataResolver metadataResolver; + private RepositorySessionFactory repositorySessionFactory; - private MetadataRepository metadataRepository; - - public SearchServiceImpl( XmlRpcUserRepositories xmlRpcUserRepositories, MetadataResolver metadataResolver, - MetadataRepository metadataRepository, RepositorySearch search ) + public SearchServiceImpl( XmlRpcUserRepositories xmlRpcUserRepositories, + RepositorySessionFactory repositorySessionFactory, RepositorySearch search ) { this.xmlRpcUserRepositories = xmlRpcUserRepositories; this.search = search; - this.metadataResolver = metadataResolver; - this.metadataRepository = metadataRepository; + this.repositorySessionFactory = repositorySessionFactory; } @SuppressWarnings( "unchecked" ) @@ -72,45 +71,57 @@ public class SearchServiceImpl results = search.search( "", observableRepos, queryString, limits, null ); - for ( SearchResultHit resultHit : results.getHits() ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - List resultHitVersions = resultHit.getVersions(); - if ( resultHitVersions != null ) + MetadataResolver metadataResolver = repositorySession.getResolver(); + + for ( SearchResultHit resultHit : results.getHits() ) { - for ( String version : resultHitVersions ) + List resultHitVersions = resultHit.getVersions(); + if ( resultHitVersions != null ) { - Artifact artifact = null; - for ( String repoId : observableRepos ) + for ( String version : resultHitVersions ) { - // slight behaviour change to previous implementation: instead of allocating "jar" when not - // found in the database, we can rely on the metadata repository to create it on the fly. We - // just allocate the default packaging if the Maven facet is not found. - FacetedMetadata model = metadataResolver.resolveProjectVersion( repoId, resultHit.getGroupId(), - resultHit.getArtifactId(), - version ); - - if ( model != null ) + Artifact artifact = null; + for ( String repoId : observableRepos ) { - String packaging = "jar"; - - MavenProjectFacet facet = (MavenProjectFacet) model.getFacet( MavenProjectFacet.FACET_ID ); - if ( facet != null && facet.getPackaging() != null ) + // slight behaviour change to previous implementation: instead of allocating "jar" when not + // found in the database, we can rely on the metadata repository to create it on the fly. We + // just allocate the default packaging if the Maven facet is not found. + FacetedMetadata model = metadataResolver.resolveProjectVersion( repositorySession, repoId, + resultHit.getGroupId(), + resultHit.getArtifactId(), + version ); + + if ( model != null ) { - packaging = facet.getPackaging(); + String packaging = "jar"; + + MavenProjectFacet facet = (MavenProjectFacet) model.getFacet( + MavenProjectFacet.FACET_ID ); + if ( facet != null && facet.getPackaging() != null ) + { + packaging = facet.getPackaging(); + } + artifact = new Artifact( repoId, resultHit.getGroupId(), resultHit.getArtifactId(), + version, packaging ); + break; } - artifact = new Artifact( repoId, resultHit.getGroupId(), resultHit.getArtifactId(), version, - packaging ); - break; } - } - if ( artifact != null ) - { - artifacts.add( artifact ); + if ( artifact != null ) + { + artifacts.add( artifact ); + } } } } } + finally + { + repositorySession.close(); + } return artifacts; } @@ -120,18 +131,30 @@ public class SearchServiceImpl { List observableRepos = xmlRpcUserRepositories.getObservableRepositories(); + RepositorySession repositorySession = repositorySessionFactory.createSession(); + List results = new ArrayList(); - for ( String repoId : observableRepos ) + try { - for ( ArtifactMetadata artifact : metadataRepository.getArtifactsByChecksum( repoId, checksum ) ) + MetadataRepository metadataRepository = repositorySession.getRepository(); + + for ( String repoId : observableRepos ) { - // TODO: customise XMLRPC to handle non-Maven artifacts - MavenArtifactFacet facet = (MavenArtifactFacet) artifact.getFacet( MavenArtifactFacet.FACET_ID ); + for ( ArtifactMetadata artifact : metadataRepository.getArtifactsByChecksum( repoId, checksum ) ) + { + // TODO: customise XMLRPC to handle non-Maven artifacts + MavenArtifactFacet facet = (MavenArtifactFacet) artifact.getFacet( MavenArtifactFacet.FACET_ID ); - results.add( new Artifact( artifact.getRepositoryId(), artifact.getNamespace(), artifact.getProject(), - artifact.getVersion(), facet != null ? facet.getType() : null ) ); + results.add( new Artifact( artifact.getRepositoryId(), artifact.getNamespace(), + artifact.getProject(), artifact.getVersion(), + facet != null ? facet.getType() : null ) ); + } } } + finally + { + repositorySession.close(); + } return results; } @@ -141,17 +164,28 @@ public class SearchServiceImpl List artifacts = new ArrayList(); List observableRepos = xmlRpcUserRepositories.getObservableRepositories(); - for ( String repoId : observableRepos ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - Collection results = metadataResolver.resolveProjectVersions( repoId, groupId, artifactId ); + MetadataResolver metadataResolver = repositorySession.getResolver(); - for ( final String version : results ) + for ( String repoId : observableRepos ) { - final Artifact artifact = new Artifact( repoId, groupId, artifactId, version, "pom" ); + Collection results = metadataResolver.resolveProjectVersions( repositorySession, repoId, + groupId, artifactId ); - artifacts.add( artifact ); + for ( final String version : results ) + { + final Artifact artifact = new Artifact( repoId, groupId, artifactId, version, "pom" ); + + artifacts.add( artifact ); + } } } + finally + { + repositorySession.close(); + } return artifacts; } @@ -174,23 +208,33 @@ public class SearchServiceImpl { List observableRepos = xmlRpcUserRepositories.getObservableRepositories(); - for ( String repoId : observableRepos ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - ProjectVersionMetadata model = metadataResolver.resolveProjectVersion( repoId, groupId, artifactId, - version ); - if ( model != null ) + MetadataResolver metadataResolver = repositorySession.getResolver(); + + for ( String repoId : observableRepos ) { - List dependencies = new ArrayList(); - List modelDeps = model.getDependencies(); - for ( org.apache.archiva.metadata.model.Dependency dep : modelDeps ) + ProjectVersionMetadata model = metadataResolver.resolveProjectVersion( repositorySession, repoId, + groupId, artifactId, version ); + if ( model != null ) { - Dependency dependency = new Dependency( dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), - dep.getClassifier(), dep.getType(), dep.getScope() ); - dependencies.add( dependency ); + List dependencies = new ArrayList(); + List modelDeps = model.getDependencies(); + for ( org.apache.archiva.metadata.model.Dependency dep : modelDeps ) + { + Dependency dependency = new Dependency( dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), + dep.getClassifier(), dep.getType(), dep.getScope() ); + dependencies.add( dependency ); + } + return dependencies; } - return dependencies; } } + finally + { + repositorySession.close(); + } throw new Exception( "Artifact does not exist." ); } @@ -209,16 +253,28 @@ public class SearchServiceImpl List artifacts = new ArrayList(); List observableRepos = xmlRpcUserRepositories.getObservableRepositories(); - for ( String repoId : observableRepos ) + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try { - Collection refs = metadataResolver.resolveProjectReferences( repoId, groupId, - artifactId, version ); - for ( ProjectVersionReference ref : refs ) + MetadataResolver metadataResolver = repositorySession.getResolver(); + + for ( String repoId : observableRepos ) { - artifacts.add( new Artifact( repoId, ref.getNamespace(), ref.getProjectId(), ref.getProjectVersion(), - "" ) ); + Collection refs = metadataResolver.resolveProjectReferences( repositorySession, + repoId, groupId, + artifactId, + version ); + for ( ProjectVersionReference ref : refs ) + { + artifacts.add( new Artifact( repoId, ref.getNamespace(), ref.getProjectId(), + ref.getProjectVersion(), "" ) ); + } } } + finally + { + repositorySession.close(); + } return artifacts; } diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java index d4126351f..53620eb7b 100644 --- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java +++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java @@ -23,6 +23,8 @@ import org.apache.archiva.audit.AuditEvent; import org.apache.archiva.audit.AuditListener; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.filter.Filter; import org.apache.archiva.metadata.repository.filter.IncludesFilter; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; @@ -63,6 +65,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * AdministrationServiceImplTest * @@ -162,6 +167,12 @@ public class AdministrationServiceImplTest metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); + RepositorySession repositorySession = mock( RepositorySession.class ); + when( repositorySession.getRepository() ).thenReturn( metadataRepository ); + + RepositorySessionFactory repositorySessionFactory = mock( RepositorySessionFactory.class ); + when( repositorySessionFactory.createSession() ).thenReturn( repositorySession ); + listenerControl = MockControl.createControl( RepositoryListener.class ); listener = (RepositoryListener) listenerControl.getMock(); @@ -175,8 +186,9 @@ public class AdministrationServiceImplTest auditListener = (AuditListener) auditListenerControl.getMock(); service = new AdministrationServiceImpl( archivaConfig, repoConsumersUtil, repositoryFactory, - metadataRepository, repositoryTaskScheduler, Collections.singletonList( - listener ), repositoryStatisticsManager, repositoryMerger, auditListener ); + repositorySessionFactory, repositoryTaskScheduler, + Collections.singletonList( listener ), repositoryStatisticsManager, + repositoryMerger, auditListener ); } /* Tests for repository consumers */ @@ -342,8 +354,8 @@ public class AdministrationServiceImplTest metadataRepository.removeArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(), artifact.getVersion(), artifact.getId() ); - listener.deleteArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(), - artifact.getVersion(), artifact.getId() ); + listener.deleteArtifact( metadataRepository, repoContent.getId(), artifact.getNamespace(), + artifact.getProject(), artifact.getVersion(), artifact.getId() ); listenerControl.setVoidCallable( 1 ); archivaConfigControl.replay(); @@ -399,8 +411,8 @@ public class AdministrationServiceImplTest metadataRepository.removeArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(), artifact.getVersion(), artifact.getId() ); - listener.deleteArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(), - artifact.getVersion(), artifact.getId() ); + listener.deleteArtifact( metadataRepository, repoContent.getId(), artifact.getNamespace(), + artifact.getProject(), artifact.getVersion(), artifact.getId() ); listenerControl.setVoidCallable( 1 ); archivaConfigControl.replay(); @@ -725,10 +737,11 @@ public class AdministrationServiceImplTest configControl.expectAndReturn( config.findManagedRepositoryById( "merge-stage" ), staging ); metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( staging.getId() ), sources ); - repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( staging.getId(), + repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( metadataRepository, + staging.getId(), merge.getId() ), sources ); - repositoryMerger.merge( staging.getId(), merge.getId() ); + repositoryMerger.merge( metadataRepository, staging.getId(), merge.getId() ); repositoryMergerControl.setVoidCallable(); repositoryTaskSchedulerControl.expectAndReturn( repositoryTaskScheduler.isProcessingRepositoryTask( "merge" ), false ); @@ -794,10 +807,11 @@ public class AdministrationServiceImplTest configControl.expectAndReturn( config.findManagedRepositoryById( "repo-stage" ), staging ); metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( staging.getId() ), sources ); - repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( staging.getId(), + repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( metadataRepository, + staging.getId(), repo.getId() ), conflicts ); - repositoryMerger.merge( staging.getId(), repo.getId(), artifactsWithOutConflicts ); + repositoryMerger.merge( metadataRepository, staging.getId(), repo.getId(), artifactsWithOutConflicts ); repositoryMergerControl.setMatcher( MockControl.ALWAYS_MATCHER ); repositoryMergerControl.setVoidCallable(); repositoryTaskSchedulerControl.expectAndReturn( repositoryTaskScheduler.isProcessingRepositoryTask( "repo" ), diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java index 7c224cf99..883e07375 100644 --- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java +++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java @@ -30,6 +30,8 @@ import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet; import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet; import org.apache.archiva.web.xmlrpc.api.SearchService; @@ -46,6 +48,9 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * SearchServiceImplTest * @@ -80,6 +85,8 @@ public class SearchServiceImplTest private static final String TEST_REPO = "test-repo"; + private RepositorySession repositorySession; + @Override public void setUp() throws Exception @@ -97,7 +104,13 @@ public class SearchServiceImplTest metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); - searchService = new SearchServiceImpl( userRepos, metadataResolver, metadataRepository, search ); + repositorySession = mock( RepositorySession.class ); + when( repositorySession.getResolver() ).thenReturn( metadataResolver ); + when( repositorySession.getRepository() ).thenReturn( metadataRepository ); + RepositorySessionFactory repositorySessionFactory = mock( RepositorySessionFactory.class ); + when( repositorySessionFactory.createSession() ).thenReturn( repositorySession ); + + searchService = new SearchServiceImpl( userRepos, repositorySessionFactory, search ); } // MRM-1230 @@ -134,7 +147,8 @@ public class SearchServiceImplTest facet.setPackaging( "war" ); model.addFacet( facet ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "repo1.mirror", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, + "repo1.mirror", ARCHIVA_TEST_GROUP_ID, "archiva-webapp", "1.0" ), model ); @@ -189,14 +203,16 @@ public class SearchServiceImplTest searchControl.expectAndDefaultReturn( search.search( "", observableRepoIds, "archiva", limits, null ), results ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "repo1.mirror", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, + "repo1.mirror", ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), null ); ProjectVersionMetadata model = new ProjectVersionMetadata(); model.setId( "1.0" ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "public.releases", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, + "public.releases", ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), model ); @@ -256,7 +272,8 @@ public class SearchServiceImplTest facet.setPackaging( "jar" ); model.addFacet( facet ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "repo1.mirror", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, + "repo1.mirror", ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), model ); @@ -349,11 +366,13 @@ public class SearchServiceImplTest observableRepoIds.add( "public.releases" ); userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( "repo1.mirror", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( repositorySession, + "repo1.mirror", ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID ), Arrays.asList( "1.0", "1.1-beta-2", "1.2" ) ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( "public.releases", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( repositorySession, + "public.releases", ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID ), Arrays.asList( "1.1-beta-1", "1.1", "1.2.1-SNAPSHOT" ) ); @@ -418,7 +437,8 @@ public class SearchServiceImplTest model.addDependency( dependency ); userReposControl.expectAndReturn( userRepos.getObservableRepositories(), Collections.singletonList( repoId ) ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repoId, ARCHIVA_TEST_GROUP_ID, + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, repoId, + ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), model ); @@ -444,7 +464,8 @@ public class SearchServiceImplTest String repoId = "repo1.mirror"; userReposControl.expectAndReturn( userRepos.getObservableRepositories(), Collections.singletonList( repoId ) ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repoId, ARCHIVA_TEST_GROUP_ID, + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, repoId, + ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), null ); @@ -498,7 +519,7 @@ public class SearchServiceImplTest dependeeModels.add( dependeeModel ); userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repoId, + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repositorySession, repoId, ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), dependeeModels ); @@ -529,12 +550,14 @@ public class SearchServiceImplTest // no longer differentiating between a project not being present and a project that is present but with // no references. If it is later determined to be needed, we will need to modify the metadata content repository userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( "repo1.mirror", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repositorySession, + "repo1.mirror", ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), Collections.emptyList() ); - metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( "public.releases", + metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repositorySession, + "public.releases", ARCHIVA_TEST_GROUP_ID, ARCHIVA_TEST_ARTIFACT_ID, "1.0" ), diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java index 91851c891..3e61ab990 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java @@ -26,26 +26,40 @@ import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; import org.apache.archiva.metadata.repository.filter.ExcludesFilter; import org.apache.archiva.metadata.repository.storage.RepositoryStorage; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException; +import org.apache.archiva.repository.events.RepositoryListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; +import java.util.List; /** + * Default implementation of the metadata resolver API. At present it will handle updating the content repository + * from new or changed information in the model and artifacts from the repository storage. + * + * This is a singleton component to allow an alternate implementation to be provided. It is intended to be the same + * system-wide for the whole content repository instead of on a per-managed-repository basis. Therefore, the session is + * passed in as an argument to obtain any necessary resources, rather than the class being instantiated within the + * session in the context of a single managed repository's resolution needs. + * + * Note that the caller is responsible for the session, such as closing and saving (which is implied by the resolver + * being obtained from within the session). The {@link RepositorySession#markDirty()} method is used as a hint to ensure + * that the session knows we've made changes at close. We cannot ensure the changes will be persisted if the caller + * chooses to revert first. This is preferable to storing the metadata immediately - a separate session would require + * having a bi-directional link with the session factory, and saving the existing session might save other changes + * unknowingly by the caller. + * * @plexus.component role="org.apache.archiva.metadata.repository.MetadataResolver" */ public class DefaultMetadataResolver implements MetadataResolver { - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - /** * FIXME: this needs to be configurable based on storage type - and could also be instantiated per repo. Change to a - * factory. + * factory, and perhaps retrieve from the session. We should avoid creating one per request, however. * * TODO: Also need to accommodate availability of proxy module * ... could be a different type since we need methods to modify the storage metadata, which would also allow more @@ -55,12 +69,19 @@ public class DefaultMetadataResolver */ private RepositoryStorage repositoryStorage; + /** + * @plexus.requirement role="org.apache.archiva.repository.events.RepositoryListener" + */ + private List listeners; + private static final Logger log = LoggerFactory.getLogger( DefaultMetadataResolver.class ); - public ProjectVersionMetadata resolveProjectVersion( String repoId, String namespace, String projectId, - String projectVersion ) + public ProjectVersionMetadata resolveProjectVersion( RepositorySession session, String repoId, String namespace, + String projectId, String projectVersion ) throws MetadataResolutionException { + MetadataRepository metadataRepository = session.getRepository(); + ProjectVersionMetadata metadata = metadataRepository.getProjectVersion( repoId, namespace, projectId, projectVersion ); // TODO: do we want to detect changes as well by comparing timestamps? isProjectVersionNewerThan(updated) @@ -70,9 +91,10 @@ public class DefaultMetadataResolver // may then work here and be more efficient than always trying again) if ( metadata == null || metadata.isIncomplete() ) { - metadata = repositoryStorage.readProjectVersionMetadata( repoId, namespace, projectId, projectVersion ); - if ( metadata != null ) + try { + metadata = repositoryStorage.readProjectVersionMetadata( repoId, namespace, projectId, projectVersion ); + if ( log.isDebugEnabled() ) { log.debug( "Resolved project version metadata from storage: " + metadata ); @@ -102,29 +124,54 @@ public class DefaultMetadataResolver } try { + for ( RepositoryListener listener : listeners ) + { + listener.addArtifact( session, repoId, namespace, projectId, metadata ); + } metadataRepository.updateProjectVersion( repoId, namespace, projectId, metadata ); } catch ( MetadataRepositoryException e ) { log.warn( "Unable to persist resolved information: " + e.getMessage(), e ); } + + session.markDirty(); + } + catch ( RepositoryStorageMetadataInvalidException e ) + { + for ( RepositoryListener listener : listeners ) + { + listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e ); + } + throw new MetadataResolutionException( e.getMessage(), e ); + } + catch ( RepositoryStorageMetadataNotFoundException e ) + { + for ( RepositoryListener listener : listeners ) + { + listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e ); + } + // no need to rethrow - return null } } return metadata; } - public Collection resolveProjectReferences( String repoId, String namespace, - String projectId, String projectVersion ) + public Collection resolveProjectReferences( RepositorySession session, String repoId, + String namespace, String projectId, + String projectVersion ) throws MetadataResolutionException { // TODO: is this assumption correct? could a storage mech. actually know all references in a non-Maven scenario? // not passed to the storage mechanism as resolving references would require iterating all artifacts + MetadataRepository metadataRepository = session.getRepository(); return metadataRepository.getProjectReferences( repoId, namespace, projectId, projectVersion ); } - public Collection resolveRootNamespaces( String repoId ) + public Collection resolveRootNamespaces( RepositorySession session, String repoId ) throws MetadataResolutionException { + MetadataRepository metadataRepository = session.getRepository(); Collection namespaces = metadataRepository.getRootNamespaces( repoId ); Collection storageNamespaces = repositoryStorage.listRootNamespaces( repoId, new ExcludesFilter( namespaces ) ); @@ -145,15 +192,18 @@ public class DefaultMetadataResolver log.warn( "Unable to persist resolved information: " + e.getMessage(), e ); } } + session.markDirty(); + namespaces = new ArrayList( namespaces ); namespaces.addAll( storageNamespaces ); } return namespaces; } - public Collection resolveNamespaces( String repoId, String namespace ) + public Collection resolveNamespaces( RepositorySession session, String repoId, String namespace ) throws MetadataResolutionException { + MetadataRepository metadataRepository = session.getRepository(); Collection namespaces = metadataRepository.getNamespaces( repoId, namespace ); Collection exclusions = new ArrayList( namespaces ); exclusions.addAll( metadataRepository.getProjects( repoId, namespace ) ); @@ -177,15 +227,18 @@ public class DefaultMetadataResolver log.warn( "Unable to persist resolved information: " + e.getMessage(), e ); } } + session.markDirty(); + namespaces = new ArrayList( namespaces ); namespaces.addAll( storageNamespaces ); } return namespaces; } - public Collection resolveProjects( String repoId, String namespace ) + public Collection resolveProjects( RepositorySession session, String repoId, String namespace ) throws MetadataResolutionException { + MetadataRepository metadataRepository = session.getRepository(); Collection projects = metadataRepository.getProjects( repoId, namespace ); Collection exclusions = new ArrayList( projects ); exclusions.addAll( metadataRepository.getNamespaces( repoId, namespace ) ); @@ -212,15 +265,19 @@ public class DefaultMetadataResolver } } } + session.markDirty(); + projects = new ArrayList( projects ); projects.addAll( storageProjects ); } return projects; } - public Collection resolveProjectVersions( String repoId, String namespace, String projectId ) + public Collection resolveProjectVersions( RepositorySession session, String repoId, String namespace, + String projectId ) throws MetadataResolutionException { + MetadataRepository metadataRepository = session.getRepository(); Collection projectVersions = metadataRepository.getProjectVersions( repoId, namespace, projectId ); Collection storageProjectVersions = repositoryStorage.listProjectVersions( repoId, namespace, projectId, new ExcludesFilter( @@ -239,39 +296,55 @@ public class DefaultMetadataResolver namespace, projectId, projectVersion ); - if ( versionMetadata != null ) + for ( RepositoryListener listener : listeners ) { - metadataRepository.updateProjectVersion( repoId, namespace, projectId, versionMetadata ); + listener.addArtifact( session, repoId, namespace, projectId, versionMetadata ); } + + metadataRepository.updateProjectVersion( repoId, namespace, projectId, versionMetadata ); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to persist resolved information: " + e.getMessage(), e ); } - catch ( MetadataResolutionException e ) + catch ( RepositoryStorageMetadataInvalidException e ) { log.warn( "Not update project in metadata repository due to an error resolving it from storage: " + e.getMessage() ); + + for ( RepositoryListener listener : listeners ) + { + listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e ); + } } - catch ( MetadataRepositoryException e ) + catch ( RepositoryStorageMetadataNotFoundException e ) { - log.warn( "Unable to persist resolved information: " + e.getMessage(), e ); + for ( RepositoryListener listener : listeners ) + { + listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e ); + } } } + session.markDirty(); + projectVersions = new ArrayList( projectVersions ); projectVersions.addAll( storageProjectVersions ); } return projectVersions; } - public Collection resolveArtifacts( String repoId, String namespace, String projectId, - String projectVersion ) + public Collection resolveArtifacts( RepositorySession session, String repoId, String namespace, + String projectId, String projectVersion ) throws MetadataResolutionException { + MetadataRepository metadataRepository = session.getRepository(); Collection artifacts = metadataRepository.getArtifacts( repoId, namespace, projectId, projectVersion ); + ExcludesFilter filter = new ExcludesFilter( createArtifactIdList( artifacts ) ); Collection storageArtifacts = repositoryStorage.readArtifactsMetadata( repoId, namespace, projectId, projectVersion, - new ExcludesFilter( - createArtifactIdList( - artifacts ) ) ); + filter ); if ( storageArtifacts != null && !storageArtifacts.isEmpty() ) { if ( log.isDebugEnabled() ) @@ -289,6 +362,8 @@ public class DefaultMetadataResolver log.warn( "Unable to persist resolved information: " + e.getMessage(), e ); } } + session.markDirty(); + artifacts = new ArrayList( artifacts ); artifacts.addAll( storageArtifacts ); } diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java index 4815ceb79..4cd2cfd41 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java @@ -27,8 +27,8 @@ import java.util.Collection; public interface MetadataResolver { - ProjectVersionMetadata resolveProjectVersion( String repoId, String namespace, String projectId, - String projectVersion ) + ProjectVersionMetadata resolveProjectVersion( RepositorySession session, String repoId, String namespace, + String projectId, String projectVersion ) throws MetadataResolutionException; /** @@ -42,23 +42,25 @@ public interface MetadataResolver * @param projectVersion the version of the project to get references to * @return a list of project references */ - Collection resolveProjectReferences( String repoId, String namespace, String projectId, + Collection resolveProjectReferences( RepositorySession session, String repoId, + String namespace, String projectId, String projectVersion ) throws MetadataResolutionException; - Collection resolveRootNamespaces( String repoId ) + Collection resolveRootNamespaces( RepositorySession session, String repoId ) throws MetadataResolutionException; - Collection resolveNamespaces( String repoId, String namespace ) + Collection resolveNamespaces( RepositorySession session, String repoId, String namespace ) throws MetadataResolutionException; - Collection resolveProjects( String repoId, String namespace ) + Collection resolveProjects( RepositorySession session, String repoId, String namespace ) throws MetadataResolutionException; - Collection resolveProjectVersions( String repoId, String namespace, String projectId ) + Collection resolveProjectVersions( RepositorySession session, String repoId, String namespace, + String projectId ) throws MetadataResolutionException; - Collection resolveArtifacts( String repoId, String namespace, String projectId, - String projectVersion ) + Collection resolveArtifacts( RepositorySession session, String repoId, String namespace, + String projectId, String projectVersion ) throws MetadataResolutionException; } diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySession.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySession.java new file mode 100644 index 000000000..1d9f43169 --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySession.java @@ -0,0 +1,96 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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. + */ + +/** + * The repository session provides a single interface to accessing Archiva repositories. It provides access to three + * resources: + *
    + *
  • {@link MetadataRepository} - the metadata content repository for read/write access, in its current state (no + * remote resources will be retrieved in the process
  • + *
  • {@link MetadataResolver} - access to resolve metadata content, accommodating metadata not yet stored or up to + * date in the content repository (i.e. virtualised repositories, remote proxied content, or metadata in a different + * model format in the repository storage)
  • + *
  • {@link org.apache.archiva.metadata.repository.storage.RepositoryStorage} - access to the physical storage of a + * repository and the source artifacts and project models
  • + *
+ */ +public class RepositorySession +{ + private final MetadataRepository repository; + + private final MetadataResolver resolver; + + private boolean dirty; + + // FIXME: include storage here too - perhaps a factory based on repository ID, or one per type to retrieve and + // operate on a given repo within the storage API + + public RepositorySession( MetadataRepository metadataRepository, MetadataResolver resolver ) + { + this.repository = metadataRepository; + this.resolver = resolver; + } + + public MetadataRepository getRepository() + { + return repository; + } + + public MetadataResolver getResolver() + { + return resolver; + } + + public void save() + { + // FIXME + + dirty = false; + } + + public void revert() + { + // FIXME + + dirty = false; + } + + /** + * Close the session. Required to be called for all open sessions to ensure resources are properly released. + * If the session has been marked as dirty, it will be saved. This may save partial changes in the case of a typical + * try { ... } finally { ... } approach - if this is a problem, ensure you revert changes when an + * exception occurs. + */ + public void close() + { + if ( dirty ) + { + save(); + } + + // FIXME + } + + public void markDirty() + { + this.dirty = true; + } +} diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySessionFactory.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySessionFactory.java new file mode 100644 index 000000000..ff6be9517 --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySessionFactory.java @@ -0,0 +1,25 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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. + */ + +public interface RepositorySessionFactory +{ + RepositorySession createSession(); +} diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java index ea93b3ff1..1c894816b 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java @@ -22,7 +22,6 @@ package org.apache.archiva.metadata.repository.storage; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; -import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.filter.Filter; import java.util.Collection; @@ -30,12 +29,11 @@ import java.util.Collection; // FIXME: we should drop the repoId parameters and attach this to an instance of a repository storage public interface RepositoryStorage { - ProjectMetadata readProjectMetadata( String repoId, String namespace, String projectId ) - throws MetadataResolutionException; + ProjectMetadata readProjectMetadata( String repoId, String namespace, String projectId ); ProjectVersionMetadata readProjectVersionMetadata( String repoId, String namespace, String projectId, String projectVersion ) - throws MetadataResolutionException; + throws RepositoryStorageMetadataInvalidException, RepositoryStorageMetadataNotFoundException; Collection listRootNamespaces( String repoId, Filter filter ); diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataException.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataException.java new file mode 100644 index 000000000..a1eff58ab --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataException.java @@ -0,0 +1,45 @@ +package org.apache.archiva.metadata.repository.storage; + +/* + * 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. + */ + +public class RepositoryStorageMetadataException + extends Exception +{ + private final String id; + + protected RepositoryStorageMetadataException( String id, String msg ) + { + super( msg ); + + this.id = id; + } + + protected RepositoryStorageMetadataException( String id, String msg, Throwable throwable ) + { + super( msg, throwable ); + + this.id = id; + } + + public String getId() + { + return id; + } +} diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataInvalidException.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataInvalidException.java new file mode 100644 index 000000000..72f81c48c --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataInvalidException.java @@ -0,0 +1,34 @@ +package org.apache.archiva.metadata.repository.storage; + +/* + * 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. + */ + +public class RepositoryStorageMetadataInvalidException + extends RepositoryStorageMetadataException +{ + public RepositoryStorageMetadataInvalidException( String id, String msg ) + { + super( id, msg ); + } + + public RepositoryStorageMetadataInvalidException( String id, String msg, Throwable throwable ) + { + super( id, msg, throwable ); + } +} diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataNotFoundException.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataNotFoundException.java new file mode 100644 index 000000000..2d9574acf --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataNotFoundException.java @@ -0,0 +1,29 @@ +package org.apache.archiva.metadata.repository.storage; + +/* + * 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. + */ + +public class RepositoryStorageMetadataNotFoundException + extends RepositoryStorageMetadataException +{ + public RepositoryStorageMetadataNotFoundException( String msg ) + { + super( "missing-pom", msg ); + } +} diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java index 2978d1a9b..580a577f7 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java @@ -19,15 +19,30 @@ package org.apache.archiva.repository.events; * under the License. */ +import org.apache.archiva.metadata.model.ProjectVersionMetadata; +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataException; + /** - * Listen to events on the repository. This class is a stopgap - * refactoring measure until an event bus is in place to handle + * Listen to events on the repository. This class is a stopgap + * refactoring measure until an event bus is in place to handle * generic events such as these. + * + * This assumes that the events occur before the action has completed, though they don't currently offer any mechanism + * to prevent an event from occurring or guarantee that it will happen. + * + * FIXME: this needs to be made more permanent since 3rd party plugins will depend on it heavily */ -public interface RepositoryListener +public interface RepositoryListener { - /** - * Event for the deletion of a given artifact. - */ - void deleteArtifact( String repositoryId, String namespace, String project, String version, String id ); + void deleteArtifact( MetadataRepository metadataRepository, String repositoryId, String namespace, String project, + String version, String id ); + + void addArtifact( RepositorySession session, String repoId, String namespace, String projectId, + ProjectVersionMetadata metadata ); + + // FIXME: this would be better as a "processException" method, with the event information captured in a single class + void addArtifactProblem( RepositorySession session, String repoId, String namespace, String projectId, + String projectVersion, RepositoryStorageMetadataException exception ); } diff --git a/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java b/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java index 23c0f674c..09d6b765b 100644 --- a/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java +++ b/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java @@ -19,6 +19,7 @@ package org.apache.archiva.audit; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import java.util.Collection; @@ -27,36 +28,39 @@ import java.util.List; public interface AuditManager { - List getMostRecentAuditEvents( List repositoryIds ) + List getMostRecentAuditEvents( MetadataRepository metadataRepository, List repositoryIds ) throws MetadataRepositoryException; - void addAuditEvent( AuditEvent event ) + void addAuditEvent( MetadataRepository repository, AuditEvent event ) throws MetadataRepositoryException; - void deleteAuditEvents( String repositoryId ) + void deleteAuditEvents( MetadataRepository metadataRepository, String repositoryId ) throws MetadataRepositoryException; /** * Get all audit events from the given repositories that match a certain range * - * @param repositoryIds the repositories to retrieve events for - * @param startTime find events only after this time - * @param endTime find events only before this time + * @param metadataRepository + * @param repositoryIds the repositories to retrieve events for + * @param startTime find events only after this time + * @param endTime find events only before this time * @return the list of events found */ - List getAuditEventsInRange( Collection repositoryIds, Date startTime, Date endTime ) + List getAuditEventsInRange( MetadataRepository metadataRepository, Collection repositoryIds, + Date startTime, Date endTime ) throws MetadataRepositoryException; /** * Get all audit events from the given repositories that match a certain range and resource pattern * - * @param repositoryIds the repositories to retrieve events for - * @param resourcePattern find all events whose resources start with this string - * @param startTime find events only after this time - * @param endTime find events only before this time + * @param metadataRepository + * @param repositoryIds the repositories to retrieve events for + * @param resourcePattern find all events whose resources start with this string + * @param startTime find events only after this time + * @param endTime find events only before this time * @return the list of events found */ - List getAuditEventsInRange( Collection repositoryIds, String resourcePattern, Date startTime, - Date endTime ) + List getAuditEventsInRange( MetadataRepository metadataRepository, Collection repositoryIds, + String resourcePattern, Date startTime, Date endTime ) throws MetadataRepositoryException; } diff --git a/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/DefaultAuditManager.java b/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/DefaultAuditManager.java index 9474ce54c..187357429 100644 --- a/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/DefaultAuditManager.java +++ b/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/DefaultAuditManager.java @@ -40,18 +40,14 @@ import java.util.TimeZone; public class DefaultAuditManager implements AuditManager { - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - - private static final int NUM_RECENT_REVENTS = 10; + private static final int NUM_RECENT_EVENTS = 10; private static final Logger log = LoggerFactory.getLogger( DefaultAuditManager.class ); private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" ); - public List getMostRecentAuditEvents( List repositoryIds ) + public List getMostRecentAuditEvents( MetadataRepository metadataRepository, + List repositoryIds ) throws MetadataRepositoryException { // TODO: consider a more efficient implementation that directly gets the last ten from the content repository @@ -65,7 +61,7 @@ public class DefaultAuditManager } } Collections.sort( records ); - records = records.subList( 0, records.size() < NUM_RECENT_REVENTS ? records.size() : NUM_RECENT_REVENTS ); + records = records.subList( 0, records.size() < NUM_RECENT_EVENTS ? records.size() : NUM_RECENT_EVENTS ); List events = new ArrayList( records.size() ); for ( AuditRecord record : records ) @@ -78,29 +74,31 @@ public class DefaultAuditManager return events; } - public void addAuditEvent( AuditEvent event ) + public void addAuditEvent( MetadataRepository repository, AuditEvent event ) throws MetadataRepositoryException { // ignore those with no repository - they will still be logged to the textual audit log if ( event.getRepositoryId() != null ) { - metadataRepository.addMetadataFacet( event.getRepositoryId(), event ); + repository.addMetadataFacet( event.getRepositoryId(), event ); } } - public void deleteAuditEvents( String repositoryId ) + public void deleteAuditEvents( MetadataRepository metadataRepository, String repositoryId ) throws MetadataRepositoryException { metadataRepository.removeMetadataFacets( repositoryId, AuditEvent.FACET_ID ); } - public List getAuditEventsInRange( Collection repositoryIds, Date startTime, Date endTime ) + public List getAuditEventsInRange( MetadataRepository metadataRepository, + Collection repositoryIds, Date startTime, Date endTime ) throws MetadataRepositoryException { - return getAuditEventsInRange( repositoryIds, null, startTime, endTime ); + return getAuditEventsInRange( metadataRepository, repositoryIds, null, startTime, endTime ); } - public List getAuditEventsInRange( Collection repositoryIds, String resource, Date startTime, + public List getAuditEventsInRange( MetadataRepository metadataRepository, + Collection repositoryIds, String resource, Date startTime, Date endTime ) throws MetadataRepositoryException { @@ -150,11 +148,6 @@ public class DefaultAuditManager return fmt; } - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } - private static final class AuditRecord implements Comparable { diff --git a/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/MetadataAuditListener.java b/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/MetadataAuditListener.java index 632187c62..6c38d93a8 100644 --- a/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/MetadataAuditListener.java +++ b/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/MetadataAuditListener.java @@ -20,6 +20,8 @@ package org.apache.archiva.audit; */ import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,20 +38,34 @@ public class MetadataAuditListener */ private AuditManager auditManager; + /** + * FIXME: this could be multiple implementations and needs to be configured. It also starts a separate session to + * the originator of the audit event that we may rather want to pass through. + * + * @plexus.requirement + */ + private RepositorySessionFactory repositorySessionFactory; + public void auditEvent( AuditEvent event ) { // for now we only log upload events, some of the others are quite noisy if ( event.getAction().equals( AuditEvent.CREATE_FILE ) || event.getAction().equals( AuditEvent.UPLOAD_FILE ) || event.getAction().equals( AuditEvent.MERGING_REPOSITORIES ) ) { + RepositorySession repositorySession = repositorySessionFactory.createSession(); try { - auditManager.addAuditEvent( event ); + auditManager.addAuditEvent( repositorySession.getRepository(), event ); + repositorySession.save(); } catch ( MetadataRepositoryException e ) { log.warn( "Unable to write audit event to repository: " + e.getMessage(), e ); } + finally + { + repositorySession.close(); + } } } } diff --git a/archiva-modules/plugins/audit/src/test/java/org/apache/archiva/audit/AuditManagerTest.java b/archiva-modules/plugins/audit/src/test/java/org/apache/archiva/audit/AuditManagerTest.java index 2ac2ddcc0..7602511ac 100644 --- a/archiva-modules/plugins/audit/src/test/java/org/apache/archiva/audit/AuditManagerTest.java +++ b/archiva-modules/plugins/audit/src/test/java/org/apache/archiva/audit/AuditManagerTest.java @@ -78,7 +78,6 @@ public class AuditManagerTest metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); - auditManager.setMetadataRepository( metadataRepository ); ManagedRepositoryConfiguration repository = new ManagedRepositoryConfiguration(); repository.setId( TEST_REPO_ID ); @@ -108,7 +107,8 @@ public class AuditManagerTest } metadataRepositoryControl.replay(); - List events = auditManager.getMostRecentAuditEvents( Collections.singletonList( TEST_REPO_ID ) ); + List events = auditManager.getMostRecentAuditEvents( metadataRepository, Collections.singletonList( + TEST_REPO_ID ) ); assertNotNull( events ); assertEquals( numEvents - 1, events.size() ); int expectedTimestampCounter = numEvents - 1; @@ -144,7 +144,8 @@ public class AuditManagerTest } metadataRepositoryControl.replay(); - List events = auditManager.getMostRecentAuditEvents( Collections.singletonList( TEST_REPO_ID ) ); + List events = auditManager.getMostRecentAuditEvents( metadataRepository, Collections.singletonList( + TEST_REPO_ID ) ); assertNotNull( events ); assertEquals( numEvents, events.size() ); int expectedTimestampCounter = numEvents - 1; @@ -190,7 +191,8 @@ public class AuditManagerTest } metadataRepositoryControl.replay(); - events = auditManager.getMostRecentAuditEvents( Arrays.asList( TEST_REPO_ID, TEST_REPO_ID_2 ) ); + events = auditManager.getMostRecentAuditEvents( metadataRepository, Arrays.asList( TEST_REPO_ID, + TEST_REPO_ID_2 ) ); assertNotNull( events ); assertEquals( numEvents - 1, events.size() ); int expectedTimestampCounter = numEvents - 1; @@ -214,7 +216,8 @@ public class AuditManagerTest Collections.emptyList() ); metadataRepositoryControl.replay(); - assertTrue( auditManager.getMostRecentAuditEvents( Collections.singletonList( TEST_REPO_ID ) ).isEmpty() ); + assertTrue( auditManager.getMostRecentAuditEvents( metadataRepository, Collections.singletonList( + TEST_REPO_ID ) ).isEmpty() ); metadataRepositoryControl.verify(); } @@ -229,7 +232,7 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - auditManager.addAuditEvent( event ); + auditManager.addAuditEvent( metadataRepository, event ); metadataRepositoryControl.verify(); } @@ -244,7 +247,7 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - auditManager.addAuditEvent( event ); + auditManager.addAuditEvent( metadataRepository, event ); metadataRepositoryControl.verify(); } @@ -257,7 +260,7 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - auditManager.deleteAuditEvents( TEST_REPO_ID ); + auditManager.deleteAuditEvents( metadataRepository, TEST_REPO_ID ); metadataRepositoryControl.verify(); } @@ -286,9 +289,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Collections.singletonList( TEST_REPO_ID ), - new Date( current.getTime() - 4000 ), new Date( - current.getTime() - 2000 ) ); + List events = auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( + TEST_REPO_ID ), new Date( current.getTime() - 4000 ), new Date( current.getTime() - 2000 ) ); assertEquals( 1, events.size() ); assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( expectedTimestamp ), expectedEvent.getResource() ); @@ -323,8 +325,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Collections.singletonList( TEST_REPO_ID ), - new Date( current.getTime() - 4000 ), current ); + List events = auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( + TEST_REPO_ID ), new Date( current.getTime() - 4000 ), current ); assertEquals( 2, events.size() ); assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( ts3 ), expectedEvent3.getResource() ); @@ -360,9 +362,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Collections.singletonList( TEST_REPO_ID ), - new Date( current.getTime() - 20000 ), new Date( - current.getTime() - 2000 ) ); + List events = auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( + TEST_REPO_ID ), new Date( current.getTime() - 20000 ), new Date( current.getTime() - 2000 ) ); assertEquals( 2, events.size() ); assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( expectedTimestamp ), expectedEvent2.getResource() ); @@ -403,8 +404,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Collections.singletonList( TEST_REPO_ID ), - new Date( current.getTime() - 20000 ), current ); + List events = auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( + TEST_REPO_ID ), new Date( current.getTime() - 20000 ), current ); assertEquals( 3, events.size() ); assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( ts3 ), expectedEvent3.getResource() ); @@ -447,9 +448,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Collections.singletonList( TEST_REPO_ID ), - TEST_RESOURCE_BASE, new Date( - current.getTime() - 20000 ), current ); + List events = auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( + TEST_REPO_ID ), TEST_RESOURCE_BASE, new Date( current.getTime() - 20000 ), current ); assertEquals( 2, events.size() ); assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( ts3 ), expectedEvent3.getResource() ); @@ -489,8 +489,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Collections.singletonList( TEST_REPO_ID ), "foo", - new Date( current.getTime() - 20000 ), current ); + List events = auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( + TEST_REPO_ID ), "foo", new Date( current.getTime() - 20000 ), current ); assertEquals( 0, events.size() ); @@ -533,7 +533,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Arrays.asList( TEST_REPO_ID, TEST_REPO_ID_2 ), + List events = auditManager.getAuditEventsInRange( metadataRepository, Arrays.asList( TEST_REPO_ID, + TEST_REPO_ID_2 ), new Date( current.getTime() - 20000 ), current ); assertEquals( 3, events.size() ); @@ -561,9 +562,8 @@ public class AuditManagerTest metadataRepositoryControl.replay(); - List events = auditManager.getAuditEventsInRange( Collections.singletonList( TEST_REPO_ID ), - new Date( current.getTime() - 20000 ), new Date( - current.getTime() - 16000 ) ); + List events = auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( + TEST_REPO_ID ), new Date( current.getTime() - 20000 ), new Date( current.getTime() - 16000 ) ); assertEquals( 0, events.size() ); diff --git a/archiva-modules/plugins/maven2-repository/pom.xml b/archiva-modules/plugins/maven2-repository/pom.xml index 32c78b9df..8abaf892c 100644 --- a/archiva-modules/plugins/maven2-repository/pom.xml +++ b/archiva-modules/plugins/maven2-repository/pom.xml @@ -29,10 +29,6 @@ maven2-repository Maven 2.x Repository Support - - org.apache.archiva - problem-reports - org.apache.archiva metadata-model diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java index 54007ab35..bd53424c1 100644 --- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java @@ -21,6 +21,8 @@ package org.apache.archiva.dependency.tree.maven2; import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; import org.apache.archiva.metadata.repository.storage.maven2.RepositoryModelResolver; import org.apache.commons.lang.StringUtils; @@ -100,9 +102,11 @@ public class DefaultDependencyTreeBuilder private ModelBuilder builder; /** + * TODO: can have other types, and this might eventually come through from the main request + * * @plexus.requirement */ - private MetadataResolver metadataResolver; + private RepositorySessionFactory repositorySessionFactory; /** * @plexus.requirement role-hint="maven2" @@ -138,12 +142,21 @@ public class DefaultDependencyTreeBuilder Set dependencyArtifacts = createArtifacts( model, null ); - ArtifactMetadataSource metadataSource = new MetadataArtifactMetadataSource( repositoryIds ); + RepositorySession repositorySession = repositorySessionFactory.createSession(); + try + { + ArtifactMetadataSource metadataSource = new MetadataArtifactMetadataSource( repositoryIds, + repositorySession ); - // Note that we don't permit going to external repositories. We don't need to pass in a local and remote - // since our metadata source has control over them - collector.collect( dependencyArtifacts, projectArtifact, managedVersions, null, null, metadataSource, null, - Collections.singletonList( listener ) ); + // Note that we don't permit going to external repositories. We don't need to pass in a local and remote + // since our metadata source has control over them + collector.collect( dependencyArtifacts, projectArtifact, managedVersions, null, null, metadataSource, + null, Collections.singletonList( listener ) ); + } + finally + { + repositorySession.close(); + } DependencyNode rootNode = listener.getRootNode(); @@ -347,9 +360,15 @@ public class DefaultDependencyTreeBuilder { private final List repositoryIds; - public MetadataArtifactMetadataSource( List repositoryIds ) + private final RepositorySession session; + + private final MetadataResolver resolver; + + public MetadataArtifactMetadataSource( List repositoryIds, RepositorySession session ) { this.repositoryIds = repositoryIds; + this.session = session; + resolver = this.session.getResolver(); } // modified version from MavenMetadataSource to work with the simpler environment @@ -425,8 +444,8 @@ public class DefaultDependencyTreeBuilder Collection projectVersions; try { - projectVersions = metadataResolver.resolveProjectVersions( repoId, artifact.getGroupId(), - artifact.getArtifactId() ); + projectVersions = resolver.resolveProjectVersions( session, repoId, artifact.getGroupId(), + artifact.getArtifactId() ); } catch ( MetadataResolutionException e ) { diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java index 1abe5a700..c4d51c0b4 100644 --- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java @@ -24,13 +24,11 @@ import org.apache.archiva.checksum.ChecksummedFile; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; -import org.apache.archiva.metadata.repository.MetadataRepository; -import org.apache.archiva.metadata.repository.MetadataRepositoryException; -import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.filter.Filter; import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; import org.apache.archiva.metadata.repository.storage.RepositoryStorage; -import org.apache.archiva.reports.RepositoryProblemFacet; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException; import org.apache.maven.archiva.common.utils.VersionUtil; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; @@ -61,6 +59,14 @@ import java.util.Date; import java.util.List; /** + * Maven 2 repository format storage implementation. This class currently takes parameters to indicate the repository to + * deal with rather than being instantiated per-repository. + * FIXME: instantiate one per repository and allocate permanently from a factory (which can be obtained within the session). + * TODO: finish Maven 1 implementation to prove this API + * + * The session is passed in as an argument to obtain any necessary resources, rather than the class being instantiated + * within the session in the context of a single managed repository's resolution needs. + * * @plexus.component role="org.apache.archiva.metadata.repository.storage.RepositoryStorage" role-hint="maven2" */ public class Maven2RepositoryStorage @@ -81,24 +87,10 @@ public class Maven2RepositoryStorage */ private RepositoryPathTranslator pathTranslator; - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - private final static Logger log = LoggerFactory.getLogger( Maven2RepositoryStorage.class ); private static final String METADATA_FILENAME = "maven-metadata.xml"; - private static final String PROBLEM_MISSING_POM = "missing-pom"; - - private static final String PROBLEM_INVALID_POM = "invalid-pom"; - - private static final String PROBLEM_MISLOCATED_POM = "mislocated-pom"; - - private static final List POTENTIAL_PROBLEMS = Arrays.asList( PROBLEM_INVALID_POM, PROBLEM_MISSING_POM, - PROBLEM_MISLOCATED_POM ); - public ProjectMetadata readProjectMetadata( String repoId, String namespace, String projectId ) { // TODO: could natively implement the "shared model" concept from the browse action to avoid needing it there? @@ -107,22 +99,8 @@ public class Maven2RepositoryStorage public ProjectVersionMetadata readProjectVersionMetadata( String repoId, String namespace, String projectId, String projectVersion ) - throws MetadataResolutionException + throws RepositoryStorageMetadataNotFoundException, RepositoryStorageMetadataInvalidException { - // Remove problems associated with this version, since we'll be re-adding any that still exist - // TODO: an event mechanism would remove coupling to the problem reporting plugin - // TODO: this removes all problems - do we need something that just removes the problems created by this resolver? - String name = RepositoryProblemFacet.createName( namespace, projectId, projectVersion, null ); - try - { - metadataRepository.removeMetadataFacet( repoId, RepositoryProblemFacet.FACET_ID, name ); - } - catch ( MetadataRepositoryException e ) - { - log.warn( "Unable to remove repository problem facets for the version being removed: " + e.getMessage(), - e ); - } - ManagedRepositoryConfiguration repositoryConfiguration = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId ); @@ -160,12 +138,9 @@ public class Maven2RepositoryStorage if ( !file.exists() ) { - // TODO: an event mechanism would remove coupling to the problem reporting plugin - addProblemReport( repoId, namespace, projectId, projectVersion, PROBLEM_MISSING_POM, - "The artifact's POM file '" + file + "' was missing" ); - // metadata could not be resolved - return null; + throw new RepositoryStorageMetadataNotFoundException( + "The artifact's POM file '" + file.getAbsolutePath() + "' was missing" ); } ModelBuildingRequest req = new DefaultModelBuildingRequest(); @@ -181,10 +156,9 @@ public class Maven2RepositoryStorage } catch ( ModelBuildingException e ) { - addProblemReport( repoId, namespace, projectId, projectVersion, PROBLEM_INVALID_POM, - "The artifact's POM file '" + file + "' was invalid: " + e.getMessage() ); + String msg = "The artifact's POM file '" + file + "' was invalid: " + e.getMessage(); - throw new MetadataResolutionException( e.getMessage() ); + throw new RepositoryStorageMetadataInvalidException( "invalid-pom", msg, e ); } // Check if the POM is in the correct location @@ -207,10 +181,7 @@ public class Maven2RepositoryStorage message.append( "\nIncorrect version: " ).append( model.getVersion() ); } - String msg = message.toString(); - addProblemReport( repoId, namespace, projectId, projectVersion, PROBLEM_MISLOCATED_POM, msg ); - - throw new MetadataResolutionException( msg ); + throw new RepositoryStorageMetadataInvalidException( "mislocated-pom", message.toString() ); } ProjectVersionMetadata metadata = new ProjectVersionMetadata(); @@ -243,29 +214,6 @@ public class Maven2RepositoryStorage return metadata; } - private void addProblemReport( String repoId, String namespace, String projectId, String projectVersion, - String problemId, String message ) - { - // TODO: an event mechanism would remove coupling to the problem reporting plugin and allow other plugins to - // generate metadata on the fly if appropriately checked for missing facets in the resolver - RepositoryProblemFacet problem = new RepositoryProblemFacet(); - problem.setProblem( problemId ); - problem.setMessage( message ); - problem.setProject( projectId ); - problem.setNamespace( namespace ); - problem.setRepositoryId( repoId ); - problem.setVersion( projectVersion ); - - try - { - metadataRepository.addMetadataFacet( repoId, problem ); - } - catch ( MetadataRepositoryException e ) - { - log.warn( "Unable to add repository problem facets for the version being removed: " + e.getMessage(), e ); - } - } - private List convertDependencies( List dependencies ) { List l = diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/TestMetadataResolver.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/TestMetadataResolver.java index 8ef9d7913..f220146d1 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/TestMetadataResolver.java +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/TestMetadataResolver.java @@ -25,43 +25,53 @@ import org.apache.archiva.metadata.model.ProjectVersionReference; import java.util.Collection; +// FIXME: remove - this is useless, better to mock it or avoid needing it public class TestMetadataResolver implements MetadataResolver { - public ProjectVersionMetadata resolveProjectVersion( String repoId, String namespace, String projectId, - String projectVersion ) + public ProjectVersionMetadata resolveProjectVersion( RepositorySession session, String repoId, String namespace, + String projectId, String projectVersion ) + throws MetadataResolutionException { return null; //To change body of implemented methods use File | Settings | File Templates. } - public Collection resolveProjectReferences( String repoId, String namespace, - String projectId, String projectVersion ) + public Collection resolveProjectReferences( RepositorySession session, String repoId, + String namespace, String projectId, + String projectVersion ) + throws MetadataResolutionException { return null; //To change body of implemented methods use File | Settings | File Templates. } - public Collection resolveRootNamespaces( String repoId ) + public Collection resolveRootNamespaces( RepositorySession session, String repoId ) + throws MetadataResolutionException { return null; //To change body of implemented methods use File | Settings | File Templates. } - public Collection resolveNamespaces( String repoId, String namespace ) + public Collection resolveNamespaces( RepositorySession session, String repoId, String namespace ) + throws MetadataResolutionException { return null; //To change body of implemented methods use File | Settings | File Templates. } - public Collection resolveProjects( String repoId, String namespace ) + public Collection resolveProjects( RepositorySession session, String repoId, String namespace ) + throws MetadataResolutionException { return null; //To change body of implemented methods use File | Settings | File Templates. } - public Collection resolveProjectVersions( String repoId, String namespace, String projectId ) + public Collection resolveProjectVersions( RepositorySession session, String repoId, String namespace, + String projectId ) + throws MetadataResolutionException { return null; //To change body of implemented methods use File | Settings | File Templates. } - public Collection resolveArtifacts( String repoId, String namespace, String projectId, - String projectVersion ) + public Collection resolveArtifacts( RepositorySession session, String repoId, String namespace, + String projectId, String projectVersion ) + throws MetadataResolutionException { return null; //To change body of implemented methods use File | Settings | File Templates. } diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java new file mode 100644 index 000000000..4827e786d --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/TestRepositorySessionFactory.java @@ -0,0 +1,38 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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. + */ + +public class TestRepositorySessionFactory + implements RepositorySessionFactory +{ + private MetadataRepository metadataRepository = new TestMetadataRepository(); + + private MetadataResolver resolver = new TestMetadataResolver(); + + public RepositorySession createSession() + { + return new RepositorySession( metadataRepository, resolver ); + } + + public void setMetadataRepository( MetadataRepository metadataRepository ) + { + this.metadataRepository = metadataRepository; + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java index 230cf03ba..ec07a00a8 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java @@ -21,17 +21,15 @@ package org.apache.archiva.metadata.repository.storage.maven2; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.Dependency; -import org.apache.archiva.metadata.model.FacetedMetadata; import org.apache.archiva.metadata.model.License; import org.apache.archiva.metadata.model.MailingList; import org.apache.archiva.metadata.model.ProjectVersionMetadata; -import org.apache.archiva.metadata.repository.MetadataRepository; -import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.filter.AllFilter; import org.apache.archiva.metadata.repository.filter.ExcludesFilter; import org.apache.archiva.metadata.repository.filter.Filter; import org.apache.archiva.metadata.repository.storage.RepositoryStorage; -import org.apache.archiva.reports.RepositoryProblemFacet; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; @@ -49,7 +47,7 @@ public class Maven2RepositoryMetadataResolverTest { private static final Filter ALL = new AllFilter(); - private Maven2RepositoryStorage resolver; + private Maven2RepositoryStorage storage; private static final String TEST_REPO_ID = "test"; @@ -63,8 +61,6 @@ public class Maven2RepositoryMetadataResolverTest private static final String EMPTY_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709"; - private MetadataRepository metadataRepository; - public void setUp() throws Exception { @@ -78,16 +74,14 @@ public class Maven2RepositoryMetadataResolverTest c.addManagedRepository( testRepo ); configuration.save( c ); - resolver = (Maven2RepositoryStorage) lookup( RepositoryStorage.class, "maven2" ); - metadataRepository = (MetadataRepository) lookup( MetadataRepository.class ); - metadataRepository.removeMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ); + storage = (Maven2RepositoryStorage) lookup( RepositoryStorage.class, "maven2" ); } public void testGetProjectVersionMetadata() throws Exception { - ProjectVersionMetadata metadata = resolver.readProjectVersionMetadata( TEST_REPO_ID, "org.apache.archiva", - "archiva-common", "1.2.1" ); + ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( TEST_REPO_ID, "org.apache.archiva", + "archiva-common", "1.2.1" ); MavenProjectFacet facet = (MavenProjectFacet) metadata.getFacet( MavenProjectFacet.FACET_ID ); assertEquals( "jar", facet.getPackaging() ); assertEquals( "http://archiva.apache.org/ref/1.2.1/archiva-base/archiva-common", metadata.getUrl() ); @@ -140,9 +134,9 @@ public class Maven2RepositoryMetadataResolverTest public void testGetArtifactMetadata() throws Exception { - Collection springArtifacts = resolver.readArtifactsMetadata( TEST_REPO_ID, - "org.codehaus.plexus", - "plexus-spring", "1.2", ALL ); + Collection springArtifacts = storage.readArtifactsMetadata( TEST_REPO_ID, + "org.codehaus.plexus", + "plexus-spring", "1.2", ALL ); List artifacts = new ArrayList( springArtifacts ); Collections.sort( artifacts, new Comparator() { @@ -182,9 +176,9 @@ public class Maven2RepositoryMetadataResolverTest public void testGetArtifactMetadataSnapshots() throws Exception { - Collection testArtifacts = resolver.readArtifactsMetadata( TEST_REPO_ID, "com.example.test", - "test-artifact", "1.0-SNAPSHOT", - ALL ); + Collection testArtifacts = storage.readArtifactsMetadata( TEST_REPO_ID, "com.example.test", + "test-artifact", "1.0-SNAPSHOT", + ALL ); List artifacts = new ArrayList( testArtifacts ); Collections.sort( artifacts, new Comparator() { @@ -265,8 +259,8 @@ public class Maven2RepositoryMetadataResolverTest public void testGetProjectVersionMetadataForTimestampedSnapshot() throws Exception { - ProjectVersionMetadata metadata = resolver.readProjectVersionMetadata( TEST_REPO_ID, "org.apache", "apache", - "5-SNAPSHOT" ); + ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( TEST_REPO_ID, "org.apache", "apache", + "5-SNAPSHOT" ); MavenProjectFacet facet = (MavenProjectFacet) metadata.getFacet( MavenProjectFacet.FACET_ID ); assertEquals( "pom", facet.getPackaging() ); assertEquals( "http://www.apache.org/", metadata.getUrl() ); @@ -302,169 +296,175 @@ public class Maven2RepositoryMetadataResolverTest public void testGetProjectVersionMetadataForTimestampedSnapshotMissingMetadata() throws Exception { - FacetedMetadata metadata = resolver.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", - "missing-metadata", "1.0-SNAPSHOT" ); - assertNull( metadata ); + try + { + storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "missing-metadata", "1.0-SNAPSHOT" ); + fail( "Should not be found" ); + } + catch ( RepositoryStorageMetadataNotFoundException e ) + { + assertEquals( "missing-pom", e.getId() ); + } } public void testGetProjectVersionMetadataForTimestampedSnapshotMalformedMetadata() throws Exception { - FacetedMetadata metadata = resolver.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", - "malformed-metadata", "1.0-SNAPSHOT" ); - assertNull( metadata ); + try + { + storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "malformed-metadata", + "1.0-SNAPSHOT" ); + fail( "Should not be found" ); + } + catch ( RepositoryStorageMetadataNotFoundException e ) + { + assertEquals( "missing-pom", e.getId() ); + } } public void testGetProjectVersionMetadataForTimestampedSnapshotIncompleteMetadata() throws Exception { - FacetedMetadata metadata = resolver.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", - "incomplete-metadata", "1.0-SNAPSHOT" ); - assertNull( metadata ); + try + { + storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "incomplete-metadata", + "1.0-SNAPSHOT" ); + fail( "Should not be found" ); + } + catch ( RepositoryStorageMetadataNotFoundException e ) + { + assertEquals( "missing-pom", e.getId() ); + } } public void testGetProjectVersionMetadataForInvalidPom() throws Exception { - assertTrue( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); - try { - resolver.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "invalid-pom", "1.0" ); + storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "invalid-pom", "1.0" ); fail( "Should have received an exception due to invalid POM" ); } - catch ( MetadataResolutionException e ) + catch ( RepositoryStorageMetadataInvalidException e ) { - assertFalse( metadataRepository.getMetadataFacets( TEST_REPO_ID, - RepositoryProblemFacet.FACET_ID ).isEmpty() ); - RepositoryProblemFacet facet = (RepositoryProblemFacet) metadataRepository.getMetadataFacet( TEST_REPO_ID, - RepositoryProblemFacet.FACET_ID, - "com.example.test/invalid-pom/1.0" ); - assertEquals( "invalid-pom", facet.getProblem() ); + assertEquals( "invalid-pom", e.getId() ); } } public void testGetProjectVersionMetadataForMislocatedPom() throws Exception { - assertTrue( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); - try { - resolver.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "mislocated-pom", "1.0" ); + storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "mislocated-pom", "1.0" ); fail( "Should have received an exception due to mislocated POM" ); } - catch ( MetadataResolutionException e ) + catch ( RepositoryStorageMetadataInvalidException e ) { - assertFalse( metadataRepository.getMetadataFacets( TEST_REPO_ID, - RepositoryProblemFacet.FACET_ID ).isEmpty() ); - RepositoryProblemFacet facet = (RepositoryProblemFacet) metadataRepository.getMetadataFacet( TEST_REPO_ID, - RepositoryProblemFacet.FACET_ID, - "com.example.test/mislocated-pom/1.0" ); - assertEquals( "mislocated-pom", facet.getProblem() ); + assertEquals( "mislocated-pom", e.getId() ); } } public void testGetProjectVersionMetadataForMissingPom() throws Exception { - assertTrue( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); - - FacetedMetadata metadata = resolver.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "missing-pom", - "1.0" ); - assertNull( metadata ); - - assertFalse( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); - RepositoryProblemFacet facet = (RepositoryProblemFacet) metadataRepository.getMetadataFacet( TEST_REPO_ID, - RepositoryProblemFacet.FACET_ID, - "com.example.test/missing-pom/1.0" ); - assertEquals( "missing-pom", facet.getProblem() ); - + try + { + storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "missing-pom", "1.0" ); + fail( "Should not be found" ); + } + catch ( RepositoryStorageMetadataNotFoundException e ) + { + assertEquals( "missing-pom", e.getId() ); + } } public void testGetRootNamespaces() { - assertEquals( Arrays.asList( "com", "org" ), resolver.listRootNamespaces( TEST_REPO_ID, ALL ) ); + assertEquals( Arrays.asList( "com", "org" ), storage.listRootNamespaces( TEST_REPO_ID, ALL ) ); } public void testGetNamespaces() { - assertEquals( Arrays.asList( "example" ), resolver.listNamespaces( TEST_REPO_ID, "com", ALL ) ); - assertEquals( Arrays.asList( "test" ), resolver.listNamespaces( TEST_REPO_ID, "com.example", ALL ) ); - assertEquals( Collections.emptyList(), resolver.listNamespaces( TEST_REPO_ID, "com.example.test", - ALL ) ); - - assertEquals( Arrays.asList( "apache", "codehaus" ), resolver.listNamespaces( TEST_REPO_ID, "org", ALL ) ); - assertEquals( Arrays.asList( "archiva", "maven" ), resolver.listNamespaces( TEST_REPO_ID, "org.apache", ALL ) ); - assertEquals( Collections.emptyList(), resolver.listNamespaces( TEST_REPO_ID, "org.apache.archiva", - ALL ) ); - assertEquals( Arrays.asList( "plugins", "shared" ), resolver.listNamespaces( TEST_REPO_ID, "org.apache.maven", - ALL ) ); - assertEquals( Collections.emptyList(), resolver.listNamespaces( TEST_REPO_ID, - "org.apache.maven.plugins", ALL ) ); - assertEquals( Collections.emptyList(), resolver.listNamespaces( TEST_REPO_ID, "org.apache.maven.shared", - ALL ) ); - - assertEquals( Arrays.asList( "plexus" ), resolver.listNamespaces( TEST_REPO_ID, "org.codehaus", ALL ) ); - assertEquals( Collections.emptyList(), resolver.listNamespaces( TEST_REPO_ID, "org.codehaus.plexus", - ALL ) ); + assertEquals( Arrays.asList( "example" ), storage.listNamespaces( TEST_REPO_ID, "com", ALL ) ); + assertEquals( Arrays.asList( "test" ), storage.listNamespaces( TEST_REPO_ID, "com.example", ALL ) ); + assertEquals( Collections.emptyList(), storage.listNamespaces( TEST_REPO_ID, "com.example.test", + ALL ) ); + + assertEquals( Arrays.asList( "apache", "codehaus" ), storage.listNamespaces( TEST_REPO_ID, "org", ALL ) ); + assertEquals( Arrays.asList( "archiva", "maven" ), storage.listNamespaces( TEST_REPO_ID, "org.apache", ALL ) ); + assertEquals( Collections.emptyList(), storage.listNamespaces( TEST_REPO_ID, "org.apache.archiva", + ALL ) ); + assertEquals( Arrays.asList( "plugins", "shared" ), storage.listNamespaces( TEST_REPO_ID, "org.apache.maven", + ALL ) ); + assertEquals( Collections.emptyList(), storage.listNamespaces( TEST_REPO_ID, "org.apache.maven.plugins", + ALL ) ); + assertEquals( Collections.emptyList(), storage.listNamespaces( TEST_REPO_ID, "org.apache.maven.shared", + ALL ) ); + + assertEquals( Arrays.asList( "plexus" ), storage.listNamespaces( TEST_REPO_ID, "org.codehaus", ALL ) ); + assertEquals( Collections.emptyList(), storage.listNamespaces( TEST_REPO_ID, "org.codehaus.plexus", + ALL ) ); } public void testGetProjects() { - assertEquals( Collections.emptyList(), resolver.listProjects( TEST_REPO_ID, "com", ALL ) ); - assertEquals( Collections.emptyList(), resolver.listProjects( TEST_REPO_ID, "com.example", ALL ) ); + assertEquals( Collections.emptyList(), storage.listProjects( TEST_REPO_ID, "com", ALL ) ); + assertEquals( Collections.emptyList(), storage.listProjects( TEST_REPO_ID, "com.example", ALL ) ); assertEquals( Arrays.asList( "incomplete-metadata", "invalid-pom", "malformed-metadata", "mislocated-pom", - "missing-metadata", "test-artifact" ), resolver.listProjects( TEST_REPO_ID, - "com.example.test", - ALL ) ); + "missing-metadata", "test-artifact" ), storage.listProjects( TEST_REPO_ID, + "com.example.test", + ALL ) ); - assertEquals( Collections.emptyList(), resolver.listProjects( TEST_REPO_ID, "org", ALL ) ); - assertEquals( Arrays.asList( "apache" ), resolver.listProjects( TEST_REPO_ID, "org.apache", ALL ) ); + assertEquals( Collections.emptyList(), storage.listProjects( TEST_REPO_ID, "org", ALL ) ); + assertEquals( Arrays.asList( "apache" ), storage.listProjects( TEST_REPO_ID, "org.apache", ALL ) ); assertEquals( Arrays.asList( "archiva", "archiva-base", "archiva-common", "archiva-modules", "archiva-parent" ), - resolver.listProjects( TEST_REPO_ID, "org.apache.archiva", ALL ) ); - assertEquals( Collections.emptyList(), resolver.listProjects( TEST_REPO_ID, "org.apache.maven", ALL ) ); - assertEquals( Collections.emptyList(), resolver.listProjects( TEST_REPO_ID, "org.apache.maven.plugins", - ALL ) ); - assertEquals( Arrays.asList( "maven-downloader" ), resolver.listProjects( TEST_REPO_ID, - "org.apache.maven.shared", ALL ) ); + storage.listProjects( TEST_REPO_ID, "org.apache.archiva", ALL ) ); + assertEquals( Collections.emptyList(), storage.listProjects( TEST_REPO_ID, "org.apache.maven", ALL ) ); + assertEquals( Collections.emptyList(), storage.listProjects( TEST_REPO_ID, "org.apache.maven.plugins", + ALL ) ); + assertEquals( Arrays.asList( "maven-downloader" ), storage.listProjects( TEST_REPO_ID, + "org.apache.maven.shared", ALL ) ); } public void testGetProjectVersions() { - assertEquals( Arrays.asList( "1.0-SNAPSHOT" ), resolver.listProjectVersions( TEST_REPO_ID, "com.example.test", - "incomplete-metadata", ALL ) ); - assertEquals( Arrays.asList( "1.0-SNAPSHOT" ), resolver.listProjectVersions( TEST_REPO_ID, "com.example.test", - "malformed-metadata", ALL ) ); - assertEquals( Arrays.asList( "1.0-SNAPSHOT" ), resolver.listProjectVersions( TEST_REPO_ID, "com.example.test", - "missing-metadata", ALL ) ); - assertEquals( Arrays.asList( "1.0" ), resolver.listProjectVersions( TEST_REPO_ID, "com.example.test", - "invalid-pom", ALL ) ); - - assertEquals( Arrays.asList( "4", "5-SNAPSHOT" ), resolver.listProjectVersions( TEST_REPO_ID, "org.apache", - "apache", ALL ) ); - - assertEquals( Arrays.asList( "1.2.1", "1.2.2" ), resolver.listProjectVersions( TEST_REPO_ID, - "org.apache.archiva", "archiva", - ALL ) ); - assertEquals( Arrays.asList( "1.2.1" ), resolver.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", - "archiva-base", ALL ) ); - assertEquals( Arrays.asList( "1.2.1" ), resolver.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", - "archiva-common", ALL ) ); - assertEquals( Arrays.asList( "1.2.1" ), resolver.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", - "archiva-modules", ALL ) ); - assertEquals( Arrays.asList( "3" ), resolver.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", - "archiva-parent", ALL ) ); - - assertEquals( Collections.emptyList(), resolver.listProjectVersions( TEST_REPO_ID, - "org.apache.maven.shared", - "maven-downloader", ALL ) ); + assertEquals( Arrays.asList( "1.0-SNAPSHOT" ), storage.listProjectVersions( TEST_REPO_ID, "com.example.test", + "incomplete-metadata", ALL ) ); + assertEquals( Arrays.asList( "1.0-SNAPSHOT" ), storage.listProjectVersions( TEST_REPO_ID, "com.example.test", + "malformed-metadata", ALL ) ); + assertEquals( Arrays.asList( "1.0-SNAPSHOT" ), storage.listProjectVersions( TEST_REPO_ID, "com.example.test", + "missing-metadata", ALL ) ); + assertEquals( Arrays.asList( "1.0" ), storage.listProjectVersions( TEST_REPO_ID, "com.example.test", + "invalid-pom", ALL ) ); + + assertEquals( Arrays.asList( "4", "5-SNAPSHOT" ), storage.listProjectVersions( TEST_REPO_ID, "org.apache", + "apache", ALL ) ); + + assertEquals( Arrays.asList( "1.2.1", "1.2.2" ), storage.listProjectVersions( TEST_REPO_ID, + "org.apache.archiva", "archiva", + ALL ) ); + assertEquals( Arrays.asList( "1.2.1" ), storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", + "archiva-base", ALL ) ); + assertEquals( Arrays.asList( "1.2.1" ), storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", + "archiva-common", ALL ) ); + assertEquals( Arrays.asList( "1.2.1" ), storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", + "archiva-modules", ALL ) ); + assertEquals( Arrays.asList( "3" ), storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", + "archiva-parent", ALL ) ); + + assertEquals( Collections.emptyList(), storage.listProjectVersions( TEST_REPO_ID, + "org.apache.maven.shared", + "maven-downloader", ALL ) ); } public void testGetArtifacts() { - List artifacts = new ArrayList( resolver.readArtifactsMetadata( - TEST_REPO_ID, "org.codehaus.plexus", "plexus-spring", "1.2", ALL ) ); + List artifacts = new ArrayList( storage.readArtifactsMetadata( TEST_REPO_ID, + "org.codehaus.plexus", + "plexus-spring", + "1.2", + ALL ) ); assertEquals( 3, artifacts.size() ); Collections.sort( artifacts, new Comparator() { @@ -484,8 +484,11 @@ public class Maven2RepositoryMetadataResolverTest { ExcludesFilter filter = new ExcludesFilter( Collections.singletonList( "plexus-spring-1.2.pom" ) ); - List artifacts = new ArrayList( resolver.readArtifactsMetadata( - TEST_REPO_ID, "org.codehaus.plexus", "plexus-spring", "1.2", filter ) ); + List artifacts = new ArrayList( storage.readArtifactsMetadata( TEST_REPO_ID, + "org.codehaus.plexus", + "plexus-spring", + "1.2", + filter ) ); assertEquals( 2, artifacts.size() ); Collections.sort( artifacts, new Comparator() { @@ -501,8 +504,11 @@ public class Maven2RepositoryMetadataResolverTest public void testGetArtifactsTimestampedSnapshots() { - List artifacts = new ArrayList( resolver.readArtifactsMetadata( - TEST_REPO_ID, "com.example.test", "missing-metadata", "1.0-SNAPSHOT", ALL ) ); + List artifacts = new ArrayList( storage.readArtifactsMetadata( TEST_REPO_ID, + "com.example.test", + "missing-metadata", + "1.0-SNAPSHOT", + ALL ) ); assertEquals( 1, artifacts.size() ); ArtifactMetadata artifact = artifacts.get( 0 ); diff --git a/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/dependency/tree/maven2/DependencyTreeBuilderTest.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/dependency/tree/maven2/DependencyTreeBuilderTest.xml index 3edfb8e56..c779c7f46 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/dependency/tree/maven2/DependencyTreeBuilderTest.xml +++ b/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/dependency/tree/maven2/DependencyTreeBuilderTest.xml @@ -29,5 +29,9 @@ org.apache.maven.archiva.configuration.ArchivaConfiguration org.apache.archiva.configuration.TestConfiguration + + org.apache.archiva.metadata.repository.RepositorySessionFactory + org.apache.archiva.metadata.repository.TestRepositorySessionFactory + \ No newline at end of file diff --git a/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.xml index 8ccfa682b..c3cbc23b6 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.xml +++ b/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.xml @@ -27,5 +27,9 @@ org.apache.archiva.metadata.repository.MetadataRepository org.apache.archiva.metadata.repository.TestMetadataRepository + + org.apache.archiva.metadata.repository.RepositorySessionFactory + org.apache.archiva.metadata.repository.TestRepositorySessionFactory + \ No newline at end of file diff --git a/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java b/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java index 76cdd2c7d..a65506fe9 100644 --- a/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java +++ b/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java @@ -59,21 +59,12 @@ import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; -/** - * @plexus.component role="org.apache.archiva.metadata.repository.MetadataRepository" - */ public class FileMetadataRepository implements MetadataRepository { - /** - * @plexus.requirement role="org.apache.archiva.metadata.model.MetadataFacetFactory" - */ - private Map metadataFacetFactories; + private final Map metadataFacetFactories; - /** - * @plexus.requirement - */ - private ArchivaConfiguration configuration; + private final ArchivaConfiguration configuration; private static final Logger log = LoggerFactory.getLogger( FileMetadataRepository.class ); @@ -85,6 +76,13 @@ public class FileMetadataRepository private static final String METADATA_KEY = "metadata"; + public FileMetadataRepository( Map metadataFacetFactories, + ArchivaConfiguration configuration ) + { + this.metadataFacetFactories = metadataFacetFactories; + this.configuration = configuration; + } + private File getBaseDirectory( String repoId ) { // TODO: should be configurable, like the index @@ -1066,16 +1064,6 @@ public class FileMetadataRepository } } - public void setMetadataFacetFactories( Map metadataFacetFactories ) - { - this.metadataFacetFactories = metadataFacetFactories; - } - - public void setConfiguration( ArchivaConfiguration configuration ) - { - this.configuration = configuration; - } - private static class ArtifactComparator implements Comparator { diff --git a/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileRepositorySessionFactory.java b/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileRepositorySessionFactory.java new file mode 100644 index 000000000..4301fc025 --- /dev/null +++ b/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileRepositorySessionFactory.java @@ -0,0 +1,58 @@ +package org.apache.archiva.metadata.repository.file; + +/* + * 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.archiva.metadata.model.MetadataFacetFactory; +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; +import org.apache.maven.archiva.configuration.ArchivaConfiguration; + +import java.util.Map; + +/** + * @plexus.component role="org.apache.archiva.metadata.repository.RepositorySessionFactory" role-hint="file" + */ +public class FileRepositorySessionFactory + implements RepositorySessionFactory +{ + /** + * @plexus.requirement role="org.apache.archiva.metadata.model.MetadataFacetFactory" + */ + private Map metadataFacetFactories; + + /** + * @plexus.requirement + */ + private ArchivaConfiguration configuration; + + /** + * @plexus.requirement + */ + private MetadataResolver metadataResolver; + + public RepositorySession createSession() + { + MetadataRepository metadataRepository = new FileMetadataRepository( metadataFacetFactories, configuration ); + + return new RepositorySession( metadataRepository, metadataResolver ); + } +} diff --git a/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java index 05448af61..3922ec0ea 100644 --- a/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java +++ b/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java @@ -47,10 +47,7 @@ public class FileMetadataRepositoryTest ArchivaConfiguration config = createTestConfiguration( directory ); Map factories = createTestMetadataFacetFactories(); - FileMetadataRepository repository = new FileMetadataRepository(); - repository.setConfiguration( config ); - repository.setMetadataFacetFactories( factories ); - this.repository = repository; + this.repository = new FileMetadataRepository( factories, config ); } protected static ArchivaConfiguration createTestConfiguration( File directory ) diff --git a/archiva-modules/plugins/problem-reports/src/main/java/org/apache/archiva/reports/RepositoryProblemEventListener.java b/archiva-modules/plugins/problem-reports/src/main/java/org/apache/archiva/reports/RepositoryProblemEventListener.java index fe4201056..575af1e82 100644 --- a/archiva-modules/plugins/problem-reports/src/main/java/org/apache/archiva/reports/RepositoryProblemEventListener.java +++ b/archiva-modules/plugins/problem-reports/src/main/java/org/apache/archiva/reports/RepositoryProblemEventListener.java @@ -19,8 +19,11 @@ package org.apache.archiva.reports; * under the License. */ +import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataException; import org.apache.archiva.repository.events.RepositoryListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,12 +38,9 @@ public class RepositoryProblemEventListener { private Logger log = LoggerFactory.getLogger( RepositoryProblemEventListener.class ); - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - - public void deleteArtifact( String repositoryId, String namespace, String project, String version, String id ) + // FIXME: move to session + public void deleteArtifact( MetadataRepository metadataRepository, String repositoryId, String namespace, + String project, String version, String id ) { String name = RepositoryProblemFacet.createName( namespace, project, version, id ); @@ -53,4 +53,46 @@ public class RepositoryProblemEventListener log.warn( "Unable to remove metadata facet as part of delete event: " + e.getMessage(), e ); } } + + public void addArtifact( RepositorySession session, String repoId, String namespace, String projectId, + ProjectVersionMetadata metadata ) + { + // Remove problems associated with this version on successful addition + // TODO: this removes all problems - do we need something that just remove the problems we know are corrected? + String name = RepositoryProblemFacet.createName( namespace, projectId, metadata.getId(), null ); + try + { + MetadataRepository metadataRepository = session.getRepository(); + metadataRepository.removeMetadataFacet( repoId, RepositoryProblemFacet.FACET_ID, name ); + session.markDirty(); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to remove repository problem facets for the version being corrected in the repository: " + + e.getMessage(), e ); + } + } + + public void addArtifactProblem( RepositorySession session, String repoId, String namespace, String projectId, + String projectVersion, RepositoryStorageMetadataException exception ) + { + RepositoryProblemFacet problem = new RepositoryProblemFacet(); + problem.setMessage( exception.getMessage() ); + problem.setProject( projectId ); + problem.setNamespace( namespace ); + problem.setRepositoryId( repoId ); + problem.setVersion( projectVersion ); + problem.setProblem( exception.getId() ); + + try + { + session.getRepository().addMetadataFacet( repoId, problem ); + session.markDirty(); + } + catch ( MetadataRepositoryException e ) + { + log.warn( "Unable to add repository problem facets for the version being removed: " + e.getMessage(), e ); + } + } + } \ No newline at end of file diff --git a/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/DefaultRepositoryStatisticsManager.java b/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/DefaultRepositoryStatisticsManager.java index 876ff19bc..4189a9a2f 100644 --- a/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/DefaultRepositoryStatisticsManager.java +++ b/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/DefaultRepositoryStatisticsManager.java @@ -44,14 +44,9 @@ public class DefaultRepositoryStatisticsManager { private static final Logger log = LoggerFactory.getLogger( DefaultRepositoryStatisticsManager.class ); - /** - * @plexus.requirement - */ - private MetadataRepository metadataRepository; - private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" ); - public RepositoryStatistics getLastStatistics( String repositoryId ) + public RepositoryStatistics getLastStatistics( MetadataRepository metadataRepository, String repositoryId ) throws MetadataRepositoryException { // TODO: consider a more efficient implementation that directly gets the last one from the content repository @@ -69,12 +64,13 @@ public class DefaultRepositoryStatisticsManager } } - private void walkRepository( RepositoryStatistics stats, String repositoryId, String ns ) + private void walkRepository( MetadataRepository metadataRepository, RepositoryStatistics stats, String repositoryId, + String ns ) throws MetadataResolutionException { for ( String namespace : metadataRepository.getNamespaces( repositoryId, ns ) ) { - walkRepository( stats, repositoryId, ns + "." + namespace ); + walkRepository( metadataRepository, stats, repositoryId, ns + "." + namespace ); } Collection projects = metadataRepository.getProjects( repositoryId, ns ); @@ -106,9 +102,8 @@ public class DefaultRepositoryStatisticsManager } } - - public void addStatisticsAfterScan( String repositoryId, Date startTime, Date endTime, long totalFiles, - long newFiles ) + public void addStatisticsAfterScan( MetadataRepository metadataRepository, String repositoryId, Date startTime, + Date endTime, long totalFiles, long newFiles ) throws MetadataRepositoryException { RepositoryStatistics repositoryStatistics = new RepositoryStatistics(); @@ -131,7 +126,7 @@ public class DefaultRepositoryStatisticsManager { for ( String ns : metadataRepository.getRootNamespaces( repositoryId ) ) { - walkRepository( repositoryStatistics, repositoryId, ns ); + walkRepository( metadataRepository, repositoryStatistics, repositoryId, ns ); } } catch ( MetadataResolutionException e ) @@ -143,13 +138,14 @@ public class DefaultRepositoryStatisticsManager metadataRepository.addMetadataFacet( repositoryId, repositoryStatistics ); } - public void deleteStatistics( String repositoryId ) + public void deleteStatistics( MetadataRepository metadataRepository, String repositoryId ) throws MetadataRepositoryException { metadataRepository.removeMetadataFacets( repositoryId, RepositoryStatistics.FACET_ID ); } - public List getStatisticsInRange( String repositoryId, Date startTime, Date endTime ) + public List getStatisticsInRange( MetadataRepository metadataRepository, String repositoryId, + Date startTime, Date endTime ) throws MetadataRepositoryException { List results = new ArrayList(); @@ -183,9 +179,4 @@ public class DefaultRepositoryStatisticsManager fmt.setTimeZone( UTC_TIME_ZONE ); return fmt; } - - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } } diff --git a/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManager.java b/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManager.java index 69fed9f65..a1e1a03ec 100644 --- a/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManager.java +++ b/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManager.java @@ -19,6 +19,7 @@ package org.apache.archiva.metadata.repository.stats; * under the License. */ +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import java.util.Date; @@ -26,15 +27,17 @@ import java.util.List; public interface RepositoryStatisticsManager { - RepositoryStatistics getLastStatistics( String repositoryId ) + RepositoryStatistics getLastStatistics( MetadataRepository metadataRepository, String repositoryId ) throws MetadataRepositoryException; - void addStatisticsAfterScan( String repositoryId, Date startTime, Date endTime, long totalFiles, long newFiles ) + void addStatisticsAfterScan( MetadataRepository metadataRepository, String repositoryId, Date startTime, + Date endTime, long totalFiles, long newFiles ) throws MetadataRepositoryException; - void deleteStatistics( String repositoryId ) + void deleteStatistics( MetadataRepository metadataRepository, String repositoryId ) throws MetadataRepositoryException; - List getStatisticsInRange( String repositoryId, Date startTime, Date endTime ) + List getStatisticsInRange( MetadataRepository metadataRepository, String repositoryId, + Date startTime, Date endTime ) throws MetadataRepositoryException; } diff --git a/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java b/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java index 9757ca910..70ef1703b 100644 --- a/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java +++ b/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java @@ -71,7 +71,6 @@ public class RepositoryStatisticsManagerTest metadataRepositoryControl = MockControl.createControl( MetadataRepository.class ); metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock(); - repositoryStatisticsManager.setMetadataRepository( metadataRepository ); } public void testGetLatestStats() @@ -98,7 +97,7 @@ public class RepositoryStatisticsManagerTest SECOND_TEST_SCAN ), stats ); metadataRepositoryControl.replay(); - stats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ); + stats = repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ); assertNotNull( stats ); assertEquals( 1314527915L, stats.getTotalArtifactFileSize() ); assertEquals( 123, stats.getNewFileCount() ); @@ -121,7 +120,7 @@ public class RepositoryStatisticsManagerTest Collections.emptyList() ); metadataRepositoryControl.replay(); - RepositoryStatistics stats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ); + RepositoryStatistics stats = repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ); assertNull( stats ); metadataRepositoryControl.verify(); @@ -148,9 +147,10 @@ public class RepositoryStatisticsManagerTest metadataRepositoryControl.replay(); - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, startTime, current, 56345, 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, startTime, current, 56345, + 45 ); - stats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ); + stats = repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ); assertNotNull( stats ); assertEquals( 246900, stats.getTotalArtifactFileSize() ); assertEquals( 45, stats.getNewFileCount() ); @@ -195,16 +195,16 @@ public class RepositoryStatisticsManagerTest metadataRepositoryControl.replay(); - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, startTime1, stats1.getScanEndTime(), 56345, - 45 ); - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, startTime2, stats2.getScanEndTime(), 56345, - 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, startTime1, + stats1.getScanEndTime(), 56345, 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, startTime2, + stats2.getScanEndTime(), 56345, 45 ); - assertNotNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) ); + assertNotNull( repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ) ); - repositoryStatisticsManager.deleteStatistics( TEST_REPO_ID ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, TEST_REPO_ID ); - assertNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) ); + assertNull( repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ) ); metadataRepositoryControl.verify(); } @@ -220,11 +220,11 @@ public class RepositoryStatisticsManagerTest metadataRepositoryControl.replay(); - assertNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) ); + assertNull( repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ) ); - repositoryStatisticsManager.deleteStatistics( TEST_REPO_ID ); + repositoryStatisticsManager.deleteStatistics( metadataRepository, TEST_REPO_ID ); - assertNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) ); + assertNull( repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ) ); metadataRepositoryControl.verify(); } @@ -257,12 +257,14 @@ public class RepositoryStatisticsManagerTest for ( RepositoryStatistics stats : statsCreated.values() ) { - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats.getScanStartTime(), - stats.getScanEndTime(), 56345, 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, + stats.getScanStartTime(), stats.getScanEndTime(), 56345, + 45 ); } - List list = repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( - current.getTime() - 4000 ), new Date( current.getTime() - 2000 ) ); + List list = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, + TEST_REPO_ID, new Date( + current.getTime() - 4000 ), new Date( current.getTime() - 2000 ) ); assertEquals( 1, list.size() ); assertEquals( new Date( current.getTime() - 3000 ), list.get( 0 ).getScanStartTime() ); @@ -302,12 +304,14 @@ public class RepositoryStatisticsManagerTest for ( RepositoryStatistics stats : statsCreated.values() ) { - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats.getScanStartTime(), - stats.getScanEndTime(), 56345, 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, + stats.getScanStartTime(), stats.getScanEndTime(), 56345, + 45 ); } - List list = repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( - current.getTime() - 4000 ), current ); + List list = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, + TEST_REPO_ID, new Date( + current.getTime() - 4000 ), current ); assertEquals( 2, list.size() ); assertEquals( new Date( current.getTime() - 3000 ), list.get( 1 ).getScanStartTime() ); @@ -348,12 +352,14 @@ public class RepositoryStatisticsManagerTest for ( RepositoryStatistics stats : statsCreated.values() ) { - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats.getScanStartTime(), - stats.getScanEndTime(), 56345, 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, + stats.getScanStartTime(), stats.getScanEndTime(), 56345, + 45 ); } - List list = repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( - current.getTime() - 20000 ), new Date( current.getTime() - 2000 ) ); + List list = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, + TEST_REPO_ID, new Date( + current.getTime() - 20000 ), new Date( current.getTime() - 2000 ) ); assertEquals( 2, list.size() ); assertEquals( new Date( current.getTime() - 12345 ), list.get( 1 ).getScanStartTime() ); @@ -399,12 +405,14 @@ public class RepositoryStatisticsManagerTest for ( RepositoryStatistics stats : statsCreated.values() ) { - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats.getScanStartTime(), - stats.getScanEndTime(), 56345, 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, + stats.getScanStartTime(), stats.getScanEndTime(), 56345, + 45 ); } - List list = repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( - current.getTime() - 20000 ), current ); + List list = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, + TEST_REPO_ID, new Date( + current.getTime() - 20000 ), current ); assertEquals( 3, list.size() ); assertEquals( new Date( current.getTime() - 12345 ), list.get( 2 ).getScanStartTime() ); @@ -435,12 +443,14 @@ public class RepositoryStatisticsManagerTest for ( RepositoryStatistics stats : statsCreated.values() ) { - repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats.getScanStartTime(), - stats.getScanEndTime(), 56345, 45 ); + repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, + stats.getScanStartTime(), stats.getScanEndTime(), 56345, + 45 ); } - List list = repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( - current.getTime() - 20000 ), new Date( current.getTime() - 16000 ) ); + List list = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, + TEST_REPO_ID, new Date( + current.getTime() - 20000 ), new Date( current.getTime() - 16000 ) ); assertEquals( 0, list.size() ); diff --git a/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMerger.java b/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMerger.java index 294956a64..6b359ce1a 100644 --- a/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMerger.java +++ b/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMerger.java @@ -20,33 +20,33 @@ package org.apache.archiva.stagerepository.merge; */ import org.apache.archiva.metadata.model.ArtifactMetadata; +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.filter.Filter; import org.apache.archiva.metadata.repository.filter.IncludesFilter; -import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; -import org.apache.maven.archiva.repository.RepositoryException; -import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException; -import org.apache.maven.archiva.repository.metadata.RepositoryMetadataWriter; -import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader; +import org.apache.maven.archiva.common.utils.VersionComparator; +import org.apache.maven.archiva.common.utils.VersionUtil; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; import org.apache.maven.archiva.model.ArchivaRepositoryMetadata; -import org.apache.maven.archiva.common.utils.VersionComparator; -import org.apache.maven.archiva.common.utils.VersionUtil; +import org.apache.maven.archiva.repository.RepositoryException; +import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException; +import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader; +import org.apache.maven.archiva.repository.metadata.RepositoryMetadataWriter; -import java.util.List; -import java.util.Date; -import java.util.Calendar; -import java.util.TimeZone; -import java.util.ArrayList; -import java.util.Collections; -import java.io.IOException; import java.io.File; -import java.io.FileOutputStream; import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; /** * @plexus.component role="org.apache.archiva.stagerepository.merge.RepositoryMerger" role-hint="maven2" @@ -54,12 +54,6 @@ import java.text.SimpleDateFormat; public class Maven2RepositoryMerger implements RepositoryMerger { - - /** - * @plexus.requirement role-hint="default" - */ - private MetadataRepository metadataRepository; - /** * @plexus.requirement role-hint="default" */ @@ -77,12 +71,7 @@ public class Maven2RepositoryMerger this.configuration = configuration; } - public void setMetadataRepository( MetadataRepository metadataRepository ) - { - this.metadataRepository = metadataRepository; - } - - public void merge( String sourceRepoId, String targetRepoId ) + public void merge( MetadataRepository metadataRepository, String sourceRepoId, String targetRepoId ) throws Exception { @@ -95,7 +84,8 @@ public class Maven2RepositoryMerger } // TODO when UI needs a subset to merge - public void merge( String sourceRepoId, String targetRepoId, Filter filter ) + public void merge( MetadataRepository metadataRepository, String sourceRepoId, String targetRepoId, + Filter filter ) throws Exception { List sourceArtifacts = metadataRepository.getArtifacts( sourceRepoId ); @@ -183,15 +173,16 @@ public class Maven2RepositoryMerger { // updating version metadata files - File versionMetaDataFileInSourceRepo = - pathTranslator.toFile( new File( sourceRepoPath ), artifactMetadata.getNamespace(), - artifactMetadata.getProject(), artifactMetadata.getVersion(), - METADATA_FILENAME ); + File versionMetaDataFileInSourceRepo = pathTranslator.toFile( new File( sourceRepoPath ), + artifactMetadata.getNamespace(), + artifactMetadata.getProject(), + artifactMetadata.getVersion(), + METADATA_FILENAME ); - if( versionMetaDataFileInSourceRepo.exists() ) + if ( versionMetaDataFileInSourceRepo.exists() ) { - String relativePathToVersionMetadataFile = - versionMetaDataFileInSourceRepo.getAbsolutePath().split( sourceRepoPath )[1]; + String relativePathToVersionMetadataFile = versionMetaDataFileInSourceRepo.getAbsolutePath().split( + sourceRepoPath )[1]; File versionMetaDataFileInTargetRepo = new File( targetRepoPath, relativePathToVersionMetadataFile ); if ( !versionMetaDataFileInTargetRepo.exists() ) @@ -209,10 +200,10 @@ public class Maven2RepositoryMerger String projectDirectoryInSourceRepo = new File( versionMetaDataFileInSourceRepo.getParent() ).getParent(); File projectMetadataFileInSourceRepo = new File( projectDirectoryInSourceRepo, METADATA_FILENAME ); - if( projectMetadataFileInSourceRepo.exists() ) + if ( projectMetadataFileInSourceRepo.exists() ) { - String relativePathToProjectMetadataFile = - projectMetadataFileInSourceRepo.getAbsolutePath().split( sourceRepoPath )[1]; + String relativePathToProjectMetadataFile = projectMetadataFileInSourceRepo.getAbsolutePath().split( + sourceRepoPath )[1]; File projectMetadataFileInTargetRepo = new File( targetRepoPath, relativePathToProjectMetadataFile ); if ( !projectMetadataFileInTargetRepo.exists() ) @@ -332,7 +323,8 @@ public class Maven2RepositoryMerger return metadata; } - public List getConflictingArtifacts( String sourceRepo, String targetRepo ) + public List getConflictingArtifacts( MetadataRepository metadataRepository, String sourceRepo, + String targetRepo ) throws Exception { List targetArtifacts = metadataRepository.getArtifacts( targetRepo ); @@ -364,9 +356,9 @@ public class Maven2RepositoryMerger boolean isSame = false; if ( ( sourceArtifact.getNamespace().equals( targetArtifact.getNamespace() ) ) && - ( sourceArtifact.getProject().equals( targetArtifact.getProject() ) ) && - ( sourceArtifact.getId().equals( targetArtifact.getId() ) ) && - ( sourceArtifact.getProjectVersion().equals( targetArtifact.getProjectVersion() ) ) ) + ( sourceArtifact.getProject().equals( targetArtifact.getProject() ) ) && ( sourceArtifact.getId().equals( + targetArtifact.getId() ) ) && ( sourceArtifact.getProjectVersion().equals( + targetArtifact.getProjectVersion() ) ) ) { isSame = true; diff --git a/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/RepositoryMerger.java b/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/RepositoryMerger.java index 85bb52cb5..7fc3f6999 100644 --- a/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/RepositoryMerger.java +++ b/archiva-modules/plugins/stage-repository-merge/src/main/java/org/apache/archiva/stagerepository/merge/RepositoryMerger.java @@ -19,18 +19,22 @@ package org.apache.archiva.stagerepository.merge; * under the License. */ -import java.util.List; - import org.apache.archiva.metadata.model.ArtifactMetadata; +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.filter.Filter; +import java.util.List; + public interface RepositoryMerger { - void merge( String sourceRepoId, String targetRepoId ) + void merge( MetadataRepository metadataRepository, String sourceRepoId, String targetRepoId ) + throws Exception; + + void merge( MetadataRepository metadataRepository, String sourceRepoId, String targetRepoId, + Filter filter ) throws Exception; - void merge( String sourceRepoId, String targetRepoId, Filter filter ) throws Exception; - - public List getConflictingArtifacts( String sourceRepo, String targetRepo ) + public List getConflictingArtifacts( MetadataRepository metadataRepository, String sourceRepo, + String targetRepo ) throws Exception; } \ No newline at end of file diff --git a/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMergerTest.java b/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMergerTest.java index 2346850fc..c646d5cc9 100644 --- a/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMergerTest.java +++ b/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/stagerepository/merge/Maven2RepositoryMergerTest.java @@ -19,23 +19,21 @@ package org.apache.archiva.stagerepository.merge; * under the License. */ -import org.codehaus.plexus.spring.PlexusInSpringTestCase; -import org.apache.maven.archiva.configuration.Configuration; +import org.apache.archiva.metadata.model.ArtifactMetadata; +import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.maven.archiva.configuration.ArchivaConfiguration; +import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration; -import org.apache.maven.archiva.repository.RepositoryContentFactory; -import org.apache.archiva.metadata.repository.MetadataRepository; -import org.apache.archiva.metadata.model.ArtifactMetadata; -import org.mockito.*; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; +import org.codehaus.plexus.spring.PlexusInSpringTestCase; import org.junit.Before; +import org.mockito.MockitoAnnotations; -import java.util.List; -import java.util.ArrayList; import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.*; public class Maven2RepositoryMergerTest extends PlexusInSpringTestCase @@ -43,17 +41,6 @@ public class Maven2RepositoryMergerTest private static final String TEST_REPO_ID = "test"; - private static final String TARGET_REPOSITORY_ID = "target-repo"; - - private Configuration config; - - @MockitoAnnotations.Mock - private MetadataRepository metadataResolver; - - private RepositoryContentFactory repositoryFactory; - - private ArchivaConfiguration configuration; - private Maven2RepositoryMerger repositoryMerger; private MetadataRepository metadataRepository; @@ -66,7 +53,6 @@ public class Maven2RepositoryMergerTest MockitoAnnotations.initMocks( this ); metadataRepository = mock( MetadataRepository.class ); repositoryMerger = (Maven2RepositoryMerger) lookup( RepositoryMerger.class, "maven2" ); - repositoryMerger.setMetadataRepository( metadataRepository ); } private List getArtifacts() @@ -106,7 +92,7 @@ public class Maven2RepositoryMergerTest configuration.save( c ); when( metadataRepository.getArtifacts( TEST_REPO_ID ) ).thenReturn( getArtifacts() ); - repositoryMerger.merge( TEST_REPO_ID, "target-rep" ); + repositoryMerger.merge( metadataRepository, TEST_REPO_ID, "target-rep" ); verify( metadataRepository ).getArtifacts( TEST_REPO_ID ); } @@ -154,7 +140,8 @@ public class Maven2RepositoryMergerTest when( metadataRepository.getArtifacts( sourceRepoId ) ).thenReturn( sourceRepoArtifactsList ); when( metadataRepository.getArtifacts( TEST_REPO_ID ) ).thenReturn( targetRepoArtifactsList ); - assertEquals( 1, repositoryMerger.getConflictingArtifacts( sourceRepoId, TEST_REPO_ID ).size() ); + assertEquals( 1, repositoryMerger.getConflictingArtifacts( metadataRepository, sourceRepoId, + TEST_REPO_ID ).size() ); verify( metadataRepository ).getArtifacts( TEST_REPO_ID ); }