Skip to content

Commit d71fdd9

Browse files
committed
Make buildSrc's custom Gradle tasks consistently abstract
Closes gh-41272
1 parent 86fa229 commit d71fdd9

30 files changed

+276
-513
lines changed

buildSrc/src/main/java/org/springframework/boot/build/ExtractResources.java

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,15 +21,13 @@
2121
import java.io.InputStream;
2222
import java.io.InputStreamReader;
2323
import java.nio.charset.StandardCharsets;
24-
import java.util.ArrayList;
25-
import java.util.HashMap;
26-
import java.util.List;
27-
import java.util.Map;
2824

2925
import org.gradle.api.DefaultTask;
3026
import org.gradle.api.GradleException;
3127
import org.gradle.api.Task;
3228
import org.gradle.api.file.DirectoryProperty;
29+
import org.gradle.api.provider.ListProperty;
30+
import org.gradle.api.provider.MapProperty;
3331
import org.gradle.api.tasks.Input;
3432
import org.gradle.api.tasks.OutputDirectory;
3533
import org.gradle.api.tasks.TaskAction;
@@ -42,54 +40,30 @@
4240
*
4341
* @author Andy Wilkinson
4442
*/
45-
public class ExtractResources extends DefaultTask {
43+
public abstract class ExtractResources extends DefaultTask {
4644

4745
private final PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}");
4846

49-
private final Map<String, String> properties = new HashMap<>();
50-
51-
private final DirectoryProperty destinationDirectory;
52-
53-
private List<String> resourceNames = new ArrayList<>();
54-
55-
public ExtractResources() {
56-
this.destinationDirectory = getProject().getObjects().directoryProperty();
57-
}
58-
5947
@Input
60-
public List<String> getResourceNames() {
61-
return this.resourceNames;
62-
}
63-
64-
public void setResourcesNames(List<String> resourceNames) {
65-
this.resourceNames = resourceNames;
66-
}
48+
public abstract ListProperty<String> getResourceNames();
6749

6850
@OutputDirectory
69-
public DirectoryProperty getDestinationDirectory() {
70-
return this.destinationDirectory;
71-
}
72-
73-
public void property(String name, String value) {
74-
this.properties.put(name, value);
75-
}
51+
public abstract DirectoryProperty getDestinationDirectory();
7652

7753
@Input
78-
public Map<String, String> getProperties() {
79-
return this.properties;
80-
}
54+
public abstract MapProperty<String, String> getProperties();
8155

8256
@TaskAction
8357
void extractResources() throws IOException {
84-
for (String resourceName : this.resourceNames) {
58+
for (String resourceName : getResourceNames().get()) {
8559
InputStream resourceStream = getClass().getClassLoader().getResourceAsStream(resourceName);
8660
if (resourceStream == null) {
8761
throw new GradleException("Resource '" + resourceName + "' does not exist");
8862
}
8963
String resource = FileCopyUtils.copyToString(new InputStreamReader(resourceStream, StandardCharsets.UTF_8));
90-
resource = this.propertyPlaceholderHelper.replacePlaceholders(resource, this.properties::get);
64+
resource = this.propertyPlaceholderHelper.replacePlaceholders(resource, getProperties().get()::get);
9165
FileCopyUtils.copy(resource,
92-
new FileWriter(this.destinationDirectory.file(resourceName).get().getAsFile()));
66+
new FileWriter(getDestinationDirectory().file(resourceName).get().getAsFile()));
9367
}
9468
}
9569

buildSrc/src/main/java/org/springframework/boot/build/JavaConventions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ private void configureJarManifestConventions(Project project) {
129129
ExtractResources extractLegalResources = project.getTasks()
130130
.create("extractLegalResources", ExtractResources.class);
131131
extractLegalResources.getDestinationDirectory().set(project.getLayout().getBuildDirectory().dir("legal"));
132-
extractLegalResources.setResourcesNames(Arrays.asList("LICENSE.txt", "NOTICE.txt"));
133-
extractLegalResources.property("version", project.getVersion().toString());
132+
extractLegalResources.getResourceNames().set(Arrays.asList("LICENSE.txt", "NOTICE.txt"));
133+
extractLegalResources.getProperties().put("version", project.getVersion().toString());
134134
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
135135
Set<String> sourceJarTaskNames = sourceSets.stream()
136136
.map(SourceSet::getSourcesJarTaskName)
Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021-2023 the original author or authors.
2+
* Copyright 2021-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@
1818

1919
import org.gradle.api.DefaultTask;
2020
import org.gradle.api.file.DirectoryProperty;
21-
import org.gradle.api.model.ObjectFactory;
2221
import org.gradle.api.provider.Property;
2322
import org.gradle.api.tasks.Input;
2423
import org.gradle.api.tasks.InputDirectory;
@@ -31,45 +30,29 @@
3130
*
3231
* @author Andy Wilkinson
3332
*/
34-
public class SyncAppSource extends DefaultTask {
33+
public abstract class SyncAppSource extends DefaultTask {
3534

36-
private final DirectoryProperty sourceDirectory;
35+
public SyncAppSource() {
36+
getPluginVersion().convention(getProject().provider(() -> getProject().getVersion().toString()));
37+
}
3738

38-
private final DirectoryProperty destinationDirectory;
39+
@InputDirectory
40+
public abstract DirectoryProperty getSourceDirectory();
3941

40-
private final Property<String> pluginVersion;
42+
@OutputDirectory
43+
public abstract DirectoryProperty getDestinationDirectory();
4144

42-
public SyncAppSource() {
43-
ObjectFactory objects = getProject().getObjects();
44-
this.sourceDirectory = objects.directoryProperty();
45-
this.destinationDirectory = objects.directoryProperty();
46-
this.pluginVersion = objects.property(String.class)
47-
.convention(getProject().provider(() -> getProject().getVersion().toString()));
48-
}
45+
@Input
46+
public abstract Property<String> getPluginVersion();
4947

5048
@TaskAction
5149
void syncAppSources() {
5250
getProject().sync((copySpec) -> {
53-
copySpec.from(this.sourceDirectory);
54-
copySpec.into(this.destinationDirectory);
51+
copySpec.from(getSourceDirectory());
52+
copySpec.into(getDestinationDirectory());
5553
copySpec.filter((line) -> line.replace("id \"org.springframework.boot\"",
5654
"id \"org.springframework.boot\" version \"" + getProject().getVersion() + "\""));
5755
});
5856
}
5957

60-
@InputDirectory
61-
public DirectoryProperty getSourceDirectory() {
62-
return this.sourceDirectory;
63-
}
64-
65-
@OutputDirectory
66-
public DirectoryProperty getDestinationDirectory() {
67-
return this.destinationDirectory;
68-
}
69-
70-
@Input
71-
public Property<String> getPluginVersion() {
72-
return this.pluginVersion;
73-
}
74-
7558
}

buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationMetadata.java

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,15 @@
2828
import java.util.List;
2929
import java.util.Properties;
3030
import java.util.Set;
31-
import java.util.concurrent.Callable;
3231

3332
import org.gradle.api.DefaultTask;
3433
import org.gradle.api.Task;
34+
import org.gradle.api.file.FileCollection;
35+
import org.gradle.api.file.RegularFileProperty;
36+
import org.gradle.api.tasks.Classpath;
37+
import org.gradle.api.tasks.InputFile;
3538
import org.gradle.api.tasks.OutputFile;
39+
import org.gradle.api.tasks.PathSensitive;
3640
import org.gradle.api.tasks.PathSensitivity;
3741
import org.gradle.api.tasks.SourceSet;
3842
import org.gradle.api.tasks.TaskAction;
@@ -48,47 +52,45 @@
4852
* @author Andy Wilkinson
4953
* @author Scott Frederick
5054
*/
51-
public class AutoConfigurationMetadata extends DefaultTask {
55+
public abstract class AutoConfigurationMetadata extends DefaultTask {
5256

5357
private static final String COMMENT_START = "#";
5458

5559
private final String moduleName;
5660

57-
private SourceSet sourceSet;
58-
59-
private File outputFile;
61+
private FileCollection classesDirectories;
6062

6163
public AutoConfigurationMetadata() {
62-
getInputs()
63-
.file((Callable<File>) () -> new File(this.sourceSet.getOutput().getResourcesDir(),
64-
"META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports"))
65-
.withPathSensitivity(PathSensitivity.RELATIVE)
66-
.withPropertyName("org.springframework.boot.autoconfigure.AutoConfiguration");
67-
68-
dependsOn((Callable<String>) () -> this.sourceSet.getProcessResourcesTaskName());
6964
getProject().getConfigurations()
7065
.maybeCreate(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME);
7166
this.moduleName = getProject().getName();
7267
}
7368

7469
public void setSourceSet(SourceSet sourceSet) {
75-
this.sourceSet = sourceSet;
70+
getAutoConfigurationImports().set(new File(sourceSet.getOutput().getResourcesDir(),
71+
"META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports"));
72+
this.classesDirectories = sourceSet.getOutput().getClassesDirs();
73+
dependsOn(sourceSet.getOutput());
7674
}
7775

76+
@InputFile
77+
@PathSensitive(PathSensitivity.RELATIVE)
78+
abstract RegularFileProperty getAutoConfigurationImports();
79+
7880
@OutputFile
79-
public File getOutputFile() {
80-
return this.outputFile;
81-
}
81+
public abstract RegularFileProperty getOutputFile();
8282

83-
public void setOutputFile(File outputFile) {
84-
this.outputFile = outputFile;
83+
@Classpath
84+
FileCollection getClassesDirectories() {
85+
return this.classesDirectories;
8586
}
8687

8788
@TaskAction
8889
void documentAutoConfiguration() throws IOException {
8990
Properties autoConfiguration = readAutoConfiguration();
90-
getOutputFile().getParentFile().mkdirs();
91-
try (FileWriter writer = new FileWriter(getOutputFile())) {
91+
File outputFile = getOutputFile().get().getAsFile();
92+
outputFile.getParentFile().mkdirs();
93+
try (FileWriter writer = new FileWriter(outputFile)) {
9294
autoConfiguration.store(writer, null);
9395
}
9496
}
@@ -120,8 +122,7 @@ private Properties readAutoConfiguration() throws IOException {
120122
* @return auto-configurations
121123
*/
122124
private List<String> readAutoConfigurationsFile() throws IOException {
123-
File file = new File(this.sourceSet.getOutput().getResourcesDir(),
124-
"META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports");
125+
File file = getAutoConfigurationImports().getAsFile().get();
125126
if (!file.exists()) {
126127
return Collections.emptyList();
127128
}
@@ -140,7 +141,7 @@ private String stripComment(String line) {
140141

141142
private File findClassFile(String className) {
142143
String classFileName = className.replace(".", "/") + ".class";
143-
for (File classesDir : this.sourceSet.getOutput().getClassesDirs()) {
144+
for (File classesDir : this.classesDirectories) {
144145
File classFile = new File(classesDir, classFileName);
145146
if (classFile.isFile()) {
146147
return classFile;

buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationPlugin.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,7 +22,6 @@
2222
import java.nio.file.Path;
2323
import java.util.Collections;
2424
import java.util.List;
25-
import java.util.concurrent.Callable;
2625

2726
import com.tngtech.archunit.core.domain.JavaClass;
2827
import com.tngtech.archunit.lang.ArchCondition;
@@ -94,10 +93,9 @@ public void apply(Project project) {
9493
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
9594
task.setSourceSet(main);
9695
task.dependsOn(main.getClassesTaskName());
97-
task.setOutputFile(new File(project.getBuildDir(), "auto-configuration-metadata.properties"));
96+
task.getOutputFile().set(new File(project.getBuildDir(), "auto-configuration-metadata.properties"));
9897
project.getArtifacts()
99-
.add(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME,
100-
project.provider((Callable<File>) task::getOutputFile),
98+
.add(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME, task.getOutputFile(),
10199
(artifact) -> artifact.builtBy(task));
102100
});
103101
project.getPlugins().withType(ArchitecturePlugin.class, (architecturePlugin) -> {

buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/DocumentAutoConfigurationClasses.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
3131
import org.gradle.api.DefaultTask;
3232
import org.gradle.api.Task;
3333
import org.gradle.api.file.FileCollection;
34+
import org.gradle.api.file.RegularFileProperty;
3435
import org.gradle.api.tasks.InputFiles;
3536
import org.gradle.api.tasks.OutputDirectory;
3637
import org.gradle.api.tasks.TaskAction;
@@ -42,12 +43,10 @@
4243
*
4344
* @author Andy Wilkinson
4445
*/
45-
public class DocumentAutoConfigurationClasses extends DefaultTask {
46+
public abstract class DocumentAutoConfigurationClasses extends DefaultTask {
4647

4748
private FileCollection autoConfiguration;
4849

49-
private File outputDir;
50-
5150
@InputFiles
5251
public FileCollection getAutoConfiguration() {
5352
return this.autoConfiguration;
@@ -58,13 +57,7 @@ public void setAutoConfiguration(FileCollection autoConfiguration) {
5857
}
5958

6059
@OutputDirectory
61-
public File getOutputDir() {
62-
return this.outputDir;
63-
}
64-
65-
public void setOutputDir(File outputDir) {
66-
this.outputDir = outputDir;
67-
}
60+
public abstract RegularFileProperty getOutputDir();
6861

6962
@TaskAction
7063
void documentAutoConfigurationClasses() throws IOException {
@@ -80,9 +73,10 @@ void documentAutoConfigurationClasses() throws IOException {
8073
}
8174

8275
private void writeTable(AutoConfiguration autoConfigurationClasses) throws IOException {
83-
this.outputDir.mkdirs();
76+
File outputDir = getOutputDir().getAsFile().get();
77+
outputDir.mkdirs();
8478
try (PrintWriter writer = new PrintWriter(
85-
new FileWriter(new File(this.outputDir, autoConfigurationClasses.module + ".adoc")))) {
79+
new FileWriter(new File(outputDir, autoConfigurationClasses.module + ".adoc")))) {
8680
writer.println("[cols=\"4,1\"]");
8781
writer.println("|===");
8882
writer.println("| Configuration Class | Links");

buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public void effectiveBomArtifact() {
149149
}
150150
MavenExec generateEffectiveBom = this.project.getTasks()
151151
.create("generateEffectiveBom", MavenExec.class);
152-
generateEffectiveBom.setProjectDir(generatedBomDir);
152+
generateEffectiveBom.getProjectDir().set(generatedBomDir);
153153
File effectiveBom = new File(this.project.getBuildDir(),
154154
"generated/effective-bom/" + this.project.getName() + "-effective-bom.xml");
155155
generateEffectiveBom.args("--settings", "settings.xml", "help:effective-pom",

buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
*
4646
* @author Andy Wilkinson
4747
*/
48-
public class CheckBom extends DefaultTask {
48+
public abstract class CheckBom extends DefaultTask {
4949

5050
private final BomExtension bom;
5151

buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForConflicts.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -48,7 +48,7 @@
4848
*
4949
* @author Andy Wilkinson
5050
*/
51-
public class CheckClasspathForConflicts extends DefaultTask {
51+
public abstract class CheckClasspathForConflicts extends DefaultTask {
5252

5353
private final List<Predicate<String>> ignores = new ArrayList<>();
5454

buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForProhibitedDependencies.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
*
3535
* @author Andy Wilkinson
3636
*/
37-
public class CheckClasspathForProhibitedDependencies extends DefaultTask {
37+
public abstract class CheckClasspathForProhibitedDependencies extends DefaultTask {
3838

3939
private static final Set<String> PROHIBITED_GROUPS = Set.of("org.codehaus.groovy", "org.eclipse.jetty.toolchain",
4040
"commons-logging", "org.apache.geronimo.specs", "com.sun.activation");

0 commit comments

Comments
 (0)