From 8cef356bcf1f28033077f767bc78cab36fd10d89 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 4 Dec 2020 15:35:21 +0100 Subject: [PATCH] Fix JavaVersion constant writer to handle recent Java versions Closes gh-1160 --- .../gradle/KotlinDslGradleBuildWriter.java | 41 +++++++++++-------- .../KotlinDslGradleBuildWriterTests.java | 35 +++++++++++----- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java index a3083322..3da0170b 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java @@ -17,7 +17,6 @@ package io.spring.initializr.generator.buildsystem.gradle; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,21 +37,7 @@ import io.spring.initializr.generator.version.VersionReference; */ public class KotlinDslGradleBuildWriter extends GradleBuildWriter { - private static final Map sourceCompatibilitiesToJavaVersion = createSourceCompatibilitiesToJavaVersion(); - - private static Map createSourceCompatibilitiesToJavaVersion() { - Map result = new HashMap<>(); - for (int version = 6; version <= 10; version++) { - result.put(Integer.toString(version), "VERSION_1_" + version); - result.put("1." + version, "VERSION_1_" + version); - } - for (int version = 11; version <= 12; version++) { - result.put(Integer.toString(version), "VERSION_" + version); - result.put("1." + version, "VERSION_" + version); - } - - return Collections.unmodifiableMap(result); - } + private final Map sourceCompatibilitiesToJavaVersion = new HashMap<>(); @Override protected void writeBuildscript(IndentingWriter writer, GradleBuild build) { @@ -97,8 +82,28 @@ public class KotlinDslGradleBuildWriter extends GradleBuildWriter { @Override protected void writeJavaSourceCompatibility(IndentingWriter writer, GradleBuildSettings settings) { - writer.println("java.sourceCompatibility = JavaVersion." - + sourceCompatibilitiesToJavaVersion.get(settings.getSourceCompatibility())); + writer.println("java.sourceCompatibility = " + getJavaVersionConstant(settings.getSourceCompatibility())); + } + + private String getJavaVersionConstant(String jvmVersion) { + return this.sourceCompatibilitiesToJavaVersion.computeIfAbsent(jvmVersion, (key) -> { + StringBuilder sb = new StringBuilder("JavaVersion."); + if (jvmVersion == null) { + return sb.append("VERSION_11").toString(); + } + int generation = (jvmVersion.startsWith("1.") ? Integer.parseInt(jvmVersion.substring(2)) + : Integer.parseInt(jvmVersion)); + if (generation >= 1 && generation <= 10) { + sb.append("VERSION_1_").append(generation); + } + else if (generation <= 17) { + sb.append("VERSION_").append(generation); + } + else { + sb.append("VERSION_HIGHER"); + } + return sb.toString(); + }); } private String configurationReference(String configurationName, Collection customConfigurations) { diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java index ef66f4f2..ba7cc22c 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java @@ -20,6 +20,7 @@ import java.io.StringWriter; import java.util.Arrays; import java.util.Comparator; import java.util.List; +import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.BillOfMaterials; import io.spring.initializr.generator.buildsystem.Dependency; @@ -30,6 +31,9 @@ import io.spring.initializr.generator.io.IndentingWriter; import io.spring.initializr.generator.version.VersionProperty; import io.spring.initializr.generator.version.VersionReference; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; @@ -49,20 +53,31 @@ class KotlinDslGradleBuildWriterTests { assertThat(lines).contains("group = \"com.example\"", "version = \"1.0.1-SNAPSHOT\""); } - @Test - void gradleBuildWithSourceCompatibility11() { + @ParameterizedTest + @MethodSource("sourceCompatibilityParameters") + void gradleBuildWithSourceCompatibility15(String sourceCompatibility, String javaVersionConstant) { GradleBuild build = new GradleBuild(); - build.settings().sourceCompatibility("11"); + build.settings().sourceCompatibility(sourceCompatibility); List lines = generateBuild(build); - assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_11"); + assertThat(lines).contains("java.sourceCompatibility = " + javaVersionConstant); } - @Test - void gradleBuildWithSourceCompatibility1Dot8() { - GradleBuild build = new GradleBuild(); - build.settings().sourceCompatibility("1.8"); - List lines = generateBuild(build); - assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_1_8"); + static Stream sourceCompatibilityParameters() { + return Stream.of(Arguments.arguments("1.8", "JavaVersion.VERSION_1_8"), + Arguments.arguments("8", "JavaVersion.VERSION_1_8"), + Arguments.arguments("1.9", "JavaVersion.VERSION_1_9"), + Arguments.arguments("9", "JavaVersion.VERSION_1_9"), + Arguments.arguments("1.10", "JavaVersion.VERSION_1_10"), + Arguments.arguments("10", "JavaVersion.VERSION_1_10"), + Arguments.arguments(null, "JavaVersion.VERSION_11"), + Arguments.arguments("11", "JavaVersion.VERSION_11"), + Arguments.arguments("12", "JavaVersion.VERSION_12"), + Arguments.arguments("13", "JavaVersion.VERSION_13"), + Arguments.arguments("14", "JavaVersion.VERSION_14"), + Arguments.arguments("15", "JavaVersion.VERSION_15"), + Arguments.arguments("16", "JavaVersion.VERSION_16"), + Arguments.arguments("17", "JavaVersion.VERSION_17"), + Arguments.arguments("18", "JavaVersion.VERSION_HIGHER")); } @Test