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 <[email protected]>
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 );
+ }
}