From 082b2ee1879e4b43ecb44ce2d364300cde9a5951 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Thu, 30 May 2024 22:51:59 +0200 Subject: [PATCH] Plugins dependencies should be filtered --- .../simplify4u/plugins/ArtifactResolver.java | 25 +++++++++------ .../plugins/skipfilters/SkipFilter.java | 31 +++++++++++++++---- .../plugins/ArtifactResolverTest.java | 14 ++++++--- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/simplify4u/plugins/ArtifactResolver.java b/src/main/java/org/simplify4u/plugins/ArtifactResolver.java index d54dbc10..26b2817f 100644 --- a/src/main/java/org/simplify4u/plugins/ArtifactResolver.java +++ b/src/main/java/org/simplify4u/plugins/ArtifactResolver.java @@ -36,6 +36,7 @@ import io.vavr.control.Try; import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.execution.MavenSession; @@ -87,6 +88,8 @@ public class ArtifactResolver { private final List remotePluginRepositories; + private final ArtifactHandlerManager artifactHandlerManager; + /** * Copy of remote repositories with check sum policy set to ignore, we need it for pgp signature resolving. *

@@ -95,13 +98,15 @@ public class ArtifactResolver { private final List remoteRepositoriesIgnoreCheckSum; @Inject - ArtifactResolver(MavenSession session, RepositorySystem repositorySystem) { + ArtifactResolver(MavenSession session, RepositorySystem repositorySystem, + ArtifactHandlerManager artifactHandlerManager) { this.remoteProjectRepositories = requireNonNull(session.getCurrentProject().getRemoteProjectRepositories()); this.remotePluginRepositories = requireNonNull(session.getCurrentProject().getRemotePluginRepositories()); this.repositorySystem = requireNonNull(repositorySystem); this.repositorySession = requireNonNull(session.getRepositorySession()); this.remoteRepositoriesIgnoreCheckSum = repositoriesIgnoreCheckSum(remoteProjectRepositories, remotePluginRepositories); + this.artifactHandlerManager = artifactHandlerManager; } /** @@ -210,15 +215,20 @@ private List resolvePlugin(Plugin plugin, Configuration config) { } List result; + + List pluginDependencies = plugin.getDependencies().stream() + .filter(d -> !config.dependencyFilter.shouldSkipDependency(d, artifactHandlerManager)) + .map(d -> RepositoryUtils.toDependency(d, repositorySession.getArtifactTypeRegistry())) + .collect(Collectors.toList()); + if (config.verifyPluginDependencies) { // we need resolve all transitive dependencies - result = resolvePluginArtifactsTransitive(pArtifact, plugin.getDependencies(), config.verifyPomFiles); + result = resolvePluginArtifactsTransitive(pArtifact, pluginDependencies, config.verifyPomFiles); } else { // only resolve plugin artifact List aeArtifacts = new ArrayList<>(); aeArtifacts.add(pArtifact); - aeArtifacts.addAll(plugin.getDependencies().stream().map( - d -> RepositoryUtils.toDependency(d, repositorySession.getArtifactTypeRegistry())) + aeArtifacts.addAll(pluginDependencies.stream() .map(Dependency::getArtifact) .collect(Collectors.toList())); @@ -230,14 +240,11 @@ private List resolvePlugin(Plugin plugin, Configuration config) { private List resolvePluginArtifactsTransitive( org.eclipse.aether.artifact.Artifact artifact, - List dependencies, boolean verifyPomFiles) { + List dependencies, boolean verifyPomFiles) { CollectRequest collectRequest = new CollectRequest(new Dependency(artifact, "runtime"), remotePluginRepositories); - - dependencies.stream().map(d -> RepositoryUtils.toDependency(d, repositorySession.getArtifactTypeRegistry())) - .forEach(collectRequest::addDependency); - + collectRequest.setDependencies(dependencies); DependencyRequest request = new DependencyRequest(collectRequest, null); DependencyResult dependencyResult = diff --git a/src/main/java/org/simplify4u/plugins/skipfilters/SkipFilter.java b/src/main/java/org/simplify4u/plugins/skipfilters/SkipFilter.java index 22a49317..d4b1b022 100644 --- a/src/main/java/org/simplify4u/plugins/skipfilters/SkipFilter.java +++ b/src/main/java/org/simplify4u/plugins/skipfilters/SkipFilter.java @@ -17,21 +17,40 @@ package org.simplify4u.plugins.skipfilters; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; +import org.apache.maven.model.Dependency; /** * An interface for a filter that determines whether or not a particular artifact should be * processed or skipped, based on the mojo configuration. */ public interface SkipFilter { + /** - * Indicates whether or not an artifact should be skipped, based on the configuration of this + * Indicates whether an artifact should be skipped, based on the configuration of this * filter. * - * @param artifact - * The artifact being considered for verification. - * - * @return {@code true} if the artifact should be skipped; {@code false} if it should be - * processed. + * @param artifact The artifact being considered for verification. + * @return {@code true} if the artifact should be skipped; {@code false} if it should be + * processed. */ boolean shouldSkipArtifact(final Artifact artifact); + + /** + * Indicates whether a dependency should be skipped, based on the configuration of this + * filter. + * + * @param dependency The artifact being considered for verification. + * @param artifactHandlerManager a artifactHandlerManager + * @return {@code true} if the artifact should be skipped; {@code false} if it should be + * processed. + */ + default boolean shouldSkipDependency(Dependency dependency, ArtifactHandlerManager artifactHandlerManager) { + DefaultArtifact artifact = + new DefaultArtifact(dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion(), + dependency.getScope(), dependency.getType(), dependency.getClassifier(), + artifactHandlerManager.getArtifactHandler(dependency.getType())); + return shouldSkipArtifact(artifact); + } } diff --git a/src/test/java/org/simplify4u/plugins/ArtifactResolverTest.java b/src/test/java/org/simplify4u/plugins/ArtifactResolverTest.java index 2b0484f2..c1ea4bed 100644 --- a/src/test/java/org/simplify4u/plugins/ArtifactResolverTest.java +++ b/src/test/java/org/simplify4u/plugins/ArtifactResolverTest.java @@ -30,6 +30,7 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.handler.DefaultArtifactHandler; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.assertj.core.api.Condition; @@ -70,6 +71,9 @@ class ArtifactResolverTest { @Mock private RepositorySystemSession repositorySession; + @Mock + private ArtifactHandlerManager artifactHandlerManager; + @Mock private MavenSession session; @@ -82,7 +86,7 @@ class ArtifactResolverTest { void setup() { when(session.getCurrentProject()).thenReturn(project); when(session.getRepositorySession()).thenReturn(repositorySession); - resolver = new ArtifactResolver(session, aetherRepositorySystem); + resolver = new ArtifactResolver(session, aetherRepositorySystem, artifactHandlerManager); } @Test @@ -90,17 +94,17 @@ void testConstructArtifactResolverWithNull() { reset(session, project); - assertThatCode(() -> new ArtifactResolver(null, null)) + assertThatCode(() -> new ArtifactResolver(null, null, null)) .isExactlyInstanceOf(NullPointerException.class); - assertThatCode(() -> new ArtifactResolver(session, null)) + assertThatCode(() -> new ArtifactResolver(session, null, null)) .isExactlyInstanceOf(NullPointerException.class); - assertThatCode(() -> new ArtifactResolver(session, null)) + assertThatCode(() -> new ArtifactResolver(session, null, null)) .isExactlyInstanceOf(NullPointerException.class); doThrow(new NullPointerException()).when(session).getCurrentProject(); - assertThatCode(() -> new ArtifactResolver(session, null)) + assertThatCode(() -> new ArtifactResolver(session, null, null)) .isExactlyInstanceOf(NullPointerException.class); }