Skip to content

Commit 97f638d

Browse files
committed
add source location and message to all validation errors
1 parent b3122b4 commit 97f638d

17 files changed

+106
-71
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public void checkArgument(Argument argument) {
1616
GraphQLArgument fieldArgument = getValidationContext().getArgument();
1717
if (fieldArgument == null) return;
1818
if (!getValidationUtil().isValidLiteralValue(argument.getValue(), fieldArgument.getType())) {
19-
addError(new ValidationError(ValidationErrorType.WrongType));
19+
String message = String.format("argument value %s has wrong type", argument.getValue());
20+
addError(new ValidationError(ValidationErrorType.WrongType, argument.getSourceLocation(), message));
2021
}
2122
}
2223

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ public void checkField(Field field) {
2020
if (parentType == null) return;
2121
GraphQLFieldDefinition fieldDef = getValidationContext().getFieldDef();
2222
if (fieldDef == null) {
23-
addError(new ValidationError(ValidationErrorType.FieldUndefined));
23+
String message = String.format("Field %s is undefined", field.getName());
24+
addError(new ValidationError(ValidationErrorType.FieldUndefined, field.getSourceLocation(), message));
2425
}
2526

2627
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ public void checkInlineFragment(InlineFragment inlineFragment) {
1919
GraphQLType type = getValidationContext().getSchema().getType(inlineFragment.getTypeCondition().getName());
2020
if (type == null) return;
2121
if (!(type instanceof GraphQLCompositeType)) {
22-
addError(new ValidationError(ValidationErrorType.InlineFragmentTypeConditionInvalid));
22+
String message = "Inline fragment type condition is invalid, must be on Object/Interface/Union";
23+
addError(new ValidationError(ValidationErrorType.InlineFragmentTypeConditionInvalid, inlineFragment.getSourceLocation(), message));
2324
}
2425
}
2526

@@ -28,7 +29,8 @@ public void checkFragmentDefinition(FragmentDefinition fragmentDefinition) {
2829
GraphQLType type = getValidationContext().getSchema().getType(fragmentDefinition.getTypeCondition().getName());
2930
if (type == null) return;
3031
if (!(type instanceof GraphQLCompositeType)) {
31-
addError(new ValidationError(ValidationErrorType.InlineFragmentTypeConditionInvalid));
32+
String message = "Fragment type condition is invalid, must be on Object/Interface/Union";
33+
addError(new ValidationError(ValidationErrorType.InlineFragmentTypeConditionInvalid, fragmentDefinition.getSourceLocation(), message));
3234
}
3335
}
3436
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ public void checkArgument(Argument argument) {
1818
GraphQLFieldDefinition fieldDef = getValidationContext().getFieldDef();
1919
if (fieldDef == null) return;
2020
GraphQLArgument fieldArgument = fieldDef.getArgument(argument.getName());
21-
if(fieldArgument == null){
22-
addError(new ValidationError(ValidationErrorType.UnknownArgument));
21+
if (fieldArgument == null) {
22+
String message = String.format("Unknown argument %s", argument.getName());
23+
addError(new ValidationError(ValidationErrorType.UnknownArgument, argument.getSourceLocation(), message));
2324
}
2425
}
2526
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,29 @@ public KnownDirectives(ValidationContext validationContext, ValidationErrorColle
1818
public void checkDirective(Directive directive, List<Node> ancestors) {
1919
GraphQLDirective graphQLDirective = getValidationContext().getSchema().getDirective(directive.getName());
2020
if (graphQLDirective == null) {
21-
addError(new ValidationError(ValidationErrorType.UnknownDirective, directive.getSourceLocation(), null));
21+
String message = String.format("Unknown directive %s", directive.getName());
22+
addError(new ValidationError(ValidationErrorType.UnknownDirective, directive.getSourceLocation(), message));
2223
return;
2324
}
2425

2526
Node ancestor = ancestors.get(ancestors.size() - 1);
2627
if (ancestor instanceof OperationDefinition && !graphQLDirective.isOnOperation()) {
27-
addError(new ValidationError(ValidationErrorType.MisplacedDirective, directive.getSourceLocation(), null));
28+
String message = String.format("Directive %s not allowed here", directive.getName());
29+
addError(new ValidationError(ValidationErrorType.MisplacedDirective, directive.getSourceLocation(), message));
2830

2931
}
3032
if (ancestor instanceof Field && !graphQLDirective.isOnField()) {
31-
addError(new ValidationError(ValidationErrorType.MisplacedDirective, directive.getSourceLocation(), null));
33+
String message = String.format("Directive %s not allowed here", directive.getName());
34+
addError(new ValidationError(ValidationErrorType.MisplacedDirective, directive.getSourceLocation(), message));
3235

3336
}
3437

3538
if ((ancestor instanceof FragmentSpread
3639
|| ancestor instanceof FragmentDefinition
3740
|| ancestor instanceof InlineFragment)
3841
&& !graphQLDirective.isOnFragment()) {
39-
addError(new ValidationError(ValidationErrorType.MisplacedDirective, directive.getSourceLocation(), null));
42+
String message = String.format("Directive %s not allowed here", directive.getName());
43+
addError(new ValidationError(ValidationErrorType.MisplacedDirective, directive.getSourceLocation(), message));
4044
}
4145

4246
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import graphql.language.FragmentSpread;
66
import graphql.validation.*;
77

8-
public class KnownFragmentNames extends AbstractRule{
8+
public class KnownFragmentNames extends AbstractRule {
99

1010
public KnownFragmentNames(ValidationContext validationContext, ValidationErrorCollector validationErrorCollector) {
1111
super(validationContext, validationErrorCollector);
@@ -14,8 +14,9 @@ public KnownFragmentNames(ValidationContext validationContext, ValidationErrorCo
1414
@Override
1515
public void checkFragmentSpread(FragmentSpread fragmentSpread) {
1616
FragmentDefinition fragmentDefinition = getValidationContext().getFragment(fragmentSpread.getName());
17-
if(fragmentDefinition == null){
18-
addError(new ValidationError(ValidationErrorType.UndefinedFragment));
17+
if (fragmentDefinition == null) {
18+
String message = String.format("Undefined framgent %s", fragmentSpread.getName());
19+
addError(new ValidationError(ValidationErrorType.UndefinedFragment, fragmentSpread.getSourceLocation(), message));
1920
}
2021
}
2122
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ public KnownTypeNames(ValidationContext validationContext, ValidationErrorCollec
1414
@Override
1515
public void checkTypeName(TypeName typeName) {
1616
if ((getValidationContext().getSchema().getType(typeName.getName())) == null) {
17-
addError(new ValidationError(ValidationErrorType.UnknownType));
17+
String message = String.format("Unknown type %s", typeName.getName());
18+
addError(new ValidationError(ValidationErrorType.UnknownType, typeName.getSourceLocation(), message));
1819
}
1920
}
2021
}

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
import graphql.language.Node;
88
import graphql.validation.*;
99

10-
import java.util.*;
10+
import java.util.ArrayList;
11+
import java.util.LinkedHashMap;
12+
import java.util.List;
13+
import java.util.Map;
1114

1215
public class NoFragmentCycles extends AbstractRule {
1316

1417
private Map<String, List<FragmentSpread>> fragmentSpreads = new LinkedHashMap<>();
1518

16-
private Set<String> foundCycles = new LinkedHashSet<>();
1719

1820
public NoFragmentCycles(ValidationContext validationContext, ValidationErrorCollector validationErrorCollector) {
1921
super(validationContext, validationErrorCollector);
@@ -63,11 +65,10 @@ private void detectCycleRecursive(String fragmentName, String initialName, List<
6365

6466
outer:
6567
for (FragmentSpread fragmentSpread : fragmentSpreads) {
66-
if (foundCycles.contains(fragmentSpread.getName())) {
67-
continue;
68-
}
68+
6969
if (fragmentSpread.getName().equals(initialName)) {
70-
addError(new ValidationError(ValidationErrorType.FragmentCycle));
70+
String message = "Fragment cycles not allowed";
71+
addError(new ErrorFactory().newError(ValidationErrorType.FragmentCycle, spreadPath, message));
7172
continue;
7273
}
7374
for (FragmentSpread spread : spreadPath) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ public void checkFragmentDefinition(FragmentDefinition fragmentDefinition) {
3232
@Override
3333
public void checkVariable(VariableReference variableReference) {
3434
if (!variableNames.contains(variableReference.getName())) {
35-
addError(new ValidationError(ValidationErrorType.UndefinedVariable, variableReference.getSourceLocation(), null));
35+
String message = String.format("Undefined variable %s",variableReference.getName());
36+
addError(new ValidationError(ValidationErrorType.UndefinedVariable, variableReference.getSourceLocation(), message));
3637
}
3738
}
3839

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class NoUnusedFragments extends AbstractRule {
1919

2020
private List<String> usedFragments = new ArrayList<>();
2121
private Map<String, List<String>> spreadsInDefinition = new LinkedHashMap<>();
22-
private final List<List<String>> fragmentsUsedDirectlyInOperation = new ArrayList<>();
22+
private final List<List<String>> fragmentsUsedDirectlyInOperation = new ArrayList<>();
2323

2424
public NoUnusedFragments(ValidationContext validationContext, ValidationErrorCollector validationErrorCollector) {
2525
super(validationContext, validationErrorCollector);
@@ -48,26 +48,27 @@ public void checkFragmentDefinition(FragmentDefinition fragmentDefinition) {
4848
public void documentFinished(Document document) {
4949

5050
List<String> allUsedFragments = new ArrayList<>();
51-
for(List<String> fragmentsInOneOperation : fragmentsUsedDirectlyInOperation){
52-
for(String fragment : fragmentsInOneOperation){
53-
collectUsedFragmentsInDefinition(allUsedFragments,fragment);
51+
for (List<String> fragmentsInOneOperation : fragmentsUsedDirectlyInOperation) {
52+
for (String fragment : fragmentsInOneOperation) {
53+
collectUsedFragmentsInDefinition(allUsedFragments, fragment);
5454
}
5555
}
5656

57-
for(FragmentDefinition fragmentDefinition : allDeclaredFragments){
58-
if(!allUsedFragments.contains(fragmentDefinition.getName())){
59-
addError(new ValidationError(ValidationErrorType.UnusedFragment));
57+
for (FragmentDefinition fragmentDefinition : allDeclaredFragments) {
58+
if (!allUsedFragments.contains(fragmentDefinition.getName())) {
59+
String message = String.format("Unused fragment %s", fragmentDefinition.getName());
60+
addError(new ValidationError(ValidationErrorType.UnusedFragment, fragmentDefinition.getSourceLocation(), message));
6061
}
6162
}
6263

6364
}
6465

65-
private void collectUsedFragmentsInDefinition(List<String> result,String fragmentName){
66-
if(result.contains(fragmentName)) return;
66+
private void collectUsedFragmentsInDefinition(List<String> result, String fragmentName) {
67+
if (result.contains(fragmentName)) return;
6768
result.add(fragmentName);
6869
List<String> spreadList = spreadsInDefinition.get(fragmentName);
69-
for(String fragment : spreadList){
70-
collectUsedFragmentsInDefinition(result,fragment);
70+
for (String fragment : spreadList) {
71+
collectUsedFragmentsInDefinition(result, fragment);
7172
}
7273

7374
}

0 commit comments

Comments
 (0)