From 80b1510668d217be562b4d38656168a01269ccbf Mon Sep 17 00:00:00 2001 From: Tobias Oberlies Date: Tue, 10 Nov 2015 12:02:41 +0100 Subject: [PATCH] Ignore invalid keys in the parser The validator already detects invalid keys, so the parser doesn't need to report them by throwing an exception. This allows to read the valid parts from an invalid RAML file. --- .../parser/builder/DefaultTupleBuilder.java | 2 +- .../parser/visitor/YamlDocumentBuilder.java | 4 ++++ .../parser/visitor/YamlDocumentSuggester.java | 6 +++++- .../raml/validation/ValidationTestCase.java | 18 ++++++++++++++++++ .../org/raml/validation/unknown-key.yaml | 7 +++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/org/raml/validation/unknown-key.yaml diff --git a/src/main/java/org/raml/parser/builder/DefaultTupleBuilder.java b/src/main/java/org/raml/parser/builder/DefaultTupleBuilder.java index 7cb523ee..22b903ee 100644 --- a/src/main/java/org/raml/parser/builder/DefaultTupleBuilder.java +++ b/src/main/java/org/raml/parser/builder/DefaultTupleBuilder.java @@ -65,7 +65,7 @@ public NodeBuilder getBuilderForTuple(NodeTuple tuple) return tupleBuilder; } } - throw new RuntimeException("Builder not found for " + tuple); + return null; } protected Map> getBuilders() diff --git a/src/main/java/org/raml/parser/visitor/YamlDocumentBuilder.java b/src/main/java/org/raml/parser/visitor/YamlDocumentBuilder.java index ecb9d601..860ac0c1 100644 --- a/src/main/java/org/raml/parser/visitor/YamlDocumentBuilder.java +++ b/src/main/java/org/raml/parser/visitor/YamlDocumentBuilder.java @@ -270,6 +270,10 @@ public boolean onTupleStart(NodeTuple nodeTuple) if (currentBuilder != null) { NodeBuilder builder = currentBuilder.getBuilderForTuple(nodeTuple); + if (builder == null) + { + return false; + } builderContext.push(builder); } else diff --git a/src/main/java/org/raml/parser/visitor/YamlDocumentSuggester.java b/src/main/java/org/raml/parser/visitor/YamlDocumentSuggester.java index 5290dc31..1a393efd 100644 --- a/src/main/java/org/raml/parser/visitor/YamlDocumentSuggester.java +++ b/src/main/java/org/raml/parser/visitor/YamlDocumentSuggester.java @@ -307,7 +307,11 @@ public boolean onTupleStart(NodeTuple nodeTuple) { try { - builder.onTupleStart(nodeTuple); + boolean found = builder.onTupleStart(nodeTuple); + if (!found) + { + return false; + } MappingNode mapping = nodeTuple.getValueNode().getNodeId() == NodeId.mapping ? (MappingNode) nodeTuple.getValueNode() : null; pushNode(nodeTuple.getKeyNode(), mapping); } diff --git a/src/test/java/org/raml/validation/ValidationTestCase.java b/src/test/java/org/raml/validation/ValidationTestCase.java index 2800465c..3572ffa3 100644 --- a/src/test/java/org/raml/validation/ValidationTestCase.java +++ b/src/test/java/org/raml/validation/ValidationTestCase.java @@ -16,6 +16,7 @@ package org.raml.validation; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import static org.junit.matchers.JUnitMatchers.containsString; @@ -28,11 +29,13 @@ import org.junit.Ignore; import org.junit.Test; +import org.raml.model.ActionType; import org.raml.model.Raml; import org.raml.parser.builder.AbstractRamlTestCase; import org.raml.parser.rule.ValidationResult; import org.raml.parser.tagresolver.ContextPath; import org.raml.parser.visitor.IncludeInfo; +import org.raml.parser.visitor.RamlDocumentBuilder; public class ValidationTestCase extends AbstractRamlTestCase { @@ -222,6 +225,21 @@ public void circularInclude() assertThat(includeInfo.getLine() + 1, is(3)); } + @Test + public void unknownKey() + { + String resource = "org/raml/validation/unknown-key.yaml"; + + // validation reports the unknown key... + List validationResults = validateRaml(resource); + assertThat(validationResults.size(), is(1)); + assertThat(validationResults.get(0).getMessage(), is("Unknown key: unknown")); + + // ... but the parser doesn't choke on it + Raml validContent = new RamlDocumentBuilder().build(resource); + assertThat(validContent.getResource("/partiallyInvalid").getAction(ActionType.POST), is(notNullValue())); + } + @Test public void badMediaTypeName() { diff --git a/src/test/resources/org/raml/validation/unknown-key.yaml b/src/test/resources/org/raml/validation/unknown-key.yaml new file mode 100644 index 00000000..a4499700 --- /dev/null +++ b/src/test/resources/org/raml/validation/unknown-key.yaml @@ -0,0 +1,7 @@ +#%RAML 0.8 +title: unknown key +/partiallyInvalid: + post: + unknown: + body: + application/json: