This is an automated email from the ASF dual-hosted git repository. martin_s pushed a commit to branch feature/storage_refactoring in repository https://gitbox.apache.org/repos/asf/archiva.git
commit 63cbe9b685a17483cdc88dbfe833fa1e14094843 Author: Martin Stockhammer <[email protected]> AuthorDate: Sat Aug 24 22:11:44 2019 +0200 Adding stream methods for artifact search --- archiva-modules/metadata/metadata-model/pom.xml | 4 + .../archiva/metadata/model/ArtifactMetadata.java | 7 +- .../repository/AbstractMetadataRepository.java | 42 ++++- .../metadata/repository/MetadataRepository.java | 73 ++++++++- .../repository/AbstractMetadataRepositoryTest.java | 56 ++++++- .../cassandra/CassandraMetadataRepository.java | 7 +- .../repository/file/FileMetadataRepository.java | 172 +++++++++++++++------ .../file/FileMetadataRepositoryTest.java | 2 + .../repository/jcr/JcrMetadataRepository.java | 2 +- 9 files changed, 302 insertions(+), 63 deletions(-) diff --git a/archiva-modules/metadata/metadata-model/pom.xml b/archiva-modules/metadata/metadata-model/pom.xml index 4d81ad9..b4894b3 100644 --- a/archiva-modules/metadata/metadata-model/pom.xml +++ b/archiva-modules/metadata/metadata-model/pom.xml @@ -40,6 +40,10 @@ <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jpa_2.0_spec</artifactId> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-collections4</artifactId> + </dependency> </dependencies> diff --git a/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ArtifactMetadata.java b/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ArtifactMetadata.java index fd44feb..d8e9290 100644 --- a/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ArtifactMetadata.java +++ b/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ArtifactMetadata.java @@ -20,6 +20,7 @@ package org.apache.archiva.metadata.model; */ import org.apache.archiva.checksum.ChecksumAlgorithm; +import org.apache.commons.collections4.bidimap.DualHashBidiMap; import sun.reflect.generics.repository.MethodRepository; import javax.xml.bind.annotation.XmlRootElement; @@ -99,7 +100,7 @@ public class ArtifactMetadata /** * The list of checksums. */ - private Map<ChecksumAlgorithm, String> checksums = new HashMap<>(); + private Map<ChecksumAlgorithm, String> checksums = new DualHashBidiMap<>( ); private String toStringValue = ""; private int lastHash = 0; @@ -177,6 +178,10 @@ public class ArtifactMetadata return this.checksums; } + public boolean hasChecksum(String checksum) { + return this.checksums.containsValue( checksum ); + } + public void setChecksums(Map<ChecksumAlgorithm,String> checksums) { this.checksums = checksums; } diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java index c4e2710..bcb3e83 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java @@ -28,6 +28,8 @@ import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; import org.apache.commons.collections4.ComparatorUtils; +import javax.annotation.Nonnull; +import javax.management.Query; import java.time.ZonedDateTime; import java.util.*; import java.util.stream.Stream; @@ -342,6 +344,10 @@ public abstract class AbstractMetadataRepository throw new UnsupportedOperationException(); } + protected QueryParameter getParameterOrDefault(QueryParameter queryParameter) { + return queryParameter == null ? new QueryParameter( ) : queryParameter; + } + @Override public <T extends MetadataFacet> Stream<T> getMetadataFacetStream( RepositorySession session, String repositoryId, Class<T> facetClazz ) throws MetadataRepositoryException { @@ -349,9 +355,9 @@ public abstract class AbstractMetadataRepository } @Override - public Stream<ArtifactMetadata> getArtifactsByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime ) throws MetadataRepositoryException + public Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime ) throws MetadataRepositoryException { - return getArtifactsByDateRangeStream( session, repositoryId, startTime, endTime, new QueryParameter()); + return getArtifactByDateRangeStream( session, repositoryId, startTime, endTime, new QueryParameter()); } @Override @@ -376,7 +382,7 @@ public abstract class AbstractMetadataRepository @Override - public Stream<ArtifactMetadata> getArtifactsByDateRangeStream(RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException + public Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException { throw new UnsupportedOperationException(); } @@ -403,7 +409,35 @@ public abstract class AbstractMetadataRepository @Override public List<ArtifactMetadata> getArtifactsByDateRange(RepositorySession session, String repoId, ZonedDateTime startTime, ZonedDateTime endTime) throws MetadataRepositoryException { - return getArtifactsByDateRange(session, repoId, startTime, endTime, new QueryParameter()); + return getArtifactsByDateRange(session, repoId, startTime, endTime, getParameterOrDefault( null )); + } + + @Override + public Stream<ArtifactMetadata> getArtifactStream( final RepositorySession session, final String repositoryId ) throws MetadataResolutionException + { + return getArtifactStream( session, repositoryId, getParameterOrDefault( null ) ); + } + + @Override + public Stream<ArtifactMetadata> getArtifactStream( final RepositorySession session, final String repoId, + final String namespace, final String projectId, + final String projectVersion) throws MetadataResolutionException + { + return getArtifactStream( session,repoId,namespace, projectId, projectVersion, getParameterOrDefault( null )); + } + + @Override + public Stream<ArtifactMetadata> getArtifactStream( final RepositorySession session, final String repositoryId, QueryParameter queryParameter ) throws MetadataResolutionException + { + throw new UnsupportedOperationException( ); + } + + @Override + public Stream<ArtifactMetadata> getArtifactStream( final RepositorySession session, final String repoId, + final String namespace, final String projectId, + final String projectVersion, final QueryParameter queryParameter ) throws MetadataResolutionException + { + throw new UnsupportedOperationException( ); } } diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java index e679704..da54715 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java @@ -26,7 +26,8 @@ import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; -import java.time.ZoneId; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.time.ZonedDateTime; import java.util.Collection; import java.util.List; @@ -319,7 +320,7 @@ public interface MetadataRepository * @throws MetadataRepositoryException * @since 3.0 */ - Stream<ArtifactMetadata> getArtifactsByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime ) + Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime ) throws MetadataRepositoryException; /** @@ -336,7 +337,7 @@ public interface MetadataRepository * @throws MetadataRepositoryException * @since 3.0 */ - Stream<ArtifactMetadata> getArtifactsByDateRangeStream(RepositorySession session, String repositoryId, + Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException; @@ -454,6 +455,72 @@ public interface MetadataRepository throws MetadataRepositoryException; /** + * Returns a stream of artifacts that are stored in the given repository. The number and order of elements in the stream + * is defined by the <code>queryParameter</code>. + * The efficiency of ordering of elements is dependent on the implementation. + * There may be some implementations that have to put a hard limit on the elements returned. + * If there are no <code>sortFields</code> defined in the query parameter, the order of elements in the stream is undefined and depends + * on the implementation. + * + * @param session + * @param repositoryId + * @return A stream of artifact metadata objects for each artifact found in the repository. + * @since 3.0 + */ + Stream<ArtifactMetadata> getArtifactStream( @Nonnull RepositorySession session, @Nonnull String repositoryId, @Nullable QueryParameter queryParameter ) + throws MetadataResolutionException; + + /** + * Returns a stream of all the artifacts in the given repository using default query parameter. + * The order of the artifacts returned in the stream depends on the implementation. + * The number of elements in the stream is unlimited, but there may be some implementations that have to put a hard + * limit on the elements returned. + * For further information see {@link #getArtifactStream(RepositorySession, String, QueryParameter)} + * + * @param session The repository session + * @param repositoryId The repository id + * @return A (unlimited) stream of artifact metadata elements that are found in this repository + * @since 3.0 + * @see #getArtifactStream(RepositorySession, String, QueryParameter) + */ + Stream<ArtifactMetadata> getArtifactStream( @Nonnull RepositorySession session, @Nonnull String repositoryId) + throws MetadataResolutionException; + + /** + * Returns a stream of artifacts found for the given artifact coordinates and using the <code>queryParameter</code> + * + * @param session The repository session. May not be <code>null</code>. + * @param repoId The repository id. May not be <code>null</code>. + * @param namespace The namespace. May not be <code>null</code>. + * @param projectId The project id. May not be <code>null</code>. + * @param projectVersion The project version. May not be <code>null</code>. + * @return A stream of artifact metadata object. Order and number of elements returned, depends on the <code>queryParameter</code>. + * @since 3.0 + * @throws MetadataResolutionException if there are no elements for the given artifact coordinates. + */ + Stream<ArtifactMetadata> getArtifactStream( @Nonnull RepositorySession session, @Nonnull String repoId, + @Nonnull String namespace, @Nonnull String projectId, + @Nonnull String projectVersion, @Nullable QueryParameter queryParameter ) + throws MetadataResolutionException; + + /** + * Returns a stream of artifacts found for the given artifact coordinates. The order of elements returned, depends on the + * implementation. + * + * @param session The repository session. May not be <code>null</code>. + * @param repoId The repository id. May not be <code>null</code>. + * @param namespace The namespace. May not be <code>null</code>. + * @param projectId The project id. May not be <code>null</code>. + * @param projectVersion The project version. May not be <code>null</code>. + * @return A stream of artifact metadata object. Order and number of elements returned, depends on the <code>queryParameter</code>. + * @since 3.0 + * @throws MetadataResolutionException if there are no elements for the given artifact coordinates. + */ + Stream<ArtifactMetadata> getArtifactStream( @Nonnull RepositorySession session, @Nonnull String repoId, + @Nonnull String namespace, @Nonnull String projectId, + @Nonnull String projectVersion) + throws MetadataResolutionException; + /** * basically just checking it exists not complete data returned * * diff --git a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java index c777097..6fb1e75 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java +++ b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java @@ -20,6 +20,7 @@ package org.apache.archiva.metadata.repository; */ import junit.framework.TestCase; +import org.apache.archiva.checksum.ChecksumAlgorithm; import org.apache.archiva.metadata.QueryParameter; import org.apache.archiva.metadata.generic.GenericMetadataFacet; import org.apache.archiva.metadata.generic.GenericMetadataFacetFactory; @@ -70,6 +71,8 @@ public abstract class AbstractMetadataRepositoryTest private static final String UNKNOWN = "unknown"; + private static final String TEST_SHA256 = "e43857b4e75e04a09d167564ca9a4636e5d233035483ba4ecf1243e34325d565"; + private static final String TEST_MD5 = "bd4a9b642562547754086de2dab26b7d"; private static final String TEST_SHA1 = "2e5daf0201ddeb068a62d5e08da18657ab2c6be9"; @@ -989,7 +992,7 @@ public abstract class AbstractMetadataRepositoryTest ZonedDateTime upper = artifact2.getWhenGathered().plusSeconds(10); tryAssert( ( ) -> { - Stream<ArtifactMetadata> stream = getRepository().getArtifactsByDateRangeStream(session, TEST_REPO_ID, lower, upper, new QueryParameter()); + Stream<ArtifactMetadata> stream = getRepository().getArtifactByDateRangeStream(session, TEST_REPO_ID, lower, upper, new QueryParameter()); assertNotNull(stream); List<ArtifactMetadata> artifacts = stream.collect(Collectors.toList()); @@ -1201,6 +1204,29 @@ public abstract class AbstractMetadataRepositoryTest } @Test + public void testGetArtifactStream( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact1 = createArtifact( ); + ArtifactMetadata artifact2 = createArtifact( "pom" ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1 ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact2 ); + + tryAssert( ( ) -> { + Stream<ArtifactMetadata> artifacts = + getRepository( ).getArtifactStream( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertNotNull( artifacts ); + List<ArtifactMetadata> actual = artifacts + .sorted( ( o1, o2 ) -> o1.getId( ).compareTo( o2.getId( ) ) ).collect( Collectors.toList( ) ); + assertEquals( Arrays.asList( artifact1, artifact2 ), actual ); + } ); + + } + } + + @Test public void testGetArtifactVersions( ) throws Exception { @@ -1592,6 +1618,23 @@ public abstract class AbstractMetadataRepositoryTest } @Test + public void testGetArtifactsByChecksumSingleResultSha256( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + artifact.setChecksum( ChecksumAlgorithm.SHA256, TEST_SHA256); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); + + assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA256 ) ) ); + + } + } + + @Test public void testGetArtifactsByChecksumSingleResultMd5( ) throws Exception { @@ -1635,10 +1678,13 @@ public abstract class AbstractMetadataRepositoryTest getRepository( ).updateArtifact( session, TEST_REPO_ID, namespace, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); session.save( ); - tryAssert( ( ) -> assertEquals( Collections.singletonList( artifact ), - new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1 ) ) ) ); - tryAssert( ( ) -> assertEquals( Collections.singletonList( artifact ), - new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5 ) ) ) ); + tryAssert( ( ) -> + { + assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1 ) ) ); + assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5 ) ) ); + }); } } diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java index 768a94b..844bba7 100644 --- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java +++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java @@ -72,7 +72,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.time.Instant; -import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.*; import java.util.function.BiFunction; @@ -1918,7 +1917,7 @@ public class CassandraMetadataRepository } /** - * For documentation see {@link MetadataRepository#getArtifactsByDateRangeStream(RepositorySession, String, ZonedDateTime, ZonedDateTime, QueryParameter)} + * For documentation see {@link MetadataRepository#getArtifactByDateRangeStream(RepositorySession, String, ZonedDateTime, ZonedDateTime, QueryParameter)} * * This implementation orders the stream. It does not order the query in the backend. * @@ -1929,10 +1928,10 @@ public class CassandraMetadataRepository * @param queryParameter Additional parameters for the query that affect ordering and number of returned results. * @return * @throws MetadataRepositoryException - * @see MetadataRepository#getArtifactsByDateRangeStream + * @see MetadataRepository#getArtifactByDateRangeStream */ @Override - public Stream<ArtifactMetadata> getArtifactsByDateRangeStream(RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException + public Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException { Comparator<ArtifactMetadata> comp = getArtifactMetadataComparator(queryParameter, "whenGathered"); return getArtifactsByDateRange(session, repositoryId, startTime, endTime, queryParameter).stream().sorted(comp).skip(queryParameter.getOffset()).limit(queryParameter.getLimit()); diff --git a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java index 272f536..4191945 100644 --- a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java +++ b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java @@ -19,14 +19,18 @@ package org.apache.archiva.metadata.repository.file; * under the License. */ +import org.apache.archiva.checksum.ChecksumAlgorithm; import org.apache.archiva.configuration.ArchivaConfiguration; import org.apache.archiva.configuration.ManagedRepositoryConfiguration; import org.apache.archiva.metadata.QueryParameter; import org.apache.archiva.metadata.model.*; import org.apache.archiva.metadata.repository.*; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -413,7 +417,7 @@ public class FileMetadataRepository * @throws MetadataRepositoryException */ @Override - public Stream<ArtifactMetadata> getArtifactsByDateRangeStream(RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException { + public Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException { try { List<ArtifactMetadata> artifacts = new ArrayList<>(); for (String ns : getRootNamespaces(session, repositoryId)) { @@ -452,6 +456,7 @@ public class FileMetadataRepository } } + @Override public Collection<ArtifactMetadata> getArtifacts(RepositorySession session, String repoId, String namespace, String projectId, String projectVersion) @@ -491,10 +496,9 @@ public class FileMetadataRepository artifact.setWhenGathered(ZonedDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(value)), ZoneId.of("GMT"))); } else if ("version".equals(field)) { artifact.setVersion(value); - } else if ("md5".equals(field)) { - artifact.setMd5(value); - } else if ("sha1".equals(field)) { - artifact.setSha1(value); + } else if (field.startsWith("checksum")) { + String algorithmStr = StringUtils.removeStart( name, "artifact:checksum:"+id+":"); + artifact.setChecksum( ChecksumAlgorithm.valueOf( algorithmStr ), value ); } else if ("facetIds".equals(field)) { if (value.length() > 0) { String propertyPrefix = "artifact:facet:" + id + ":"; @@ -566,11 +570,9 @@ public class FileMetadataRepository // alternatively, we could build a referential tree in the content repository, however it would need some levels // of depth to avoid being too broad to be useful (eg. /repository/checksums/a/ab/abcdef1234567) - List<ArtifactMetadata> artifacts = new ArrayList<>(); - for (String ns : getRootNamespaces(session, repositoryId)) { - getArtifactsByChecksum(session, artifacts, repositoryId, ns, checksum); - } - return artifacts; + return getArtifactStream( session, repositoryId ).filter( + a -> a.hasChecksum( checksum ) + ).collect( Collectors.toList() ); } catch (MetadataResolutionException e) { throw new MetadataRepositoryException(e.getMessage(), e); } @@ -607,8 +609,8 @@ public class FileMetadataRepository properties.remove("artifact:updated:" + id); properties.remove("artifact:whenGathered:" + id); properties.remove("artifact:size:" + id); - properties.remove("artifact:md5:" + id); - properties.remove("artifact:sha1:" + id); + artifactMetadata.getChecksums().entrySet().stream().forEach( entry -> + properties.remove( "artifact:checksum:"+id+":"+entry.getKey().name() )); properties.remove("artifact:version:" + id); properties.remove("artifact:facetIds:" + id); @@ -638,15 +640,15 @@ public class FileMetadataRepository properties.remove("artifact:updated:" + id); properties.remove("artifact:whenGathered:" + id); properties.remove("artifact:size:" + id); - properties.remove("artifact:md5:" + id); - properties.remove("artifact:sha1:" + id); properties.remove("artifact:version:" + id); properties.remove("artifact:facetIds:" + id); - String prefix = "artifact:facet:" + id + ":"; - for (Object key : new ArrayList<>(properties.keySet())) { - String property = (String) key; - if (property.startsWith(prefix)) { + String facetPrefix = "artifact:facet:" + id + ":"; + String checksumPrefix = "artifact:checksum:"+id+":"; + for (String property : properties.stringPropertyNames()) { + if (property.startsWith( checksumPrefix )) { + properties.remove( property ); + } else if (property.startsWith(facetPrefix)) { properties.remove(property); } } @@ -687,27 +689,6 @@ public class FileMetadataRepository } } - private void getArtifactsByChecksum(RepositorySession session, List<ArtifactMetadata> artifacts, String repositoryId, String ns, - String checksum) - throws MetadataRepositoryException { - try { - for (String namespace : getNamespaces(session, repositoryId, ns)) { - getArtifactsByChecksum(session, artifacts, repositoryId, ns + "." + namespace, checksum); - } - - for (String project : getProjects(session, repositoryId, ns)) { - for (String version : getProjectVersions(session, repositoryId, ns, project)) { - for (ArtifactMetadata artifact : getArtifacts(session, repositoryId, ns, project, version)) { - if (checksum.equals(artifact.getMd5()) || checksum.equals(artifact.getSha1())) { - artifacts.add(artifact); - } - } - } - } - } catch (MetadataResolutionException e) { - throw new MetadataRepositoryException(e.getMessage(), e); - } - } @Override public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata(RepositorySession session, String key, String value, String repositoryId) @@ -771,12 +752,8 @@ public class FileMetadataRepository properties.setProperty("artifact:whenGathered:" + id, Long.toString(artifact.getWhenGathered().toInstant().toEpochMilli())); properties.setProperty("artifact:size:" + id, Long.toString(artifact.getSize())); - if (artifact.getMd5() != null) { - properties.setProperty("artifact:md5:" + id, artifact.getMd5()); - } - if (artifact.getSha1() != null) { - properties.setProperty("artifact:sha1:" + id, artifact.getSha1()); - } + artifact.getChecksums().entrySet().stream().forEach( entry -> + properties.setProperty( "artifact:checksum:"+id+":"+entry.getKey().name(), entry.getValue() )); properties.setProperty("artifact:version:" + id, artifact.getVersion()); Set<String> facetIds = new LinkedHashSet<>(artifact.getFacetIds()); @@ -1043,6 +1020,32 @@ public class FileMetadataRepository return getNamespaces(session, repoId, null); } + private Stream<String> getAllNamespacesStream(RepositorySession session, String repoId) { + Path directory = null; + try + { + directory = getDirectory(repoId); + } + catch ( IOException e ) + { + return Stream.empty( ); + } + if (!(Files.exists(directory) && Files.isDirectory(directory))) { + return Stream.empty( ); + } + final String searchFile = NAMESPACE_METADATA_KEY + ".properties"; + try + { + return Files.list(directory).filter(Files::isDirectory).filter(path -> + Files.exists(path.resolve(searchFile)) + ).map(path -> path.getFileName().toString()); + } + catch ( IOException e ) + { + return Stream.empty( ); + } + } + @Override public Collection<String> getNamespaces(RepositorySession session, String repoId, String baseNamespace) throws MetadataResolutionException { @@ -1182,6 +1185,85 @@ public class FileMetadataRepository } } + private class ArtifactCoordinates { + final String namespace; + final String project; + final String version; + + public ArtifactCoordinates(String namespace, String project, String version) { + this.namespace = namespace; + this.project = project; + this.version = version; + } + + public String getNamespace( ) + { + return namespace; + } + + public String getProject( ) + { + return project; + } + + public String getVersion( ) + { + return version; + } + } + + @Override + public Stream<ArtifactMetadata> getArtifactStream( @Nonnull final RepositorySession session, @Nonnull final String repositoryId, + @Nullable QueryParameter queryParameter ) throws MetadataResolutionException + { + + queryParameter = getParameterOrDefault( queryParameter ); + return getAllNamespacesStream( session, repositoryId ).filter( Objects::nonNull ).flatMap( ns -> + { + try + { + return getProjects( session, repositoryId, ns ).stream( ).map( proj -> + new ArtifactCoordinates( ns, proj, null ) ); + } + catch ( MetadataResolutionException e ) + { + return null; + } + } + ).filter( Objects::nonNull ).flatMap( artifactCoordinates -> + { + try + { + return getProjectVersions( session, repositoryId, artifactCoordinates.getNamespace( ), artifactCoordinates.getProject( ) ) + .stream( ).map(version -> new ArtifactCoordinates( artifactCoordinates.getNamespace(), artifactCoordinates.getProject(), version )); + } + catch ( MetadataResolutionException e ) + { + return null; + } + } + ).filter( Objects::nonNull ).flatMap( ac -> + { + try + { + return getArtifactStream( session, repositoryId, ac.getNamespace(), ac.getProject(), ac.getVersion() ); + } + catch ( MetadataResolutionException e ) + { + return null; + } + } + ).filter( Objects::nonNull ); + } + + @Override + public Stream<ArtifactMetadata> getArtifactStream( final RepositorySession session, final String repoId, + final String namespace, final String projectId, + final String projectVersion ) throws MetadataResolutionException + { + return getArtifacts( session, repoId, namespace, projectId, projectVersion ).stream( ); + } + private void getArtifacts(RepositorySession session, List<ArtifactMetadata> artifacts, String repoId, String ns) throws MetadataResolutionException { for (String namespace : getNamespaces(session, repoId, ns)) { diff --git a/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java index 41497ac..053b283 100644 --- a/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java +++ b/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java @@ -64,6 +64,8 @@ public class FileMetadataRepositoryTest throws Exception { super.setUp(); + assertMaxTries = 1; + assertRetrySleepMs = 10; Path directory = Paths.get( "target/test-repositories" ); if (Files.exists(directory)) diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java index 101b633..25b11de 100644 --- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java @@ -815,7 +815,7 @@ public class JcrMetadataRepository } @Override - public Stream<ArtifactMetadata> getArtifactsByDateRangeStream(RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException + public Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, QueryParameter queryParameter) throws MetadataRepositoryException { final Session jcrSession = getSession( session ); QueryResult result = queryArtifactByDateRange(jcrSession, repositoryId, startTime, endTime, queryParameter);
