diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java index 010759a3..19b567c9 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java @@ -40,8 +40,8 @@ class KotlinGradleBuildCustomizer implements BuildCustomizer { public void customize(GradleBuild build) { build.addPlugin("org.jetbrains.kotlin.jvm", this.settings.getVersion()); build.addPlugin("org.jetbrains.kotlin.plugin.spring", this.settings.getVersion()); - build.addImportedType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile"); - build.customizeTasksWithType("KotlinCompile", this::customizeKotlinOptions); + build.customizeTasksWithType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile", + this::customizeKotlinOptions); } private void customizeKotlinOptions(TaskCustomization compile) { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuild.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuild.java index eb2c1bfd..6fad200f 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuild.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuild.java @@ -31,6 +31,9 @@ import java.util.function.Consumer; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.BuildItemResolver; +import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; + /** * Gradle build configuration for a project. * @@ -127,17 +130,24 @@ public class GradleBuild extends Build { return Collections.unmodifiableMap(this.configurationCustomizations); } - public void addImportedType(String type) { - this.importedTypes.add(type); - } - public Set getImportedTypes() { return Collections.unmodifiableSet(this.importedTypes); } + /** + * Customize tasks matching a given type. + * @param typeName the name of type. Can use the short form for well-known types such + * as {@code JavaCompile}, use a fully qualified name if an import is required + * @param customizer a callback to customize tasks matching that type + */ public void customizeTasksWithType(String typeName, Consumer customizer) { - customizer.accept(this.tasksWithTypeCustomizations.computeIfAbsent(typeName, + String packageName = ClassUtils.getPackageName(typeName); + if (!StringUtils.isEmpty(packageName)) { + this.importedTypes.add(typeName); + } + String shortName = ClassUtils.getShortName(typeName); + customizer.accept(this.tasksWithTypeCustomizations.computeIfAbsent(shortName, (name) -> new TaskCustomization())); } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java index 23779f5e..647c46d4 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java @@ -291,7 +291,6 @@ public class GradleBuildWriter { GradleBuild build) { Map tasksWithTypeCustomizations = build .getTasksWithTypeCustomizations(); - tasksWithTypeCustomizations.forEach((typeName, customization) -> { writer.println(); writer.println("tasks.withType(" + typeName + ") {"); diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriterTests.java index b4d02366..7ce940d0 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriterTests.java @@ -34,24 +34,10 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Andy Wilkinson * @author Jean-Baptiste Nizet + * @author Stephane Nicoll */ class GradleBuildWriterTests { - @Test - void gradleBuildWithImports() throws IOException { - GradleBuild build = new GradleBuild(); - build.addImportedType( - "org.springframework.boot.gradle.tasks.buildinfo.BuildInfo"); - build.addImportedType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile"); - // same import added twice on purpose - build.addImportedType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile"); - - List lines = generateBuild(build); - assertThat(lines.subList(0, 3)).containsExactly( - "import org.jetbrains.kotlin.gradle.tasks.KotlinCompile", - "import org.springframework.boot.gradle.tasks.buildinfo.BuildInfo", ""); - } - @Test void gradleBuildWithCoordinates() throws IOException { GradleBuild build = new GradleBuild(); @@ -159,16 +145,30 @@ class GradleBuildWriterTests { void gradleBuildWithTaskWithTypesCustomizedWithNestedAssignments() throws IOException { GradleBuild build = new GradleBuild(); - build.customizeTasksWithType("KotlinCompile", (task) -> { - task.nested("kotlinOptions", (kotlinOptions) -> { - kotlinOptions.set("freeCompilerArgs", "['-Xjsr305=strict']"); - kotlinOptions.set("jvmTarget", "'1.8'"); - }); - }); + build.customizeTasksWithType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile", + (task) -> task.nested("kotlinOptions", (kotlinOptions) -> kotlinOptions + .set("freeCompilerArgs", "['-Xjsr305=strict']"))); + build.customizeTasksWithType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile", + (task) -> task.nested("kotlinOptions", + (kotlinOptions) -> kotlinOptions.set("jvmTarget", "'1.8'"))); List lines = generateBuild(build); - assertThat(lines).containsSequence("tasks.withType(KotlinCompile) {", - " kotlinOptions {", " freeCompilerArgs = ['-Xjsr305=strict']", - " jvmTarget = '1.8'", " }", "}"); + assertThat(lines) + .containsOnlyOnce( + "import org.jetbrains.kotlin.gradle.tasks.KotlinCompile") + .containsSequence("tasks.withType(KotlinCompile) {", + " kotlinOptions {", + " freeCompilerArgs = ['-Xjsr305=strict']", + " jvmTarget = '1.8'", " }", "}"); + } + + @Test + void gradleBuildWithTaskWithTypesAndShortTypes() throws IOException { + GradleBuild build = new GradleBuild(); + build.customizeTasksWithType("JavaCompile", + (javaCompile) -> javaCompile.set("options.fork", "true")); + assertThat(generateBuild(build)).doesNotContain("import JavaCompile") + .containsSequence("tasks.withType(JavaCompile) {", + " options.fork = true", "}"); } @Test