From 01c55f47050aa09d149ad9deeb28b712911ea341 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 6 Dec 2022 16:09:33 +0100 Subject: [PATCH 1/3] [MRESOLVER-303] Make checksum detection reusable Expose it on selector. --- https://issues.apache.org/jira/browse/MRESOLVER-303 --- .../basic/TestChecksumAlgorithmSelector.java | 6 ++++++ .../impl/Maven2RepositoryLayoutFactory.java | 10 +++++----- .../DefaultChecksumAlgorithmFactorySelector.java | 14 ++++++++++++++ ...ChecksumsArtifactResolverPostProcessorTest.java | 6 ++++++ .../checksum/ChecksumAlgorithmFactory.java | 1 + .../checksum/ChecksumAlgorithmFactorySelector.java | 9 +++++++++ 6 files changed, 41 insertions(+), 5 deletions(-) diff --git a/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java b/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java index 574ab5adc..c26685aaa 100644 --- a/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java +++ b/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java @@ -98,6 +98,12 @@ public List selectList( Collection algorithmNa .collect( toList() ); } + @Override + public boolean isChecksum( String extension ) + { + throw new RuntimeException( "not used in test" ); + } + private static class MessageDigestChecksumAlgorithmFactory extends ChecksumAlgorithmFactorySupport { diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java index 6705f767c..10459614c 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java @@ -134,7 +134,7 @@ public RepositoryLayout newInstance( RepositorySystemSession session, RemoteRepo } return new Maven2RepositoryLayout( - new ArrayList<>( checksumAlgorithmFactorySelector.getChecksumAlgorithmFactories() ), + checksumAlgorithmFactorySelector, checksumsAlgorithms, omitChecksumsForExtensions ); @@ -143,17 +143,17 @@ public RepositoryLayout newInstance( RepositorySystemSession session, RemoteRepo private static class Maven2RepositoryLayout implements RepositoryLayout { - private final List allChecksumAlgorithms; + private final ChecksumAlgorithmFactorySelector checksumAlgorithmFactorySelector; private final List configuredChecksumAlgorithms; private final Set extensionsWithoutChecksums; - private Maven2RepositoryLayout( List allChecksumAlgorithms, + private Maven2RepositoryLayout( ChecksumAlgorithmFactorySelector checksumAlgorithmFactorySelector, List configuredChecksumAlgorithms, Set extensionsWithoutChecksums ) { - this.allChecksumAlgorithms = Collections.unmodifiableList( allChecksumAlgorithms ); + this.checksumAlgorithmFactorySelector = requireNonNull( checksumAlgorithmFactorySelector ); this.configuredChecksumAlgorithms = Collections.unmodifiableList( configuredChecksumAlgorithms ); this.extensionsWithoutChecksums = requireNonNull( extensionsWithoutChecksums ); } @@ -269,7 +269,7 @@ private List getChecksumLocations( URI location ) private boolean isChecksum( String extension ) { - return allChecksumAlgorithms.stream().anyMatch( a -> extension.endsWith( "." + a.getFileExtension() ) ); + return checksumAlgorithmFactorySelector.isChecksum( extension ); } } } diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java index 81d8b64df..af6eac362 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java @@ -98,4 +98,18 @@ public List getChecksumAlgorithmFactories() { return new ArrayList<>( factories.values() ); } + + @Override + public boolean isChecksum( String extension ) + { + requireNonNull( extension ); + if ( extension.contains( "." ) ) + { + return factories.values().stream().anyMatch( a -> extension.endsWith( "." + a.getFileExtension() ) ); + } + else + { + return factories.values().stream().anyMatch( a -> extension.equals( a.getFileExtension() ) ); + } + } } diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java index 49c3c09ee..6ddc65a77 100644 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java @@ -108,6 +108,12 @@ public Collection getChecksumAlgorithmFactories() { return Collections.singletonList( checksumAlgorithmFactory ); } + + @Override + public boolean isChecksum( String extension ) + { + throw new RuntimeException( "not implemented" ); + } }; subject = new TrustedChecksumsArtifactResolverPostProcessor( selector, Collections.singletonMap( TRUSTED_SOURCE_NAME, this ) ); diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactory.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactory.java index f8196d0fc..f11f6c6e2 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactory.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactory.java @@ -37,6 +37,7 @@ public interface ChecksumAlgorithmFactory /** * Returns the file extension to be used for given checksum file (without leading dot), never {@code null}. The * extension should be file and URL path friendly, and may differ from value returned by {@link #getName()}. + * The checksum extension SHOULD NOT contain dot (".") character. * Example: "sha1". */ String getFileExtension(); diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java index 55feea706..c2f856d09 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java @@ -58,4 +58,13 @@ public interface ChecksumAlgorithmFactorySelector * of it). */ Collection getChecksumAlgorithmFactories(); + + /** + * Returns {@code true} if passed in extension matches any known checksum extension. The extension string may + * start or contain dot ("."), but does not have to. In former case "ends with" is checked (i.e. "jar.sha1" -> true; + * ".sha1" -> true) while in latter equality (i.e. "sha1" -> true). + * + * @since 1.9.3 + */ + boolean isChecksum( String extension ); } From 2684f232740b77f98d94b1aad857e978f740aa32 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Wed, 7 Dec 2022 08:42:15 +0100 Subject: [PATCH 2/3] Bending things toward artifact --- .../basic/TestChecksumAlgorithmSelector.java | 11 +++++++++-- .../internal/impl/Maven2RepositoryLayoutFactory.java | 6 +++--- .../DefaultChecksumAlgorithmFactorySelector.java | 9 ++++++++- ...tedChecksumsArtifactResolverPostProcessorTest.java | 8 +++++++- .../checksum/ChecksumAlgorithmFactorySelector.java | 11 ++++++++++- 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java b/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java index c26685aaa..aa7492964 100644 --- a/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java +++ b/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java @@ -28,6 +28,7 @@ import java.util.Locale; import java.util.Set; +import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithm; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector; @@ -99,9 +100,15 @@ public List selectList( Collection algorithmNa } @Override - public boolean isChecksum( String extension ) + public boolean isChecksumExtension( String extension ) { - throw new RuntimeException( "not used in test" ); + throw new RuntimeException( "not implemented" ); + } + + @Override + public boolean isChecksumArtifact( Artifact artifact ) + { + throw new RuntimeException( "not implemented" ); } private static class MessageDigestChecksumAlgorithmFactory diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java index 10459614c..e07b35ef5 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java @@ -244,7 +244,7 @@ public URI getLocation( Metadata metadata, boolean upload ) @Override public List getChecksumLocations( Artifact artifact, boolean upload, URI location ) { - if ( !hasChecksums( artifact ) || isChecksum( artifact.getExtension() ) ) + if ( !hasChecksums( artifact ) || isChecksum( artifact ) ) { return Collections.emptyList(); } @@ -267,9 +267,9 @@ private List getChecksumLocations( URI location ) return checksumLocations; } - private boolean isChecksum( String extension ) + private boolean isChecksum( Artifact artifact ) { - return checksumAlgorithmFactorySelector.isChecksum( extension ); + return checksumAlgorithmFactorySelector.isChecksumArtifact( artifact ); } } } diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java index af6eac362..a5deea078 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; +import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector; @@ -100,7 +101,7 @@ public List getChecksumAlgorithmFactories() } @Override - public boolean isChecksum( String extension ) + public boolean isChecksumExtension( String extension ) { requireNonNull( extension ); if ( extension.contains( "." ) ) @@ -112,4 +113,10 @@ public boolean isChecksum( String extension ) return factories.values().stream().anyMatch( a -> extension.equals( a.getFileExtension() ) ); } } + + @Override + public boolean isChecksumArtifact( Artifact artifact ) + { + return isChecksumExtension( artifact.getExtension() ); + } } diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java index 6ddc65a77..be05af9f0 100644 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java @@ -110,7 +110,13 @@ public Collection getChecksumAlgorithmFactories() } @Override - public boolean isChecksum( String extension ) + public boolean isChecksumExtension( String extension ) + { + throw new RuntimeException( "not implemented" ); + } + + @Override + public boolean isChecksumArtifact( Artifact artifact ) { throw new RuntimeException( "not implemented" ); } diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java index c2f856d09..810e265bc 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java @@ -22,6 +22,8 @@ import java.util.Collection; import java.util.List; +import org.eclipse.aether.artifact.Artifact; + /** * Component performing selection of {@link ChecksumAlgorithmFactory} based on known factory names. * Note: this component is NOT meant to be implemented or extended by client, is exposed ONLY to make clients @@ -66,5 +68,12 @@ public interface ChecksumAlgorithmFactorySelector * * @since 1.9.3 */ - boolean isChecksum( String extension ); + boolean isChecksumExtension( String extension ); + + /** + * Returns {@code true} if passed in artifact matches any known checksum artifact. + * + * @since 1.9.3 + */ + boolean isChecksumArtifact( Artifact artifact ); } From c11fe6fc56f37d45b2c8e15f799843de8713f5f8 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 9 Dec 2022 12:13:53 +0100 Subject: [PATCH 3/3] Undo addition of method reveiving artifact --- .../basic/TestChecksumAlgorithmSelector.java | 7 ------- .../impl/Maven2RepositoryLayoutFactory.java | 6 +++--- .../DefaultChecksumAlgorithmFactorySelector.java | 13 +++---------- ...hecksumsArtifactResolverPostProcessorTest.java | 6 ------ .../ChecksumAlgorithmFactorySelector.java | 15 +++------------ 5 files changed, 9 insertions(+), 38 deletions(-) diff --git a/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java b/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java index aa7492964..16afbe279 100644 --- a/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java +++ b/maven-resolver-connector-basic/src/test/java/org/eclipse/aether/connector/basic/TestChecksumAlgorithmSelector.java @@ -28,7 +28,6 @@ import java.util.Locale; import java.util.Set; -import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithm; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector; @@ -105,12 +104,6 @@ public boolean isChecksumExtension( String extension ) throw new RuntimeException( "not implemented" ); } - @Override - public boolean isChecksumArtifact( Artifact artifact ) - { - throw new RuntimeException( "not implemented" ); - } - private static class MessageDigestChecksumAlgorithmFactory extends ChecksumAlgorithmFactorySupport { diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java index e07b35ef5..46d2501f9 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java @@ -244,7 +244,7 @@ public URI getLocation( Metadata metadata, boolean upload ) @Override public List getChecksumLocations( Artifact artifact, boolean upload, URI location ) { - if ( !hasChecksums( artifact ) || isChecksum( artifact ) ) + if ( !hasChecksums( artifact ) || isChecksum( artifact.getExtension() ) ) { return Collections.emptyList(); } @@ -267,9 +267,9 @@ private List getChecksumLocations( URI location ) return checksumLocations; } - private boolean isChecksum( Artifact artifact ) + private boolean isChecksum( String extension ) { - return checksumAlgorithmFactorySelector.isChecksumArtifact( artifact ); + return checksumAlgorithmFactorySelector.isChecksumExtension( extension ); } } } diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java index a5deea078..da353add8 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector.java @@ -23,13 +23,12 @@ import javax.inject.Named; import javax.inject.Singleton; -import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector; @@ -95,9 +94,9 @@ public List selectList( Collection algorithmNa } @Override - public List getChecksumAlgorithmFactories() + public Collection getChecksumAlgorithmFactories() { - return new ArrayList<>( factories.values() ); + return Collections.unmodifiableCollection( factories.values() ); } @Override @@ -113,10 +112,4 @@ public boolean isChecksumExtension( String extension ) return factories.values().stream().anyMatch( a -> extension.equals( a.getFileExtension() ) ); } } - - @Override - public boolean isChecksumArtifact( Artifact artifact ) - { - return isChecksumExtension( artifact.getExtension() ); - } } diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java index be05af9f0..393cc4bc3 100644 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessorTest.java @@ -114,12 +114,6 @@ public boolean isChecksumExtension( String extension ) { throw new RuntimeException( "not implemented" ); } - - @Override - public boolean isChecksumArtifact( Artifact artifact ) - { - throw new RuntimeException( "not implemented" ); - } }; subject = new TrustedChecksumsArtifactResolverPostProcessor( selector, Collections.singletonMap( TRUSTED_SOURCE_NAME, this ) ); diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java index 810e265bc..6b26ba55e 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector.java @@ -22,8 +22,6 @@ import java.util.Collection; import java.util.List; -import org.eclipse.aether.artifact.Artifact; - /** * Component performing selection of {@link ChecksumAlgorithmFactory} based on known factory names. * Note: this component is NOT meant to be implemented or extended by client, is exposed ONLY to make clients @@ -43,7 +41,7 @@ public interface ChecksumAlgorithmFactorySelector ChecksumAlgorithmFactory select( String algorithmName ); /** - * Returns a list of factories for given algorithm names in order as collection is ordered, or throws if any of the + * Returns a list of factories in same order as algorithm names are ordered, or throws if any of the * algorithm name is not supported. The returned list has equal count of elements as passed in collection of names, * and if names contains duplicated elements, the returned list of algorithms will have duplicates as well. * @@ -54,8 +52,8 @@ public interface ChecksumAlgorithmFactorySelector List selectList( Collection algorithmNames ); /** - * Returns a collection of supported algorithms. This set represents ALL the algorithms supported by Resolver, - * and is NOT in any relation to given repository layout used checksums, returned by method {@link + * Returns immutable collection of all supported algorithms. This set represents ALL the algorithms supported by + * Resolver, and is NOT in any relation to given repository layout used checksums, returned by method {@link * org.eclipse.aether.spi.connector.layout.RepositoryLayout#getChecksumAlgorithmFactories()} (in fact, is super set * of it). */ @@ -69,11 +67,4 @@ public interface ChecksumAlgorithmFactorySelector * @since 1.9.3 */ boolean isChecksumExtension( String extension ); - - /** - * Returns {@code true} if passed in artifact matches any known checksum artifact. - * - * @since 1.9.3 - */ - boolean isChecksumArtifact( Artifact artifact ); }