1515 */
1616package com .diffplug .gradle .spotless ;
1717
18- import java .io .File ;
1918import java .util .Collection ;
2019import java .util .HashMap ;
2120import java .util .Map ;
22- import java .util .Set ;
2321
2422import org .gradle .api .GradleException ;
23+ import org .gradle .api .NamedDomainObjectProvider ;
2524import org .gradle .api .Project ;
2625import org .gradle .api .artifacts .Configuration ;
2726import org .gradle .api .artifacts .ConfigurationContainer ;
2827import org .gradle .api .artifacts .dsl .DependencyHandler ;
2928import org .gradle .api .attributes .Bundling ;
3029import org .gradle .api .attributes .Category ;
3130import org .gradle .api .attributes .java .TargetJvmEnvironment ;
31+ import org .gradle .api .file .FileCollection ;
3232import org .gradle .api .initialization .dsl .ScriptHandler ;
3333import org .slf4j .Logger ;
3434import org .slf4j .LoggerFactory ;
3535
3636import com .diffplug .common .base .Unhandled ;
3737import com .diffplug .common .collect .ImmutableList ;
38+ import com .diffplug .spotless .LazyFiles ;
3839import com .diffplug .spotless .Provisioner ;
3940
4041/** Should be package-private. */
@@ -59,16 +60,16 @@ public DedupingProvisioner dedupingProvisioner(Project project) {
5960
6061 static class DedupingProvisioner implements Provisioner {
6162 private final Provisioner provisioner ;
62- private final Map <Request , Set < File > > cache = new HashMap <>();
63+ private final Map <Request , LazyFiles > cache = new HashMap <>();
6364
6465 DedupingProvisioner (Provisioner provisioner ) {
6566 this .provisioner = provisioner ;
6667 }
6768
6869 @ Override
69- public Set < File > provisionWithTransitives (boolean withTransitives , Collection <String > mavenCoordinates ) {
70+ public LazyFiles provisionWithTransitives (boolean withTransitives , Collection <String > mavenCoordinates ) {
7071 Request req = new Request (withTransitives , mavenCoordinates );
71- Set < File > result ;
72+ LazyFiles result ;
7273 synchronized (cache ) {
7374 result = cache .get (req );
7475 }
@@ -89,7 +90,7 @@ public Set<File> provisionWithTransitives(boolean withTransitives, Collection<St
8990 /** A child Provisioner which retries cached elements only. */
9091 final Provisioner cachedOnly = (withTransitives , mavenCoordinates ) -> {
9192 Request req = new Request (withTransitives , mavenCoordinates );
92- Set < File > result ;
93+ LazyFiles result ;
9394 synchronized (cache ) {
9495 result = cache .get (req );
9596 }
@@ -113,22 +114,25 @@ static Provisioner forRootProjectBuildscript(Project project) {
113114 private static Provisioner forConfigurationContainer (Project project , ConfigurationContainer configurations , DependencyHandler dependencies ) {
114115 return (withTransitives , mavenCoords ) -> {
115116 try {
116- Configuration config = configurations .create ("spotless"
117- + new Request (withTransitives , mavenCoords ).hashCode ());
118- mavenCoords .stream ()
119- .map (dependencies ::create )
120- .forEach (config .getDependencies ()::add );
121- config .setDescription (mavenCoords .toString ());
122- config .setTransitive (withTransitives );
123- config .setCanBeConsumed (false );
124- config .setVisible (false );
125- config .attributes (attr -> {
126- attr .attribute (Category .CATEGORY_ATTRIBUTE , project .getObjects ().named (Category .class , Category .LIBRARY ));
127- attr .attribute (Bundling .BUNDLING_ATTRIBUTE , project .getObjects ().named (Bundling .class , Bundling .EXTERNAL ));
128- // Add this attribute for resolving Guava dependency, see https://github.com/google/guava/issues/6801.
129- attr .attribute (TargetJvmEnvironment .TARGET_JVM_ENVIRONMENT_ATTRIBUTE , project .getObjects ().named (TargetJvmEnvironment .class , TargetJvmEnvironment .STANDARD_JVM ));
130- });
131- return config .resolve ();
117+ NamedDomainObjectProvider <Configuration > config = configurations .register (
118+ "spotless" + new Request (withTransitives , mavenCoords ).hashCode (),
119+ files -> {
120+ mavenCoords .stream ()
121+ .map (dependencies ::create )
122+ .forEach (files .getDependencies ()::add );
123+ files .setDescription (mavenCoords .toString ());
124+ files .setTransitive (withTransitives );
125+ files .setCanBeConsumed (false );
126+ files .setVisible (false );
127+ files .attributes (attr -> {
128+ attr .attribute (Category .CATEGORY_ATTRIBUTE , project .getObjects ().named (Category .class , Category .LIBRARY ));
129+ attr .attribute (Bundling .BUNDLING_ATTRIBUTE , project .getObjects ().named (Bundling .class , Bundling .EXTERNAL ));
130+ attr .attribute (TargetJvmEnvironment .TARGET_JVM_ENVIRONMENT_ATTRIBUTE , project .getObjects ().named (TargetJvmEnvironment .class , TargetJvmEnvironment .STANDARD_JVM ));
131+ });
132+ });
133+
134+ final FileCollection configFiles = project .files (config );
135+ return configFiles ::getFiles ;
132136 } catch (Exception e ) {
133137 String projName = project .getPath ().substring (1 ).replace (':' , '/' );
134138 if (!projName .isEmpty ()) {
0 commit comments