]> source.dussan.org Git - archiva.git/commitdiff
Adding item selector api to repository content
authorMartin Stockhammer <martin_s@apache.org>
Fri, 14 Feb 2020 21:00:14 +0000 (22:00 +0100)
committerMartin Stockhammer <martin_s@apache.org>
Fri, 14 Feb 2020 21:00:14 +0000 (22:00 +0100)
12 files changed:
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/PathParser.java
archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/AbstractDefaultRepositoryContent.java
archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/DefaultPathParser.java
archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/AbstractDefaultRepositoryContentTestCase.java
archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/RemoteDefaultRepositoryContentTest.java

index 0afe493e169f644e87895ed433430c935b9447a2..f72645dba1d6b98c8b7ae87792e7d62b6800f783 100644 (file)
@@ -57,4 +57,19 @@ public interface RepositoryContent
      * @return the path to the content item
      */
     String toPath( ItemSelector selector );
+
+    /**
+     * Return a item selector that matches the given path. This is kind of reverse method for the {@link #toPath(ItemSelector)}
+     * method and fills the selector with the known information. It may not make sense for every path, and the following
+     * must <b>not be true</b>:
+     * <pre>
+     *  selector.equals(r.toItemSelector(r.toPath(selector)))
+     * </pre>
+     *
+     * The methods on the ManagedRepository give more reliable results.
+     *
+     * @param path the repository path
+     * @return a item selector that would select the given path
+     */
+    ItemSelector toItemSelector(String path) throws LayoutException;
 }
index ddbcb6d59682ce211d57fb42131975c3ea716df7..3133c070de00b4406ec0623cfe8506ec87ecd55a 100644 (file)
@@ -40,4 +40,14 @@ public interface PathParser
     ArtifactReference toArtifactReference( String path )
         throws LayoutException;
 
+
+    /**
+     * Return a item selector for the given path.
+     * @param path the path relative to the repository
+     * @return a item selector instance
+     * @throws LayoutException if the path does not reference a valid item
+     */
+    ItemSelector toItemSelector(String path) throws LayoutException;
+
+
 }
index 0ba3658c20b536688ef9e4a625fd002208074b08..c252a8ab4c88dab6fc950ee4cdcaee1008807808 100644 (file)
@@ -223,6 +223,12 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
         return null;
     }
 
+    @Override
+    public ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return null;
+    }
+
     @Override
     public String toPath( ArchivaArtifact reference )
     {
index 1760012ea0f2f9434b713081a26f32528cb13063..bdf951f49ecf956ece87b32e9f40ed47a4461363 100644 (file)
@@ -77,6 +77,12 @@ public class RemoteRepositoryContentMock implements RemoteRepositoryContent
         return null;
     }
 
+    @Override
+    public ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return null;
+    }
+
     @Override
     public RepositoryURL toURL( ArtifactReference reference )
     {
index 7f2dec2fd72152c457897aade03e5c304c16d7fd..69fa8d9e718c07d2370a8b07d2a6ddd7e1eabb32 100644 (file)
@@ -453,6 +453,12 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
         return null;
     }
 
+    @Override
+    public ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return null;
+    }
+
     @Override
     public String toPath( ArchivaArtifact reference )
     {
index 881e90fea5246e78fe7948c5a3bca6b446e4b8b8..53950cca1acf93a6725bc476e2ad3a7624287ab8 100644 (file)
@@ -457,6 +457,12 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
         return null;
     }
 
+    @Override
+    public ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return null;
+    }
+
     @Override
     public String toPath( ArchivaArtifact reference )
     {
index 78fff18db43e42ff09056239106e5e3ace2d6e64..057d09a93fde84fe52409450758c3f685b8a52c9 100644 (file)
@@ -99,6 +99,12 @@ public class RemoteRepositoryContentMock implements RemoteRepositoryContent
             StringUtils.isNotEmpty(selector.getClassifier()) ? "-"+selector.getClassifier() : "")+"."+selector.getType();
     }
 
+    @Override
+    public ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return null;
+    }
+
     @Override
     public RepositoryURL toURL( ArtifactReference reference )
     {
index 1713ec77c438bab1f36c69c11a371f5d360e607b..5c7da20043eed1e03e9d416f11bcee034066b445 100644 (file)
@@ -81,7 +81,13 @@ public abstract class AbstractDefaultRepositoryContent implements RepositoryCont
         return defaultPathParser.toArtifactReference( path );
     }
 
-    public String toPath (ProjectReference reference) {
+    @Override
+    public ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return defaultPathParser.toItemSelector( path );
+    }
+
+    public String toPath ( ProjectReference reference) {
         final StringBuilder path = new StringBuilder();
         path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
         path.append( reference.getArtifactId( ) );
index 64a430c8b9fc5dd65d3175dd568996afc13ce6fe..98cc529e7306d40c4551cca698f9285ee35e7b8e 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.archiva.repository.content.maven2;
  */
 
 import org.apache.archiva.metadata.model.ArtifactMetadata;
+import org.apache.archiva.metadata.model.FacetedMetadata;
 import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
 import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
 import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMappingProvider;
@@ -27,7 +28,9 @@ import org.apache.archiva.metadata.repository.storage.maven2.DefaultArtifactMapp
 import org.apache.archiva.metadata.repository.storage.maven2.Maven2RepositoryPathTranslator;
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.repository.LayoutException;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.content.PathParser;
+import org.apache.archiva.repository.content.base.ArchivaItemSelector;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
@@ -88,4 +91,35 @@ public class DefaultPathParser
         return artifact;
     }
 
+    @Override
+    public ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        if ( StringUtils.isBlank( path ) )
+        {
+            throw new LayoutException( "Unable to convert blank path." );
+        }
+
+        try
+        {
+            ArtifactMetadata metadata = pathTranslator.getArtifactForPath( null, path );
+            ArchivaItemSelector.Builder builder = ArchivaItemSelector.builder( ).withNamespace( metadata.getNamespace( ) )
+                .withProjectId( metadata.getProject( ) )
+                .withVersion( metadata.getProjectVersion( ) )
+                .withArtifactId( metadata.getProject( ) )
+                .withArtifactVersion( metadata.getVersion( ) );
+            MavenArtifactFacet facet = (MavenArtifactFacet) metadata.getFacet( MavenArtifactFacet.FACET_ID );
+            if ( facet != null )
+            {
+                builder.withClassifier( facet.getClassifier() );
+                builder.withType( facet.getType() );
+            }
+            return builder.build( );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            throw new LayoutException( e.getMessage(), e );
+        }
+
+    }
+
 }
index d697815e5f2bb3b951c7717b6c3b6b9f84520377..3c843315cf39922edf45f24a866ea1d7bd9c78ac 100644 (file)
@@ -23,6 +23,7 @@ import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.repository.AbstractRepositoryLayerTestCase;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.content.ItemSelector;
+import org.apache.archiva.repository.content.base.ArchivaItemSelector;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.Test;
 
@@ -98,6 +99,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "ch/ethz/ganymed/ganymed-ssh2/build210/ganymed-ssh2-build210.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type);
     }
 
     /**
@@ -119,6 +121,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "javax/comm/3.0-u1/comm-3.0-u1.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     /**
@@ -168,6 +171,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
          */
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     @Test
@@ -182,6 +186,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "com/foo/foo-tool/1.0/foo-tool-1.0.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     @Test
@@ -196,6 +201,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     /**
@@ -213,6 +219,8 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "test/maven-arch/test-arch/2.0.3-SNAPSHOT/test-arch-2.0.3-SNAPSHOT.pom";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
+
     }
 
     /**
@@ -230,6 +238,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "com/company/department/com.company.department/0.2/com.company.department-0.2.pom";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     /**
@@ -248,6 +257,8 @@ public abstract class AbstractDefaultRepositoryContentTestCase
             "com/company/department/com.company.department.project/0.3/com.company.department.project-0.3.pom";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
+
     }
 
     /**
@@ -268,6 +279,8 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "com/foo/lib/foo-lib/2.1-alpha-1/foo-lib-2.1-alpha-1-sources.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
+
     }
 
     /**
@@ -289,6 +302,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
             "org/apache/archiva/test/redonkulous/3.1-beta-1-SNAPSHOT/redonkulous-3.1-beta-1-20050831.101112-42.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     /**
@@ -307,6 +321,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "maven/maven-test-plugin/1.8.2/maven-test-plugin-1.8.2.pom";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     /**
@@ -325,6 +340,8 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "maven/maven-test-plugin/1.8.2/maven-test-plugin-1.8.2.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
+
     }
 
     /**
@@ -342,6 +359,7 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         String path = "org/codehaus/mojo/cobertura-maven-plugin/2.1/cobertura-maven-plugin-2.1.jar";
 
         assertLayout( path, groupId, artifactId, version, classifier, type );
+        assertLayoutCi( path, groupId, artifactId, version, classifier, type );
     }
 
     @Test
@@ -449,6 +467,24 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         assertEquals( expectedId + " - Type", type, actualReference.getType() );
     }
 
+    private void assertItemSelector( ItemSelector actualReference, String groupId, String artifactId,
+                                          String version, String classifier, String type )
+    {
+        String expectedId =
+            "ArtifactReference - " + groupId + ":" + artifactId + ":" + version + ":" + classifier + ":" + type;
+
+        assertNotNull( expectedId + " - Should not be null.", actualReference );
+
+        assertEquals( expectedId + " - Group ID", groupId, actualReference.getNamespace() );
+        assertEquals( expectedId + " - Artifact ID", artifactId, actualReference.getArtifactId() );
+        if ( StringUtils.isNotBlank( classifier ) )
+        {
+            assertEquals( expectedId + " - Classifier", classifier, actualReference.getClassifier() );
+        }
+        assertEquals( expectedId + " - Version ID", version, actualReference.getArtifactVersion() );
+        assertEquals( expectedId + " - Type", type, actualReference.getType() );
+    }
+
     private void assertBadPath( String path, String reason )
     {
         try
@@ -487,6 +523,27 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         assertEquals( "Artifact <" + expectedArtifact + "> to path:", path, toPath( testReference ) );
     }
 
+    private void assertLayoutCi( String path, String groupId, String artifactId, String version, String classifier,
+                               String type )
+        throws LayoutException
+    {
+        ItemSelector expectedArtifact = createItemSelector( groupId, artifactId, version, classifier, type );
+
+        // --- Artifact Tests.
+
+        // Artifact to Path
+        assertEquals( "Artifact <" + expectedArtifact + "> to path:", path, toPath( expectedArtifact ) );
+
+        // --- Artifact Reference Tests
+
+        // Path to Artifact Reference.
+        ItemSelector testReference = toItemSelector( path );
+        assertItemSelector( testReference, groupId, artifactId, version, classifier, type );
+
+        // And back again, using test Reference from previous step.
+        assertEquals( "Artifact <" + expectedArtifact + "> to path:", path, toPath( testReference ) );
+    }
+
     protected ArtifactReference createArtifact( String groupId, String artifactId, String version, String classifier,
                                               String type )
     {
@@ -500,6 +557,17 @@ public abstract class AbstractDefaultRepositoryContentTestCase
         return artifact;
     }
 
+    protected ItemSelector createItemSelector(String groupId, String artifactId, String version, String classifier,
+                                              String type) {
+        return ArchivaItemSelector.builder( ).withNamespace( groupId )
+            .withArtifactId( artifactId )
+            .withVersion( version )
+            .withClassifier( classifier )
+            .withType( type )
+            .build( );
+
+    }
+
     protected abstract ArtifactReference toArtifactReference( String path )
         throws LayoutException;
 
@@ -507,4 +575,6 @@ public abstract class AbstractDefaultRepositoryContentTestCase
 
 
     protected abstract String toPath( ItemSelector selector );
+
+    protected abstract ItemSelector toItemSelector(String path) throws LayoutException;
 }
index baa518e945d13bb4ae7dcc43b28944e005d83345..d75ec2a91c134d44e4d64fd2e0ff8a265620d6f6 100644 (file)
@@ -254,6 +254,12 @@ public class ManagedDefaultRepositoryContentTest
         return repoContent.toArtifactReference( path );
     }
 
+    @Override
+    protected ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return repoContent.toItemSelector( path );
+    }
+
     @Override
     protected String toPath( ArtifactReference reference )
     {
index 33f845687929fd1a0cb5733f519a91209526ccf3..40d6c55aebc8460062dbf036cd275ebdd8d4b3f9 100644 (file)
@@ -61,6 +61,12 @@ public class RemoteDefaultRepositoryContentTest
         return repoContent.toArtifactReference( path );
     }
 
+    @Override
+    protected ItemSelector toItemSelector( String path ) throws LayoutException
+    {
+        return repoContent.toItemSelector( path );
+    }
+
     @Override
     protected String toPath( ArtifactReference reference )
     {