This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git


The following commit(s) were added to refs/heads/master by this push:
     new 6823bb0  Adding selector interface for repository content
6823bb0 is described below

commit 6823bb0371a3278cfb7bcb834792c21e623183b6
Author: Martin Stockhammer <marti...@apache.org>
AuthorDate: Thu Feb 13 22:20:35 2020 +0100

    Adding selector interface for repository content
---
 .../archiva/repository/RepositoryContent.java      |   9 +
 .../archiva/repository/content/Artifact.java       |   3 -
 .../archiva/repository/content/ItemSelector.java   |  79 +++++++++
 .../apache/archiva/repository/content/Project.java |   4 +-
 .../content/base/ArchivaItemSelector.java          | 194 +++++++++++++++++++++
 .../repository/content/base/ArchivaProject.java    |  13 +-
 .../repository/content/base/ArchivaVersion.java    |   2 +-
 .../content/base/ArchivaItemSelectorTest.java      | 145 +++++++++++++++
 .../mock/ManagedRepositoryContentMock.java         |   7 +
 .../mock/RemoteRepositoryContentMock.java          |   7 +
 .../scanner/mock/ManagedRepositoryContentMock.java |   7 +
 .../mock/ManagedRepositoryContentMock.java         |   7 +
 .../mock/RemoteRepositoryContentMock.java          |  15 ++
 .../maven2/Maven2RepositoryPathTranslator.java     |  10 +-
 .../maven2/AbstractDefaultRepositoryContent.java   |  41 +++++
 .../maven2/ManagedDefaultRepositoryContent.java    |   2 +
 .../AbstractDefaultRepositoryContentTestCase.java  |  19 ++
 .../ManagedDefaultRepositoryContentTest.java       |   6 +
 .../maven2/RemoteDefaultRepositoryContentTest.java |   6 +
 19 files changed, 564 insertions(+), 12 deletions(-)

diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
index d959a86..0afe493 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
@@ -21,6 +21,7 @@ package org.apache.archiva.repository;
 
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.VersionedReference;
+import org.apache.archiva.repository.content.ItemSelector;
 
 
 /**
@@ -48,4 +49,12 @@ public interface RepositoryContent
      * @return the relative path to the artifact.
      */
     String toPath( ArtifactReference reference );
+
+
+    /**
+     * Return the path, that represents the item specified by the selector.
+     * @param selector the selector with the artifact coordinates
+     * @return the path to the content item
+     */
+    String toPath( ItemSelector selector );
 }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
index 474f824..b4c6d6c 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
@@ -19,11 +19,8 @@ package org.apache.archiva.repository.content;
  * under the License.
  */
 
-import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
 import org.apache.archiva.repository.storage.StorageAsset;
 
-import java.util.Map;
-
 /**
  *
  * Represents a artifact of a repository. This object contains unique 
coordinates of the
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/ItemSelector.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/ItemSelector.java
new file mode 100644
index 0000000..9e50c24
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/ItemSelector.java
@@ -0,0 +1,79 @@
+package org.apache.archiva.repository.content;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+/**
+ * The item selector is used to specify coordinates for retrieving ContentItem 
elements.
+ */
+public interface ItemSelector
+{
+
+    String getProjectId();
+
+    String getNamespace();
+
+    String getVersion( );
+
+    String getArtifactVersion();
+
+    String getArtifactId( );
+
+    String getType();
+
+    String getClassifier();
+
+    String getAttribute( String key );
+
+    Map<String, String> getAttributes( );
+
+    default boolean hasNamespace() {
+        return !StringUtils.isEmpty( getNamespace( ) );
+    }
+
+    default boolean hasProjectId() {
+        return !StringUtils.isEmpty( getProjectId( ) );
+    }
+
+    default boolean hasVersion() {
+        return !StringUtils.isEmpty(getVersion());
+    }
+
+    default boolean hasArtifactId() {
+        return !StringUtils.isEmpty( getArtifactId( ) );
+    }
+
+    default boolean hasArtifactVersion() {
+        return !StringUtils.isEmpty( getArtifactVersion( ) );
+    }
+
+    default boolean hasType() {
+        return !StringUtils.isEmpty( getType( ) );
+    }
+
+    default boolean hasClassifier() {
+        return !StringUtils.isEmpty( getClassifier( ) );
+    }
+
+    boolean hasAttributes();
+}
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Project.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Project.java
index f7a840a..ef72496 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Project.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Project.java
@@ -19,7 +19,7 @@ package org.apache.archiva.repository.content;
  * under the License.
  */
 
-import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.RepositoryContent;
 import org.apache.archiva.repository.storage.StorageAsset;
 
 /**
@@ -57,7 +57,7 @@ public interface Project extends ContentItem
      * The repository this project is part of.
      * @return the repository content
      */
-    ManagedRepositoryContent getRepository();
+    RepositoryContent getRepository();
 
     /**
      * Returns the asset that corresponds to this project.
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaItemSelector.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaItemSelector.java
new file mode 100644
index 0000000..34c10ec
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaItemSelector.java
@@ -0,0 +1,194 @@
+package org.apache.archiva.repository.content.base;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.repository.content.ItemSelector;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Item selector for querying artifacts and other content items.
+ */
+public class ArchivaItemSelector implements ItemSelector
+{
+
+    private String projectId = null;
+    private String version = null;
+    private String artifactVersion = null;
+    private String artifactId = null;
+    private String namespace = "";
+    private String type = null;
+    private String classifier = null;
+    private Map<String,String> attributes;
+
+
+    private ArchivaItemSelector() {
+
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static class Builder
+    {
+        private final ArchivaItemSelector selector = new ArchivaItemSelector( 
);
+
+        public Builder withNamespace( String namespace )
+        {
+            selector.namespace = namespace;
+            return this;
+        }
+
+
+        public Builder withProjectId( String projectId )
+        {
+            selector.projectId = projectId;
+            return this;
+        }
+
+
+        public Builder withVersion( String version )
+        {
+            selector.version = version;
+            return this;
+        }
+
+
+        public Builder withArtifactVersion( String artifactVersion )
+        {
+            selector.artifactVersion = artifactVersion;
+            return this;
+        }
+
+
+        public Builder withArtifactId( String artifactId )
+        {
+            selector.artifactId = artifactId;
+            return this;
+        }
+
+
+        public Builder withType( String type )
+        {
+            selector.type = type;
+            return this;
+        }
+
+
+        public Builder withClassifier( String classifier )
+        {
+            selector.classifier = classifier;
+            return this;
+        }
+
+
+        public Builder withAttribute( String key, String value )
+        {
+            selector.setAttribute( key, value );
+            return this;
+        }
+
+        public ArchivaItemSelector build() {
+            return selector;
+        }
+    }
+
+    private void setAttribute(String key, String value) {
+        if (this.attributes == null) {
+            this.attributes = new HashMap<>( );
+        }
+        this.attributes.put( key, value );
+    }
+
+    @Override
+    public String getProjectId( )
+    {
+        return projectId;
+    }
+
+    @Override
+    public String getNamespace( )
+    {
+        return namespace;
+    }
+
+    @Override
+    public String getVersion( )
+    {
+        return version;
+    }
+
+    @Override
+    public String getArtifactVersion( )
+    {
+        return artifactVersion;
+    }
+
+    @Override
+    public String getArtifactId( )
+    {
+        return artifactId;
+    }
+
+    @Override
+    public String getType( )
+    {
+        return type;
+    }
+
+    @Override
+    public String getClassifier( )
+    {
+        return classifier;
+    }
+
+    @Override
+    public String getAttribute( String key )
+    {
+        if ( this.attributes == null || !this.attributes.containsKey( key ) )
+        {
+
+            return "";
+        }
+        else
+        {
+            return this.attributes.get( key );
+        }
+    }
+
+    @Override
+    public Map<String, String> getAttributes( )
+    {
+        if (this.attributes==null) {
+            return Collections.emptyMap( );
+        } else {
+            return Collections.unmodifiableMap( this.attributes );
+        }
+    }
+
+    @Override
+    public boolean hasAttributes( )
+    {
+        return attributes!=null && attributes.size()>0;
+    }
+}
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java
index 37e0474..e520719 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java
@@ -19,7 +19,9 @@ package org.apache.archiva.repository.content.base;
  * under the License.
  */
 
+import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.RepositoryContent;
 import org.apache.archiva.repository.content.Project;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.apache.commons.lang3.StringUtils;
@@ -31,7 +33,7 @@ public class ArchivaProject extends ArchivaContentItem 
implements Project
 {
     private String namespace;
     private String id;
-    private ManagedRepositoryContent repositoryContent;
+    private RepositoryContent repositoryContent;
     private StorageAsset asset;
 
     // Setting all setters to private. Builder is the way to go.
@@ -63,7 +65,7 @@ public class ArchivaProject extends ArchivaContentItem 
implements Project
     }
 
     @Override
-    public ManagedRepositoryContent getRepository( )
+    public RepositoryContent getRepository( )
     {
         return this.repositoryContent;
     }
@@ -110,7 +112,7 @@ public class ArchivaProject extends ArchivaContentItem 
implements Project
         }
 
 
-        public OptBuilder withRepository( ManagedRepositoryContent repository 
) {
+        public OptBuilder withRepository( RepositoryContent repository ) {
             project.repositoryContent = repository;
             return this;
         }
@@ -140,7 +142,10 @@ public class ArchivaProject extends ArchivaContentItem 
implements Project
                 project.namespace = "";
             }
             if (project.asset == null) {
-                project.asset = project.getRepository( ).getRepository( 
).getAsset( "" );
+                if (project.getRepository() instanceof 
ManagedRepositoryContent) {
+                    project.asset = (( 
ManagedRepositoryContent)project.getRepository( )).getRepository( ).getAsset( 
"" );
+                }
+
             }
             return project;
         }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
index 66fd529..b8fd55d 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
@@ -95,7 +95,7 @@ public class ArchivaVersion extends ArchivaContentItem 
implements Version
 
         public ArchivaVersion build() {
             if (this.version.asset == null) {
-                this.version.project.getRepository( 
).getRepository().getAsset( "" );
+                this.version.project.getAsset( );
             }
             return this.version;
         }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaItemSelectorTest.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaItemSelectorTest.java
new file mode 100644
index 0000000..7ab3c41
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaItemSelectorTest.java
@@ -0,0 +1,145 @@
+package org.apache.archiva.repository.content.base;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ArchivaItemSelectorTest
+{
+
+    @Test
+    void getProjectId( )
+    {
+
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withProjectId( "test-project-123" ).build( );
+        assertEquals( "test-project-123", selector.getProjectId( ) );
+        assertTrue( selector.hasProjectId( ) );
+        assertFalse( selector.hasVersion( ) );
+        assertFalse( selector.hasArtifactId( ) );
+        assertFalse( selector.hasArtifactVersion( ) );
+        assertFalse( selector.hasType( ) );
+        assertFalse( selector.hasClassifier( ) );
+        assertFalse( selector.hasAttributes( ) );
+    }
+
+    @Test
+    void getNamespace( )
+    {
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withNamespace( "abc.de.fg" ).build();
+        assertEquals( "abc.de.fg", selector.getNamespace( ) );
+        assertFalse( selector.hasProjectId( ) );
+        assertFalse( selector.hasVersion( ) );
+        assertFalse( selector.hasArtifactId( ) );
+        assertFalse( selector.hasArtifactVersion( ) );
+        assertFalse( selector.hasType( ) );
+        assertFalse( selector.hasClassifier( ) );
+        assertFalse( selector.hasAttributes( ) );
+    }
+
+    @Test
+    void getVersion( )
+    {
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withVersion( "1.15.20.3" ).build();
+        assertEquals( "1.15.20.3", selector.getVersion( ) );
+        assertFalse( selector.hasProjectId( ) );
+        assertTrue( selector.hasVersion( ) );
+        assertFalse( selector.hasArtifactId( ) );
+        assertFalse( selector.hasArtifactVersion( ) );
+        assertFalse( selector.hasType( ) );
+        assertFalse( selector.hasClassifier( ) );
+        assertFalse( selector.hasAttributes( ) );
+    }
+
+    @Test
+    void getArtifactVersion( )
+    {
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withArtifactVersion( "5.13.2.4" ).build();
+        assertEquals( "5.13.2.4", selector.getArtifactVersion() );
+        assertFalse( selector.hasProjectId( ) );
+        assertFalse( selector.hasVersion( ) );
+        assertFalse( selector.hasArtifactId( ) );
+        assertTrue( selector.hasArtifactVersion( ) );
+        assertFalse( selector.hasType( ) );
+        assertFalse( selector.hasClassifier( ) );
+        assertFalse( selector.hasAttributes( ) );
+    }
+
+    @Test
+    void getArtifactId( )
+    {
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withArtifactId( "xml-tools" ).build();
+        assertEquals( "xml-tools", selector.getArtifactId() );
+        assertFalse( selector.hasProjectId( ) );
+        assertFalse( selector.hasVersion( ) );
+        assertTrue( selector.hasArtifactId( ) );
+        assertFalse( selector.hasArtifactVersion( ) );
+        assertFalse( selector.hasType( ) );
+        assertFalse( selector.hasClassifier( ) );
+        assertFalse( selector.hasAttributes( ) );
+
+    }
+
+    @Test
+    void getType( )
+    {
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withType( "javadoc" ).build();
+        assertEquals( "javadoc", selector.getType() );
+        assertFalse( selector.hasProjectId( ) );
+        assertFalse( selector.hasVersion( ) );
+        assertFalse( selector.hasArtifactId( ) );
+        assertFalse( selector.hasArtifactVersion( ) );
+        assertTrue( selector.hasType( ) );
+        assertFalse( selector.hasClassifier( ) );
+        assertFalse( selector.hasAttributes( ) );
+    }
+
+    @Test
+    void getClassifier( )
+    {
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withClassifier( "source" ).build();
+        assertEquals( "source", selector.getClassifier() );
+        assertFalse( selector.hasProjectId( ) );
+        assertFalse( selector.hasVersion( ) );
+        assertFalse( selector.hasArtifactId( ) );
+        assertFalse( selector.hasArtifactVersion( ) );
+        assertFalse( selector.hasType( ) );
+        assertTrue( selector.hasClassifier( ) );
+        assertFalse( selector.hasAttributes( ) );
+    }
+
+    @Test
+    void getAttribute( )
+    {
+        ArchivaItemSelector selector = ArchivaItemSelector.builder( 
).withAttribute( "test1","value1" ).
+            withAttribute( "test2", "value2" ).build();
+        assertEquals( "value1", selector.getAttribute("test1") );
+        assertEquals( "value2", selector.getAttribute("test2") );
+        assertFalse( selector.hasProjectId( ) );
+        assertFalse( selector.hasVersion( ) );
+        assertFalse( selector.hasArtifactId( ) );
+        assertFalse( selector.hasArtifactVersion( ) );
+        assertFalse( selector.hasType( ) );
+        assertFalse( selector.hasClassifier( ) );
+        assertTrue( selector.hasAttributes( ) );
+    }
+
+}
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
index 3248430..0ba3658 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
@@ -28,6 +28,7 @@ import org.apache.archiva.repository.ContentNotFoundException;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.springframework.stereotype.Service;
 
@@ -217,6 +218,12 @@ public class ManagedRepositoryContentMock implements 
ManagedRepositoryContent
     }
 
     @Override
+    public String toPath( ItemSelector selector )
+    {
+        return null;
+    }
+
+    @Override
     public String toPath( ArchivaArtifact reference )
     {
         return null;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
index c797b56..1760012 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
@@ -24,6 +24,7 @@ import org.apache.archiva.model.RepositoryURL;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.RemoteRepositoryContent;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.springframework.stereotype.Service;
 
 /**
@@ -71,6 +72,12 @@ public class RemoteRepositoryContentMock implements 
RemoteRepositoryContent
     }
 
     @Override
+    public String toPath( ItemSelector selector )
+    {
+        return null;
+    }
+
+    @Override
     public RepositoryURL toURL( ArtifactReference reference )
     {
         return null;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
index 86d43d1..7f2dec2 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
@@ -28,6 +28,7 @@ import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
 import org.apache.archiva.repository.*;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.storage.FilesystemStorage;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.apache.commons.lang3.StringUtils;
@@ -447,6 +448,12 @@ public class ManagedRepositoryContentMock implements 
ManagedRepositoryContent
     }
 
     @Override
+    public String toPath( ItemSelector selector )
+    {
+        return null;
+    }
+
+    @Override
     public String toPath( ArchivaArtifact reference )
     {
         return null;
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
 
b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
index f263345..881e90f 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
@@ -28,6 +28,7 @@ import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
 import org.apache.archiva.repository.*;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.storage.FilesystemStorage;
 import org.apache.archiva.repository.storage.RepositoryStorage;
 import org.apache.archiva.repository.storage.StorageAsset;
@@ -451,6 +452,12 @@ public class ManagedRepositoryContentMock implements 
ManagedRepositoryContent
     }
 
     @Override
+    public String toPath( ItemSelector selector )
+    {
+        return null;
+    }
+
+    @Override
     public String toPath( ArchivaArtifact reference )
     {
         return null;
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
 
b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
index 4ab4a5a..78fff18 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
@@ -25,6 +25,7 @@ import org.apache.archiva.model.RepositoryURL;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.RemoteRepositoryContent;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
@@ -85,6 +86,20 @@ public class RemoteRepositoryContentMock implements 
RemoteRepositoryContent
     }
 
     @Override
+    public String toPath( ItemSelector selector )
+    {
+        String baseVersion;
+        if (!selector.hasVersion() && 
VersionUtil.isSnapshot(selector.getArtifactVersion())) {
+            
baseVersion=VersionUtil.getBaseVersion(selector.getArtifactVersion());
+        } else {
+            baseVersion=selector.getVersion();
+        }
+        return selector.getNamespace().replaceAll("\\.", 
"/")+"/"+selector.getArtifactId()+"/"+baseVersion+"/"
+            +selector.getArtifactId()+"-"+selector.getVersion()+(
+            StringUtils.isNotEmpty(selector.getClassifier()) ? 
"-"+selector.getClassifier() : "")+"."+selector.getType();
+    }
+
+    @Override
     public RepositoryURL toURL( ArtifactReference reference )
     {
         return null;
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
index 7d728f9..eb72653 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
@@ -24,6 +24,7 @@ import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
 import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
 import org.apache.archiva.repository.storage.StorageAsset;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -140,12 +141,17 @@ public class Maven2RepositoryPathTranslator
     private void appendNamespaceAndProject( StringBuilder path, String 
namespace, String projectId )
     {
         appendNamespace( path, namespace );
-        path.append( projectId ).append( PATH_SEPARATOR );
+        if (StringUtils.isNotEmpty( projectId ))
+        {
+            path.append( projectId ).append( PATH_SEPARATOR );
+        }
     }
 
     private void appendNamespace( StringBuilder path, String namespace )
     {
-        path.append( formatAsDirectory( namespace ) ).append( PATH_SEPARATOR );
+        if ( StringUtils.isNotEmpty( namespace ) ) {
+            path.append( formatAsDirectory( namespace ) ).append( 
PATH_SEPARATOR );
+        }
     }
 
     @Override
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/AbstractDefaultRepositoryContent.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/AbstractDefaultRepositoryContent.java
index 0919fca..1713ec7 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/AbstractDefaultRepositoryContent.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/AbstractDefaultRepositoryContent.java
@@ -29,7 +29,9 @@ import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.RepositoryContent;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.content.PathParser;
+import org.apache.archiva.repository.content.Version;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -86,6 +88,45 @@ public abstract class AbstractDefaultRepositoryContent 
implements RepositoryCont
         return path.toString( );
     }
 
+    @Override
+    public String toPath ( ItemSelector selector ) {
+        if (selector==null) {
+            throw new IllegalArgumentException( "ItemSelector must not be 
null." );
+        }
+        String projectId;
+        // Initialize the project id if not set
+        if (selector.hasProjectId()) {
+            projectId = selector.getProjectId( );
+        } else if (selector.hasArtifactId()) {
+            // projectId same as artifact id, if set
+            projectId = selector.getArtifactId( );
+        } else {
+            // we arrive here, if projectId && artifactId not set
+            return pathTranslator.toPath( selector.getNamespace(), "");
+        }
+        if ( !selector.hasArtifactId( )) {
+            return pathTranslator.toPath( selector.getNamespace( ), projectId 
);
+        }
+        // this part only, if projectId && artifactId is set
+        String artifactVersion = "";
+        String version = "";
+        if (selector.hasVersion() && selector.hasArtifactVersion() ) {
+            artifactVersion = selector.getArtifactVersion();
+            version = VersionUtil.getBaseVersion( selector.getVersion( ) );
+        } else if (!selector.hasVersion() && selector.hasArtifactVersion()) {
+            // we try to retrieve the base version, if artifact version is 
only set
+            version = VersionUtil.getBaseVersion( selector.getArtifactVersion( 
) );
+            artifactVersion = selector.getArtifactVersion( );
+        } else if (selector.hasVersion() && !selector.hasArtifactVersion()) {
+            artifactVersion = selector.getVersion();
+            version = VersionUtil.getBaseVersion( selector.getVersion( ) );
+        }
+
+        return pathTranslator.toPath( selector.getNamespace(), projectId, 
version,
+                constructId( selector.getArtifactId(), artifactVersion, 
selector.getClassifier(), selector.getType() ) );
+
+    }
+
     public String toMetadataPath( ProjectReference reference )
     {
         final StringBuilder path = new StringBuilder();
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
index ba14ac0..cfb37a0 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
@@ -34,6 +34,7 @@ import 
org.apache.archiva.repository.EditableManagedRepository;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.apache.commons.lang3.StringUtils;
 
@@ -572,6 +573,7 @@ public class ManagedDefaultRepositoryContent
         }
     }
 
+
     // The variant with runtime exception for stream usage
     private ArtifactReference toArtifactRef(String path) {
         try {
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/AbstractDefaultRepositoryContentTestCase.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/AbstractDefaultRepositoryContentTestCase.java
index cd1044b..d697815 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/AbstractDefaultRepositoryContentTestCase.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/AbstractDefaultRepositoryContentTestCase.java
@@ -22,6 +22,7 @@ package org.apache.archiva.metadata.repository.storage.maven2;
 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.commons.lang3.StringUtils;
 import org.junit.Test;
 
@@ -415,6 +416,21 @@ public abstract class 
AbstractDefaultRepositoryContentTestCase
         }
     }
 
+    public void testToPathOnNullItemSelector()
+
+    {
+        try
+        {
+            ItemSelector selector = null;
+            toPath( selector );
+            fail( "Should have failed due to null artifact reference." );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            /* expected path */
+        }
+    }
+
     private void assertArtifactReference( ArtifactReference actualReference, 
String groupId, String artifactId,
                                           String version, String classifier, 
String type )
     {
@@ -488,4 +504,7 @@ public abstract class 
AbstractDefaultRepositoryContentTestCase
         throws LayoutException;
 
     protected abstract String toPath( ArtifactReference reference );
+
+
+    protected abstract String toPath( ItemSelector selector );
 }
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
index 03a9b42..baa518e 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
@@ -29,6 +29,7 @@ import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
 import org.apache.archiva.repository.EditableManagedRepository;
 import org.apache.archiva.repository.LayoutException;
+import org.apache.archiva.repository.content.ItemSelector;
 import 
org.apache.archiva.repository.content.maven2.ManagedDefaultRepositoryContent;
 import org.apache.archiva.repository.maven2.MavenManagedRepository;
 import org.apache.commons.io.FileUtils;
@@ -259,6 +260,11 @@ public class ManagedDefaultRepositoryContentTest
         return repoContent.toPath( reference );
     }
 
+    @Override
+    protected String toPath( ItemSelector selector ) {
+        return repoContent.toPath( selector );
+    }
+
     private Path setupRepoCopy( String source, String target) throws 
IOException
     {
         Path defaultRepo = getRepositoryPath( source );
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/RemoteDefaultRepositoryContentTest.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/RemoteDefaultRepositoryContentTest.java
index 42a5b26..33f8456 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/RemoteDefaultRepositoryContentTest.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/RemoteDefaultRepositoryContentTest.java
@@ -23,6 +23,7 @@ import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.RemoteRepositoryContent;
+import org.apache.archiva.repository.content.ItemSelector;
 import 
org.apache.archiva.repository.content.maven2.RemoteDefaultRepositoryContent;
 import org.junit.Before;
 
@@ -65,4 +66,9 @@ public class RemoteDefaultRepositoryContentTest
     {
         return repoContent.toPath( reference );
     }
+
+    @Override
+    protected String toPath( ItemSelector selector ) {
+        return repoContent.toPath( selector );
+    }
 }

Reply via email to