Skip to content

Commit 8730af0

Browse files
committed
Fix value sanitization for immutable collections #1385
1 parent 8d122e4 commit 8730af0

12 files changed

+83
-83
lines changed

src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@
2020
import java.io.IOException;
2121
import java.util.ArrayList;
2222
import java.util.Collection;
23+
import java.util.HashMap;
24+
import java.util.HashSet;
2325
import java.util.List;
2426
import java.util.Map;
27+
import java.util.Set;
2528
import java.util.stream.Collectors;
2629

2730
import static java.util.stream.Collectors.toList;
@@ -90,38 +93,45 @@ protected GraphQLCodegen(List<String> schemas,
9093

9194
initDefaultValues(mappingConfig);
9295
validateConfigs(mappingConfig);
93-
sanitizeValues(mappingConfig);
96+
sanitize(mappingConfig);
9497
}
9598

96-
private static void sanitizeValues(MappingConfig mappingConfig) {
99+
private static void sanitize(MappingConfig mappingConfig) {
97100
mappingConfig.setModelValidationAnnotation(
98101
Utils.replaceLeadingAtSign(mappingConfig.getModelValidationAnnotation()));
99-
100-
if (mappingConfig.getResolverArgumentAnnotations() != null) {
101-
mappingConfig.setResolverArgumentAnnotations(mappingConfig.getResolverArgumentAnnotations().stream()
102-
.map(Utils::replaceLeadingAtSign).collect(Collectors.toSet()));
102+
mappingConfig.setResolverArgumentAnnotations(sanitizeSet(mappingConfig.getResolverArgumentAnnotations()));
103+
mappingConfig.setParametrizedResolverAnnotations(
104+
sanitizeSet(mappingConfig.getParametrizedResolverAnnotations()));
105+
mappingConfig.setCustomAnnotationsMapping(sanitizeMap(mappingConfig.getCustomAnnotationsMapping()));
106+
mappingConfig.setDirectiveAnnotationsMapping(sanitizeMap(mappingConfig.getDirectiveAnnotationsMapping()));
107+
if (mappingConfig.getCustomTypesMapping() != null) {
108+
mappingConfig.setCustomTypesMapping(new HashMap<>(mappingConfig.getCustomTypesMapping()));
103109
}
104-
if (mappingConfig.getParametrizedResolverAnnotations() != null) {
105-
mappingConfig.setParametrizedResolverAnnotations(mappingConfig.getParametrizedResolverAnnotations().stream()
106-
.map(Utils::replaceLeadingAtSign).collect(Collectors.toSet()));
110+
if (mappingConfig.getCustomTemplates() != null) {
111+
mappingConfig.setCustomTemplates(new HashMap<>(mappingConfig.getCustomTemplates()));
107112
}
113+
}
108114

109-
Map<String, List<String>> customAnnotationsMapping = mappingConfig.getCustomAnnotationsMapping();
110-
if (customAnnotationsMapping != null) {
111-
for (Map.Entry<String, List<String>> entry : customAnnotationsMapping.entrySet()) {
112-
if (entry.getValue() != null) {
113-
entry.setValue(entry.getValue().stream().map(Utils::replaceLeadingAtSign).collect(toList()));
114-
}
115-
}
115+
private static Set<String> sanitizeSet(Set<String> originalSet) {
116+
if (originalSet == null) {
117+
return new HashSet<>();
118+
}
119+
return originalSet.stream().map(Utils::replaceLeadingAtSign).collect(Collectors.toSet());
120+
}
121+
122+
private static Map<String, List<String>> sanitizeMap(Map<String, List<String>> multiValueMap) {
123+
if (multiValueMap == null) {
124+
return new HashMap<>();
116125
}
117-
Map<String, List<String>> directiveAnnotationsMapping = mappingConfig.getDirectiveAnnotationsMapping();
118-
if (directiveAnnotationsMapping != null) {
119-
for (Map.Entry<String, List<String>> entry : directiveAnnotationsMapping.entrySet()) {
120-
if (entry.getValue() != null) {
121-
entry.setValue(entry.getValue().stream().map(Utils::replaceLeadingAtSign).collect(toList()));
122-
}
126+
Map<String, List<String>> sanitizedMultiValueMap = new HashMap<>(multiValueMap.size());
127+
for (Map.Entry<String, List<String>> entry : multiValueMap.entrySet()) {
128+
List<String> sanitizedValues = null;
129+
if (entry.getValue() != null) {
130+
sanitizedValues = entry.getValue().stream().map(Utils::replaceLeadingAtSign).collect(toList());
123131
}
132+
sanitizedMultiValueMap.put(entry.getKey(), sanitizedValues);
124133
}
134+
return sanitizedMultiValueMap;
125135
}
126136

127137
protected void initDefaultValues(MappingConfig mappingConfig) {

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,10 @@ void cleanup() {
4646

4747
@Test
4848
void generate_CustomAnnotationMappings() throws Exception {
49-
mappingConfig.setCustomTypesMapping(new HashMap<>(
50-
singletonMap("Event.createdDateTime", "org.joda.time.DateTime")));
51-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime",
49+
mappingConfig.setCustomTypesMapping(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"));
50+
mappingConfig.setCustomAnnotationsMapping(singletonMap("Event.createdDateTime",
5251
singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
53-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
52+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
5453

5554
generate("src/test/resources/schemas/test.graphqls");
5655

@@ -63,10 +62,10 @@ void generate_CustomAnnotationMappings() throws Exception {
6362

6463
@Test
6564
void generate_CustomAnnotationMappings_Type() throws Exception {
66-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
67-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("DateTime",
65+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "org.joda.time.DateTime"));
66+
mappingConfig.setCustomAnnotationsMapping(singletonMap("DateTime",
6867
singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
69-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
68+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
7069

7170
generate("src/test/resources/schemas/test.graphqls");
7271

@@ -92,10 +91,10 @@ void generate_CustomAnnotationMappings_Input() throws Exception {
9291

9392
@Test
9493
void generate_CustomAnnotationMappings_Regexp() throws Exception {
95-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
96-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Date.*",
94+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "org.joda.time.DateTime"));
95+
mappingConfig.setCustomAnnotationsMapping(singletonMap("Date.*",
9796
singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
98-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
97+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
9998

10099
generate("src/test/resources/schemas/test.graphqls");
101100

@@ -108,10 +107,10 @@ void generate_CustomAnnotationMappings_Regexp() throws Exception {
108107

109108
@Test
110109
void generate_CustomAnnotationMappings_FieldType() throws Exception {
111-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
112-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime",
110+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "org.joda.time.DateTime"));
111+
mappingConfig.setCustomAnnotationsMapping(singletonMap("Event.createdDateTime",
113112
singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
114-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
113+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
115114

116115
generate("src/test/resources/schemas/test.graphqls");
117116

@@ -124,10 +123,10 @@ void generate_CustomAnnotationMappings_FieldType() throws Exception {
124123

125124
@Test
126125
void generate_CustomAnnotationMappings_FieldType_Regexp() throws Exception {
127-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
128-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event..*Date.*",
126+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "org.joda.time.DateTime"));
127+
mappingConfig.setCustomAnnotationsMapping(singletonMap("Event..*Date.*",
129128
singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
130-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
129+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
131130

132131
generate("src/test/resources/schemas/test.graphqls");
133132

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomScalarMappingTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void cleanup() {
3838

3939
@Test
4040
void generate_CustomTypeMapping_WholeScalar() throws Exception {
41-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("ZonedDateTime", "String")));
41+
mappingConfig.setCustomTypesMapping(singletonMap("ZonedDateTime", "String"));
4242

4343
generate("src/test/resources/schemas/date-scalar.graphqls");
4444

@@ -74,7 +74,7 @@ void generate_CustomTypeMapping_ScalarOnQueryOnly() throws Exception {
7474
@Test
7575
void generate_CustomTypeMapping_ForExtensionProperty() throws Exception {
7676
mappingConfig.setGenerateExtensionFieldsResolvers(true);
77-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("External", "com.example.External")));
77+
mappingConfig.setCustomTypesMapping(singletonMap("External", "com.example.External"));
7878
mappingConfig.setGenerateClient(false);
7979

8080
generate("src/test/resources/schemas/external-type-extend.graphqls");

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.io.File;
1111
import java.io.IOException;
1212
import java.util.Arrays;
13-
import java.util.HashMap;
1413
import java.util.List;
1514
import java.util.Objects;
1615

@@ -87,7 +86,7 @@ void generate_CheckFiles_WithPrefixSuffix() throws Exception {
8786

8887
@Test
8988
void generate_CheckFiles_OnLongDefault() throws Exception {
90-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("Long", "java.lang.Long")));
89+
mappingConfig.setCustomTypesMapping(singletonMap("Long", "java.lang.Long"));
9190
mappingConfig.setModelNameSuffix("DTO");
9291

9392
generate("src/test/resources/schemas/defaults-with-Long.graphqls");

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@
1212
import java.io.File;
1313
import java.io.IOException;
1414
import java.nio.file.Paths;
15-
import java.util.Collections;
16-
import java.util.HashMap;
1715
import java.util.Objects;
1816

1917
import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements;
2018
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
2119
import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName;
20+
import static java.util.Collections.singletonMap;
2221

2322
@ExtendWith(MaxQueryTokensExtension.class)
2423
class GraphQLCodegenOptionalTest {
@@ -106,7 +105,7 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception {
106105
*/
107106
@Test
108107
void generate_ObjectsInsteadOfPrimitives() throws Exception {
109-
mappingConfig.setCustomTypesMapping(new HashMap<>(Collections.singletonMap("Int!", "Integer")));
108+
mappingConfig.setCustomTypesMapping(singletonMap("Int!", "Integer"));
110109
schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls");
111110

112111
generate();

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import java.io.IOException;
1515
import java.nio.file.NoSuchFileException;
1616
import java.util.Arrays;
17-
import java.util.HashMap;
1817
import java.util.List;
1918
import java.util.Objects;
2019

@@ -93,7 +92,7 @@ void generate_NoBuilder() throws Exception {
9392

9493
@Test
9594
void generate_CustomMappings() throws Exception {
96-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "java.util.Date")));
95+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "java.util.Date"));
9796

9897
generate("src/test/resources/schemas/test.graphqls");
9998

@@ -103,8 +102,7 @@ void generate_CustomMappings() throws Exception {
103102

104103
@Test
105104
void generate_CustomMappings_Nested() throws Exception {
106-
mappingConfig
107-
.setCustomTypesMapping(new HashMap<>(singletonMap("EventProperty.intVal", "java.math.BigInteger")));
105+
mappingConfig.setCustomTypesMapping(singletonMap("EventProperty.intVal", "java.math.BigInteger"));
108106

109107
generate("src/test/resources/schemas/test.graphqls");
110108

src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenAnnotationsTest.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
import java.io.File;
1414
import java.io.IOException;
15-
import java.util.HashMap;
1615
import java.util.Objects;
1716

1817
import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements;
@@ -43,11 +42,10 @@ void cleanup() {
4342

4443
@Test
4544
void generate_CustomAnnotationMappings() throws Exception {
46-
mappingConfig.setCustomTypesMapping(new HashMap<>(
47-
singletonMap("Event.createdDateTime", "org.joda.time.DateTime")));
48-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime",
45+
mappingConfig.setCustomTypesMapping(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"));
46+
mappingConfig.setCustomAnnotationsMapping(singletonMap("Event.createdDateTime",
4947
singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
50-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
48+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
5149

5250
generate("src/test/resources/schemas/test.graphqls");
5351

@@ -60,10 +58,10 @@ void generate_CustomAnnotationMappings() throws Exception {
6058

6159
@Test
6260
void generate_CustomAnnotationMappings_Type() throws Exception {
63-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
64-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("DateTime",
61+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "org.joda.time.DateTime"));
62+
mappingConfig.setCustomAnnotationsMapping(singletonMap("DateTime",
6563
singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
66-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
64+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
6765

6866
generate("src/test/resources/schemas/test.graphqls");
6967

@@ -76,8 +74,8 @@ void generate_CustomAnnotationMappings_Type() throws Exception {
7674

7775
@Test
7876
void generate_CustomAnnotationMappings_Input() throws Exception {
79-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("ReproInput.reproField",
80-
singletonList("@com.fasterxml.jackson.annotation.JsonProperty(\"reproField\")"))));
77+
mappingConfig.setCustomAnnotationsMapping(singletonMap("ReproInput.reproField",
78+
singletonList("@com.fasterxml.jackson.annotation.JsonProperty(\"reproField\")")));
8179

8280
generate("src/test/resources/schemas/input.graphqls");
8381

@@ -89,10 +87,10 @@ void generate_CustomAnnotationMappings_Input() throws Exception {
8987

9088
@Test
9189
void generate_CustomAnnotationMappings_Regexp() throws Exception {
92-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
93-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Date.*",
90+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "org.joda.time.DateTime"));
91+
mappingConfig.setCustomAnnotationsMapping(singletonMap("Date.*",
9492
singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
95-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
93+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
9694

9795
generate("src/test/resources/schemas/test.graphqls");
9896

@@ -105,10 +103,10 @@ void generate_CustomAnnotationMappings_Regexp() throws Exception {
105103

106104
@Test
107105
void generate_CustomAnnotationMappings_FieldType() throws Exception {
108-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
109-
mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime",
106+
mappingConfig.setCustomTypesMapping(singletonMap("DateTime", "org.joda.time.DateTime"));
107+
mappingConfig.setCustomAnnotationsMapping(singletonMap("Event.createdDateTime",
110108
singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
111-
"using = com.example.json.DateTimeScalarDeserializer.class)"))));
109+
"using = com.example.json.DateTimeScalarDeserializer.class)")));
112110

113111
generate("src/test/resources/schemas/test.graphqls");
114112

@@ -121,10 +119,9 @@ void generate_CustomAnnotationMappings_FieldType() throws Exception {
121119

122120
@Test
123121
void generate_CustomAnnotationMappings_With_Annotations() throws Exception {
124-
mappingConfig.setCustomTypesMapping(new HashMap<>(
125-
singletonMap("CAMS", "com.intuit.identity.manage.enum.CamsGroup::class")));
126-
mappingConfig.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("NotNull",
127-
singletonList("@javax.validation.constraints.NotNull(message = {{message}}, groups = {{groups}})"))));
122+
mappingConfig.setCustomTypesMapping(singletonMap("CAMS", "com.intuit.identity.manage.enum.CamsGroup::class"));
123+
mappingConfig.setDirectiveAnnotationsMapping(singletonMap("NotNull",
124+
singletonList("@javax.validation.constraints.NotNull(message = {{message}}, groups = {{groups}})")));
128125

129126
generate("src/test/resources/schemas/kt/customTypesMapping-directive.graphqls");
130127

src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void cleanup() {
4242

4343
@Test
4444
void generate_CustomTypeMapping_WholeScalar() throws Exception {
45-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("ZonedDateTime", "String")));
45+
mappingConfig.setCustomTypesMapping(singletonMap("ZonedDateTime", "String"));
4646

4747
generate("src/test/resources/schemas/date-scalar.graphqls");
4848

src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.io.File;
1313
import java.io.IOException;
1414
import java.nio.file.Paths;
15-
import java.util.HashMap;
1615
import java.util.Objects;
1716

1817
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
@@ -117,7 +116,7 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception {
117116
void generate_NullableCustomTypeWithApiReturnType() throws Exception {
118117
mappingConfig.setGenerateApis(true);
119118
mappingConfig.setApiReturnType("reactor.core.publisher.Mono");
120-
mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("ZonedDateTime", "String")));
119+
mappingConfig.setCustomTypesMapping(singletonMap("ZonedDateTime", "String"));
121120

122121
schemaFinder.setIncludePattern("nullable-custom-type-with-api-return-type.graphqls");
123122

0 commit comments

Comments
 (0)