From 28d1bee0dc3a732b165d22055004e714d3f166ff Mon Sep 17 00:00:00 2001 From: Marius Bogoevici Date: Mon, 5 Oct 2015 17:18:20 -0400 Subject: [PATCH] XD-3338 Prevent optional dependencies to be automatically added as includes --- .../module/launcher/ModuleLauncher.java | 2 +- .../module/resolver/AetherModuleResolver.java | 2 +- ...ilter.java => ModuleDependencyFilter.java} | 14 ++++++++-- .../resolver/AetherModuleResolverTests.java | 28 +++++++++++++++++-- .../foo/bar/foo-bar/1.0.0/foo-bar-1.0.0.pom | 20 +++++++++++++ .../foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.jar | 0 .../foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.pom | 12 ++++++++ .../qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.jar | 0 .../qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.pom | 12 ++++++++ 9 files changed, 82 insertions(+), 8 deletions(-) rename spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/{InclusionExclusionDependencyFilter.java => ModuleDependencyFilter.java} (84%) create mode 100644 spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/bar/foo-bar/1.0.0/foo-bar-1.0.0.pom create mode 100644 spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.jar create mode 100644 spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.pom create mode 100644 spring-cloud-stream-module-launcher/src/test/resources/local-repo/qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.jar create mode 100644 spring-cloud-stream-module-launcher/src/test/resources/local-repo/qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.pom diff --git a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/launcher/ModuleLauncher.java b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/launcher/ModuleLauncher.java index 8b81fd14c..e2e9627c5 100644 --- a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/launcher/ModuleLauncher.java +++ b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/launcher/ModuleLauncher.java @@ -59,7 +59,7 @@ public class ModuleLauncher { public static final String MODULE_AGGREGATOR_RUNNER_THREAD_NAME = "module-aggregator-runner"; - private Log log = LogFactory.getLog(ModuleLauncher.class); + private static Log log = LogFactory.getLog(ModuleLauncher.class); private static final String DEFAULT_EXTENSION = "jar"; diff --git a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolver.java b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolver.java index df8e6d911..bbd42e644 100644 --- a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolver.java +++ b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolver.java @@ -207,7 +207,7 @@ public class AetherModuleResolver implements ModuleResolver { DependencyResult dependencyResult = repositorySystem.resolveDependencies(session, new DependencyRequest(collectRequest, - new InclusionExclusionDependencyFilter(includeArtifacts, excludePatterns))); + new ModuleDependencyFilter(includeArtifacts, excludePatterns))); for (ArtifactResult artifactResult : dependencyResult.getArtifactResults()) { // we are only interested in the jars if ("jar".equalsIgnoreCase(artifactResult.getArtifact().getExtension())) { diff --git a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/InclusionExclusionDependencyFilter.java b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/ModuleDependencyFilter.java similarity index 84% rename from spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/InclusionExclusionDependencyFilter.java rename to spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/ModuleDependencyFilter.java index 141dcb3c3..20f67e159 100644 --- a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/InclusionExclusionDependencyFilter.java +++ b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/cloud/stream/module/resolver/ModuleDependencyFilter.java @@ -31,21 +31,29 @@ import org.springframework.util.ObjectUtils; * * @author Marius Bogoevici */ -public class InclusionExclusionDependencyFilter implements DependencyFilter { +public class ModuleDependencyFilter implements DependencyFilter { private final PatternExclusionsDependencyFilter patternExclusionsDependencyFilter; private final Artifact[] includes; + + private boolean acceptOptional = false; - public InclusionExclusionDependencyFilter(Artifact[] includes, String... excludes) { + public ModuleDependencyFilter(Artifact[] includes, String... excludes) { this.patternExclusionsDependencyFilter = new PatternExclusionsDependencyFilter(excludes); this.includes = includes != null ? includes : new Artifact[0]; } + public void setAcceptOptional(boolean acceptOptional) { + this.acceptOptional = acceptOptional; + } + @Override public boolean accept(DependencyNode node, List parents) { + // optional nodes are rejected conditionally // nodes included explicitly are always accepted - return isIncludedDirectly(node) || patternExclusionsDependencyFilter.accept(node, parents); + return (acceptOptional || !node.getDependency().isOptional()) + && (isIncludedDirectly(node) || patternExclusionsDependencyFilter.accept(node, parents)); } private boolean isIncludedDirectly(DependencyNode node) { diff --git a/spring-cloud-stream-module-launcher/src/test/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolverTests.java b/spring-cloud-stream-module-launcher/src/test/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolverTests.java index 122a58aba..d291c3d7d 100644 --- a/spring-cloud-stream-module-launcher/src/test/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolverTests.java +++ b/spring-cloud-stream-module-launcher/src/test/java/org/springframework/cloud/stream/module/resolver/AetherModuleResolverTests.java @@ -20,7 +20,15 @@ import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.arrayContainingInAnyOrder; +import static org.hamcrest.Matchers.arrayWithSize; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; +import static org.hamcrest.object.HasToString.hasToString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -33,18 +41,15 @@ import java.util.Map; import java.util.UUID; import org.eclipse.aether.resolution.ArtifactResolutionException; -import org.hamcrest.Matchers; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.util.SocketUtils; import com.github.tomakehurst.wiremock.junit.WireMockRule; -import wiremock.org.mortbay.resource.FileResource; /** * @author David Turanski @@ -66,6 +71,23 @@ public class AetherModuleResolverTests { assertEquals(resource.getFile().getName(), "foo-bar-1.0.0.jar"); } + @Test + public void testResolveLocalWithIncludes() throws IOException { + ClassPathResource cpr = new ClassPathResource("local-repo"); + File localRepository = cpr.getFile(); + AetherModuleResolver defaultModuleResolver = new AetherModuleResolver(localRepository, null); + Resource[] resources = defaultModuleResolver.resolve( + new Coordinates("foo.bar", "foo-bar", "jar", "", "1.0.0"), + new Coordinates[]{new Coordinates("qux.bar", "qux-bar", "jar", "", "1.0.0")},new String[]{}); + assertThat(resources, arrayWithSize(2)); + assertTrue(resources[0].exists()); + assertTrue(resources[1].exists()); + // the optional dependency 'foo.baz:foo-baz:1.0.0'of 'foo.bar:foo-bar' is not included + assertThat(resources, arrayContainingInAnyOrder( + hasToString(containsString("foo-bar-1.0.0.jar")), + hasToString(containsString("qux-bar-1.0.0.jar")))); + } + @Test(expected = RuntimeException.class) public void testResolveDoesNotExist() throws IOException { ClassPathResource cpr = new ClassPathResource("local-repo"); diff --git a/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/bar/foo-bar/1.0.0/foo-bar-1.0.0.pom b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/bar/foo-bar/1.0.0/foo-bar-1.0.0.pom new file mode 100644 index 000000000..1210081ad --- /dev/null +++ b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/bar/foo-bar/1.0.0/foo-bar-1.0.0.pom @@ -0,0 +1,20 @@ + + + 4.0.0 + + foo.bar + foo-bar + 1.0.0 + + jar + foo-bar + + + + foo.baz + foo-baz + 1.0.0 + true + + + diff --git a/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.jar b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.jar new file mode 100644 index 000000000..e69de29bb diff --git a/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.pom b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.pom new file mode 100644 index 000000000..29b3ddd84 --- /dev/null +++ b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/foo/baz/foo-baz/1.0.0/foo-baz-1.0.0.pom @@ -0,0 +1,12 @@ + + + 4.0.0 + + foo.baz + foo-baz + 1.0.0 + + jar + foo-baz + + diff --git a/spring-cloud-stream-module-launcher/src/test/resources/local-repo/qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.jar b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.jar new file mode 100644 index 000000000..e69de29bb diff --git a/spring-cloud-stream-module-launcher/src/test/resources/local-repo/qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.pom b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.pom new file mode 100644 index 000000000..4c5205853 --- /dev/null +++ b/spring-cloud-stream-module-launcher/src/test/resources/local-repo/qux/bar/qux-bar/1.0.0/qux-bar-1.0.0.pom @@ -0,0 +1,12 @@ + + + 4.0.0 + + qux-bar + qux-bar + 1.0.0 + + jar + qux-bar + +