From ab96d5eca8fb1edc4794a7f0fbaaf304dbeefa61 Mon Sep 17 00:00:00 2001 From: Frank Vennemeyer Date: Tue, 11 Sep 2018 21:51:47 +0200 Subject: [PATCH 1/5] Extended Provisioner to provide dependencies either with or without their transitives. Changed EclipseBasedStepBuilder to request dependencies only without transitives. Removed work-around from Eclipse dependency lock-files. --- .../extra/EclipseBasedStepBuilder.java | 2 +- .../eclipse_wtp_formatters/v4.7.3a.lockfile | 6 ++-- .../groovy_eclipse_formatter/v4.8.0.lockfile | 6 ++-- .../groovy_eclipse_formatter/v4.8.1.lockfile | 6 ++-- .../java/com/diffplug/spotless/JarState.java | 6 +++- .../com/diffplug/spotless/Provisioner.java | 32 +++++++++++++++---- .../gradle/spotless/GradleProvisioner.java | 22 ++++++++++++- .../spotless/maven/ArtifactResolver.java | 24 ++++++++++---- .../spotless/maven/MavenProvisioner.java | 20 +++++++++++- .../spotless/maven/MavenProvisionerTest.java | 4 +-- .../diffplug/spotless/TestProvisioner.java | 25 +++++++++++++-- .../diffplug/spotless/ProvisionerTest.java | 14 +++++++- 12 files changed, 131 insertions(+), 36 deletions(-) diff --git a/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java b/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java index 5cb1dbd9f2..83291344f4 100644 --- a/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java +++ b/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java @@ -152,7 +152,7 @@ public static class State implements Serializable { /** State constructor expects that all passed items are not modified afterwards */ protected State(String formatterStepExt, Provisioner jarProvisioner, List dependencies, Iterable settingsFiles) throws IOException { - this.jarState = JarState.from(dependencies, jarProvisioner); + this.jarState = JarState.from(dependencies, false, jarProvisioner); this.settingsFiles = FileSignature.signAsList(settingsFiles); this.formatterStepExt = formatterStepExt; } diff --git a/lib-extra/src/main/resources/com/diffplug/spotless/extra/eclipse_wtp_formatters/v4.7.3a.lockfile b/lib-extra/src/main/resources/com/diffplug/spotless/extra/eclipse_wtp_formatters/v4.7.3a.lockfile index 538073263f..2aae28f4ba 100644 --- a/lib-extra/src/main/resources/com/diffplug/spotless/extra/eclipse_wtp_formatters/v4.7.3a.lockfile +++ b/lib-extra/src/main/resources/com/diffplug/spotless/extra/eclipse_wtp_formatters/v4.7.3a.lockfile @@ -17,10 +17,8 @@ org.eclipse.platform:org.eclipse.equinox.app:1.3.500 org.eclipse.platform:org.eclipse.equinox.common:3.10.0 org.eclipse.platform:org.eclipse.equinox.preferences:3.7.100 org.eclipse.platform:org.eclipse.equinox.registry:3.8.0 -#Spotless currently loads all transitive dependencies. -#jface requires platform specific JARs (not used by formatter), which are not hosted via M2. -#org.eclipse.platform:org.eclipse.jface.text:3.13.0 -#org.eclipse.platform:org.eclipse.jface:3.14.0 +org.eclipse.platform:org.eclipse.jface.text:3.13.0 +org.eclipse.platform:org.eclipse.jface:3.14.0 org.eclipse.platform:org.eclipse.osgi.services:3.7.0 org.eclipse.platform:org.eclipse.osgi:3.13.0 org.eclipse.platform:org.eclipse.text:3.6.300 diff --git a/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.0.lockfile b/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.0.lockfile index bda127d96f..1cda67e29c 100644 --- a/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.0.lockfile +++ b/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.0.lockfile @@ -12,9 +12,7 @@ org.eclipse.platform:org.eclipse.equinox.app:1.3.500 org.eclipse.platform:org.eclipse.equinox.common:3.10.0 org.eclipse.platform:org.eclipse.equinox.preferences:3.7.100 org.eclipse.platform:org.eclipse.equinox.registry:3.8.0 -#Spotless currently loads all transitive dependencies. -#jface requires platform specific JARs (not used by formatter), which are not hosted via M2. -#org.eclipse.platform:org.eclipse.jface.text:3.13.0 -#org.eclipse.platform:org.eclipse.jface:3.14.0 +org.eclipse.platform:org.eclipse.jface.text:3.13.0 +org.eclipse.platform:org.eclipse.jface:3.14.0 org.eclipse.platform:org.eclipse.osgi:3.13.0 org.eclipse.platform:org.eclipse.text:3.6.300 \ No newline at end of file diff --git a/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.1.lockfile b/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.1.lockfile index e1bcf464d5..952bcd326b 100644 --- a/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.1.lockfile +++ b/lib-extra/src/main/resources/com/diffplug/spotless/extra/groovy_eclipse_formatter/v4.8.1.lockfile @@ -12,9 +12,7 @@ org.eclipse.platform:org.eclipse.equinox.app:1.3.500 org.eclipse.platform:org.eclipse.equinox.common:3.10.0 org.eclipse.platform:org.eclipse.equinox.preferences:3.7.100 org.eclipse.platform:org.eclipse.equinox.registry:3.8.0 -#Spotless currently loads all transitive dependencies. -#jface requires platform specific JARs (not used by formatter), which are not hosted via M2. -#org.eclipse.platform:org.eclipse.jface.text:3.13.0 -#org.eclipse.platform:org.eclipse.jface:3.14.0 +org.eclipse.platform:org.eclipse.jface.text:3.13.0 +org.eclipse.platform:org.eclipse.jface:3.14.0 org.eclipse.platform:org.eclipse.osgi:3.13.0 org.eclipse.platform:org.eclipse.text:3.6.300 \ No newline at end of file diff --git a/lib/src/main/java/com/diffplug/spotless/JarState.java b/lib/src/main/java/com/diffplug/spotless/JarState.java index faaaa43ca3..159e65d86e 100644 --- a/lib/src/main/java/com/diffplug/spotless/JarState.java +++ b/lib/src/main/java/com/diffplug/spotless/JarState.java @@ -69,9 +69,13 @@ public static JarState from(String mavenCoordinate, Provisioner provisioner) thr } public static JarState from(Collection mavenCoordinates, Provisioner provisioner) throws IOException { + return from(mavenCoordinates, true, provisioner); + } + + public static JarState from(Collection mavenCoordinates, boolean resolveTransitives, Provisioner provisioner) throws IOException { Objects.requireNonNull(provisioner, "provisioner"); Objects.requireNonNull(mavenCoordinates, "mavenCoordinates"); - Set jars = provisioner.provisionWithDependencies(mavenCoordinates); + Set jars = provisioner.provide(resolveTransitives, mavenCoordinates); if (jars.isEmpty()) { throw new NoSuchElementException("Resolved to an empty result: " + mavenCoordinates.stream().collect(Collectors.joining(", "))); } diff --git a/lib/src/main/java/com/diffplug/spotless/Provisioner.java b/lib/src/main/java/com/diffplug/spotless/Provisioner.java index 6da15c010a..bbc04c211e 100644 --- a/lib/src/main/java/com/diffplug/spotless/Provisioner.java +++ b/lib/src/main/java/com/diffplug/spotless/Provisioner.java @@ -25,17 +25,35 @@ * Spotless' dependencies minimal. */ public interface Provisioner { + + /** Method interface has been extended to {@link Provisioner#provide}. */ + @Deprecated + public Set provisionWithDependencies(Collection mavenCoordinates); + + /** Method interface has been extended to {@link Provisioner#provide}. */ + @Deprecated + public default Set provisionWithDependencies(String... mavenCoordinates) { + return provisionWithDependencies(Arrays.asList(mavenCoordinates)); + } + /** - * Given a set of maven coordinates, returns a set of jars which - * include all of the specified coordinates and their dependencies. + * Given a set of maven coordinates, returns a set of jars which include all + * of the specified coordinates and optionally their transitive dependencies. */ - public Set provisionWithDependencies(Collection mavenCoordinates); + public default Set provide(boolean resolveTransitives, String... mavenCoordinates) { + return provide(resolveTransitives, Arrays.asList(mavenCoordinates)); + } /** - * Given a set of maven coordinates, returns a set of jars which - * include all of the specified coordinates and their dependencies. + * Given a set of maven coordinates, returns a set of jars which include all + * of the specified coordinates and optionally their transitive dependencies. */ - public default Set provisionWithDependencies(String... mavenCoordinates) { - return provisionWithDependencies(Arrays.asList(mavenCoordinates)); + public default Set provide(boolean resolveTransitives, Collection mavenCoordinates) { + if (resolveTransitives) { + //Support of previous implementation + return provisionWithDependencies(mavenCoordinates); + } + throw new UnsupportedOperationException("Provisioner: provide without transitives"); } + } diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java index a2793f8e47..a016a63305 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java @@ -15,7 +15,10 @@ */ package com.diffplug.gradle.spotless; +import java.io.File; +import java.util.Collection; import java.util.Objects; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -32,13 +35,14 @@ private GradleProvisioner() {} public static Provisioner fromProject(Project project) { Objects.requireNonNull(project); - return mavenCoords -> { + return (CompatibleProvisioner) (resolveTransitives, mavenCoords) -> { try { Dependency[] deps = mavenCoords.stream() .map(project.getBuildscript().getDependencies()::create) .toArray(Dependency[]::new); Configuration config = project.getRootProject().getBuildscript().getConfigurations().detachedConfiguration(deps); config.setDescription(mavenCoords.toString()); + config.setTransitive(resolveTransitives); return config.resolve(); } catch (Exception e) { logger.log(Level.SEVERE, @@ -53,4 +57,20 @@ public static Provisioner fromProject(Project project) { } private static final Logger logger = Logger.getLogger(GradleProvisioner.class.getName()); + + /** + * Portable version of {@link Provisioner} interface. In next spotless-lib major version + * deprecated methods can be removed together with this wrapper. + */ + private static interface CompatibleProvisioner extends Provisioner { + + @Override + @Deprecated + default Set provisionWithDependencies(Collection mavenCoordinates) { + return provide(true, mavenCoordinates); + } + + @Override + Set provide(boolean resolveTransitives, Collection mavenCoordinates); + } } diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java index bf1379e0d5..e035395041 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java @@ -41,7 +41,8 @@ public class ArtifactResolver { - private static final DependencyFilter ACCEPT_ALL_FILTER = (node, parents) -> true; + private static final DependencyFilter ACCEPT_ALL = (node, parents) -> true; + private static final DependencyFilter FILTER_TRANSITIVES = (node, parents) -> parents.size() <= 1; private final RepositorySystem repositorySystem; private final RepositorySystemSession session; @@ -56,19 +57,28 @@ public ArtifactResolver(RepositorySystem repositorySystem, RepositorySystemSessi this.log = Objects.requireNonNull(log); } - /** Use {@link ArtifactResolver#resolve(Collection) instead.} */ + /** Use {@link ArtifactResolver#resolve(boolean, Collection)) instead.} */ @Deprecated public Set resolve(String mavenCoordinate) { - return resolve(Arrays.asList(mavenCoordinate)); + return resolve(true, Arrays.asList(mavenCoordinate)); } - public Set resolve(Collection mavenCoordinate) { - List dependencies = mavenCoordinate.stream() + /** + * Given a set of maven coordinates, returns a set of jars which include all + * of the specified coordinates and optionally their transitive dependencies. + */ + public Set resolve(boolean resolveTransitives, Collection mavenCoordinates) { + List dependencies = mavenCoordinates.stream() .map(coordinateString -> new DefaultArtifact(coordinateString)) .map(artifact -> new Dependency(artifact, null)) .collect(toList()); - CollectRequest collectRequest = new CollectRequest((Dependency) null, dependencies, repositories); - DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, ACCEPT_ALL_FILTER); + CollectRequest collectRequest = new CollectRequest(dependencies, null, repositories); + DependencyRequest dependencyRequest; + if (resolveTransitives) { + dependencyRequest = new DependencyRequest(collectRequest, ACCEPT_ALL); + } else { + dependencyRequest = new DependencyRequest(collectRequest, FILTER_TRANSITIVES); + } DependencyResult dependencyResult = resolveDependencies(dependencyRequest); diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java index 5da8e792f7..00608e267e 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java @@ -15,6 +15,10 @@ */ package com.diffplug.spotless.maven; +import java.io.File; +import java.util.Collection; +import java.util.Set; + import com.diffplug.spotless.Provisioner; /** Maven integration for Provisioner. */ @@ -22,7 +26,21 @@ public class MavenProvisioner { private MavenProvisioner() {} public static Provisioner create(ArtifactResolver artifactResolver) { - return artifactResolver::resolve; + return (CompatibleProvisioner) artifactResolver::resolve; } + /** + * Portable version of {@link Provisioner} interface. In next spotless-lib major version + * deprecated methods can be removed together with this wrapper. + */ + private static interface CompatibleProvisioner extends Provisioner { + @Override + @Deprecated + default Set provisionWithDependencies(Collection mavenCoordinates) { + return provide(true, mavenCoordinates); + } + + @Override + Set provide(boolean resolveTransitives, Collection mavenCoordinates); + } } diff --git a/plugin-maven/src/test/java/com/diffplug/spotless/maven/MavenProvisionerTest.java b/plugin-maven/src/test/java/com/diffplug/spotless/maven/MavenProvisionerTest.java index ad077c99e4..c5d6201f0d 100644 --- a/plugin-maven/src/test/java/com/diffplug/spotless/maven/MavenProvisionerTest.java +++ b/plugin-maven/src/test/java/com/diffplug/spotless/maven/MavenProvisionerTest.java @@ -20,7 +20,7 @@ public class MavenProvisionerTest extends MavenIntegrationTest { @Test - public void testMultipleDependencies() throws Exception { + public void testMultipleDependenciesExcludingTransitives() throws Exception { writePomWithJavaSteps( "", " 4.8.0", @@ -30,7 +30,7 @@ public void testMultipleDependencies() throws Exception { } @Test - public void testSingleDependency() throws Exception { + public void testSingleDependencyIncludingTransitives() throws Exception { writePomWithJavaSteps( "", " 1.2", diff --git a/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java b/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java index f2ccfe731a..712b9b0d44 100644 --- a/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java +++ b/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java @@ -19,8 +19,10 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; @@ -52,11 +54,12 @@ private static Supplier createLazyWithRepositories(Consumer { Project project = ProjectBuilder.builder().build(); repoConfig.accept(project.getRepositories()); - return mavenCoords -> { + return (CompatibleProvisioner) (resolveTransitives, mavenCoords) -> { Dependency[] deps = mavenCoords.stream() .map(project.getDependencies()::create) .toArray(Dependency[]::new); Configuration config = project.getConfigurations().detachedConfiguration(deps); + config.setTransitive(resolveTransitives); config.setDescription(mavenCoords.toString()); try { return config.resolve(); @@ -85,11 +88,11 @@ private static Provisioner caching(String name, Supplier input) { } else { cached = new HashMap<>(); } - return mavenCoords -> { + return (CompatibleProvisioner) (resolveTransitives, mavenCoords) -> { Box wasChanged = Box.of(false); ImmutableSet result = cached.computeIfAbsent(ImmutableSet.copyOf(mavenCoords), coords -> { wasChanged.set(true); - return ImmutableSet.copyOf(input.get().provisionWithDependencies(coords)); + return ImmutableSet.copyOf(input.get().provide(resolveTransitives, coords)); }); if (wasChanged.get()) { try (ObjectOutputStream outputStream = new ObjectOutputStream(Files.asByteSink(cacheFile).openBufferedStream())) { @@ -137,4 +140,20 @@ public static Provisioner snapshots() { setup.setUrl("https://oss.sonatype.org/content/repositories/snapshots"); }); }); + + /** + * Portable version of {@link Provisioner} interface. In next spotless-lib major version + * deprecated methods can be removed together with this wrapper. + */ + private static interface CompatibleProvisioner extends Provisioner { + + @Override + @Deprecated + default Set provisionWithDependencies(Collection mavenCoordinates) { + return provide(true, mavenCoordinates); + } + + @Override + Set provide(boolean resolveTransitives, Collection mavenCoordinates); + } } diff --git a/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java b/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java index 1c7f8ea376..547e34fac7 100644 --- a/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java +++ b/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java @@ -24,7 +24,8 @@ public class ProvisionerTest { @Test - public void testManipulation() { + @Deprecated + public void testManipulationDeprecated() { Provisioner provisioner = deps -> deps.stream().map(File::new).collect(Collectors.toSet()); Assertions.assertThat(provisioner.provisionWithDependencies("a")) .containsExactlyInAnyOrder(new File("a")); @@ -33,4 +34,15 @@ public void testManipulation() { Assertions.assertThat(provisioner.provisionWithDependencies(Arrays.asList("a", "a"))) .containsExactlyInAnyOrder(new File("a")); } + + @Test + public void testManipulation() { + Provisioner provisioner = deps -> deps.stream().map(File::new).collect(Collectors.toSet()); + Assertions.assertThat(provisioner.provide(true, "a")) + .containsExactlyInAnyOrder(new File("a")); + Assertions.assertThat(provisioner.provide(true, "a", "a")) + .containsExactlyInAnyOrder(new File("a")); + Assertions.assertThat(provisioner.provide(true, Arrays.asList("a", "a"))) + .containsExactlyInAnyOrder(new File("a")); + } } From c2edd4b00fa6a0f6249eaf61c47babe7f3bdf703 Mon Sep 17 00:00:00 2001 From: Frank Vennemeyer Date: Tue, 11 Sep 2018 22:27:26 +0200 Subject: [PATCH 2/5] Updated CHANGES.md for #297. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index af3112797b..3a562b8f3b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,7 @@ You might be looking for: ### Version 1.15.0-SNAPSHOT - TBD (javadoc [lib](https://diffplug.github.io/spotless/javadoc/spotless-lib/snapshot/) [lib-extra](https://diffplug.github.io/spotless/javadoc/spotless-lib-extra/snapshot/), [snapshot repo](https://oss.sonatype.org/content/repositories/snapshots/com/diffplug/spotless/)) +* Extended dependency provisioner to exclude transitives on request ([#297](https://github.com/diffplug/spotless/pull/297)).This prevents unnecessary downloads of unused transitive dependencies for Eclipse based formatter steps. * Updated default groovy-eclipse from 4.8.0 to 4.8.1 ([#288](https://github.com/diffplug/spotless/pull/288)). New version is based on [Groovy-Eclipse 3.0.0](https://github.com/groovy/groovy-eclipse/wiki/3.0.0-Release-Notes). * Integrated Eclipse WTP formatter ([#290](https://github.com/diffplug/spotless/pull/290)) * Updated JSR305 annotation from 3.0.0 to 3.0.2 ([#274](https://github.com/diffplug/spotless/pull/274)) From 2c1d82629478bf4594944056ccbd1dceaa0924b1 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Tue, 11 Sep 2018 23:09:48 -0700 Subject: [PATCH 3/5] Same API as before, but breaks `Provisioner` implementations at compile-time rather than runtime. - Allows us to remove all the CompatibleProvisioner - Renamed `provide(boolean resolveTransitives, ...` to `provisionWithTransitives(boolean withTransitives, ...` This helps to make the boolean parameter less opaque: provisioner.provisionWithTransitives(true, 'artifact') provisioner.provisionWithTransitives(false, 'artifact') --- .../java/com/diffplug/spotless/JarState.java | 2 +- .../com/diffplug/spotless/Provisioner.java | 17 +++++------- .../gradle/spotless/GradleProvisioner.java | 22 ++-------------- .../spotless/maven/ArtifactResolver.java | 4 +-- .../spotless/maven/MavenProvisioner.java | 21 +-------------- .../diffplug/spotless/TestProvisioner.java | 26 +++---------------- .../diffplug/spotless/ProvisionerTest.java | 10 +++---- 7 files changed, 21 insertions(+), 81 deletions(-) diff --git a/lib/src/main/java/com/diffplug/spotless/JarState.java b/lib/src/main/java/com/diffplug/spotless/JarState.java index 159e65d86e..c99417f7e8 100644 --- a/lib/src/main/java/com/diffplug/spotless/JarState.java +++ b/lib/src/main/java/com/diffplug/spotless/JarState.java @@ -75,7 +75,7 @@ public static JarState from(Collection mavenCoordinates, Provisioner pro public static JarState from(Collection mavenCoordinates, boolean resolveTransitives, Provisioner provisioner) throws IOException { Objects.requireNonNull(provisioner, "provisioner"); Objects.requireNonNull(mavenCoordinates, "mavenCoordinates"); - Set jars = provisioner.provide(resolveTransitives, mavenCoordinates); + Set jars = provisioner.provisionWithTransitives(resolveTransitives, mavenCoordinates); if (jars.isEmpty()) { throw new NoSuchElementException("Resolved to an empty result: " + mavenCoordinates.stream().collect(Collectors.joining(", "))); } diff --git a/lib/src/main/java/com/diffplug/spotless/Provisioner.java b/lib/src/main/java/com/diffplug/spotless/Provisioner.java index bbc04c211e..40d8397ac0 100644 --- a/lib/src/main/java/com/diffplug/spotless/Provisioner.java +++ b/lib/src/main/java/com/diffplug/spotless/Provisioner.java @@ -28,7 +28,9 @@ public interface Provisioner { /** Method interface has been extended to {@link Provisioner#provide}. */ @Deprecated - public Set provisionWithDependencies(Collection mavenCoordinates); + public default Set provisionWithDependencies(Collection mavenCoordinates) { + return provisionWithTransitives(true, mavenCoordinates); + } /** Method interface has been extended to {@link Provisioner#provide}. */ @Deprecated @@ -40,20 +42,13 @@ public default Set provisionWithDependencies(String... mavenCoordinates) { * Given a set of maven coordinates, returns a set of jars which include all * of the specified coordinates and optionally their transitive dependencies. */ - public default Set provide(boolean resolveTransitives, String... mavenCoordinates) { - return provide(resolveTransitives, Arrays.asList(mavenCoordinates)); + public default Set provisionWithTransitives(boolean withTransitives, String... mavenCoordinates) { + return provisionWithTransitives(withTransitives, Arrays.asList(mavenCoordinates)); } /** * Given a set of maven coordinates, returns a set of jars which include all * of the specified coordinates and optionally their transitive dependencies. */ - public default Set provide(boolean resolveTransitives, Collection mavenCoordinates) { - if (resolveTransitives) { - //Support of previous implementation - return provisionWithDependencies(mavenCoordinates); - } - throw new UnsupportedOperationException("Provisioner: provide without transitives"); - } - + public Set provisionWithTransitives(boolean withTransitives, Collection mavenCoordinates); } diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java index a016a63305..1e902f881f 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java @@ -15,10 +15,7 @@ */ package com.diffplug.gradle.spotless; -import java.io.File; -import java.util.Collection; import java.util.Objects; -import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -35,14 +32,14 @@ private GradleProvisioner() {} public static Provisioner fromProject(Project project) { Objects.requireNonNull(project); - return (CompatibleProvisioner) (resolveTransitives, mavenCoords) -> { + return (withTransitives, mavenCoords) -> { try { Dependency[] deps = mavenCoords.stream() .map(project.getBuildscript().getDependencies()::create) .toArray(Dependency[]::new); Configuration config = project.getRootProject().getBuildscript().getConfigurations().detachedConfiguration(deps); config.setDescription(mavenCoords.toString()); - config.setTransitive(resolveTransitives); + config.setTransitive(withTransitives); return config.resolve(); } catch (Exception e) { logger.log(Level.SEVERE, @@ -58,19 +55,4 @@ public static Provisioner fromProject(Project project) { private static final Logger logger = Logger.getLogger(GradleProvisioner.class.getName()); - /** - * Portable version of {@link Provisioner} interface. In next spotless-lib major version - * deprecated methods can be removed together with this wrapper. - */ - private static interface CompatibleProvisioner extends Provisioner { - - @Override - @Deprecated - default Set provisionWithDependencies(Collection mavenCoordinates) { - return provide(true, mavenCoordinates); - } - - @Override - Set provide(boolean resolveTransitives, Collection mavenCoordinates); - } } diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java index e035395041..379bf25cff 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/ArtifactResolver.java @@ -67,14 +67,14 @@ public Set resolve(String mavenCoordinate) { * Given a set of maven coordinates, returns a set of jars which include all * of the specified coordinates and optionally their transitive dependencies. */ - public Set resolve(boolean resolveTransitives, Collection mavenCoordinates) { + public Set resolve(boolean withTransitives, Collection mavenCoordinates) { List dependencies = mavenCoordinates.stream() .map(coordinateString -> new DefaultArtifact(coordinateString)) .map(artifact -> new Dependency(artifact, null)) .collect(toList()); CollectRequest collectRequest = new CollectRequest(dependencies, null, repositories); DependencyRequest dependencyRequest; - if (resolveTransitives) { + if (withTransitives) { dependencyRequest = new DependencyRequest(collectRequest, ACCEPT_ALL); } else { dependencyRequest = new DependencyRequest(collectRequest, FILTER_TRANSITIVES); diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java index 00608e267e..2ce571a09d 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/MavenProvisioner.java @@ -15,10 +15,6 @@ */ package com.diffplug.spotless.maven; -import java.io.File; -import java.util.Collection; -import java.util.Set; - import com.diffplug.spotless.Provisioner; /** Maven integration for Provisioner. */ @@ -26,21 +22,6 @@ public class MavenProvisioner { private MavenProvisioner() {} public static Provisioner create(ArtifactResolver artifactResolver) { - return (CompatibleProvisioner) artifactResolver::resolve; - } - - /** - * Portable version of {@link Provisioner} interface. In next spotless-lib major version - * deprecated methods can be removed together with this wrapper. - */ - private static interface CompatibleProvisioner extends Provisioner { - @Override - @Deprecated - default Set provisionWithDependencies(Collection mavenCoordinates) { - return provide(true, mavenCoordinates); - } - - @Override - Set provide(boolean resolveTransitives, Collection mavenCoordinates); + return artifactResolver::resolve; } } diff --git a/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java b/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java index 712b9b0d44..e5852d7c56 100644 --- a/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java +++ b/testlib/src/main/java/com/diffplug/spotless/TestProvisioner.java @@ -19,10 +19,8 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; @@ -54,12 +52,12 @@ private static Supplier createLazyWithRepositories(Consumer { Project project = ProjectBuilder.builder().build(); repoConfig.accept(project.getRepositories()); - return (CompatibleProvisioner) (resolveTransitives, mavenCoords) -> { + return (withTransitives, mavenCoords) -> { Dependency[] deps = mavenCoords.stream() .map(project.getDependencies()::create) .toArray(Dependency[]::new); Configuration config = project.getConfigurations().detachedConfiguration(deps); - config.setTransitive(resolveTransitives); + config.setTransitive(withTransitives); config.setDescription(mavenCoords.toString()); try { return config.resolve(); @@ -88,11 +86,11 @@ private static Provisioner caching(String name, Supplier input) { } else { cached = new HashMap<>(); } - return (CompatibleProvisioner) (resolveTransitives, mavenCoords) -> { + return (withTransitives, mavenCoords) -> { Box wasChanged = Box.of(false); ImmutableSet result = cached.computeIfAbsent(ImmutableSet.copyOf(mavenCoords), coords -> { wasChanged.set(true); - return ImmutableSet.copyOf(input.get().provide(resolveTransitives, coords)); + return ImmutableSet.copyOf(input.get().provisionWithTransitives(withTransitives, coords)); }); if (wasChanged.get()) { try (ObjectOutputStream outputStream = new ObjectOutputStream(Files.asByteSink(cacheFile).openBufferedStream())) { @@ -140,20 +138,4 @@ public static Provisioner snapshots() { setup.setUrl("https://oss.sonatype.org/content/repositories/snapshots"); }); }); - - /** - * Portable version of {@link Provisioner} interface. In next spotless-lib major version - * deprecated methods can be removed together with this wrapper. - */ - private static interface CompatibleProvisioner extends Provisioner { - - @Override - @Deprecated - default Set provisionWithDependencies(Collection mavenCoordinates) { - return provide(true, mavenCoordinates); - } - - @Override - Set provide(boolean resolveTransitives, Collection mavenCoordinates); - } } diff --git a/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java b/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java index 547e34fac7..adc26b5318 100644 --- a/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java +++ b/testlib/src/test/java/com/diffplug/spotless/ProvisionerTest.java @@ -26,7 +26,7 @@ public class ProvisionerTest { @Test @Deprecated public void testManipulationDeprecated() { - Provisioner provisioner = deps -> deps.stream().map(File::new).collect(Collectors.toSet()); + Provisioner provisioner = (withTransitives, deps) -> deps.stream().map(File::new).collect(Collectors.toSet()); Assertions.assertThat(provisioner.provisionWithDependencies("a")) .containsExactlyInAnyOrder(new File("a")); Assertions.assertThat(provisioner.provisionWithDependencies("a", "a")) @@ -37,12 +37,12 @@ public void testManipulationDeprecated() { @Test public void testManipulation() { - Provisioner provisioner = deps -> deps.stream().map(File::new).collect(Collectors.toSet()); - Assertions.assertThat(provisioner.provide(true, "a")) + Provisioner provisioner = (withTransitives, deps) -> deps.stream().map(File::new).collect(Collectors.toSet()); + Assertions.assertThat(provisioner.provisionWithTransitives(true, "a")) .containsExactlyInAnyOrder(new File("a")); - Assertions.assertThat(provisioner.provide(true, "a", "a")) + Assertions.assertThat(provisioner.provisionWithTransitives(true, "a", "a")) .containsExactlyInAnyOrder(new File("a")); - Assertions.assertThat(provisioner.provide(true, Arrays.asList("a", "a"))) + Assertions.assertThat(provisioner.provisionWithTransitives(true, Arrays.asList("a", "a"))) .containsExactlyInAnyOrder(new File("a")); } } From 3a08fca1d4b28687629982993e829fe5ca9ef89b Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Tue, 11 Sep 2018 23:22:16 -0700 Subject: [PATCH 4/5] Hid the opaque boolean parameter behind a named method in JarState. --- .../spotless/extra/EclipseBasedStepBuilder.java | 2 +- .../java/com/diffplug/spotless/JarState.java | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java b/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java index 83291344f4..5ce6a6d6e9 100644 --- a/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java +++ b/lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java @@ -152,7 +152,7 @@ public static class State implements Serializable { /** State constructor expects that all passed items are not modified afterwards */ protected State(String formatterStepExt, Provisioner jarProvisioner, List dependencies, Iterable settingsFiles) throws IOException { - this.jarState = JarState.from(dependencies, false, jarProvisioner); + this.jarState = JarState.withoutTransitives(dependencies, jarProvisioner); this.settingsFiles = FileSignature.signAsList(settingsFiles); this.formatterStepExt = formatterStepExt; } diff --git a/lib/src/main/java/com/diffplug/spotless/JarState.java b/lib/src/main/java/com/diffplug/spotless/JarState.java index c99417f7e8..2b7d15e527 100644 --- a/lib/src/main/java/com/diffplug/spotless/JarState.java +++ b/lib/src/main/java/com/diffplug/spotless/JarState.java @@ -54,28 +54,37 @@ public final class JarState implements Serializable { @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") private final transient Set jars; + @Deprecated // internal public JarState(String mavenCoordinate, FileSignature fileSignature, Set jars) { this(Arrays.asList(mavenCoordinate), fileSignature, jars); } + @Deprecated // internal public JarState(Collection mavenCoordinates, FileSignature fileSignature, Set jars) { this.mavenCoordinates = new TreeSet(mavenCoordinates); this.fileSignature = fileSignature; this.jars = jars; } + /** Provisions the given maven coordinate and its transitive dependencies. */ public static JarState from(String mavenCoordinate, Provisioner provisioner) throws IOException { return from(Collections.singletonList(mavenCoordinate), provisioner); } + /** Provisions the given maven coordinates and their transitive dependencies. */ public static JarState from(Collection mavenCoordinates, Provisioner provisioner) throws IOException { - return from(mavenCoordinates, true, provisioner); + return provisionWithTransitives(true, mavenCoordinates, provisioner); } - public static JarState from(Collection mavenCoordinates, boolean resolveTransitives, Provisioner provisioner) throws IOException { - Objects.requireNonNull(provisioner, "provisioner"); + /** Provisions the given maven coordinates without their transitive dependencies. */ + public static JarState withoutTransitives(Collection mavenCoordinates, Provisioner provisioner) throws IOException { + return provisionWithTransitives(false, mavenCoordinates, provisioner); + } + + private static JarState provisionWithTransitives(boolean withTransitives, Collection mavenCoordinates, Provisioner provisioner) throws IOException { Objects.requireNonNull(mavenCoordinates, "mavenCoordinates"); - Set jars = provisioner.provisionWithTransitives(resolveTransitives, mavenCoordinates); + Objects.requireNonNull(provisioner, "provisioner"); + Set jars = provisioner.provisionWithTransitives(withTransitives, mavenCoordinates); if (jars.isEmpty()) { throw new NoSuchElementException("Resolved to an empty result: " + mavenCoordinates.stream().collect(Collectors.joining(", "))); } From af690a5300c0a3a3cb0b88daf3f2b6a4a9a073a8 Mon Sep 17 00:00:00 2001 From: Frank Vennemeyer Date: Thu, 13 Sep 2018 05:54:29 +0200 Subject: [PATCH 5/5] Fixes Provisioner JavaDoc --- lib/src/main/java/com/diffplug/spotless/Provisioner.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/main/java/com/diffplug/spotless/Provisioner.java b/lib/src/main/java/com/diffplug/spotless/Provisioner.java index 40d8397ac0..cb39e7f993 100644 --- a/lib/src/main/java/com/diffplug/spotless/Provisioner.java +++ b/lib/src/main/java/com/diffplug/spotless/Provisioner.java @@ -26,20 +26,20 @@ */ public interface Provisioner { - /** Method interface has been extended to {@link Provisioner#provide}. */ + /** Method interface has been extended to {@link Provisioner#provisionWithTransitives(boolean, Collection)}. */ @Deprecated public default Set provisionWithDependencies(Collection mavenCoordinates) { return provisionWithTransitives(true, mavenCoordinates); } - /** Method interface has been extended to {@link Provisioner#provide}. */ + /** Method interface has been extended to {@link Provisioner#provisionWithTransitives(boolean, String...)}. */ @Deprecated public default Set provisionWithDependencies(String... mavenCoordinates) { return provisionWithDependencies(Arrays.asList(mavenCoordinates)); } /** - * Given a set of maven coordinates, returns a set of jars which include all + * Given a set of Maven coordinates, returns a set of jars which include all * of the specified coordinates and optionally their transitive dependencies. */ public default Set provisionWithTransitives(boolean withTransitives, String... mavenCoordinates) { @@ -47,7 +47,7 @@ public default Set provisionWithTransitives(boolean withTransitives, Strin } /** - * Given a set of maven coordinates, returns a set of jars which include all + * Given a set of Maven coordinates, returns a set of jars which include all * of the specified coordinates and optionally their transitive dependencies. */ public Set provisionWithTransitives(boolean withTransitives, Collection mavenCoordinates);