Allow to customize the ProjectAssetGenerator to use

Closes gh-1116
This commit is contained in:
Stephane Nicoll
2020-11-16 09:34:37 +01:00
parent e9b3ca74c3
commit d18dcab14f
2 changed files with 40 additions and 3 deletions

View File

@@ -47,6 +47,7 @@ import org.springframework.util.FileSystemUtils;
*
* @param <R> the concrete {@link ProjectRequest} type
* @author Madhura Bhave
* @see ProjectAssetGenerator
*/
public class ProjectGenerationInvoker<R extends ProjectRequest> {
@@ -56,6 +57,8 @@ public class ProjectGenerationInvoker<R extends ProjectRequest> {
private final ProjectRequestToDescriptionConverter<R> requestConverter;
private final ProjectAssetGenerator<Path> projectAssetGenerator = new DefaultProjectAssetGenerator();
private final transient Map<Path, List<Path>> temporaryFiles = new ConcurrentHashMap<>();
public ProjectGenerationInvoker(ApplicationContext parentApplicationContext,
@@ -82,7 +85,8 @@ public class ProjectGenerationInvoker<R extends ProjectRequest> {
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<R extends ProjectRequest> {
}
}
private ProjectAssetGenerator<ProjectGenerationResult> generateProject(R request) {
private ProjectAssetGenerator<ProjectGenerationResult> 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<Path> 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

View File

@@ -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<ProjectRequest>(this.context, this.eventPublisher,
new DefaultProjectRequestToDescriptionConverter()) {
@Override
protected ProjectAssetGenerator<Path> 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());