diff --git a/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java b/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java index 52e5f88b..229efde6 100644 --- a/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java +++ b/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java @@ -47,6 +47,7 @@ import org.springframework.util.FileSystemUtils; * * @param the concrete {@link ProjectRequest} type * @author Madhura Bhave + * @see ProjectAssetGenerator */ public class ProjectGenerationInvoker { @@ -56,6 +57,8 @@ public class ProjectGenerationInvoker { private final ProjectRequestToDescriptionConverter requestConverter; + private final ProjectAssetGenerator projectAssetGenerator = new DefaultProjectAssetGenerator(); + private final transient Map> temporaryFiles = new ConcurrentHashMap<>(); public ProjectGenerationInvoker(ApplicationContext parentApplicationContext, @@ -82,7 +85,8 @@ public class ProjectGenerationInvoker { ProjectDescription description = this.requestConverter.convert(request, metadata); ProjectGenerator projectGenerator = new ProjectGenerator(( projectGenerationContext) -> customizeProjectGenerationContext(projectGenerationContext, metadata)); - ProjectGenerationResult result = projectGenerator.generate(description, generateProject(request)); + ProjectGenerationResult result = projectGenerator.generate(description, + generateProject(description, request)); addTempFile(result.getRootDirectory(), result.getRootDirectory()); return result; } @@ -92,14 +96,24 @@ public class ProjectGenerationInvoker { } } - private ProjectAssetGenerator generateProject(R request) { + private ProjectAssetGenerator generateProject(ProjectDescription description, R request) { return (context) -> { - Path projectDir = new DefaultProjectAssetGenerator().generate(context); + Path projectDir = getProjectAssetGenerator(description).generate(context); publishProjectGeneratedEvent(request, context); return new ProjectGenerationResult(context.getBean(ProjectDescription.class), projectDir); }; } + /** + * Return the {@link ProjectAssetGenerator} to use to generate the project structure + * for the specified {@link ProjectDescription}. + * @param description the project description + * @return an asset generator for the specified request + */ + protected ProjectAssetGenerator getProjectAssetGenerator(ProjectDescription description) { + return this.projectAssetGenerator; + } + /** * Invokes the project generation API that knows how to just write the build file. * Returns a directory containing the project for the specified diff --git a/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectGenerationInvokerTests.java b/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectGenerationInvokerTests.java index 4419273e..948c48ac 100644 --- a/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectGenerationInvokerTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/project/ProjectGenerationInvokerTests.java @@ -22,9 +22,12 @@ import java.nio.file.Path; import java.util.List; import java.util.Map; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.io.IndentingWriterFactory; import io.spring.initializr.generator.io.SimpleIndentStrategy; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; +import io.spring.initializr.generator.project.ProjectAssetGenerator; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectDirectoryFactory; import io.spring.initializr.generator.test.InitializrMetadataTestBuilder; import io.spring.initializr.generator.test.buildsystem.gradle.GroovyDslGradleBuildAssert; @@ -169,6 +172,26 @@ public class ProjectGenerationInvokerTests { assertThat(result.getRootDirectory()).doesNotExist(); } + @Test + void invokeProjectStructureGenerationWithCustomAssetGenerator(@TempDir Path directory) { + WebProjectRequest webRequest = new WebProjectRequest(); + webRequest.initialize(metadata); + webRequest.setGroupId("org.acme.test"); + webRequest.setType("maven-project"); + ProjectGenerationResult result = new ProjectGenerationInvoker(this.context, this.eventPublisher, + new DefaultProjectRequestToDescriptionConverter()) { + @Override + protected ProjectAssetGenerator getProjectAssetGenerator(ProjectDescription description) { + assertThat(description.getBuildSystem()).isInstanceOf(MavenBuildSystem.class); + assertThat(description.getGroupId()).isEqualTo("org.acme.test"); + return (context) -> directory; + } + }.invokeProjectStructureGeneration(webRequest); + assertThat(result.getRootDirectory()).isSameAs(directory); + assertThat(result.getRootDirectory()).isEmptyDirectory(); + verifyProjectSuccessfulEventFor(webRequest); + } + private void setupContext() { InitializrMetadataProvider metadataProvider = mock(InitializrMetadataProvider.class); given(metadataProvider.get()).willReturn(InitializrMetadataTestBuilder.withDefaults().build());