|
|
@@ -9,6 +9,8 @@ import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
|
|
|
+import org.leumasjaffe.json.JsonHelper;
|
|
|
+
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
import com.fasterxml.jackson.databind.node.JsonNodeType;
|
|
|
|
|
|
@@ -25,6 +27,9 @@ public class Schema implements Tester {
|
|
|
"exclusiveMaximum");
|
|
|
private static final List<String> STRING_MATCHERS = Arrays.asList(
|
|
|
"maxLength", "minLength", "pattern", "format");
|
|
|
+ private static final List<String> ARRAY_MATCHERS = Arrays.asList(
|
|
|
+ "maxItems", "minItems", "uniqueItems", "contains");
|
|
|
+
|
|
|
Map<String, Tester> children = new HashMap<>();
|
|
|
|
|
|
public Schema() {
|
|
|
@@ -59,6 +64,7 @@ public class Schema implements Tester {
|
|
|
switch (node.getNodeType()) {
|
|
|
case NUMBER: return acceptsNumber(node);
|
|
|
case STRING: return acceptsString(node);
|
|
|
+ case ARRAY: return acceptsArray(node);
|
|
|
default: return acceptsUniversal(node);
|
|
|
}
|
|
|
}
|
|
|
@@ -80,6 +86,21 @@ public class Schema implements Tester {
|
|
|
}
|
|
|
return acceptsUniversal(node);
|
|
|
}
|
|
|
+
|
|
|
+ private boolean acceptsArray(JsonNode node) {
|
|
|
+ for (String key : getKeys(ARRAY_MATCHERS)) {
|
|
|
+ if (!children.get(key).accepts(node)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ArrayTester items = (ArrayTester) children.get("items");
|
|
|
+ ArrayTester addtlItems = (ArrayTester) children.get("additionalItems");
|
|
|
+ ArrayTester.Status status = items.accepts(JsonHelper.toArray(node));
|
|
|
+ if (status.accepted && !status.unprocessed.isEmpty()) {
|
|
|
+ status = addtlItems.accepts(status.unprocessed);
|
|
|
+ }
|
|
|
+ return status.accepted && acceptsUniversal(node);
|
|
|
+ }
|
|
|
|
|
|
private boolean acceptsUniversal(JsonNode node) {
|
|
|
for (String key : getKeys(UNIVERSAL_MATCHERS)) {
|