diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/CodeComplianceTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/CodeComplianceTests.java index 4d225d0e..3c8edd67 100755 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/CodeComplianceTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/CodeComplianceTests.java @@ -53,121 +53,122 @@ class CodeComplianceTests extends AbstractComplianceTests { @ParameterizedTest @MethodSource("parameters") - void currentGenerationJar(Language language, String extension) { + void currentGenerationJar(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE"); assertThat(project).filePaths().contains( - String.format("src/main/%s/com/example/demo/DemoApplication.%s", language.id(), extension), - String.format("src/test/%s/com/example/demo/DemoApplicationTests.%s", language.id(), extension), + String.format("src/main/%s/com/example/demo/DemoApplication.%s", language.id(), + language.sourceFileExtension()), + String.format("src/test/%s/com/example/demo/DemoApplicationTests.%s", language.id(), + language.sourceFileExtension()), "src/main/resources/application.properties"); } @ParameterizedTest @MethodSource("parameters") - void currentGenerationWar(Language language, String extension) { + void currentGenerationWar(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE", (description) -> description.setPackaging(Packaging.forId("war"))); assertThat(project).filePaths().contains( - String.format("src/main/%s/com/example/demo/DemoApplication.%s", language.id(), extension), - String.format("src/test/%s/com/example/demo/DemoApplicationTests.%s", language.id(), extension), + String.format("src/main/%s/com/example/demo/DemoApplication.%s", language.id(), + language.sourceFileExtension()), + String.format("src/test/%s/com/example/demo/DemoApplicationTests.%s", language.id(), + language.sourceFileExtension()), "src/main/resources/application.properties"); } @ParameterizedTest @MethodSource("parameters") - void currentGenerationMainClass(Language language, String extension) { + void currentGenerationMainClass(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE"); - assertThat(project).asJvmModule(language, extension).mainSource("com.example.demo", "DemoApplication") + assertThat(project).asJvmModule(language).mainSource("com.example.demo", "DemoApplication") .hasSameContentAs(new ClassPathResource( - "project/" + language + "/standard/DemoApplication." + getExpectedExtension(extension))); + "project/" + language + "/standard/DemoApplication." + getExpectedExtension(language))); } @ParameterizedTest @MethodSource("parameters") - void previousGenerationMainClass(Language language, String extension) { + void previousGenerationMainClass(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE", (description) -> description.setPlatformVersion(Version.parse("1.5.18.RELEASE"))); - assertThat(project).asJvmModule(language, extension).mainSource("com.example.demo", "DemoApplication") + assertThat(project).asJvmModule(language).mainSource("com.example.demo", "DemoApplication") .hasSameContentAs(new ClassPathResource( - "project/" + language + "/previous/" + "/DemoApplication." + getExpectedExtension(extension))); + "project/" + language + "/previous/" + "/DemoApplication." + getExpectedExtension(language))); } @ParameterizedTest @MethodSource("parameters") - void currentGenerationTestClass(Language language, String extension) { + void currentGenerationTestClass(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE"); - assertThat(project).asJvmModule(language, extension).testSource("com.example.demo", "DemoApplicationTests") + assertThat(project).asJvmModule(language).testSource("com.example.demo", "DemoApplicationTests") .hasSameContentAs(new ClassPathResource( - "project/" + language + "/standard/DemoApplicationTests." + getExpectedExtension(extension))); + "project/" + language + "/standard/DemoApplicationTests." + getExpectedExtension(language))); } @ParameterizedTest @MethodSource("parameters") - void currentGenerationTestClassWeb(Language language, String extension) { + void currentGenerationTestClassWeb(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE", (description) -> description.addDependency("web", MetadataBuildItemMapper.toDependency(WEB))); - assertThat(project).asJvmModule(language, extension).testSource("com.example.demo", "DemoApplicationTests") - .hasSameContentAs(new ClassPathResource("project/" + language + "/standard/DemoApplicationTestsWeb." - + getExpectedExtension(extension))); + assertThat(project).asJvmModule(language).testSource("com.example.demo", "DemoApplicationTests") + .hasSameContentAs(new ClassPathResource( + "project/" + language + "/standard/DemoApplicationTestsWeb." + getExpectedExtension(language))); } @ParameterizedTest @MethodSource("parameters") - void currentGenerationServletInitializer(Language language, String extension) { + void currentGenerationServletInitializer(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE", (description) -> description.setPackaging(Packaging.forId("war"))); - assertThat(project).asJvmModule(language, extension).mainSource("com.example.demo", "ServletInitializer") - .hasSameContentAs(new ClassPathResource("project/" + language + "/standard/" + "ServletInitializer." - + getExpectedExtension(extension))); + assertThat(project).asJvmModule(language).mainSource("com.example.demo", "ServletInitializer") + .hasSameContentAs(new ClassPathResource( + "project/" + language + "/standard/" + "ServletInitializer." + getExpectedExtension(language))); } @ParameterizedTest @MethodSource("parameters") - void previousGenerationServletInitializer(Language language, String extension) { + void previousGenerationServletInitializer(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE", (description) -> { description.setPackaging(Packaging.forId("war")); description.setPlatformVersion(Version.parse("1.5.18.RELEASE")); }); - assertThat(project).asJvmModule(language, extension).mainSource("com.example.demo", "ServletInitializer") - .hasSameContentAs(new ClassPathResource("project/" + language + "/previous/" + "ServletInitializer." - + getExpectedExtension(extension))); + assertThat(project).asJvmModule(language).mainSource("com.example.demo", "ServletInitializer") + .hasSameContentAs(new ClassPathResource( + "project/" + language + "/previous/" + "ServletInitializer." + getExpectedExtension(language))); } @ParameterizedTest @MethodSource("parameters") - void currentGenerationCustomCoordinates(Language language, String extension) { + void currentGenerationCustomCoordinates(Language language) { ProjectStructure project = generateProject(language, maven, "2.1.1.RELEASE", (description) -> { description.setGroupId("com.example.acme"); description.setArtifactId("my-project"); description.setPackageName("com.example.acme.myproject"); description.setApplicationName("MyProjectApplication"); }); - assertThat(project).asJvmModule(language, extension) - .mainSource("com.example.acme.myproject", "MyProjectApplication") + assertThat(project).asJvmModule(language).mainSource("com.example.acme.myproject", "MyProjectApplication") .hasSameContentAs(new ClassPathResource( - "project/" + language + "/standard/MyProjectApplication." + getExpectedExtension(extension))); - assertThat(project).asJvmModule(language, extension) - .testSource("com.example.acme.myproject", "MyProjectApplicationTests") + "project/" + language + "/standard/MyProjectApplication." + getExpectedExtension(language))); + assertThat(project).asJvmModule(language).testSource("com.example.acme.myproject", "MyProjectApplicationTests") .hasSameContentAs(new ClassPathResource("project/" + language + "/standard/MyProjectApplicationTests." - + getExpectedExtension(extension))); + + getExpectedExtension(language))); } @ParameterizedTest @MethodSource("parameters") - void previousGenerationCustomCoordinates(Language language, String extension) { + void previousGenerationCustomCoordinates(Language language) { ProjectStructure project = generateProject(language, maven, "1.5.18.RELEASE", (description) -> { description.setGroupId("com.example.acme"); description.setArtifactId("my-project"); description.setPackageName("com.example.acme.myproject"); description.setApplicationName("MyProjectApplication"); }); - assertThat(project).asJvmModule(language, extension) - .mainSource("com.example.acme.myproject", "MyProjectApplication") + assertThat(project).asJvmModule(language).mainSource("com.example.acme.myproject", "MyProjectApplication") .hasSameContentAs(new ClassPathResource( - "project/" + language + "/previous/MyProjectApplication." + getExpectedExtension(extension))); + "project/" + language + "/previous/MyProjectApplication." + getExpectedExtension(language))); } - private String getExpectedExtension(String extension) { - return extension + ".gen"; + private String getExpectedExtension(Language language) { + return language.sourceFileExtension() + ".gen"; } } diff --git a/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractJvmModuleAssert.java b/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractJvmModuleAssert.java index 1e3b2d9d..23767de0 100644 --- a/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractJvmModuleAssert.java +++ b/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractJvmModuleAssert.java @@ -40,12 +40,11 @@ public abstract class AbstractJvmModuleAssert selfType) { + protected AbstractJvmModuleAssert(Path projectDirectory, Language language, Class selfType) { super(projectDirectory, selfType); - this.mainDirectory = new SourceStructure(projectDirectory.resolve("src/main/"), language.id()); - this.testDirectory = new SourceStructure(projectDirectory.resolve("src/test/"), language.id()); - this.sourceFileExtension = sourceFileExtension; + this.mainDirectory = new SourceStructure(projectDirectory.resolve("src/main/"), language); + this.testDirectory = new SourceStructure(projectDirectory.resolve("src/test/"), language); + this.sourceFileExtension = language.sourceFileExtension(); } /** diff --git a/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractModuleAssert.java b/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractModuleAssert.java index d79e19b1..15208da4 100644 --- a/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractModuleAssert.java +++ b/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/AbstractModuleAssert.java @@ -37,16 +37,15 @@ public abstract class AbstractModuleAssert * Does not validate that the module has source code for the specified language. * @param language the language of the module - * @param sourceFileExtension the source file extension * @return a {@link JvmModuleAssert} for the specified language */ - public JvmModuleAssert asJvmModule(Language language, String sourceFileExtension) { - return new JvmModuleAssert(this.actual, language, sourceFileExtension); + public JvmModuleAssert asJvmModule(Language language) { + return new JvmModuleAssert(this.actual, language); } /** diff --git a/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/JvmModuleAssert.java b/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/JvmModuleAssert.java index 6bec419d..f6a7b25a 100644 --- a/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/JvmModuleAssert.java +++ b/initializr-generator-test/src/main/java/io/spring/initializr/generator/test/project/JvmModuleAssert.java @@ -27,8 +27,8 @@ import io.spring.initializr.generator.language.Language; */ public class JvmModuleAssert extends AbstractJvmModuleAssert { - public JvmModuleAssert(Path projectDirectory, Language language, String sourceFileExtension) { - super(projectDirectory, language, sourceFileExtension, JvmModuleAssert.class); + public JvmModuleAssert(Path projectDirectory, Language language) { + super(projectDirectory, language, JvmModuleAssert.class); } } diff --git a/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/JvmModuleAssertTests.java b/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/JvmModuleAssertTests.java index a291f596..43c38f8c 100644 --- a/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/JvmModuleAssertTests.java +++ b/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/JvmModuleAssertTests.java @@ -137,7 +137,7 @@ class JvmModuleAssertTests { } private AssertProvider forJavaProject(Path root) { - return () -> new JvmModuleAssert(root, JAVA_LANGUAGE, "java"); + return () -> new JvmModuleAssert(root, JAVA_LANGUAGE); } private void createFile(Path root, String path) throws IOException { diff --git a/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/ModuleAssertTests.java b/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/ModuleAssertTests.java index 5239e0cd..6bfe4c7e 100644 --- a/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/ModuleAssertTests.java +++ b/initializr-generator-test/src/test/java/io/spring/initializr/generator/test/project/ModuleAssertTests.java @@ -127,7 +127,7 @@ class ModuleAssertTests { @Test void asJavaProject(@TempDir Path dir) throws IOException { createFiles(dir, "src/main/java/com/example/Test.java"); - assertThat(forDirectory(dir)).asJvmModule(new JavaLanguage(), "java").hasMainPackage("com.example") + assertThat(forDirectory(dir)).asJvmModule(new JavaLanguage()).hasMainPackage("com.example") .hasMainSource("com.example", "Test"); } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java index d09b85ac..586cafbc 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java @@ -53,7 +53,7 @@ public interface BuildSystem { * @return a {@link SourceStructure} for main assets */ default SourceStructure getMainSource(Path projectRoot, Language language) { - return new SourceStructure(projectRoot.resolve("src/main/"), language.id()); + return new SourceStructure(projectRoot.resolve("src/main/"), language); } /** @@ -63,7 +63,7 @@ public interface BuildSystem { * @return a {@link SourceStructure} for test assets */ default SourceStructure getTestSource(Path projectRoot, Language language) { - return new SourceStructure(projectRoot.resolve("src/test/"), language.id()); + return new SourceStructure(projectRoot.resolve("src/test/"), language); } static BuildSystem forId(String id) { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/language/AbstractLanguage.java b/initializr-generator/src/main/java/io/spring/initializr/generator/language/AbstractLanguage.java index 9d518158..b1e505e3 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/language/AbstractLanguage.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/language/AbstractLanguage.java @@ -27,9 +27,12 @@ public abstract class AbstractLanguage implements Language { private final String jvmVersion; - protected AbstractLanguage(String id, String jvmVersion) { + private final String sourceFileExtension; + + protected AbstractLanguage(String id, String jvmVersion, String sourceFileExtension) { this.id = id; this.jvmVersion = (jvmVersion != null) ? jvmVersion : DEFAULT_JVM_VERSION; + this.sourceFileExtension = sourceFileExtension; } @Override @@ -42,6 +45,11 @@ public abstract class AbstractLanguage implements Language { return this.jvmVersion; } + @Override + public String sourceFileExtension() { + return this.sourceFileExtension; + } + @Override public String toString() { return id(); diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/language/Language.java b/initializr-generator/src/main/java/io/spring/initializr/generator/language/Language.java index 7d8681a2..d3a2593d 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/language/Language.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/language/Language.java @@ -32,10 +32,24 @@ public interface Language { */ String DEFAULT_JVM_VERSION = "1.8"; + /** + * Return the language identifier. + * @return the language id + */ String id(); + /** + * Return the JVM version level to use. + * @return the JVM version or {@value DEFAULT_JVM_VERSION} if not set + */ String jvmVersion(); + /** + * Return the file extension to use for source file of this language. + * @return the source file extension + */ + String sourceFileExtension(); + static Language forId(String id, String jvmVersion) { return SpringFactoriesLoader.loadFactories(LanguageFactory.class, LanguageFactory.class.getClassLoader()) .stream().map((factory) -> factory.createLanguage(id, jvmVersion)).filter(Objects::nonNull).findFirst() diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/language/SourceStructure.java b/initializr-generator/src/main/java/io/spring/initializr/generator/language/SourceStructure.java index 1656a700..04126d68 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/language/SourceStructure.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/language/SourceStructure.java @@ -21,7 +21,7 @@ import java.nio.file.Files; import java.nio.file.Path; /** - * Provide dedicated method for directories that hold sources. + * Provide dedicated methods for a structure that holds sources. * * @author Stephane Nicoll */ @@ -29,16 +29,19 @@ public class SourceStructure { private final Path rootDirectory; + private final Language language; + private final Path sourcesDirectory; - public SourceStructure(Path rootDirectory, String sourcesDirectoryName) { + public SourceStructure(Path rootDirectory, Language language) { this.rootDirectory = rootDirectory; - this.sourcesDirectory = rootDirectory.resolve(sourcesDirectoryName); + this.language = language; + this.sourcesDirectory = rootDirectory.resolve(language.id()); } /** - * Return the root {@link Path} of this structure. Can be used to access additional - * resources. + * Return the root {@link Path directory} of this structure. Can be used to access + * additional resources. * @return the root directory */ public Path getRootDirectory() { @@ -46,7 +49,7 @@ public class SourceStructure { } /** - * Return the sources {@link Path} of this structure. + * Return the sources {@link Path directory} of this structure. * @return the source code directory */ public Path getSourcesDirectory() { @@ -54,15 +57,17 @@ public class SourceStructure { } /** - * Resource a source file, creating its package structure if necessary. + * Resolve a source file, creating its package structure if necessary. Does not create + * the file itself. * @param packageName the name of the package - * @param file the name of the file (including its extension) - * @return the file to use to store a {@code CompilationUnit} with the specified - * package name name + * @param fileName the name of the file (without its extension) + * @return the {@link Path file} to use to store a {@code CompilationUnit} with the + * specified package and name * @throws IOException if an error occurred while trying to create the directory * structure */ - public Path resolveSourceFile(String packageName, String file) throws IOException { + public Path resolveSourceFile(String packageName, String fileName) throws IOException { + String file = fileName + "." + this.language.sourceFileExtension(); return createPackage(this.sourcesDirectory, packageName).resolve(file); } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovyLanguage.java b/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovyLanguage.java index 7295b005..309e1b71 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovyLanguage.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovyLanguage.java @@ -36,7 +36,7 @@ public final class GroovyLanguage extends AbstractLanguage { } public GroovyLanguage(String jvmVersion) { - super(ID, jvmVersion); + super(ID, jvmVersion, "groovy"); } } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovySourceCodeWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovySourceCodeWriter.java index ba477f0f..085a6569 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovySourceCodeWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/language/groovy/GroovySourceCodeWriter.java @@ -95,8 +95,7 @@ public class GroovySourceCodeWriter implements SourceCodeWriter { } private void writeTo(SourceStructure structure, JavaCompilationUnit compilationUnit) throws IOException { - Path output = structure.resolveSourceFile(compilationUnit.getPackageName(), - compilationUnit.getName() + ".java"); + Path output = structure.resolveSourceFile(compilationUnit.getPackageName(), compilationUnit.getName()); Files.createDirectories(output.getParent()); try (IndentingWriter writer = this.indentingWriterFactory.createIndentingWriter("java", Files.newBufferedWriter(output))) { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinLanguage.java b/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinLanguage.java index c81c089b..74e9a639 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinLanguage.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinLanguage.java @@ -36,7 +36,7 @@ public final class KotlinLanguage extends AbstractLanguage { } public KotlinLanguage(String jvmVersion) { - super(ID, jvmVersion); + super(ID, jvmVersion, "kt"); } } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinSourceCodeWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinSourceCodeWriter.java index f5545665..6f2da6d0 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinSourceCodeWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/language/kotlin/KotlinSourceCodeWriter.java @@ -61,7 +61,7 @@ public class KotlinSourceCodeWriter implements SourceCodeWriter