Skip to content

Commit 6db9d41

Browse files
committed
Allow customization of fields and template variables
Closes gh-1626
1 parent 274d842 commit 6db9d41

File tree

5 files changed

+124
-42
lines changed

5 files changed

+124
-42
lines changed

initializr-web/src/main/java/io/spring/initializr/web/mapper/DependencyMetadataV21JsonMapper.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,33 @@ public class DependencyMetadataV21JsonMapper implements DependencyMetadataJsonMa
3939

4040
@Override
4141
public String write(DependencyMetadata metadata) {
42-
ObjectNode json = nodeFactory.objectNode();
43-
json.put("bootVersion", metadata.getBootVersion().toString());
44-
json.set("dependencies",
42+
ObjectNode parent = nodeFactory.objectNode();
43+
parent.put("bootVersion", metadata.getBootVersion().toString());
44+
parent.set("dependencies",
4545
mapNode(metadata.getDependencies()
4646
.entrySet()
4747
.stream()
4848
.collect(Collectors.toMap(Map.Entry::getKey, (entry) -> mapDependency(entry.getValue())))));
49-
json.set("repositories",
49+
parent.set("repositories",
5050
mapNode(metadata.getRepositories()
5151
.entrySet()
5252
.stream()
5353
.collect(Collectors.toMap(Map.Entry::getKey, (entry) -> mapRepository(entry.getValue())))));
54-
json.set("boms",
54+
parent.set("boms",
5555
mapNode(metadata.getBoms()
5656
.entrySet()
5757
.stream()
5858
.collect(Collectors.toMap(Map.Entry::getKey, (entry) -> mapBom(entry.getValue())))));
59-
return json.toString();
59+
customizeParent(parent, metadata);
60+
return parent.toString();
61+
}
62+
63+
/**
64+
* Customizes the parent.
65+
* @param parent the parent
66+
* @param metadata the metadata
67+
*/
68+
protected void customizeParent(ObjectNode parent, DependencyMetadata metadata) {
6069
}
6170

6271
private static JsonNode mapDependency(Dependency dep) {

initializr-web/src/main/java/io/spring/initializr/web/mapper/InitializrMetadataV21JsonMapper.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package io.spring.initializr.web.mapper;
1818

19+
import java.util.Collection;
20+
import java.util.Collections;
1921
import java.util.List;
2022

2123
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -41,7 +43,19 @@ public class InitializrMetadataV21JsonMapper extends InitializrMetadataV2JsonMap
4143

4244
private final TemplateVariables dependenciesVariables;
4345

46+
/**
47+
* Create a new instance.
48+
*/
4449
public InitializrMetadataV21JsonMapper() {
50+
this(Collections.emptyList());
51+
}
52+
53+
/**
54+
* Create a new instance using the additional template variables.
55+
* @param additionalTemplateVariables the additional template variables
56+
*/
57+
public InitializrMetadataV21JsonMapper(Collection<? extends TemplateVariable> additionalTemplateVariables) {
58+
super(additionalTemplateVariables);
4559
this.dependenciesVariables = new TemplateVariables(
4660
new TemplateVariable("bootVersion", TemplateVariable.VariableType.REQUEST_PARAM));
4761
}

initializr-web/src/main/java/io/spring/initializr/web/mapper/InitializrMetadataV22JsonMapper.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@
1616

1717
package io.spring.initializr.web.mapper;
1818

19+
import java.util.Collection;
20+
import java.util.Collections;
21+
1922
import io.spring.initializr.generator.version.Version;
2023
import io.spring.initializr.generator.version.VersionRange;
2124

25+
import org.springframework.hateoas.TemplateVariable;
26+
2227
/**
2328
* A {@link InitializrMetadataJsonMapper} handling the metadata format for v2.2
2429
* <p>
@@ -29,6 +34,21 @@
2934
*/
3035
public class InitializrMetadataV22JsonMapper extends InitializrMetadataV21JsonMapper {
3136

37+
/**
38+
* Create a new instance.
39+
*/
40+
public InitializrMetadataV22JsonMapper() {
41+
this(Collections.emptyList());
42+
}
43+
44+
/**
45+
* Create a new instance using the additional template variables.
46+
* @param additionalTemplateVariables the additional template variables
47+
*/
48+
public InitializrMetadataV22JsonMapper(Collection<? extends TemplateVariable> additionalTemplateVariables) {
49+
super(additionalTemplateVariables);
50+
}
51+
3252
@Override
3353
protected String formatVersion(String versionId) {
3454
return versionId;

initializr-web/src/main/java/io/spring/initializr/web/mapper/InitializrMetadataV2JsonMapper.java

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
package io.spring.initializr.web.mapper;
1818

19+
import java.util.ArrayList;
20+
import java.util.Collection;
21+
import java.util.Collections;
1922
import java.util.List;
2023
import java.util.function.Function;
2124
import java.util.stream.Collectors;
@@ -49,26 +52,40 @@
4952
*
5053
* @author Stephane Nicoll
5154
* @author Guillaume Gerbaud
55+
* @author Moritz Halbritter
5256
*/
5357
public class InitializrMetadataV2JsonMapper implements InitializrMetadataJsonMapper {
5458

5559
private static final JsonNodeFactory nodeFactory = JsonNodeFactory.instance;
5660

5761
private final TemplateVariables templateVariables;
5862

63+
/**
64+
* Create a new instance.
65+
*/
5966
public InitializrMetadataV2JsonMapper() {
60-
this.templateVariables = new TemplateVariables(
61-
new TemplateVariable("dependencies", TemplateVariable.VariableType.REQUEST_PARAM),
62-
new TemplateVariable("packaging", TemplateVariable.VariableType.REQUEST_PARAM),
63-
new TemplateVariable("javaVersion", TemplateVariable.VariableType.REQUEST_PARAM),
64-
new TemplateVariable("language", TemplateVariable.VariableType.REQUEST_PARAM),
65-
new TemplateVariable("bootVersion", TemplateVariable.VariableType.REQUEST_PARAM),
66-
new TemplateVariable("groupId", TemplateVariable.VariableType.REQUEST_PARAM),
67-
new TemplateVariable("artifactId", TemplateVariable.VariableType.REQUEST_PARAM),
68-
new TemplateVariable("version", TemplateVariable.VariableType.REQUEST_PARAM),
69-
new TemplateVariable("name", TemplateVariable.VariableType.REQUEST_PARAM),
70-
new TemplateVariable("description", TemplateVariable.VariableType.REQUEST_PARAM),
71-
new TemplateVariable("packageName", TemplateVariable.VariableType.REQUEST_PARAM));
67+
this(Collections.emptyList());
68+
}
69+
70+
/**
71+
* Create a new instance using the additional template variables.
72+
* @param additionalTemplateVariables the additional template variables
73+
*/
74+
public InitializrMetadataV2JsonMapper(Collection<? extends TemplateVariable> additionalTemplateVariables) {
75+
List<TemplateVariable> templateVariables = new ArrayList<>();
76+
templateVariables.add(new TemplateVariable("dependencies", TemplateVariable.VariableType.REQUEST_PARAM));
77+
templateVariables.add(new TemplateVariable("packaging", TemplateVariable.VariableType.REQUEST_PARAM));
78+
templateVariables.add(new TemplateVariable("javaVersion", TemplateVariable.VariableType.REQUEST_PARAM));
79+
templateVariables.add(new TemplateVariable("language", TemplateVariable.VariableType.REQUEST_PARAM));
80+
templateVariables.add(new TemplateVariable("bootVersion", TemplateVariable.VariableType.REQUEST_PARAM));
81+
templateVariables.add(new TemplateVariable("groupId", TemplateVariable.VariableType.REQUEST_PARAM));
82+
templateVariables.add(new TemplateVariable("artifactId", TemplateVariable.VariableType.REQUEST_PARAM));
83+
templateVariables.add(new TemplateVariable("version", TemplateVariable.VariableType.REQUEST_PARAM));
84+
templateVariables.add(new TemplateVariable("name", TemplateVariable.VariableType.REQUEST_PARAM));
85+
templateVariables.add(new TemplateVariable("description", TemplateVariable.VariableType.REQUEST_PARAM));
86+
templateVariables.add(new TemplateVariable("packageName", TemplateVariable.VariableType.REQUEST_PARAM));
87+
templateVariables.addAll(additionalTemplateVariables);
88+
this.templateVariables = new TemplateVariables(templateVariables);
7289
}
7390

7491
protected JsonNodeFactory nodeFactory() {
@@ -77,21 +94,30 @@ protected JsonNodeFactory nodeFactory() {
7794

7895
@Override
7996
public String write(InitializrMetadata metadata, String appUrl) {
80-
ObjectNode delegate = nodeFactory.objectNode();
81-
links(delegate, metadata.getTypes().getContent(), appUrl);
82-
dependencies(delegate, metadata.getDependencies());
83-
type(delegate, metadata.getTypes());
84-
singleSelect(delegate, metadata.getPackagings());
85-
singleSelect(delegate, metadata.getJavaVersions());
86-
singleSelect(delegate, metadata.getLanguages());
87-
singleSelect(delegate, metadata.getBootVersions(), this::mapVersionMetadata, this::formatVersion);
88-
text(delegate, metadata.getGroupId());
89-
text(delegate, metadata.getArtifactId());
90-
text(delegate, metadata.getVersion());
91-
text(delegate, metadata.getName());
92-
text(delegate, metadata.getDescription());
93-
text(delegate, metadata.getPackageName());
94-
return delegate.toString();
97+
ObjectNode parent = nodeFactory.objectNode();
98+
links(parent, metadata.getTypes().getContent(), appUrl);
99+
dependencies(parent, metadata.getDependencies());
100+
type(parent, metadata.getTypes());
101+
singleSelect(parent, metadata.getPackagings());
102+
singleSelect(parent, metadata.getJavaVersions());
103+
singleSelect(parent, metadata.getLanguages());
104+
singleSelect(parent, metadata.getBootVersions(), this::mapVersionMetadata, this::formatVersion);
105+
text(parent, metadata.getGroupId());
106+
text(parent, metadata.getArtifactId());
107+
text(parent, metadata.getVersion());
108+
text(parent, metadata.getName());
109+
text(parent, metadata.getDescription());
110+
text(parent, metadata.getPackageName());
111+
customizeParent(parent, metadata);
112+
return parent.toString();
113+
}
114+
115+
/**
116+
* Customizes the parent.
117+
* @param parent the parent
118+
* @param metadata the metadata
119+
*/
120+
protected void customizeParent(ObjectNode parent, InitializrMetadata metadata) {
95121
}
96122

97123
protected ObjectNode links(ObjectNode parent, List<Type> types, String appUrl) {

initializr-web/src/test/java/io/spring/initializr/web/mapper/InitializrMetadataV22JsonMapperTests.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package io.spring.initializr.web.mapper;
1818

19+
import java.util.List;
20+
1921
import com.fasterxml.jackson.core.JsonProcessingException;
2022
import com.fasterxml.jackson.databind.JsonNode;
2123
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -25,6 +27,8 @@
2527
import io.spring.initializr.metadata.InitializrMetadata;
2628
import org.junit.jupiter.api.Test;
2729

30+
import org.springframework.hateoas.TemplateVariable;
31+
2832
import static org.assertj.core.api.Assertions.assertThat;
2933

3034
/**
@@ -73,18 +77,27 @@ void platformVersionUsingSemVerUIsNotChanged() throws JsonProcessingException {
7377
assertVersionMetadata(versions.get(2), "2.4.2", "2.4.2");
7478
}
7579

80+
@Test
81+
void shouldAllowCustomization() throws JsonProcessingException {
82+
InitializrMetadataJsonMapper mapper = new InitializrMetadataV22JsonMapper(
83+
List.of(TemplateVariable.requestParameter("testParameter"))) {
84+
@Override
85+
protected void customizeParent(ObjectNode parent, InitializrMetadata metadata) {
86+
parent.put("testField", "testValue");
87+
}
88+
};
89+
String json = mapper.write(
90+
new InitializrMetadataTestBuilder().addType("id", true, "action", "build", "dialect", "format").build(),
91+
"http://localhost");
92+
JsonNode result = objectMapper.readTree(json);
93+
assertThat(result.get("testField").asText()).isEqualTo("testValue");
94+
assertThat(result.get("_links").get("id").get("href").asText()).isEqualTo(
95+
"http://localhost/action?type=id{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName,testParameter}");
96+
}
97+
7698
private void assertVersionMetadata(JsonNode node, String id, String name) {
7799
assertThat(node.get("id").textValue()).isEqualTo(id);
78100
assertThat(node.get("name").textValue()).isEqualTo(name);
79101
}
80102

81-
private Object get(JsonNode result, String path) {
82-
String[] nodes = path.split("\\.");
83-
for (int i = 0; i < nodes.length - 1; i++) {
84-
String node = nodes[i];
85-
result = result.path(node);
86-
}
87-
return result.get(nodes[nodes.length - 1]).textValue();
88-
}
89-
90103
}

0 commit comments

Comments
 (0)