mirror of
https://gitee.com/dcren/initializr.git
synced 2026-02-25 21:22:58 +08:00
Allow to customize the ProjectAssetGenerator to use
Closes gh-1116
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user