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: