Skip to content

Commit aeeef75

Browse files
Fix issue graphql-java#6 were rules on nested input were not applied correctly
1 parent bef87f7 commit aeeef75

File tree

2 files changed

+44
-31
lines changed

2 files changed

+44
-31
lines changed

src/main/java/graphql/validation/rules/TargetedValidationRules.java

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
package graphql.validation.rules;
22

3+
import static graphql.validation.rules.ValidationEnvironment.ValidatedElement.ARGUMENT;
4+
import static graphql.validation.rules.ValidationEnvironment.ValidatedElement.FIELD;
5+
import static graphql.validation.rules.ValidationEnvironment.ValidatedElement.INPUT_OBJECT_FIELD;
6+
7+
import java.util.ArrayList;
8+
import java.util.Collections;
9+
import java.util.HashMap;
10+
import java.util.List;
11+
import java.util.Locale;
12+
import java.util.Map;
13+
14+
import org.springframework.web.servlet.tags.form.InputTag;
15+
316
import graphql.Assert;
417
import graphql.GraphQLError;
518
import graphql.PublicApi;
@@ -20,17 +33,6 @@
2033
import graphql.validation.locale.LocaleUtil;
2134
import graphql.validation.util.Util;
2235

23-
import java.util.ArrayList;
24-
import java.util.Collections;
25-
import java.util.HashMap;
26-
import java.util.List;
27-
import java.util.Locale;
28-
import java.util.Map;
29-
30-
import static graphql.validation.rules.ValidationEnvironment.ValidatedElement.ARGUMENT;
31-
import static graphql.validation.rules.ValidationEnvironment.ValidatedElement.FIELD;
32-
import static graphql.validation.rules.ValidationEnvironment.ValidatedElement.INPUT_OBJECT_FIELD;
33-
3436
/**
3537
* TargetedValidationRules is a holder of {@link graphql.validation.rules.ValidationRule}s targeted against a specific
3638
* type, field and possible argument via {@link ValidationCoordinates}. It then allows those rules
@@ -40,14 +42,17 @@
4042
@PublicApi
4143
public class TargetedValidationRules {
4244

45+
private final ValidationRules validationRules;
46+
4347
private final Map<ValidationCoordinates, List<ValidationRule>> rulesMap;
4448

4549
public TargetedValidationRules(Builder builder) {
4650
this.rulesMap = new HashMap<>(builder.rulesMap);
51+
this.validationRules=builder.validationRules;
4752
}
4853

49-
public static Builder newValidationRules() {
50-
return new Builder();
54+
public static Builder newValidationRules(ValidationRules validationRules) {
55+
return new Builder(validationRules);
5156
}
5257

5358
public boolean isEmpty() {
@@ -117,34 +122,37 @@ public List<GraphQLError> runValidationRules(DataFetchingEnvironment env, Messag
117122
.locale(defaultLocale)
118123
.build();
119124

120-
for (ValidationRule rule : rules) {
121-
List<GraphQLError> ruleErrors = runValidationImpl(rule, ruleEnvironment, inputType, argValue);
122-
errors.addAll(ruleErrors);
123-
}
125+
errors.addAll(runValidationImpl(rules, ruleEnvironment, inputType, argValue));
124126
}
125127

126128
return errors;
127129
}
128130

129131
@SuppressWarnings("unchecked")
130-
private List<GraphQLError> runValidationImpl(ValidationRule rule, ValidationEnvironment validationEnvironment, GraphQLInputType inputType, Object validatedValue) {
131-
List<GraphQLError> errors = rule.runValidation(validationEnvironment);
132+
private List<GraphQLError> runValidationImpl(List<ValidationRule> rules, ValidationEnvironment validationEnvironment, GraphQLInputType inputType, Object validatedValue) {
133+
List<GraphQLError> errors = new ArrayList<GraphQLError>();
134+
for(ValidationRule rule : rules) {
135+
errors.addAll(rule.runValidation(validationEnvironment));
136+
}
137+
132138
if (validatedValue == null) {
133139
return errors;
134140
}
135141

136142
inputType = (GraphQLInputType) GraphQLTypeUtil.unwrapNonNull(inputType);
137143

138-
if (GraphQLTypeUtil.isList(inputType)) {
139-
List<Object> values = new ArrayList<>(FpKit.toCollection(validatedValue));
140-
List<GraphQLError> ruleErrors = walkListArg(rule, validationEnvironment, (GraphQLList) inputType, values);
141-
errors.addAll(ruleErrors);
144+
145+
if (GraphQLTypeUtil.isList(inputType)) {
146+
List<Object> values = new ArrayList<>(FpKit.toCollection(validatedValue));
147+
List<GraphQLError> ruleErrors = walkListArg(rules, validationEnvironment, (GraphQLList) inputType, values);
148+
errors.addAll(ruleErrors);
142149
}
150+
143151

144152
if (inputType instanceof GraphQLInputObjectType) {
145153
if (validatedValue instanceof Map) {
146154
Map<String, Object> objectValue = (Map<String, Object>) validatedValue;
147-
List<GraphQLError> ruleErrors = walkObjectArg(rule, validationEnvironment, (GraphQLInputObjectType) inputType, objectValue);
155+
List<GraphQLError> ruleErrors = walkObjectArg(validationEnvironment, (GraphQLInputObjectType) inputType, objectValue);
148156
errors.addAll(ruleErrors);
149157
} else {
150158
Assert.assertShouldNeverHappen("How can there be a `input` object type '%s' that does not have a matching Map java value", GraphQLTypeUtil.simplePrint(inputType));
@@ -154,15 +162,14 @@ private List<GraphQLError> runValidationImpl(ValidationRule rule, ValidationEnvi
154162
}
155163

156164

157-
private List<GraphQLError> walkObjectArg(ValidationRule rule, ValidationEnvironment validationEnvironment, GraphQLInputObjectType argumentType, Map<String, Object> objectMap) {
165+
private List<GraphQLError> walkObjectArg(ValidationEnvironment validationEnvironment, GraphQLInputObjectType argumentType, Map<String, Object> objectMap) {
158166
List<GraphQLError> errors = new ArrayList<>();
159167

160168
// run them in a stable order
161169
List<GraphQLInputObjectField> fieldDefinitions = Util.sort(argumentType.getFieldDefinitions(), GraphQLInputObjectField::getName);
162170
for (GraphQLInputObjectField inputField : fieldDefinitions) {
163171

164172
GraphQLInputType fieldType = inputField.getType();
165-
List<GraphQLDirective> directives = inputField.getDirectives();
166173
Object validatedValue = objectMap.getOrDefault(inputField.getName(), inputField.getDefaultValue());
167174
if (validatedValue == null) {
168175
continue;
@@ -177,14 +184,15 @@ private List<GraphQLError> walkObjectArg(ValidationRule rule, ValidationEnvironm
177184
.directives(inputField.getDirectives())
178185
.validatedElement(INPUT_OBJECT_FIELD)
179186
);
187+
188+
List<ValidationRule> rulesChild = validationRules.getRulesFor(newValidationEnvironment.getArgument(), newValidationEnvironment.getFieldDefinition(), newValidationEnvironment.getFieldsContainer());
189+
errors.addAll(runValidationImpl(rulesChild, newValidationEnvironment, fieldType, validatedValue));
180190

181-
List<GraphQLError> ruleErrors = runValidationImpl(rule, newValidationEnvironment, fieldType, validatedValue);
182-
errors.addAll(ruleErrors);
183191
}
184192
return errors;
185193
}
186194

187-
private List<GraphQLError> walkListArg(ValidationRule rule, ValidationEnvironment validationEnvironment, GraphQLList argumentType, List<Object> objectList) {
195+
private List<GraphQLError> walkListArg(List<ValidationRule> rules, ValidationEnvironment validationEnvironment, GraphQLList argumentType, List<Object> objectList) {
188196
List<GraphQLError> errors = new ArrayList<>();
189197

190198
GraphQLInputType listItemType = Util.unwrapOneAndAllNonNull(argumentType);
@@ -206,16 +214,21 @@ private List<GraphQLError> walkListArg(ValidationRule rule, ValidationEnvironmen
206214
.directives(directives)
207215
);
208216

209-
List<GraphQLError> ruleErrors = runValidationImpl(rule, newValidationEnvironment, listItemType, value);
217+
List<GraphQLError> ruleErrors = runValidationImpl(rules, newValidationEnvironment, listItemType, value);
210218
errors.addAll(ruleErrors);
211219
ix++;
212220
}
213221
return errors;
214222
}
215223

216224
public static class Builder {
225+
ValidationRules validationRules;
217226
Map<ValidationCoordinates, List<ValidationRule>> rulesMap = new HashMap<>();
218227

228+
public Builder(ValidationRules validationRules) {
229+
this.validationRules=validationRules;
230+
}
231+
219232
public Builder addRule(ValidationCoordinates coordinates, ValidationRule rule) {
220233
rulesMap.compute(coordinates, (key, listOfRules) -> {
221234
if (listOfRules == null) {

src/main/java/graphql/validation/rules/ValidationRules.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public OnValidationErrorStrategy getOnValidationErrorStrategy() {
6060
}
6161

6262
public TargetedValidationRules buildRulesFor(GraphQLFieldDefinition fieldDefinition, GraphQLFieldsContainer fieldsContainer) {
63-
TargetedValidationRules.Builder rulesBuilder = TargetedValidationRules.newValidationRules();
63+
TargetedValidationRules.Builder rulesBuilder = TargetedValidationRules.newValidationRules(this);
6464

6565
ValidationCoordinates fieldCoordinates = ValidationCoordinates.newCoordinates(fieldsContainer, fieldDefinition);
6666
List<ValidationRule> fieldRules = getRulesFor(fieldDefinition, fieldsContainer);

0 commit comments

Comments
 (0)