Skip to content
This repository was archived by the owner on Feb 12, 2022. It is now read-only.

Commit 9eb6379

Browse files
authored
Issue 665 (#673)
* Best attempt at fixing #665 It now checks to see if it parses, otherwise, it treats as a string.... * Best attempt at fixing #665 It now checks to see if it parses, otherwise, it treats as a string.... * Best attempt at fixing #665 It now checks to see if it parses, otherwise, it treats as a string.... * Better first part of a solution. * This works, I think. * Simpler approach.
1 parent cdeae4b commit 9eb6379

File tree

8 files changed

+345
-286
lines changed

8 files changed

+345
-286
lines changed

raml-parser-2/src/main/java/org/raml/v2/internal/impl/v10/phase/ExampleValidationPhase.java

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,30 @@
1515
*/
1616
package org.raml.v2.internal.impl.v10.phase;
1717

18+
import com.fasterxml.jackson.core.JsonParser;
19+
import com.fasterxml.jackson.databind.JsonNode;
20+
import com.fasterxml.jackson.databind.ObjectMapper;
21+
import com.google.common.base.Predicate;
22+
import com.google.common.collect.FluentIterable;
1823
import org.apache.ws.commons.schema.XmlSchema;
1924
import org.raml.v2.api.loader.ResourceLoader;
2025
import org.raml.v2.internal.impl.commons.model.factory.TypeDeclarationModelFactory;
26+
import org.raml.v2.internal.impl.commons.model.type.TypeDeclaration;
27+
import org.raml.v2.internal.impl.commons.model.type.UnionTypeDeclaration;
2128
import org.raml.v2.internal.impl.commons.nodes.ExampleDeclarationNode;
2229
import org.raml.v2.internal.impl.commons.nodes.TypeDeclarationNode;
30+
import org.raml.v2.internal.impl.commons.nodes.TypeExpressionNode;
2331
import org.raml.v2.internal.impl.commons.type.JsonSchemaExternalType;
2432
import org.raml.v2.internal.impl.commons.type.ResolvedType;
2533
import org.raml.v2.internal.impl.commons.type.XmlSchemaExternalType;
26-
import org.raml.v2.internal.impl.v10.type.AnyResolvedType;
27-
import org.raml.v2.internal.impl.v10.type.FileResolvedType;
28-
import org.raml.v2.internal.impl.v10.type.StringResolvedType;
29-
import org.raml.v2.internal.impl.v10.type.TypeToRuleVisitor;
30-
import org.raml.v2.internal.impl.v10.type.TypeToXmlSchemaVisitor;
34+
import org.raml.v2.internal.impl.v10.nodes.NamedTypeExpressionNode;
35+
import org.raml.v2.internal.impl.v10.nodes.UnionTypeExpressionNode;
36+
import org.raml.v2.internal.impl.v10.type.*;
3137
import org.raml.yagi.framework.grammar.rule.ErrorNodeFactory;
3238
import org.raml.yagi.framework.grammar.rule.Rule;
33-
import org.raml.yagi.framework.nodes.ErrorNode;
34-
import org.raml.yagi.framework.nodes.Node;
35-
import org.raml.yagi.framework.nodes.NodeType;
36-
import org.raml.yagi.framework.nodes.NullNodeImpl;
37-
import org.raml.yagi.framework.nodes.StringNode;
38-
import org.raml.yagi.framework.nodes.StringNodeImpl;
39+
import org.raml.yagi.framework.nodes.*;
3940
import org.raml.yagi.framework.nodes.jackson.JNodeParser;
41+
import org.raml.yagi.framework.nodes.jackson.JsonUtils;
4042
import org.raml.yagi.framework.nodes.snakeyaml.NodeParser;
4143
import org.raml.yagi.framework.phase.Phase;
4244
import org.xml.sax.Attributes;
@@ -46,6 +48,7 @@
4648
import org.xml.sax.helpers.XMLFilterImpl;
4749
import org.xml.sax.helpers.XMLReaderFactory;
4850

51+
import javax.annotation.Nonnull;
4952
import javax.annotation.Nullable;
5053
import javax.xml.XMLConstants;
5154
import javax.xml.transform.sax.SAXSource;
@@ -54,8 +57,12 @@
5457
import javax.xml.validation.SchemaFactory;
5558
import javax.xml.validation.Validator;
5659
import java.io.IOException;
60+
import java.io.Reader;
5761
import java.io.StringReader;
5862
import java.io.StringWriter;
63+
import java.util.ArrayList;
64+
import java.util.Collection;
65+
import java.util.HashSet;
5966
import java.util.List;
6067

6168
import static org.apache.commons.lang.StringUtils.isBlank;
@@ -108,7 +115,10 @@ public Node validate(TypeDeclarationNode type, String exampleValue)
108115
{
109116
exampleValueNode = new NullNodeImpl();
110117
}
111-
else if (!(type.getResolvedType() instanceof StringResolvedType) && !(type.getResolvedType() instanceof FileResolvedType) && !isJsonValue(exampleValue) && !isXmlValue(exampleValue))
118+
else if (!(type.getResolvedType() instanceof StringResolvedType) &&
119+
!(type.getResolvedType() instanceof FileResolvedType) &&
120+
!isJsonValue(exampleValue) &&
121+
!isXmlValue(exampleValue))
112122
{
113123
// parse as yaml except for string, file, json and xml types
114124
exampleValueNode = NodeParser.parse(resourceLoader, "", exampleValue);
@@ -124,14 +134,14 @@ public Node validate(TypeDeclarationNode type, Node exampleValue)
124134
{
125135
return null;
126136
}
127-
if (exampleValue instanceof StringNode && !(resolvedType instanceof StringResolvedType) && !isExternalSchemaType(resolvedType))
137+
if (exampleValue instanceof StringNode && !isExternalSchemaType(resolvedType))
128138
{
129139
final String value = ((StringNode) exampleValue).getValue();
130-
if (isXmlValue(value))
140+
if ((mightBeAnObjectType(resolvedType)) && isXmlValue(value))
131141
{
132142
return validateXml(type, resolvedType, value);
133143
}
134-
else if (isJsonValue(value))
144+
else if ((mightBeAnObjectType(resolvedType) || (resolvedType instanceof ArrayResolvedType)) && isJsonValue(value))
135145
{
136146
return validateJson(exampleValue, resolvedType, value);
137147
}
@@ -144,6 +154,35 @@ else if (isJsonValue(value))
144154
return null;
145155
}
146156

157+
private boolean mightBeAnObjectType(ResolvedType resolvedType)
158+
{
159+
if (resolvedType instanceof ObjectResolvedType)
160+
{
161+
return true;
162+
}
163+
164+
return unionMightBeAnObject(resolvedType, new HashSet<String>());
165+
}
166+
167+
private boolean unionMightBeAnObject(ResolvedType resolvedType, HashSet<String> seenTypes)
168+
{
169+
170+
seenTypes.add(resolvedType.getTypeName());
171+
if (resolvedType instanceof UnionResolvedType)
172+
{
173+
UnionResolvedType urt = (UnionResolvedType) resolvedType;
174+
for (ResolvedType type : urt.of())
175+
{
176+
if (!seenTypes.contains(type.getTypeName()))
177+
{
178+
return unionMightBeAnObject(type, seenTypes);
179+
}
180+
}
181+
}
182+
183+
return resolvedType instanceof ObjectResolvedType;
184+
}
185+
147186
protected Node validateJson(Node exampleValue, ResolvedType resolvedType, String value)
148187
{
149188
final Rule rule = resolvedType.visit(new TypeToRuleVisitor(resourceLoader));

raml-parser-2/src/test/java/org/raml/v2/api/LimitErrorMessagesTestCase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void originalErrorMessage()
3232
File ramlFile = new File("src/test/resources/org/raml/v2/api/v10/limit-error-message/limit-error-message.raml");
3333
assertTrue(ramlFile.isFile());
3434
RamlModelResult ramlModelResult = new RamlModelBuilder().buildApi(ramlFile);
35-
Assert.assertEquals(32765, ramlModelResult.getValidationResults().get(0).getMessage().length());
35+
Assert.assertEquals(26429, ramlModelResult.getValidationResults().get(0).getMessage().length());
3636
}
3737

3838
@Test
@@ -42,6 +42,6 @@ public void limitErrorMessage()
4242
File ramlFile = new File("src/test/resources/org/raml/v2/api/v10/limit-error-message/limit-error-message.raml");
4343
assertTrue(ramlFile.isFile());
4444
RamlModelResult ramlModelResult = new RamlModelBuilder().buildApi(ramlFile);
45-
Assert.assertEquals(10042, ramlModelResult.getValidationResults().get(0).getMessage().length());
45+
Assert.assertEquals(10079, ramlModelResult.getValidationResults().get(0).getMessage().length());
4646
}
4747
}

0 commit comments

Comments
 (0)