diff options
author | Martin Stockhammer <martin_s@apache.org> | 2020-02-13 22:20:35 +0100 |
---|---|---|
committer | Martin Stockhammer <martin_s@apache.org> | 2020-02-13 22:20:35 +0100 |
commit | 6823bb0371a3278cfb7bcb834792c21e623183b6 (patch) | |
tree | 98c10add81c294fb42e620da40ab7c5cb15ebbfe /archiva-modules/archiva-base | |
parent | 84d9f5723fde9e72ab413d1ef739f1f728b84485 (diff) | |
download | archiva-6823bb0371a3278cfb7bcb834792c21e623183b6.tar.gz archiva-6823bb0371a3278cfb7bcb834792c21e623183b6.zip |
Adding selector interface for repository content
Diffstat (limited to 'archiva-modules/archiva-base')
11 files changed, 460 insertions, 10 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 d959a8629..0afe493e1 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 474f8241b..b4c6d6cdb 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 000000000..9e50c2488 --- /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 f7a840a7a..ef7249664 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 000000000..34c10ece6 --- /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 37e04748d..e52071970 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 66fd52964..b8fd55d1b 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 000000000..7ab3c412c --- /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 324843090..0ba3658c2 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 c797b5686..1760012ea 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 86d43d188..7f2dec2fd 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; |