Skip to content

Commit 0d583df

Browse files
committed
more validation
1 parent 0be87ca commit 0d583df

File tree

11 files changed

+205
-22
lines changed

11 files changed

+205
-22
lines changed

src/main/java/graphql/schema/SchemaUtil.java

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

99
public class SchemaUtil {
1010

11+
public static boolean isLeafType(GraphQLType type) {
12+
GraphQLUnmodifiedType unmodifiedType = getUnmodifiedType(type);
13+
return
14+
unmodifiedType instanceof GraphQLScalarType ||
15+
unmodifiedType instanceof GraphQLEnumType;
16+
}
17+
18+
public static GraphQLUnmodifiedType getUnmodifiedType(GraphQLType graphQLType) {
19+
if (graphQLType instanceof GraphQLModifiedType) {
20+
return getUnmodifiedType(((GraphQLModifiedType) graphQLType).getWrappedType());
21+
}
22+
return (GraphQLUnmodifiedType) graphQLType;
23+
}
24+
1125

1226
private static void collectTypes(GraphQLType root, Map<String, GraphQLType> result) {
1327
if (root instanceof GraphQLNonNull) {
Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,73 @@
11
package graphql.validation;
22

33

4-
import graphql.language.Argument;
4+
import graphql.language.*;
55

66
public class AbstractRule {
77

8+
private ValidationContext validationContext;
9+
10+
private ValidationUtil validationUtil = new ValidationUtil();
11+
12+
public ValidationUtil getValidationUtil() {
13+
return validationUtil;
14+
}
15+
16+
public void setValidationUtil(ValidationUtil validationUtil) {
17+
this.validationUtil = validationUtil;
18+
}
19+
20+
public void setValidationContext(ValidationContext validationContext) {
21+
this.validationContext = validationContext;
22+
}
23+
24+
public ValidationContext getValidationContext() {
25+
return validationContext;
26+
}
827

928
public void checkArgument(Argument argument) {
1029

1130
}
1231

32+
public void checkTypeName(TypeName typeName) {
33+
34+
}
35+
36+
public void checkVariableDefinition(VariableDefinition variableDefinition) {
37+
38+
}
39+
40+
public void checkField(Field field) {
41+
42+
}
43+
44+
public void checkInlineFragment(InlineFragment inlineFragment) {
45+
46+
}
47+
48+
public void checkDirective(Directive directive) {
49+
50+
}
51+
52+
public void checkFragmentSpread(FragmentSpread fragmentSpread) {
53+
54+
}
55+
56+
public void checkFragmentDefinition(FragmentDefinition fragmentDefinition) {
57+
58+
}
59+
60+
public void checkOperationDefinition(OperationDefinition operationDefinition) {
61+
62+
}
63+
64+
public void checkSelectionSet(SelectionSet selectionSet) {
65+
66+
}
67+
68+
public void checkVariable(VariableReference variableReference) {
69+
70+
}
71+
1372

1473
}

src/main/java/graphql/validation/RulesVisitor.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
import graphql.language.Argument;
55
import graphql.language.Node;
6+
import graphql.language.TypeName;
67
import graphql.validation.rules.ArgumentsOfCorrectType;
8+
import graphql.validation.rules.DefaultValuesOfCorrectType;
9+
import graphql.validation.rules.KnownTypeNames;
10+
import graphql.validation.rules.ScalarLeafs;
711

812
import java.util.ArrayList;
913
import java.util.List;
@@ -15,7 +19,22 @@ public class RulesVisitor implements QueryLanguageVisitor {
1519

1620
public RulesVisitor(ValidationContext validationContext) {
1721
this.validationContext = validationContext;
18-
rules.add(new ArgumentsOfCorrectType(validationContext));
22+
23+
ArgumentsOfCorrectType argumentsOfCorrectType = new ArgumentsOfCorrectType();
24+
argumentsOfCorrectType.setValidationContext(validationContext);
25+
rules.add(argumentsOfCorrectType);
26+
27+
KnownTypeNames knownTypeNames = new KnownTypeNames();
28+
knownTypeNames.setValidationContext(validationContext);
29+
rules.add(knownTypeNames);
30+
31+
DefaultValuesOfCorrectType defaultValuesOfCorrectType = new DefaultValuesOfCorrectType();
32+
defaultValuesOfCorrectType.setValidationContext(validationContext);
33+
rules.add(defaultValuesOfCorrectType);
34+
35+
ScalarLeafs scalarLeafs = new ScalarLeafs();
36+
scalarLeafs.setValidationContext(validationContext);
37+
rules.add(scalarLeafs);
1938
}
2039

2140
@Override
@@ -25,6 +44,10 @@ public void enter(Node node) {
2544
for (AbstractRule rule : rules) {
2645
rule.checkArgument((Argument) node);
2746
}
47+
} else if (node instanceof TypeName) {
48+
for (AbstractRule rule : rules) {
49+
rule.checkTypeName((TypeName) node);
50+
}
2851
}
2952
}
3053

src/main/java/graphql/validation/TypeInfo.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public void enter(Node node) {
5656

5757

5858
private void enterImpl(SelectionSet selectionSet) {
59-
GraphQLUnmodifiedType rawType = getUnmodifiedType(getType());
59+
GraphQLUnmodifiedType rawType = SchemaUtil.getUnmodifiedType(getType());
6060
GraphQLCompositeType compositeType = null;
6161
if (rawType instanceof GraphQLCompositeType) {
6262
compositeType = (GraphQLCompositeType) rawType;
@@ -131,7 +131,7 @@ private void enterImpl(ArrayValue arrayValue) {
131131
}
132132

133133
private void enterImpl(ObjectField objectField) {
134-
GraphQLUnmodifiedType objectType = getUnmodifiedType(getInputType());
134+
GraphQLUnmodifiedType objectType = SchemaUtil.getUnmodifiedType(getInputType());
135135
GraphQLInputType inputType = null;
136136
if (objectType instanceof GraphQLInputObjectType) {
137137
GraphQLInputObjectField inputField = ((GraphQLInputObjectType) objectType).getField(objectField.getName());
@@ -177,12 +177,6 @@ public void leave(Node node) {
177177

178178
}
179179

180-
private GraphQLUnmodifiedType getUnmodifiedType(GraphQLType graphQLType) {
181-
if (graphQLType instanceof GraphQLModifiedType) {
182-
return getUnmodifiedType(((GraphQLModifiedType) graphQLType).getWrappedType());
183-
}
184-
return (GraphQLUnmodifiedType) graphQLType;
185-
}
186180

187181
private GraphQLNullableType getNullableType(GraphQLType type) {
188182
return (GraphQLNullableType) (type instanceof GraphQLNonNull ? ((GraphQLNonNull) type).getWrappedType() : type);
@@ -196,6 +190,7 @@ private void addType(GraphQLOutputType type) {
196190
typeStack.add(type);
197191
}
198192

193+
199194
private <T> T lastElement(List<T> list) {
200195
if (list.size() == 0) return null;
201196
return list.get(list.size() - 1);

src/main/java/graphql/validation/ValidationContext.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,18 @@ public ValidationContext(GraphQLSchema schema, Document document) {
2828
this.document = document;
2929
this.typeInfo = new TypeInfo(schema);
3030
}
31+
3132
public TypeInfo getTypeInfo() {
3233
return typeInfo;
3334
}
3435

36+
public GraphQLSchema getSchema() {
37+
return schema;
38+
}
39+
40+
public Document getDocument() {
41+
return document;
42+
}
3543

3644
public void addError(ValidationError validationError) {
3745
validationErrors.add(validationError);
@@ -60,4 +68,8 @@ public GraphQLDirective getDirective() {
6068
public GraphQLArgument getArgument() {
6169
return typeInfo.getArgument();
6270
}
71+
72+
public GraphQLOutputType getType() {
73+
return typeInfo.getType();
74+
}
6375
}

src/main/java/graphql/validation/ValidationUtil.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,5 @@ private boolean isValidLiteralValue(Value value, GraphQLList type) {
8080
return isValidLiteralValue(value, wrappedType);
8181
}
8282
}
83+
8384
}

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

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,17 @@
44
import graphql.language.Argument;
55
import graphql.schema.GraphQLArgument;
66
import graphql.validation.AbstractRule;
7-
import graphql.validation.ValidationContext;
87
import graphql.validation.ValidationError;
9-
import graphql.validation.ValidationUtil;
108

119
public class ArgumentsOfCorrectType extends AbstractRule {
1210

13-
private final ValidationContext validationContext;
14-
15-
ValidationUtil validationUtil = new ValidationUtil();
16-
17-
public ArgumentsOfCorrectType(ValidationContext validationContext) {
18-
this.validationContext = validationContext;
19-
}
2011

2112
@Override
2213
public void checkArgument(Argument argument) {
23-
GraphQLArgument fieldArgument = validationContext.getArgument();
14+
GraphQLArgument fieldArgument = getValidationContext().getArgument();
2415
if (fieldArgument == null) return;
25-
if (!validationUtil.isValidLiteralValue(argument.getValue(), fieldArgument.getType())) {
26-
validationContext.addError(new ValidationError("Wrong type"));
16+
if (!getValidationUtil().isValidLiteralValue(argument.getValue(), fieldArgument.getType())) {
17+
getValidationContext().addError(new ValidationError("Wrong type"));
2718
}
2819
}
2920
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package graphql.validation.rules;
2+
3+
import graphql.validation.AbstractRule;
4+
5+
6+
public class DefaultValuesOfCorrectType extends AbstractRule {
7+
8+
9+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package graphql.validation.rules;
2+
3+
4+
import graphql.language.TypeName;
5+
import graphql.schema.SchemaUtil;
6+
import graphql.validation.AbstractRule;
7+
import graphql.validation.ValidationError;
8+
9+
public class KnownTypeNames extends AbstractRule {
10+
11+
12+
@Override
13+
public void checkTypeName(TypeName typeName) {
14+
if (SchemaUtil.findType(getValidationContext().getSchema(), typeName.getName()) == null) {
15+
getValidationContext().addError(new ValidationError("Invalid type name " + typeName.getName()));
16+
}
17+
}
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package graphql.validation.rules;
2+
3+
4+
import graphql.language.Field;
5+
import graphql.schema.GraphQLOutputType;
6+
import graphql.schema.SchemaUtil;
7+
import graphql.validation.AbstractRule;
8+
import graphql.validation.ValidationError;
9+
10+
public class ScalarLeafs extends AbstractRule {
11+
12+
13+
@Override
14+
public void checkField(Field field) {
15+
GraphQLOutputType type = getValidationContext().getType();
16+
if (SchemaUtil.isLeafType(type)) {
17+
if (field.getSelectionSet() != null) {
18+
getValidationContext().addError(new ValidationError("No subselection allowed on " + field.getName()));
19+
}
20+
} else {
21+
if (field.getSelectionSet() != null) {
22+
getValidationContext().addError(new ValidationError("Subseletion required on " + field.getName()));
23+
}
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)