From 63c171e2eb136117115bc2f964d92c8a30480d6e Mon Sep 17 00:00:00 2001 From: Brett Porter Date: Tue, 5 Sep 2006 07:00:52 +0000 Subject: [PATCH] [MRM-161] move the query layer tests, remove unnecessary mocks, and fix tests to test legitimate things. Remove tests for null artifact ids, etc since it is impossible that they would be created with a normal (non-mock) API and the reporting will get these errors fed through from the file positioning and model validation errors instead git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@440282 13f79535-47bb-0310-9956-ffa450edef68 --- .../archiva/DefaultRepositoryManager.java | 2 +- .../archiva/reporting/ArtifactReporter.java | 23 +- .../reporting/BadMetadataReportProcessor.java | 31 +- .../DefaultArtifactReportProcessor.java | 123 ++---- .../reporting/DefaultArtifactReporter.java | 2 +- .../ArtifactReportProcessorTest.java | 373 ++++-------------- .../reporting/ArtifactReporterTest.java | 68 ++-- .../BadMetadataReportProcessorTest.java | 3 +- .../archiva/reporting/GenericMockObject.java | 62 --- .../maven/archiva/reporting/MockArtifact.java | 258 ------------ .../reporting/MockArtifactFactory.java | 92 ----- .../MockArtifactReportProcessor.java | 80 ---- .../reporting/MockRepositoryQueryLayer.java | 80 ---- .../archiva/reporting/ReportCondition.java | 74 ---- .../layer/AbstractRepositoryQueryLayer.java | 106 ----- .../layer/CachedRepositoryQueryLayer.java | 56 ++- .../layer/DefaultRepositoryQueryLayer.java | 70 +++- .../archiva/layer/RepositoryQueryLayer.java | 6 +- .../AbstractRepositoryQueryLayerTestCase.java | 53 +-- .../maven/archiva/layer}/CacheTest.java | 3 +- .../CachedRepositoryQueryLayerTest.java | 25 +- .../DefaultRepositoryQueryLayerTest.java | 29 ++ .../1.0-alpha-1/artifactId-1.0-alpha-1.jar | Bin 0 -> 45568 bytes .../1.0-alpha-1/artifactId-1.0-alpha-1.pom | 6 + .../groupId/artifactId/maven-metadata.xml | 26 ++ ...artifact-1.0-alpha-1-20050611.202024-1.pom | 0 26 files changed, 336 insertions(+), 1315 deletions(-) delete mode 100644 archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/GenericMockObject.java delete mode 100644 archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifact.java delete mode 100644 archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactFactory.java delete mode 100644 archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactReportProcessor.java delete mode 100644 archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockRepositoryQueryLayer.java delete mode 100644 archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ReportCondition.java delete mode 100644 archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayer.java rename {archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting => archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer}/AbstractRepositoryQueryLayerTestCase.java (66%) rename {archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting => archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer}/CacheTest.java (97%) rename {archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting => archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer}/CachedRepositoryQueryLayerTest.java (71%) create mode 100644 archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayerTest.java create mode 100644 archiva-repository-layer/src/test/repository/groupId/artifactId/1.0-alpha-1/artifactId-1.0-alpha-1.jar create mode 100644 archiva-repository-layer/src/test/repository/groupId/artifactId/1.0-alpha-1/artifactId-1.0-alpha-1.pom create mode 100644 archiva-repository-layer/src/test/repository/groupId/artifactId/maven-metadata.xml create mode 100644 archiva-repository-layer/src/test/repository/groupId/snapshot-artifact/1.0-alpha-1-SNAPSHOT/snapshot-artifact-1.0-alpha-1-20050611.202024-1.pom diff --git a/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java b/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java index 35681ea65..271f97a09 100644 --- a/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java +++ b/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java @@ -49,7 +49,7 @@ public class DefaultRepositoryManager private RepositoryConverter repositoryConverter; /** - * @plexus.requirement role-hint="default" + * @plexus.requirement */ private ArtifactReporter reporter; diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReporter.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReporter.java index dab65753c..d9bfcc7c3 100644 --- a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReporter.java +++ b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReporter.java @@ -28,34 +28,19 @@ import java.util.Iterator; * failures and successes for checking assertions. Later, implementations will be made to present reports on the * web interface, send them via mail, and so on. * - * @todo i18n + * @todo i18n, including message formatting and parameterisation + * @todo remove no longer used reports! */ public interface ArtifactReporter { String ROLE = ArtifactReporter.class.getName(); - String NULL_MODEL = "Provided model was null"; - - String NULL_ARTIFACT = "Provided artifact was null"; - - String EMPTY_GROUP_ID = "Group id was empty or null"; - - String EMPTY_ARTIFACT_ID = "Artifact id was empty or null"; - - String EMPTY_VERSION = "Version was empty or null"; - - String EMPTY_DEPENDENCY_GROUP_ID = "Group id was empty or null"; - - String EMPTY_DEPENDENCY_ARTIFACT_ID = "Artifact id was empty or null"; - - String EMPTY_DEPENDENCY_VERSION = "Version was empty or null"; - - String NO_DEPENDENCIES = "Artifact has no dependencies"; - String ARTIFACT_NOT_FOUND = "Artifact does not exist in the repository"; String DEPENDENCY_NOT_FOUND = "Artifact's dependency does not exist in the repository"; + String DEPENDENCY_INVALID_VERSION = "Artifact's dependency contains an invalid version"; + void addFailure( Artifact artifact, String reason ); void addSuccess( Artifact artifact ); diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java index 733524002..7ba79b61a 100644 --- a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java +++ b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java @@ -212,13 +212,16 @@ public class BadMetadataReportProcessor boolean hasFailures = false; Snapshot snapshot = metadata.getMetadata().getVersioning().getSnapshot(); - String timestamp = snapshot.getTimestamp(); - String buildNumber = String.valueOf( snapshot.getBuildNumber() ); - Artifact artifact = createArtifact( metadata ); - if ( !repositoryQueryLayer.containsArtifact( artifact, snapshot ) ) + String version = metadata.getBaseVersion().replace( Artifact.SNAPSHOT_VERSION, + snapshot.getTimestamp() + "-" + snapshot.getBuildNumber() ); + Artifact artifact = + artifactFactory.createProjectArtifact( metadata.getGroupId(), metadata.getArtifactId(), version ); + artifact.isSnapshot(); // trigger baseVersion correction + + if ( !repositoryQueryLayer.containsArtifact( artifact ) ) { - reporter.addFailure( metadata, "Snapshot artifact " + timestamp + "-" + buildNumber + " does not exist." ); + reporter.addFailure( metadata, "Snapshot artifact " + version + " does not exist." ); hasFailures = true; } @@ -244,7 +247,8 @@ public class BadMetadataReportProcessor { String version = (String) versions.next(); - Artifact artifact = createArtifact( metadata, version ); + Artifact artifact = + artifactFactory.createProjectArtifact( metadata.getGroupId(), metadata.getArtifactId(), version ); if ( !repositoryQueryLayer.containsArtifact( artifact ) ) { @@ -287,20 +291,9 @@ public class BadMetadataReportProcessor return hasFailures; } - /** - * Used to create an artifact object from a metadata base version - */ - private Artifact createArtifact( RepositoryMetadata metadata ) - { - return artifactFactory.createProjectArtifact( metadata.getGroupId(), metadata.getArtifactId(), - metadata.getBaseVersion() ); - } - - /** - * Used to create an artifact object with a specified version - */ - private Artifact createArtifact( RepositoryMetadata metadata, String version ) + private Artifact createArtifact( RepositoryMetadata metadata, Snapshot snapshot ) { + String version = metadata.getBaseVersion(); return artifactFactory.createProjectArtifact( metadata.getGroupId(), metadata.getArtifactId(), version ); } diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReportProcessor.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReportProcessor.java index 22e220a66..b9fd36dd7 100644 --- a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReportProcessor.java +++ b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReportProcessor.java @@ -17,9 +17,12 @@ package org.apache.maven.archiva.reporting; */ import org.apache.maven.archiva.layer.RepositoryQueryLayer; +import org.apache.maven.archiva.layer.RepositoryQueryLayerFactory; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; +import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; @@ -32,94 +35,54 @@ import java.util.List; public class DefaultArtifactReportProcessor implements ArtifactReportProcessor { - private static final String EMPTY_STRING = ""; - - // plexus components + /** + * @plexus.requirement + */ private ArtifactFactory artifactFactory; - private RepositoryQueryLayer repositoryQueryLayer; + /** + * @plexus.requirement + */ + private RepositoryQueryLayerFactory layerFactory; public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter, ArtifactRepository repository ) { - if ( artifact == null ) - { - reporter.addFailure( artifact, ArtifactReporter.NULL_ARTIFACT ); - } - else - { - processArtifact( artifact, reporter ); - } + RepositoryQueryLayer queryLayer = layerFactory.createRepositoryQueryLayer( repository ); + processArtifact( artifact, reporter, queryLayer ); - if ( model == null ) - { - reporter.addFailure( artifact, ArtifactReporter.NULL_MODEL ); - } - else - { - List dependencies = model.getDependencies(); - processDependencies( dependencies, reporter ); - } + List dependencies = model.getDependencies(); + processDependencies( dependencies, reporter, queryLayer ); } - private void processArtifact( Artifact artifact, ArtifactReporter reporter ) + private void processArtifact( Artifact artifact, ArtifactReporter reporter, + RepositoryQueryLayer repositoryQueryLayer ) { - boolean hasFailed = false; - if ( EMPTY_STRING.equals( artifact.getGroupId() ) || artifact.getGroupId() == null ) + if ( repositoryQueryLayer.containsArtifact( artifact ) ) { - reporter.addFailure( artifact, ArtifactReporter.EMPTY_GROUP_ID ); - hasFailed = true; + reporter.addSuccess( artifact ); } - if ( EMPTY_STRING.equals( artifact.getArtifactId() ) || artifact.getArtifactId() == null ) - { - reporter.addFailure( artifact, ArtifactReporter.EMPTY_ARTIFACT_ID ); - hasFailed = true; - } - if ( EMPTY_STRING.equals( artifact.getVersion() ) || artifact.getVersion() == null ) + else { - reporter.addFailure( artifact, ArtifactReporter.EMPTY_VERSION ); - hasFailed = true; - } - if ( !hasFailed ) - { - if ( repositoryQueryLayer.containsArtifact( artifact ) ) - { - reporter.addSuccess( artifact ); - } - else - { - reporter.addFailure( artifact, ArtifactReporter.ARTIFACT_NOT_FOUND ); - } + reporter.addFailure( artifact, ArtifactReporter.ARTIFACT_NOT_FOUND ); } } - private void processDependencies( List dependencies, ArtifactReporter reporter ) + private void processDependencies( List dependencies, ArtifactReporter reporter, + RepositoryQueryLayer repositoryQueryLayer ) { if ( dependencies.size() > 0 ) { Iterator iterator = dependencies.iterator(); while ( iterator.hasNext() ) { - boolean hasFailed = false; Dependency dependency = (Dependency) iterator.next(); - Artifact artifact = createArtifact( dependency ); - if ( EMPTY_STRING.equals( dependency.getGroupId() ) || dependency.getGroupId() == null ) - { - reporter.addFailure( artifact, ArtifactReporter.EMPTY_DEPENDENCY_GROUP_ID ); - hasFailed = true; - } - if ( EMPTY_STRING.equals( dependency.getArtifactId() ) || dependency.getArtifactId() == null ) - { - reporter.addFailure( artifact, ArtifactReporter.EMPTY_DEPENDENCY_ARTIFACT_ID ); - hasFailed = true; - } - if ( EMPTY_STRING.equals( dependency.getVersion() ) || dependency.getVersion() == null ) - { - reporter.addFailure( artifact, ArtifactReporter.EMPTY_DEPENDENCY_VERSION ); - hasFailed = true; - } - if ( !hasFailed ) + + Artifact artifact = null; + try { + artifact = createArtifact( dependency ); + if ( repositoryQueryLayer.containsArtifact( artifact ) ) { reporter.addSuccess( artifact ); @@ -129,34 +92,20 @@ public class DefaultArtifactReportProcessor reporter.addFailure( artifact, ArtifactReporter.DEPENDENCY_NOT_FOUND ); } } + catch ( InvalidVersionSpecificationException e ) + { + reporter.addFailure( artifact, ArtifactReporter.DEPENDENCY_INVALID_VERSION ); + } } } - - } - - /** - * Only used for passing a mock object when unit testing - * - * @param repositoryQueryLayer - */ - protected void setRepositoryQueryLayer( RepositoryQueryLayer repositoryQueryLayer ) - { - this.repositoryQueryLayer = repositoryQueryLayer; - } - - /** - * Only used for passing a mock object when unit testing - * - * @param artifactFactory - */ - protected void setArtifactFactory( ArtifactFactory artifactFactory ) - { - this.artifactFactory = artifactFactory; } private Artifact createArtifact( Dependency dependency ) + throws InvalidVersionSpecificationException { - return artifactFactory.createBuildArtifact( dependency.getGroupId(), dependency.getArtifactId(), - dependency.getVersion(), "pom" ); + return artifactFactory.createDependencyArtifact( dependency.getGroupId(), dependency.getArtifactId(), + VersionRange.createFromVersionSpec( dependency.getVersion() ), + dependency.getType(), dependency.getClassifier(), + dependency.getScope() ); } } diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReporter.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReporter.java index d70e77144..7c10eb4e6 100644 --- a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReporter.java +++ b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReporter.java @@ -24,7 +24,7 @@ import java.util.Iterator; import java.util.List; /** - * @plexus.component role="org.apache.maven.archiva.reporting.ArtifactReporter" role-hint="default" + * @plexus.component role="org.apache.maven.archiva.reporting.ArtifactReporter" */ public class DefaultArtifactReporter implements ArtifactReporter diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReportProcessorTest.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReportProcessorTest.java index f1e245368..1b3d60759 100644 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReportProcessorTest.java +++ b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReportProcessorTest.java @@ -17,6 +17,7 @@ package org.apache.maven.archiva.reporting; */ import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; @@ -28,77 +29,53 @@ import java.util.Iterator; public class ArtifactReportProcessorTest extends AbstractRepositoryReportsTestCase { - private static final String EMPTY_STRING = ""; + private static final String VALID_GROUP_ID = "groupId"; - private static final String VALID = "temp"; + private static final String VALID_ARTIFACT_ID = "artifactId"; - private ArtifactReporter reporter; + private static final String VALID_VERSION = "1.0-alpha-1"; - private Artifact artifact; + private ArtifactReporter reporter; private Model model; - private DefaultArtifactReportProcessor processor; + private ArtifactReportProcessor processor; - private static final boolean ARTIFACT_FOUND = true; + private ArtifactFactory artifactFactory; - private static final boolean ARTIFACT_NOT_FOUND = false; + private static final String INVALID = "invalid"; protected void setUp() throws Exception { super.setUp(); - reporter = new DefaultArtifactReporter(); - artifact = new MockArtifact(); + reporter = (ArtifactReporter) lookup( ArtifactReporter.ROLE ); model = new Model(); - processor = new DefaultArtifactReportProcessor(); - } + processor = (ArtifactReportProcessor) lookup( ArtifactReportProcessor.ROLE, "default" ); - public void testNullArtifact() - { - processor.processArtifact( model, null, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.NULL_ARTIFACT, result.getReason() ); + artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE ); } - public void testNoProjectDescriptor() + public void testArtifactFoundButNoDirectDependencies() + throws ReportProcessorException { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - setRequiredElements( artifact, VALID, VALID, VALID ); - processor.processArtifact( null, artifact, reporter, null ); + Artifact artifact = createValidArtifact(); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 1, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); + assertEquals( 0, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.NULL_MODEL, result.getReason() ); } - public void testArtifactFoundButNoDirectDependencies() + private Artifact createValidArtifact() { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - setRequiredElements( artifact, VALID, VALID, VALID ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 1, reporter.getNumSuccesses() ); - assertEquals( 0, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); + return artifactFactory.createProjectArtifact( VALID_GROUP_ID, VALID_ARTIFACT_ID, VALID_VERSION ); } public void testArtifactNotFound() + throws ReportProcessorException { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_NOT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - setRequiredElements( artifact, VALID, VALID, VALID ); - processor.processArtifact( model, artifact, reporter, null ); + Artifact artifact = artifactFactory.createProjectArtifact( INVALID, INVALID, INVALID ); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 0, reporter.getNumSuccesses() ); assertEquals( 1, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); @@ -108,100 +85,67 @@ public class ArtifactReportProcessorTest } public void testValidArtifactWithNullDependency() + throws ReportProcessorException { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); + Artifact artifact = createValidArtifact(); - setRequiredElements( artifact, VALID, VALID, VALID ); - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - - Dependency dependency = new Dependency(); - setRequiredElements( dependency, VALID, VALID, VALID ); + Dependency dependency = createValidDependency(); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 2, reporter.getNumSuccesses() ); assertEquals( 0, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); } - public void testValidArtifactWithValidSingleDependency() + private Dependency createValidDependency() { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); + return createDependency( VALID_GROUP_ID, VALID_ARTIFACT_ID, VALID_VERSION ); + } - setRequiredElements( artifact, VALID, VALID, VALID ); - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); + public void testValidArtifactWithValidSingleDependency() + throws ReportProcessorException + { + Artifact artifact = createValidArtifact(); - Dependency dependency = new Dependency(); - setRequiredElements( dependency, VALID, VALID, VALID ); + Dependency dependency = createValidDependency(); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 2, reporter.getNumSuccesses() ); assertEquals( 0, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); } public void testValidArtifactWithValidMultipleDependencies() + throws ReportProcessorException { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); - - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - - Dependency dependency = new Dependency(); - setRequiredElements( dependency, VALID, VALID, VALID ); + Dependency dependency = createValidDependency(); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - setRequiredElements( artifact, VALID, VALID, VALID ); - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); + Artifact artifact = createValidArtifact(); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 6, reporter.getNumSuccesses() ); assertEquals( 0, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); } public void testValidArtifactWithAnInvalidDependency() + throws ReportProcessorException { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); - - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - - Dependency dependency = new Dependency(); - setRequiredElements( dependency, VALID, VALID, VALID ); - model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); + Dependency dependency = createValidDependency(); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_NOT_FOUND ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); + model.addDependency( createDependency( INVALID, INVALID, INVALID ) ); - setRequiredElements( artifact, VALID, VALID, VALID ); - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); + Artifact artifact = createValidArtifact(); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 5, reporter.getNumSuccesses() ); assertEquals( 1, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); @@ -211,253 +155,84 @@ public class ArtifactReportProcessorTest assertEquals( ArtifactReporter.DEPENDENCY_NOT_FOUND, result.getReason() ); } - public void testEmptyGroupId() - { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - - setRequiredElements( artifact, EMPTY_STRING, VALID, VALID ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_GROUP_ID, result.getReason() ); - } - - public void testEmptyArtifactId() - { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - - setRequiredElements( artifact, VALID, EMPTY_STRING, VALID ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_ARTIFACT_ID, result.getReason() ); - } - - public void testEmptyVersion() - { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - - setRequiredElements( artifact, VALID, VALID, EMPTY_STRING ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_VERSION, result.getReason() ); - } - - public void testNullGroupId() - { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - - setRequiredElements( artifact, null, VALID, VALID ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_GROUP_ID, result.getReason() ); - } - - public void testNullArtifactId() + public void testValidArtifactWithInvalidDependencyGroupId() + throws ReportProcessorException { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - - setRequiredElements( artifact, VALID, null, VALID ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_ARTIFACT_ID, result.getReason() ); - } + Artifact artifact = createValidArtifact(); - public void testNullVersion() - { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); + Dependency dependency = createDependency( INVALID, VALID_ARTIFACT_ID, VALID_VERSION ); + model.addDependency( dependency ); - setRequiredElements( artifact, VALID, VALID, null ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); + processor.processArtifact( model, artifact, reporter, repository ); + assertEquals( 1, reporter.getNumSuccesses() ); assertEquals( 1, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); Iterator failures = reporter.getArtifactFailureIterator(); ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_VERSION, result.getReason() ); - } - - public void testMultipleFailures() - { - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - - setRequiredElements( artifact, null, null, null ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 0, reporter.getNumSuccesses() ); - assertEquals( 3, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_GROUP_ID, result.getReason() ); - result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_ARTIFACT_ID, result.getReason() ); - result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_VERSION, result.getReason() ); + assertEquals( ArtifactReporter.DEPENDENCY_NOT_FOUND, result.getReason() ); } - public void testValidArtifactWithInvalidDependencyGroupId() + private Dependency createDependency( String o, String valid, String s ) { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); - - setRequiredElements( artifact, VALID, VALID, VALID ); - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - Dependency dependency = new Dependency(); - setRequiredElements( dependency, null, VALID, VALID ); - model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); - assertEquals( 1, reporter.getNumSuccesses() ); - assertEquals( 1, reporter.getNumFailures() ); - assertEquals( 0, reporter.getNumWarnings() ); - - Iterator failures = reporter.getArtifactFailureIterator(); - ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_DEPENDENCY_GROUP_ID, result.getReason() ); + dependency.setGroupId( o ); + dependency.setArtifactId( valid ); + dependency.setVersion( s ); + return dependency; } public void testValidArtifactWithInvalidDependencyArtifactId() + throws ReportProcessorException { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); + Artifact artifact = createValidArtifact(); - setRequiredElements( artifact, VALID, VALID, VALID ); - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - - Dependency dependency = new Dependency(); - setRequiredElements( dependency, VALID, null, VALID ); + Dependency dependency = createDependency( VALID_GROUP_ID, INVALID, VALID_VERSION ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 1, reporter.getNumSuccesses() ); assertEquals( 1, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); Iterator failures = reporter.getArtifactFailureIterator(); ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_DEPENDENCY_ARTIFACT_ID, result.getReason() ); + assertEquals( ArtifactReporter.DEPENDENCY_NOT_FOUND, result.getReason() ); } - public void testValidArtifactWithInvalidDependencyVersion() + public void testValidArtifactWithIncorrectDependencyVersion() + throws ReportProcessorException { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); + Artifact artifact = createValidArtifact(); - setRequiredElements( artifact, VALID, VALID, VALID ); - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - - Dependency dependency = new Dependency(); - setRequiredElements( dependency, VALID, VALID, null ); + Dependency dependency = createDependency( VALID_GROUP_ID, VALID_ARTIFACT_ID, INVALID ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 1, reporter.getNumSuccesses() ); assertEquals( 1, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); Iterator failures = reporter.getArtifactFailureIterator(); ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_DEPENDENCY_VERSION, result.getReason() ); + assertEquals( ArtifactReporter.DEPENDENCY_NOT_FOUND, result.getReason() ); } - public void testValidArtifactWithInvalidDependencyRequiredElements() + public void testValidArtifactWithInvalidDependencyVersion() + throws ReportProcessorException { - MockArtifactFactory artifactFactory = new MockArtifactFactory(); - processor.setArtifactFactory( artifactFactory ); + Artifact artifact = createValidArtifact(); - setRequiredElements( artifact, VALID, VALID, VALID ); - MockRepositoryQueryLayer queryLayer = new MockRepositoryQueryLayer(); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - - Dependency dependency = new Dependency(); - setRequiredElements( dependency, null, null, null ); + Dependency dependency = createDependency( VALID_GROUP_ID, VALID_ARTIFACT_ID, "[" ); model.addDependency( dependency ); - queryLayer.addReturnValue( ARTIFACT_FOUND ); - processor.setRepositoryQueryLayer( queryLayer ); - processor.processArtifact( model, artifact, reporter, null ); + processor.processArtifact( model, artifact, reporter, repository ); assertEquals( 1, reporter.getNumSuccesses() ); - assertEquals( 3, reporter.getNumFailures() ); + assertEquals( 1, reporter.getNumFailures() ); assertEquals( 0, reporter.getNumWarnings() ); Iterator failures = reporter.getArtifactFailureIterator(); ArtifactResult result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_DEPENDENCY_GROUP_ID, result.getReason() ); - result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_DEPENDENCY_ARTIFACT_ID, result.getReason() ); - result = (ArtifactResult) failures.next(); - assertEquals( ArtifactReporter.EMPTY_DEPENDENCY_VERSION, result.getReason() ); - } - - protected void tearDown() - throws Exception - { - model = null; - artifact = null; - reporter = null; - super.tearDown(); - } - - private void setRequiredElements( Artifact artifact, String groupId, String artifactId, String version ) - { - artifact.setGroupId( groupId ); - artifact.setArtifactId( artifactId ); - artifact.setVersion( version ); - } - - private void setRequiredElements( Dependency dependency, String groupId, String artifactId, String version ) - { - dependency.setGroupId( groupId ); - dependency.setArtifactId( artifactId ); - dependency.setVersion( version ); + assertEquals( ArtifactReporter.DEPENDENCY_INVALID_VERSION, result.getReason() ); } } diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReporterTest.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReporterTest.java index 80a09f72d..71bcffca3 100644 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReporterTest.java +++ b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReporterTest.java @@ -33,18 +33,15 @@ public class ArtifactReporterTest private Artifact artifact; - private MockArtifactReportProcessor processor; - private Model model; protected void setUp() throws Exception { super.setUp(); - reporter = new DefaultArtifactReporter(); + reporter = (ArtifactReporter) lookup( ArtifactReporter.ROLE ); ArtifactFactory artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE ); artifact = artifactFactory.createBuildArtifact( "groupId", "artifactId", "1.0-alpha-1", "type" ); - processor = new MockArtifactReportProcessor(); Versioning versioning = new Versioning(); versioning.addVersion( "1.0-alpha-1" ); versioning.setLastUpdated( "20050611.202020" ); @@ -53,11 +50,12 @@ public class ArtifactReporterTest public void testArtifactReporterSingleSuccess() { - processor.addReturnValue( ReportCondition.SUCCESS, artifact, "all is good" ); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addSuccess( artifact ); + + assertEquals( 1, reporter.getNumSuccesses() ); + Iterator success = reporter.getArtifactSuccessIterator(); assertTrue( success.hasNext() ); - assertEquals( 1, reporter.getNumSuccesses() ); Artifact result = ( (ArtifactResult) success.next() ).getArtifact(); assertEquals( "groupId", result.getGroupId() ); assertEquals( "artifactId", result.getArtifactId() ); @@ -67,12 +65,9 @@ public class ArtifactReporterTest public void testArtifactReporterMultipleSuccess() { - processor.clearList(); - processor.addReturnValue( ReportCondition.SUCCESS, artifact, "one" ); - processor.addReturnValue( ReportCondition.SUCCESS, artifact, "two" ); - processor.addReturnValue( ReportCondition.SUCCESS, artifact, "three" ); - reporter = new DefaultArtifactReporter(); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addSuccess( artifact ); + reporter.addSuccess( artifact ); + reporter.addSuccess( artifact ); Iterator success = reporter.getArtifactSuccessIterator(); assertTrue( success.hasNext() ); int i; @@ -88,8 +83,7 @@ public class ArtifactReporterTest public void testArtifactReporterSingleFailure() { - processor.addReturnValue( ReportCondition.FAILURE, artifact, "failed once" ); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addFailure( artifact, "failed once" ); Iterator failure = reporter.getArtifactFailureIterator(); assertTrue( failure.hasNext() ); failure.next(); @@ -101,10 +95,9 @@ public class ArtifactReporterTest public void testArtifactReporterMultipleFailure() { - processor.addReturnValue( ReportCondition.FAILURE, artifact, "failed once" ); - processor.addReturnValue( ReportCondition.FAILURE, artifact, "failed twice" ); - processor.addReturnValue( ReportCondition.FAILURE, artifact, "failed thrice" ); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addFailure( artifact, "failed once" ); + reporter.addFailure( artifact, "failed twice" ); + reporter.addFailure( artifact, "failed thrice" ); Iterator failure = reporter.getArtifactFailureIterator(); assertTrue( failure.hasNext() ); int i; @@ -120,10 +113,9 @@ public class ArtifactReporterTest public void testFailureMessages() { - processor.addReturnValue( ReportCondition.FAILURE, artifact, "failed once" ); - processor.addReturnValue( ReportCondition.FAILURE, artifact, "failed twice" ); - processor.addReturnValue( ReportCondition.FAILURE, artifact, "failed thrice" ); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addFailure( artifact, "failed once" ); + reporter.addFailure( artifact, "failed twice" ); + reporter.addFailure( artifact, "failed thrice" ); Iterator failure = reporter.getArtifactFailureIterator(); assertEquals( "failed once", ( (ArtifactResult) failure.next() ).getReason() ); assertEquals( "failed twice", ( (ArtifactResult) failure.next() ).getReason() ); @@ -132,8 +124,7 @@ public class ArtifactReporterTest public void testArtifactReporterSingleWarning() { - processor.addReturnValue( ReportCondition.WARNING, artifact, "you've been warned" ); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addWarning( artifact, "you've been warned" ); Iterator warning = reporter.getArtifactWarningIterator(); assertTrue( warning.hasNext() ); warning.next(); @@ -145,10 +136,10 @@ public class ArtifactReporterTest public void testArtifactReporterMultipleWarning() { - processor.addReturnValue( ReportCondition.WARNING, artifact, "i'm warning you" ); - processor.addReturnValue( ReportCondition.WARNING, artifact, "you have to stop now" ); - processor.addReturnValue( ReportCondition.WARNING, artifact, "all right... that does it!" ); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addWarning( artifact, "i'm warning you" ); + reporter.addWarning( artifact, "you have to stop now" ); + reporter.addWarning( artifact, "all right... that does it!" ); + Iterator warning = reporter.getArtifactWarningIterator(); assertTrue( warning.hasNext() ); int i; @@ -164,24 +155,13 @@ public class ArtifactReporterTest public void testWarningMessages() { - processor.addReturnValue( ReportCondition.WARNING, artifact, "i'm warning you" ); - processor.addReturnValue( ReportCondition.WARNING, artifact, "you have to stop now" ); - processor.addReturnValue( ReportCondition.WARNING, artifact, "all right... that does it!" ); - processor.processArtifact( model, artifact, reporter, null ); + reporter.addWarning( artifact, "i'm warning you" ); + reporter.addWarning( artifact, "you have to stop now" ); + reporter.addWarning( artifact, "all right... that does it!" ); + Iterator warning = reporter.getArtifactWarningIterator(); assertEquals( "i'm warning you", ( (ArtifactResult) warning.next() ).getReason() ); assertEquals( "you have to stop now", ( (ArtifactResult) warning.next() ).getReason() ); assertEquals( "all right... that does it!", ( (ArtifactResult) warning.next() ).getReason() ); } - - protected void tearDown() - throws Exception - { - model = null; - processor.clearList(); - processor = null; - reporter = null; - super.tearDown(); - } - } diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessorTest.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessorTest.java index 73f58393d..30a60b1b3 100644 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessorTest.java +++ b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessorTest.java @@ -316,7 +316,8 @@ public class BadMetadataReportProcessorTest RepositoryMetadataResult result = (RepositoryMetadataResult) failures.next(); assertEquals( "check metadata", metadata, result.getMetadata() ); // TODO: should be more robust - assertEquals( "check reason", "Snapshot artifact 20050611.202024-2 does not exist.", result.getReason() ); + assertEquals( "check reason", "Snapshot artifact 1.0-alpha-1-20050611.202024-2 does not exist.", + result.getReason() ); assertFalse( "check no more failures", failures.hasNext() ); } diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/GenericMockObject.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/GenericMockObject.java deleted file mode 100644 index 8e8a49c15..000000000 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/GenericMockObject.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.apache.maven.archiva.reporting; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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 java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author Edwin Punzalan - */ -public class GenericMockObject - implements InvocationHandler -{ - private Map invocations = new HashMap(); - - public GenericMockObject() - { - //default constructor - } - - public GenericMockObject( Map returnMap ) - { - invocations = new HashMap( returnMap ); - } - - public void setExpectedReturns( Method method, List returnList ) - { - invocations.put( method, returnList ); - } - - public Object invoke( Object proxy, Method method, Object[] args ) - { - if ( !invocations.containsKey( method ) ) - { - throw new UnsupportedOperationException( "No expected return values defined." ); - } - - List returnList = (List) invocations.get( method ); - if ( returnList.size() < 1 ) - { - throw new UnsupportedOperationException( "Too few expected return values defined." ); - } - return returnList.remove( 0 ); - } -} diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifact.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifact.java deleted file mode 100644 index 9e4482137..000000000 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifact.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.apache.maven.archiva.reporting; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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.maven.artifact.Artifact; -import org.apache.maven.artifact.handler.ArtifactHandler; -import org.apache.maven.artifact.metadata.ArtifactMetadata; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.filter.ArtifactFilter; -import org.apache.maven.artifact.versioning.ArtifactVersion; -import org.apache.maven.artifact.versioning.OverConstrainedVersionException; -import org.apache.maven.artifact.versioning.VersionRange; - -import java.io.File; -import java.util.Collection; -import java.util.List; - -/** - * @noinspection ReturnOfNull - */ -public class MockArtifact - implements Artifact -{ - private String groupId; - - private String artifactId; - - private String version; - - public String getGroupId() - { - return groupId; - } - - public String getArtifactId() - { - return artifactId; - } - - public String getVersion() - { - return version; - } - - public void setVersion( String s ) - { - version = s; - } - - public String getScope() - { - return null; - } - - public String getType() - { - return null; - } - - public String getClassifier() - { - return null; - } - - public boolean hasClassifier() - { - return false; - } - - public File getFile() - { - return null; - } - - public void setFile( File file ) - { - } - - public String getBaseVersion() - { - return null; - } - - public void setBaseVersion( String s ) - { - } - - public String getId() - { - return null; - } - - public String getDependencyConflictId() - { - return null; - } - - public void addMetadata( ArtifactMetadata artifactMetadata ) - { - } - - public Collection getMetadataList() - { - return null; - } - - public void setRepository( ArtifactRepository artifactRepository ) - { - } - - public ArtifactRepository getRepository() - { - return null; - } - - public void updateVersion( String s, ArtifactRepository artifactRepository ) - { - } - - public String getDownloadUrl() - { - return null; - } - - public void setDownloadUrl( String s ) - { - } - - public ArtifactFilter getDependencyFilter() - { - return null; - } - - public void setDependencyFilter( ArtifactFilter artifactFilter ) - { - } - - public ArtifactHandler getArtifactHandler() - { - return null; - } - - public List getDependencyTrail() - { - return null; - } - - public void setDependencyTrail( List list ) - { - } - - public void setScope( String s ) - { - } - - public VersionRange getVersionRange() - { - return null; - } - - public void setVersionRange( VersionRange versionRange ) - { - } - - public void selectVersion( String s ) - { - } - - public void setGroupId( String s ) - { - groupId = s; - } - - public void setArtifactId( String s ) - { - artifactId = s; - } - - public boolean isSnapshot() - { - return false; - } - - public void setResolved( boolean b ) - { - } - - public boolean isResolved() - { - return false; - } - - public void setResolvedVersion( String s ) - { - } - - public void setArtifactHandler( ArtifactHandler artifactHandler ) - { - } - - public boolean isRelease() - { - return false; - } - - public void setRelease( boolean b ) - { - } - - public List getAvailableVersions() - { - return null; - } - - public void setAvailableVersions( List list ) - { - } - - public boolean isOptional() - { - return false; - } - - public ArtifactVersion getSelectedVersion() - throws OverConstrainedVersionException - { - return null; - } - - public boolean isSelectedVersionKnown() - throws OverConstrainedVersionException - { - return false; - } - - public int compareTo( Object o ) - { - return 0; - } - - public void setOptional( boolean b ) - { - } -} diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactFactory.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactFactory.java deleted file mode 100644 index bf4cb5382..000000000 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactFactory.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.apache.maven.archiva.reporting; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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.maven.artifact.Artifact; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.versioning.VersionRange; - -/** - * @noinspection ReturnOfNull - */ -public class MockArtifactFactory - implements ArtifactFactory -{ - public Artifact createArtifact( String s, String s1, String s2, String s3, String s4 ) - { - return null; - } - - public Artifact createArtifactWithClassifier( String s, String s1, String s2, String s3, String s4 ) - { - return null; - } - - public Artifact createDependencyArtifact( String s, String s1, VersionRange versionRange, String s2, String s3, - String s4 ) - { - return null; - } - - public Artifact createDependencyArtifact( String s, String s1, VersionRange versionRange, String s2, String s3, - String s4, String s5 ) - { - return null; - } - - public Artifact createDependencyArtifact( String s, String s1, VersionRange versionRange, String s2, String s3, - String s4, String s5, boolean b ) - { - return null; - } - - public Artifact createBuildArtifact( String s, String s1, String s2, String s3 ) - { - return null; - } - - public Artifact createProjectArtifact( String s, String s1, String s2 ) - { - return null; - } - - public Artifact createParentArtifact( String s, String s1, String s2 ) - { - return null; - } - - public Artifact createPluginArtifact( String s, String s1, VersionRange versionRange ) - { - return null; - } - - public Artifact createProjectArtifact( String s, String s1, String s2, String s3 ) - { - return null; - } - - public Artifact createExtensionArtifact( String s, String s1, VersionRange versionRange ) - { - return null; - } - - public Artifact createDependencyArtifact( String string, String string1, VersionRange versionRange, String string2, - String string3, String string4, boolean b ) - { - return null; - } -} diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactReportProcessor.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactReportProcessor.java deleted file mode 100644 index 54697973f..000000000 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockArtifactReportProcessor.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.apache.maven.archiva.reporting; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.model.Model; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * - */ -public class MockArtifactReportProcessor - implements ArtifactReportProcessor -{ - private List reportConditions; - - private Iterator iterator; - - public MockArtifactReportProcessor() - { - reportConditions = new ArrayList(); - } - - public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter, - ArtifactRepository repository ) - { - if ( iterator == null || !iterator.hasNext() ) // not initialized or reached end of the list. start again - { - iterator = reportConditions.iterator(); - } - if ( !reportConditions.isEmpty() ) - { - while ( iterator.hasNext() ) - { - ReportCondition reportCondition = (ReportCondition) iterator.next(); - int i = reportCondition.getResult(); - if ( i == ReportCondition.SUCCESS ) - { - reporter.addSuccess( reportCondition.getArtifact() ); - } - else if ( i == ReportCondition.WARNING ) - { - reporter.addWarning( reportCondition.getArtifact(), reportCondition.getReason() ); - } - else if ( i == ReportCondition.FAILURE ) - { - reporter.addFailure( reportCondition.getArtifact(), reportCondition.getReason() ); - } - } - } - } - - public void addReturnValue( int result, Artifact artifact, String reason ) - { - reportConditions.add( new ReportCondition( result, artifact, reason ) ); - } - - public void clearList() - { - reportConditions.clear(); - } -} diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockRepositoryQueryLayer.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockRepositoryQueryLayer.java deleted file mode 100644 index e1aa69ac2..000000000 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockRepositoryQueryLayer.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.apache.maven.archiva.reporting; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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.maven.archiva.layer.RepositoryQueryLayer; -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.metadata.Snapshot; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -/** - * - */ -public class MockRepositoryQueryLayer - implements RepositoryQueryLayer -{ - private List queryConditions; - - private Iterator iterator; - - public MockRepositoryQueryLayer() - { - queryConditions = new ArrayList(); - } - - public boolean containsArtifact( Artifact artifact ) - { - if ( iterator == null || !iterator.hasNext() ) // not initialized or reached end of the list. start again - { - iterator = queryConditions.iterator(); - } - boolean b; - if ( queryConditions.isEmpty() ) - { - b = false; - } - else - { - b = ( (Boolean) iterator.next() ).booleanValue(); - } - return b; - } - - public void addReturnValue( boolean queryCondition ) - { - queryConditions.add( Boolean.valueOf( queryCondition ) ); - } - - public void clearList() - { - queryConditions.clear(); - } - - public boolean containsArtifact( Artifact artifact, Snapshot snapshot ) - { - return containsArtifact( artifact ); - } - - public List getVersions( Artifact artifact ) - { - return Collections.EMPTY_LIST; - } -} diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ReportCondition.java b/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ReportCondition.java deleted file mode 100644 index fcabbbd78..000000000 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ReportCondition.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.apache.maven.archiva.reporting; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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.maven.artifact.Artifact; - -/** - * - */ -public class ReportCondition -{ - public static final int SUCCESS = 0; - - public static final int FAILURE = -1; - - public static final int WARNING = 1; - - private int result; - - private Artifact artifact; - - private String reason; - - public ReportCondition( int result, Artifact artifact, String reason ) - { - this.result = result; - this.artifact = artifact; - this.reason = reason; - } - - public int getResult() - { - return result; - } - - public void setResult( int result ) - { - this.result = result; - } - - public Artifact getArtifact() - { - return artifact; - } - - public void setArtifact( Artifact artifact ) - { - this.artifact = artifact; - } - - public String getReason() - { - return reason; - } - - public void setReason( String reason ) - { - this.reason = reason; - } -} diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayer.java deleted file mode 100644 index 60b0e5bb0..000000000 --- a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayer.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.apache.maven.archiva.layer; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata; -import org.apache.maven.artifact.repository.metadata.Metadata; -import org.apache.maven.artifact.repository.metadata.Snapshot; -import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader; -import org.codehaus.plexus.util.xml.pull.XmlPullParserException; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.List; - -/** - * - */ -public abstract class AbstractRepositoryQueryLayer - implements RepositoryQueryLayer -{ - protected ArtifactRepository repository; - - public boolean containsArtifact( Artifact artifact ) - { - File f = new File( repository.getBasedir(), repository.pathOf( artifact ) ); - return f.exists(); - } - - public boolean containsArtifact( Artifact artifact, Snapshot snapshot ) - { - String artifactPath = getSnapshotArtifactRepositoryPath( artifact, snapshot ); - File artifactFile = new File( artifactPath ); - return artifactFile.exists(); - } - - public List getVersions( Artifact artifact ) - throws RepositoryQueryLayerException - { - Metadata metadata = getMetadata( artifact ); - - return metadata.getVersioning().getVersions(); - } - - protected String getSnapshotArtifactRepositoryPath( Artifact artifact, Snapshot snapshot ) - { - File f = new File( repository.getBasedir(), repository.pathOf( artifact ) ); - String snapshotInfo = artifact.getVersion().replaceFirst( "SNAPSHOT", snapshot.getTimestamp() + "-" + - snapshot.getBuildNumber() + ".pom" ); - File snapshotFile = new File( f.getParentFile(), artifact.getArtifactId() + "-" + snapshotInfo ); - return snapshotFile.getAbsolutePath(); - } - - protected Metadata getMetadata( Artifact artifact ) - throws RepositoryQueryLayerException - { - Metadata metadata; - - ArtifactRepositoryMetadata repositoryMetadata = new ArtifactRepositoryMetadata( artifact ); - String path = repository.pathOfRemoteRepositoryMetadata( repositoryMetadata ); - File metadataFile = new File( repository.getBasedir(), path ); - if ( metadataFile.exists() ) - { - MetadataXpp3Reader reader = new MetadataXpp3Reader(); - try - { - metadata = reader.read( new FileReader( metadataFile ) ); - } - catch ( FileNotFoundException e ) - { - throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e ); - } - catch ( IOException e ) - { - throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e ); - } - catch ( XmlPullParserException e ) - { - throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e ); - } - } - else - { - throw new RepositoryQueryLayerException( "Metadata not found: " + metadataFile.getAbsolutePath() ); - } - - return metadata; - } -} diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayer.java index 91f9c5ff9..9453588e9 100644 --- a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayer.java +++ b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayer.java @@ -18,27 +18,35 @@ package org.apache.maven.archiva.layer; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.metadata.Metadata; -import org.apache.maven.artifact.repository.metadata.Snapshot; + +import java.util.List; /** * */ public class CachedRepositoryQueryLayer - extends AbstractRepositoryQueryLayer + implements RepositoryQueryLayer { private Cache cache; public static final double CACHE_HIT_RATIO = 0.5; - public CachedRepositoryQueryLayer( ArtifactRepository repository ) + private RepositoryQueryLayer layer; + + public CachedRepositoryQueryLayer( RepositoryQueryLayer layer ) { - this.repository = repository; + this.layer = layer; cache = new Cache( CACHE_HIT_RATIO ); } + public CachedRepositoryQueryLayer( RepositoryQueryLayer layer, Cache cache ) + { + this.cache = cache; + this.layer = layer; + } + public double getCacheHitRate() { return cache.getHitRate(); @@ -48,11 +56,11 @@ public class CachedRepositoryQueryLayer { boolean artifactFound = true; - String artifactPath = repository.getBasedir() + "/" + repository.pathOf( artifact ); + String artifactPath = layer.getRepository().pathOf( artifact ); if ( cache.get( artifactPath ) == null ) { - artifactFound = super.containsArtifact( artifact ); + artifactFound = layer.containsArtifact( artifact ); if ( artifactFound ) { cache.put( artifactPath, artifactPath ); @@ -62,38 +70,22 @@ public class CachedRepositoryQueryLayer return artifactFound; } - public boolean containsArtifact( Artifact artifact, Snapshot snapshot ) + public List getVersions( Artifact artifact ) + throws RepositoryQueryLayerException { - boolean artifactFound = true; + List list = (List) cache.get( artifact.getId() ); - String path = getSnapshotArtifactRepositoryPath( artifact, snapshot ); - - if ( cache.get( path ) == null ) + if ( list == null ) { - artifactFound = super.containsArtifact( artifact, snapshot ); - if ( artifactFound ) - { - cache.put( path, path ); - } + list = layer.getVersions( artifact ); + cache.put( artifact.getId(), list ); } - return artifactFound; + return list; } - /** - * Override method to utilize the cache - */ - protected Metadata getMetadata( Artifact artifact ) - throws RepositoryQueryLayerException + public ArtifactRepository getRepository() { - Metadata metadata = (Metadata) cache.get( artifact.getId() ); - - if ( metadata == null ) - { - metadata = super.getMetadata( artifact ); - cache.put( artifact.getId(), metadata ); - } - - return metadata; + return layer.getRepository(); } } diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayer.java index 582d5f377..0eadd6d2c 100644 --- a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayer.java +++ b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayer.java @@ -16,16 +16,84 @@ package org.apache.maven.archiva.layer; * limitations under the License. */ +import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata; +import org.apache.maven.artifact.repository.metadata.Metadata; +import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.List; /** * */ public class DefaultRepositoryQueryLayer - extends AbstractRepositoryQueryLayer + implements RepositoryQueryLayer { + protected ArtifactRepository repository; + public DefaultRepositoryQueryLayer( ArtifactRepository repository ) { this.repository = repository; } + + public boolean containsArtifact( Artifact artifact ) + { + File f = new File( repository.getBasedir(), repository.pathOf( artifact ) ); + return f.exists(); + } + + public List getVersions( Artifact artifact ) + throws RepositoryQueryLayerException + { + Metadata metadata = getMetadata( artifact ); + + return metadata.getVersioning().getVersions(); + } + + public ArtifactRepository getRepository() + { + return repository; + } + + private Metadata getMetadata( Artifact artifact ) + throws RepositoryQueryLayerException + { + Metadata metadata; + + ArtifactRepositoryMetadata repositoryMetadata = new ArtifactRepositoryMetadata( artifact ); + String path = repository.pathOfRemoteRepositoryMetadata( repositoryMetadata ); + File metadataFile = new File( repository.getBasedir(), path ); + if ( metadataFile.exists() ) + { + MetadataXpp3Reader reader = new MetadataXpp3Reader(); + try + { + metadata = reader.read( new FileReader( metadataFile ) ); + } + catch ( FileNotFoundException e ) + { + throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e ); + } + catch ( IOException e ) + { + throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e ); + } + catch ( XmlPullParserException e ) + { + throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e ); + } + } + else + { + throw new RepositoryQueryLayerException( "Metadata not found: " + metadataFile.getAbsolutePath() ); + } + + return metadata; + } } diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayer.java index 93c57ef1f..874f52e05 100644 --- a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayer.java +++ b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayer.java @@ -17,7 +17,7 @@ package org.apache.maven.archiva.layer; */ import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.metadata.Snapshot; +import org.apache.maven.artifact.repository.ArtifactRepository; import java.util.List; @@ -30,8 +30,8 @@ public interface RepositoryQueryLayer boolean containsArtifact( Artifact artifact ); - boolean containsArtifact( Artifact artifact, Snapshot snapshot ); - List getVersions( Artifact artifact ) throws RepositoryQueryLayerException; + + ArtifactRepository getRepository(); } diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/AbstractRepositoryQueryLayerTestCase.java b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayerTestCase.java similarity index 66% rename from archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/AbstractRepositoryQueryLayerTestCase.java rename to archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayerTestCase.java index 52fd4efc5..76debd58e 100644 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/AbstractRepositoryQueryLayerTestCase.java +++ b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayerTestCase.java @@ -1,4 +1,4 @@ -package org.apache.maven.archiva.reporting; +package org.apache.maven.archiva.layer; /* * Copyright 2005-2006 The Apache Software Foundation. @@ -16,14 +16,11 @@ package org.apache.maven.archiva.reporting; * limitations under the License. */ -import org.apache.maven.archiva.layer.CachedRepositoryQueryLayer; -import org.apache.maven.archiva.layer.RepositoryQueryLayerException; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; -import org.apache.maven.artifact.repository.metadata.Snapshot; import org.codehaus.plexus.PlexusTestCase; import java.io.File; @@ -39,7 +36,7 @@ public abstract class AbstractRepositoryQueryLayerTestCase protected ArtifactRepository repository; - protected CachedRepositoryQueryLayer queryLayer; + protected RepositoryQueryLayer queryLayer; protected void setUp() throws Exception @@ -71,25 +68,17 @@ public abstract class AbstractRepositoryQueryLayerTestCase public void testContainsSnapshotArtifactTrue() { - Snapshot snapshot = new Snapshot(); - snapshot.setTimestamp( "20050611.202024" ); - snapshot.setBuildNumber( 1 ); - - Artifact artifact = getArtifact( "groupId", "snapshot-artifact", "1.0-alpha-1-SNAPSHOT" ); - assertTrue( "check for snapshot artifact", queryLayer.containsArtifact( artifact, snapshot ) ); + Artifact artifact = getArtifact( "groupId", "snapshot-artifact", "1.0-alpha-1-20050611.202024-1" ); + assertTrue( "check for snapshot artifact", queryLayer.containsArtifact( artifact ) ); } public void testContainsSnapshotArtifactFalse() { - Snapshot snapshot = new Snapshot(); - snapshot.setTimestamp( "20050611.202024" ); - snapshot.setBuildNumber( 2 ); - - Artifact artifact = getArtifact( "groupId", "snapshot-artifact", "1.0-alpha-1-SNAPSHOT" ); - assertFalse( "check for non-existent snapshot artifact", queryLayer.containsArtifact( artifact, snapshot ) ); + Artifact artifact = getArtifact( "groupId", "snapshot-artifact", "1.0-alpha-1-20050611.202024-2" ); + assertFalse( "check for non-existent snapshot artifact", queryLayer.containsArtifact( artifact ) ); } - public void testArtifactVersionsTrue() + public void testArtifactVersions() throws Exception { Artifact artifact = getArtifact( "groupId", "artifactId", "ignored" ); @@ -97,20 +86,7 @@ public abstract class AbstractRepositoryQueryLayerTestCase List versions = queryLayer.getVersions( artifact ); assertTrue( "check version 1.0-alpha-1", versions.contains( "1.0-alpha-1" ) ); - assertTrue( "check version 1.0-alpha-2", versions.contains( "1.0-alpha-2" ) ); - assertFalse( "check version 1.0-alpha-3", versions.contains( "1.0-alpha-3" ) ); - } - - public void testArtifactVersionsFalse() - throws Exception - { - Artifact artifact = getArtifact( "groupId", "artifactId", "ignored" ); - - List versions = queryLayer.getVersions( artifact ); - - assertTrue( "check version 1.0-alpha-1", versions.contains( "1.0-alpha-1" ) ); - assertTrue( "check version 1.0-alpha-2", versions.contains( "1.0-alpha-2" ) ); - assertFalse( "check version 1.0-alpha-3", versions.contains( "1.0-alpha-3" ) ); + assertFalse( "check version 1.0-alpha-2", versions.contains( "1.0-alpha-2" ) ); } public void testArtifactVersionsError() @@ -130,15 +106,8 @@ public abstract class AbstractRepositoryQueryLayerTestCase private Artifact getArtifact( String groupId, String artifactId, String version ) { - return artifactFactory.createBuildArtifact( groupId, artifactId, version, "pom" ); - } - - protected void tearDown() - throws Exception - { - release( artifactFactory ); - super.tearDown(); - artifactFactory = null; - repository = null; + Artifact projectArtifact = artifactFactory.createProjectArtifact( groupId, artifactId, version ); + projectArtifact.isSnapshot(); + return projectArtifact; } } diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CacheTest.java b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/CacheTest.java similarity index 97% rename from archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CacheTest.java rename to archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/CacheTest.java index 65d6f8109..a784c1373 100644 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CacheTest.java +++ b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/CacheTest.java @@ -1,4 +1,4 @@ -package org.apache.maven.archiva.reporting; +package org.apache.maven.archiva.layer; /* * Copyright 2005-2006 The Apache Software Foundation. @@ -17,7 +17,6 @@ package org.apache.maven.archiva.reporting; */ import junit.framework.TestCase; -import org.apache.maven.archiva.layer.Cache; /** * diff --git a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CachedRepositoryQueryLayerTest.java b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayerTest.java similarity index 71% rename from archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CachedRepositoryQueryLayerTest.java rename to archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayerTest.java index bba92c722..8f717973e 100644 --- a/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CachedRepositoryQueryLayerTest.java +++ b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayerTest.java @@ -1,6 +1,4 @@ -package org.apache.maven.archiva.reporting; - -import org.apache.maven.archiva.layer.CachedRepositoryQueryLayer; +package org.apache.maven.archiva.layer; /* * Copyright 2005-2006 The Apache Software Foundation. @@ -24,37 +22,40 @@ import org.apache.maven.archiva.layer.CachedRepositoryQueryLayer; public class CachedRepositoryQueryLayerTest extends AbstractRepositoryQueryLayerTestCase { + private Cache cache; protected void setUp() throws Exception { super.setUp(); - queryLayer = new CachedRepositoryQueryLayer( repository ); + cache = new Cache( CachedRepositoryQueryLayer.CACHE_HIT_RATIO ); + + queryLayer = new CachedRepositoryQueryLayer( new DefaultRepositoryQueryLayer( repository ), cache ); } public void testUseFileCache() { testContainsArtifactTrue(); - assertEquals( 0, queryLayer.getCacheHitRate(), 0 ); + assertEquals( 0, cache.getHitRate(), 0 ); testContainsArtifactTrue(); - assertEquals( CachedRepositoryQueryLayer.CACHE_HIT_RATIO, queryLayer.getCacheHitRate(), 0 ); + assertEquals( CachedRepositoryQueryLayer.CACHE_HIT_RATIO, cache.getHitRate(), 0 ); } public void testUseMetadataCache() throws Exception { - testArtifactVersionsTrue(); - assertEquals( 0, queryLayer.getCacheHitRate(), 0 ); - testArtifactVersionsTrue(); - assertEquals( CachedRepositoryQueryLayer.CACHE_HIT_RATIO, queryLayer.getCacheHitRate(), 0 ); + testArtifactVersions(); + assertEquals( 0, cache.getHitRate(), 0 ); + testArtifactVersions(); + assertEquals( CachedRepositoryQueryLayer.CACHE_HIT_RATIO, cache.getHitRate(), 0 ); } public void testUseFileCacheOnSnapshot() { testContainsSnapshotArtifactTrue(); - assertEquals( 0, queryLayer.getCacheHitRate(), 0 ); + assertEquals( 0, cache.getHitRate(), 0 ); testContainsSnapshotArtifactTrue(); - assertEquals( CachedRepositoryQueryLayer.CACHE_HIT_RATIO, queryLayer.getCacheHitRate(), 0 ); + assertEquals( CachedRepositoryQueryLayer.CACHE_HIT_RATIO, cache.getHitRate(), 0 ); } } diff --git a/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayerTest.java b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayerTest.java new file mode 100644 index 000000000..1a1817cea --- /dev/null +++ b/archiva-repository-layer/src/test/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayerTest.java @@ -0,0 +1,29 @@ +package org.apache.maven.archiva.layer; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed 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 DefaultRepositoryQueryLayerTest + extends AbstractRepositoryQueryLayerTestCase +{ + protected void setUp() + throws Exception + { + super.setUp(); + + queryLayer = new DefaultRepositoryQueryLayer( repository ); + } +} diff --git a/archiva-repository-layer/src/test/repository/groupId/artifactId/1.0-alpha-1/artifactId-1.0-alpha-1.jar b/archiva-repository-layer/src/test/repository/groupId/artifactId/1.0-alpha-1/artifactId-1.0-alpha-1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c2ea777c166ef02a078a9b92d2cead0124845d6f GIT binary patch literal 45568 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 literal 0 HcmV?d00001 diff --git a/archiva-repository-layer/src/test/repository/groupId/artifactId/1.0-alpha-1/artifactId-1.0-alpha-1.pom b/archiva-repository-layer/src/test/repository/groupId/artifactId/1.0-alpha-1/artifactId-1.0-alpha-1.pom new file mode 100644 index 000000000..c5f8bccb2 --- /dev/null +++ b/archiva-repository-layer/src/test/repository/groupId/artifactId/1.0-alpha-1/artifactId-1.0-alpha-1.pom @@ -0,0 +1,6 @@ + + 4.0.0 + groupId + artifactId + 1.0-alpha-1 + diff --git a/archiva-repository-layer/src/test/repository/groupId/artifactId/maven-metadata.xml b/archiva-repository-layer/src/test/repository/groupId/artifactId/maven-metadata.xml new file mode 100644 index 000000000..bb105fbcb --- /dev/null +++ b/archiva-repository-layer/src/test/repository/groupId/artifactId/maven-metadata.xml @@ -0,0 +1,26 @@ + + + + groupId + artifactId + 1.0-alpha-1 + + + 1.0-alpha-1 + + + diff --git a/archiva-repository-layer/src/test/repository/groupId/snapshot-artifact/1.0-alpha-1-SNAPSHOT/snapshot-artifact-1.0-alpha-1-20050611.202024-1.pom b/archiva-repository-layer/src/test/repository/groupId/snapshot-artifact/1.0-alpha-1-SNAPSHOT/snapshot-artifact-1.0-alpha-1-20050611.202024-1.pom new file mode 100644 index 000000000..e69de29bb -- 2.39.5