Skip to content

Commit 55e15c2

Browse files
authored
RND-37 (#7)
1 parent 4d9dbc8 commit 55e15c2

8 files changed

Lines changed: 357 additions & 0 deletions

‎README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,13 @@ Java Sandbox for R&D
33

44
# Requirements:
55
- Java 8 or up to and including Java 19
6+
7+
8+
# Notes for further development
9+
As described in https://docs.spring.io/initializr/docs/current-SNAPSHOT/reference/html/#create-instance-advanced-config-custom-project-request there is a possibility to customize spring initializr.
10+
11+
In com.intellias.devsandbox.playground package initial attempt for this is made.
12+
Via config([Config.java](src%2Fmain%2Fjava%2Fcom%2Fintellias%2Fdevsandbox%2Fplayground%2FConfig.java)) we define custom controller bean([CustomProjectGenerationController.java](src%2Fmain%2Fjava%2Fcom%2Fintellias%2Fdevsandbox%2Fplayground%2FCustomProjectGenerationController.java)), that replaces default one. For further customization in project generation flow [CustomProjectGenerationInvoker.java](src%2Fmain%2Fjava%2Fcom%2Fintellias%2Fdevsandbox%2Fplayground%2FCustomProjectGenerationInvoker.java) was introduced. Right now there is no implementation, but it can be used for invoking custom ProjectAssetGenerator for example.
13+
14+
Abstractions that can help further customization :
15+
* io.spring.initializr.generator.project.contributor.ProjectContributor
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.intellias.devsandbox.playground;
2+
3+
import io.spring.initializr.metadata.InitializrMetadataProvider;
4+
import io.spring.initializr.web.project.ProjectGenerationInvoker;
5+
import org.springframework.context.ApplicationContext;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
@Configuration
10+
public class Config {
11+
@Bean
12+
public CustomProjectGenerationController projectGenerationController(InitializrMetadataProvider metadataProvider,
13+
ApplicationContext applicationContext) {
14+
CustomProjectGenerationInvoker projectGenerationInvoker = new CustomProjectGenerationInvoker(
15+
applicationContext, new CustomProjectRequestToDescriptionConverter());
16+
return new CustomProjectGenerationController(metadataProvider, projectGenerationInvoker);
17+
}
18+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.intellias.devsandbox.playground;
2+
3+
import io.spring.initializr.generator.project.ProjectDescription;
4+
5+
public interface CustomProjectDescription extends ProjectDescription {
6+
7+
String getTestAttribute();
8+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.intellias.devsandbox.playground;
2+
3+
import io.spring.initializr.metadata.InitializrMetadataProvider;
4+
import io.spring.initializr.web.controller.ProjectGenerationController;
5+
import io.spring.initializr.web.project.ProjectGenerationInvoker;
6+
7+
import java.util.Map;
8+
9+
10+
public class CustomProjectGenerationController extends ProjectGenerationController<CustomProjectRequest> {
11+
12+
public CustomProjectGenerationController(InitializrMetadataProvider metadataProvider,
13+
ProjectGenerationInvoker<CustomProjectRequest> projectGenerationInvoker) {
14+
super(metadataProvider, projectGenerationInvoker);
15+
}
16+
17+
@Override
18+
public CustomProjectRequest projectRequest(Map<String, String> headers) {
19+
return null;
20+
}
21+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.intellias.devsandbox.playground;
2+
3+
import io.spring.initializr.generator.project.ProjectAssetGenerator;
4+
import io.spring.initializr.generator.project.ProjectDescription;
5+
import io.spring.initializr.web.project.ProjectGenerationInvoker;
6+
import io.spring.initializr.web.project.ProjectGenerationResult;
7+
import io.spring.initializr.web.project.ProjectRequestToDescriptionConverter;
8+
import org.springframework.context.ApplicationContext;
9+
import org.springframework.context.ApplicationEventPublisher;
10+
11+
import java.nio.file.Path;
12+
13+
public class CustomProjectGenerationInvoker extends ProjectGenerationInvoker<CustomProjectRequest> {
14+
15+
public CustomProjectGenerationInvoker(ApplicationContext parentApplicationContext, ProjectRequestToDescriptionConverter<CustomProjectRequest> requestConverter) {
16+
super(parentApplicationContext, requestConverter);
17+
}
18+
19+
protected CustomProjectGenerationInvoker(ApplicationContext parentApplicationContext, ApplicationEventPublisher eventPublisher, ProjectRequestToDescriptionConverter<CustomProjectRequest> requestConverter) {
20+
super(parentApplicationContext, eventPublisher, requestConverter);
21+
}
22+
23+
@Override
24+
public ProjectGenerationResult invokeProjectStructureGeneration(CustomProjectRequest request) {
25+
return super.invokeProjectStructureGeneration(request);
26+
}
27+
28+
@Override
29+
protected ProjectAssetGenerator<Path> getProjectAssetGenerator(ProjectDescription description) {
30+
return super.getProjectAssetGenerator(description);
31+
}
32+
33+
@Override
34+
public byte[] invokeBuildGeneration(CustomProjectRequest request) {
35+
return super.invokeBuildGeneration(request);
36+
}
37+
38+
@Override
39+
public Path createDistributionFile(Path dir, String extension) {
40+
return super.createDistributionFile(dir, extension);
41+
}
42+
43+
@Override
44+
public void cleanTempFiles(Path dir) {
45+
super.cleanTempFiles(dir);
46+
}
47+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.intellias.devsandbox.playground;
2+
3+
import io.spring.initializr.web.project.ProjectRequest;
4+
5+
public class CustomProjectRequest extends ProjectRequest {
6+
7+
private String testAttribute;
8+
9+
public String getTestAttribute() {
10+
return testAttribute;
11+
}
12+
13+
public void setTestAttribute(String testAttribute) {
14+
this.testAttribute = testAttribute;
15+
}
16+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.intellias.devsandbox.playground;
2+
3+
import io.spring.initializr.generator.buildsystem.BuildSystem;
4+
import io.spring.initializr.generator.language.Language;
5+
import io.spring.initializr.generator.packaging.Packaging;
6+
import io.spring.initializr.generator.version.Version;
7+
import io.spring.initializr.metadata.Dependency;
8+
import io.spring.initializr.metadata.InitializrMetadata;
9+
import io.spring.initializr.metadata.Type;
10+
import io.spring.initializr.metadata.support.MetadataBuildItemMapper;
11+
import io.spring.initializr.web.project.InvalidProjectRequestException;
12+
import io.spring.initializr.web.project.ProjectRequest;
13+
import io.spring.initializr.web.project.ProjectRequestToDescriptionConverter;
14+
15+
import java.util.List;
16+
import java.util.stream.Collectors;
17+
18+
public class CustomProjectRequestToDescriptionConverter implements ProjectRequestToDescriptionConverter<CustomProjectRequest> {
19+
20+
@Override
21+
public CustomProjectDescription convert(CustomProjectRequest request, InitializrMetadata metadata) {
22+
MutableCustomProjectDescription description = new MutableCustomProjectDescription();
23+
24+
Version platformVersion = Version.parse(request.getBootVersion());
25+
List<Dependency> resolvedDependencies = getResolvedDependencies(request, platformVersion, metadata);
26+
validateDependencyRange(platformVersion, resolvedDependencies);
27+
28+
description.setApplicationName(request.getApplicationName());
29+
description.setArtifactId(request.getArtifactId());
30+
description.setBaseDirectory(request.getBaseDir());
31+
description.setBuildSystem(getBuildSystem(request, metadata));
32+
description.setDescription(request.getDescription());
33+
description.setGroupId(request.getGroupId());
34+
description.setLanguage(Language.forId(request.getLanguage(), request.getJavaVersion()));
35+
description.setName(request.getName());
36+
description.setPackageName(request.getPackageName());
37+
description.setPackaging(Packaging.forId(request.getPackaging()));
38+
description.setPlatformVersion(platformVersion);
39+
description.setVersion(request.getVersion());
40+
resolvedDependencies.forEach((dependency) -> description.addDependency(dependency.getId(),
41+
MetadataBuildItemMapper.toDependency(dependency)));
42+
43+
description.setTestAttribute(request.getTestAttribute());
44+
45+
return description;
46+
}
47+
48+
private BuildSystem getBuildSystem(ProjectRequest request, InitializrMetadata metadata) {
49+
Type typeFromMetadata = metadata.getTypes().get(request.getType());
50+
return BuildSystem.forId(typeFromMetadata.getTags().get("build"));
51+
}
52+
53+
private List<Dependency> getResolvedDependencies(ProjectRequest request, Version platformVersion,
54+
InitializrMetadata metadata) {
55+
List<String> depIds = request.getDependencies();
56+
return depIds.stream().map((it) -> {
57+
Dependency dependency = metadata.getDependencies().get(it);
58+
return dependency.resolve(platformVersion);
59+
}).collect(Collectors.toList());
60+
}
61+
62+
private void validateDependencyRange(Version platformVersion, List<Dependency> resolvedDependencies) {
63+
resolvedDependencies.forEach((dep) -> {
64+
if (!dep.match(platformVersion)) {
65+
throw new InvalidProjectRequestException(
66+
"Dependency '" + dep.getId() + "' is not compatible " + "with Spring Boot " + platformVersion);
67+
}
68+
});
69+
}
70+
}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package com.intellias.devsandbox.playground;
2+
3+
import io.spring.initializr.generator.buildsystem.BuildSystem;
4+
import io.spring.initializr.generator.buildsystem.Dependency;
5+
import io.spring.initializr.generator.language.Language;
6+
import io.spring.initializr.generator.packaging.Packaging;
7+
import io.spring.initializr.generator.version.Version;
8+
9+
import java.util.LinkedHashMap;
10+
import java.util.Map;
11+
12+
public class MutableCustomProjectDescription implements CustomProjectDescription {
13+
14+
private Version platformVersion;
15+
16+
private BuildSystem buildSystem;
17+
18+
private Packaging packaging;
19+
20+
private Language language;
21+
22+
private final Map<String, Dependency> requestedDependencies = new LinkedHashMap<>();
23+
24+
private String groupId;
25+
26+
private String artifactId;
27+
28+
private String version;
29+
30+
private String name;
31+
32+
private String description;
33+
34+
private String applicationName;
35+
36+
private String packageName;
37+
38+
private String baseDirectory;
39+
40+
private String testAttribute;
41+
42+
@Override
43+
public Version getPlatformVersion() {
44+
return platformVersion;
45+
}
46+
47+
public void setPlatformVersion(Version platformVersion) {
48+
this.platformVersion = platformVersion;
49+
}
50+
51+
@Override
52+
public BuildSystem getBuildSystem() {
53+
return buildSystem;
54+
}
55+
56+
public void setBuildSystem(BuildSystem buildSystem) {
57+
this.buildSystem = buildSystem;
58+
}
59+
60+
@Override
61+
public Packaging getPackaging() {
62+
return packaging;
63+
}
64+
65+
public void setPackaging(Packaging packaging) {
66+
this.packaging = packaging;
67+
}
68+
69+
@Override
70+
public Language getLanguage() {
71+
return language;
72+
}
73+
74+
public void setLanguage(Language language) {
75+
this.language = language;
76+
}
77+
78+
@Override
79+
public Map<String, Dependency> getRequestedDependencies() {
80+
return requestedDependencies;
81+
}
82+
83+
@Override
84+
public String getGroupId() {
85+
return groupId;
86+
}
87+
88+
public void setGroupId(String groupId) {
89+
this.groupId = groupId;
90+
}
91+
92+
@Override
93+
public String getArtifactId() {
94+
return artifactId;
95+
}
96+
97+
public void setArtifactId(String artifactId) {
98+
this.artifactId = artifactId;
99+
}
100+
101+
@Override
102+
public String getVersion() {
103+
return version;
104+
}
105+
106+
public void setVersion(String version) {
107+
this.version = version;
108+
}
109+
110+
@Override
111+
public String getName() {
112+
return name;
113+
}
114+
115+
public void setName(String name) {
116+
this.name = name;
117+
}
118+
119+
@Override
120+
public String getDescription() {
121+
return description;
122+
}
123+
124+
public void setDescription(String description) {
125+
this.description = description;
126+
}
127+
128+
@Override
129+
public String getApplicationName() {
130+
return applicationName;
131+
}
132+
133+
public void setApplicationName(String applicationName) {
134+
this.applicationName = applicationName;
135+
}
136+
137+
@Override
138+
public String getPackageName() {
139+
return packageName;
140+
}
141+
142+
public void setPackageName(String packageName) {
143+
this.packageName = packageName;
144+
}
145+
146+
@Override
147+
public String getBaseDirectory() {
148+
return baseDirectory;
149+
}
150+
151+
public void setBaseDirectory(String baseDirectory) {
152+
this.baseDirectory = baseDirectory;
153+
}
154+
155+
@Override
156+
public String getTestAttribute() {
157+
return testAttribute;
158+
}
159+
160+
public void setTestAttribute(String testAttribute) {
161+
this.testAttribute = testAttribute;
162+
}
163+
164+
public Dependency addDependency(String id, Dependency dependency) {
165+
return this.requestedDependencies.put(id, dependency);
166+
}
167+
}

0 commit comments

Comments
 (0)