Skip to content

Commit 0be87ca

Browse files
committed
invalid syntax error handling (very simple at the moment)
1 parent e9ad513 commit 0be87ca

File tree

4 files changed

+41
-5
lines changed

4 files changed

+41
-5
lines changed

src/main/java/graphql/GraphQL.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88
import graphql.schema.GraphQLSchema;
99
import graphql.validation.ValidationError;
1010
import graphql.validation.Validator;
11+
import org.antlr.v4.runtime.RecognitionException;
1112

12-
import java.util.Collections;
13-
import java.util.LinkedHashMap;
14-
import java.util.List;
15-
import java.util.Map;
13+
import java.util.*;
1614
import java.util.concurrent.ExecutorService;
1715
import java.util.concurrent.Executors;
1816

@@ -41,7 +39,13 @@ public GraphQL(GraphQLSchema graphQLSchema, String requestString, Map<String, Ob
4139

4240
public ExecutionResult execute() {
4341
Parser parser = new Parser();
44-
Document document = parser.parseDocument(requestString);
42+
Document document;
43+
try {
44+
document = parser.parseDocument(requestString);
45+
} catch (RecognitionException e) {
46+
ValidationError validationError = new ValidationError("Invalid syntax: " + e.toString());
47+
return new ExecutionResult(Arrays.asList(validationError));
48+
}
4549
Execution execution = new Execution(executorService);
4650
Validator validator = new Validator();
4751
List<ValidationError> validationErrors = validator.validateDocument(graphQLSchema, document);

src/main/java/graphql/parser/Parser.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,34 @@
55
import graphql.parser.antlr.GraphqlParser;
66
import org.antlr.v4.runtime.ANTLRInputStream;
77
import org.antlr.v4.runtime.CommonTokenStream;
8+
import org.antlr.v4.runtime.DefaultErrorStrategy;
9+
import org.antlr.v4.runtime.RecognitionException;
810

911
public class Parser {
1012

13+
1114
public Document parseDocument(String input) {
1215

1316
GraphqlLexer lexer = new GraphqlLexer(new ANTLRInputStream(input));
17+
1418
CommonTokenStream tokens = new CommonTokenStream(lexer);
1519

1620
GraphqlParser parser = new GraphqlParser(tokens);
21+
parser.setErrorHandler(new ErrorStrategy());
1722
GraphqlParser.DocumentContext document = parser.document();
1823

1924

2025
GraphqlAntlrToLanguage antlrToLanguage = new GraphqlAntlrToLanguage();
2126
antlrToLanguage.visitDocument(document);
2227
return antlrToLanguage.result;
2328
}
29+
30+
private class ErrorStrategy extends DefaultErrorStrategy {
31+
32+
@Override
33+
public void recover(org.antlr.v4.runtime.Parser recognizer, RecognitionException e) {
34+
throw e;
35+
}
36+
}
37+
2438
}

src/main/java/graphql/validation/ValidationError.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ public ValidationError(String description, Object... args) {
99
this.description = String.format(description, args);
1010
}
1111

12+
public String getDescription() {
13+
return description;
14+
}
15+
1216
@Override
1317
public String toString() {
1418
return "ValidationError{" +

src/test/groovy/graphql/GraphQLTest.groovy

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,21 @@ class GraphQLTest extends Specification {
9191

9292
then:
9393
errors.size() == 1
94+
}
9495

96+
def "query with invalid syntax"() {
97+
given:
98+
GraphQLSchema schema = newSchema().query(
99+
newObject()
100+
.name("RootQueryType")
101+
.build()
102+
).build()
103+
104+
when:
105+
def errors = new GraphQL(schema, '{ hello(() }').execute().validationErrors
95106

107+
then:
108+
errors.size() == 1
109+
errors[0].description.contains("Invalid syntax")
96110
}
97111
}

0 commit comments

Comments
 (0)