|
|
@@ -1,5 +1,8 @@
|
|
|
package org.leumasjaffe.json.schema.factory;
|
|
|
|
|
|
+import static com.fasterxml.jackson.databind.node.JsonNodeType.*;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
import java.util.function.Predicate;
|
|
|
|
|
|
import org.leumasjaffe.json.JsonHelper;
|
|
|
@@ -8,6 +11,8 @@ import org.leumasjaffe.json.schema.tester.AllItemsTester;
|
|
|
import org.leumasjaffe.json.schema.tester.AllOfTester;
|
|
|
import org.leumasjaffe.json.schema.tester.AnyOfTester;
|
|
|
import org.leumasjaffe.json.schema.tester.ContainsTester;
|
|
|
+import org.leumasjaffe.json.schema.tester.EqualsTester;
|
|
|
+import org.leumasjaffe.json.schema.tester.FixedTester;
|
|
|
import org.leumasjaffe.json.schema.tester.FormatTester;
|
|
|
import org.leumasjaffe.json.schema.tester.ItemsTester;
|
|
|
import org.leumasjaffe.json.schema.tester.NotTester;
|
|
|
@@ -20,7 +25,6 @@ import org.leumasjaffe.json.schema.tester.TypeTester;
|
|
|
import org.leumasjaffe.json.schema.tester.UniqueItemTester;
|
|
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
-import com.fasterxml.jackson.databind.node.JsonNodeType;
|
|
|
|
|
|
class SchemaV6Factory extends SchemaFactory {
|
|
|
@Override
|
|
|
@@ -31,31 +35,34 @@ class SchemaV6Factory extends SchemaFactory {
|
|
|
@Override
|
|
|
protected Tester createMapping(final String key, final JsonNode value) {
|
|
|
switch (key) {
|
|
|
- case "$id": return Tester.ACCEPT;
|
|
|
- case "$schema": return Tester.ACCEPT;
|
|
|
+ case "$id": return FixedTester.ACCEPT;
|
|
|
+ case "$schema": return FixedTester.ACCEPT;
|
|
|
// case "$ref": ; // TODO Implement reference propagating
|
|
|
- case "title": return Tester.ACCEPT;
|
|
|
- case "description": return Tester.ACCEPT;
|
|
|
- case "default": return Tester.ACCEPT;
|
|
|
- case "examples": return Tester.ACCEPT;
|
|
|
+ case "title": return FixedTester.ACCEPT;
|
|
|
+ case "description": return FixedTester.ACCEPT;
|
|
|
+ case "default": return FixedTester.ACCEPT;
|
|
|
+ case "examples": return FixedTester.ACCEPT;
|
|
|
case "multipleOf": return new NumberTester(d -> d % value.asDouble() == 0);
|
|
|
case "maximum": return new NumberTester(d -> d <= value.asDouble());
|
|
|
case "exclusiveMaximum": return new NumberTester(d -> d < value.asDouble());
|
|
|
case "minimum": return new NumberTester(d -> d >= value.asDouble());
|
|
|
case "exclusiveMinimum": return new NumberTester(d -> d > value.asDouble());
|
|
|
- case "maxLength": return new SizeTester(JsonNodeType.STRING, i -> i < value.asInt());
|
|
|
- case "minLength": return new SizeTester(JsonNodeType.STRING, i -> i >= value.asInt(0));
|
|
|
- case "pattern": return j -> j.isTextual() && j.asText().matches(value.asText());
|
|
|
- case "additionalItems": return new AllItemsTester(create(value));
|
|
|
- case "items": return value.isArray() ? new ItemsTester(createArray(value)) : new AllItemsTester(create(value));
|
|
|
- case "maxItems": return new SizeTester(JsonNodeType.ARRAY, i -> i < value.asInt());
|
|
|
- case "minItems": return new SizeTester(JsonNodeType.ARRAY, i -> i >= value.asInt(0));
|
|
|
- case "uniqueItems": return value.asBoolean() ? UniqueItemTester.INSTANCE : Tester.ACCEPT;
|
|
|
+ case "maxLength": return new SizeTester(STRING, i -> i < value.asInt());
|
|
|
+ case "minLength": return new SizeTester(STRING, i -> i >= value.asInt(0));
|
|
|
+ case "pattern": return new SimpleTester(STRING, j -> j.asText().matches(value.asText()));
|
|
|
+ case "additionalItems": return new AllItemsTester(ARRAY, create(value));
|
|
|
+ case "items": return value.isArray() ? new ItemsTester(createArray(value)) : new AllItemsTester(ARRAY, create(value));
|
|
|
+ case "maxItems": return new SizeTester(ARRAY, i -> i < value.asInt());
|
|
|
+ case "minItems": return new SizeTester(ARRAY, i -> i >= value.asInt(0));
|
|
|
+ case "uniqueItems": return value.asBoolean() ? UniqueItemTester.INSTANCE : FixedTester.ACCEPT;
|
|
|
case "contains": return new ContainsTester(create(value));
|
|
|
- case "maxProperties": return new SizeTester(JsonNodeType.OBJECT, i -> i < value.asInt());
|
|
|
- case "minProperties": return new SizeTester(JsonNodeType.OBJECT, i -> i >= value.asInt(0));
|
|
|
- case "required": return json -> JsonHelper.toArray(value, JsonNode::asText).stream().allMatch(json::has);
|
|
|
- case "additionalProperties": return j -> JsonHelper.toArray(j).stream().allMatch(create(value)::accepts);
|
|
|
+ case "maxProperties": return new SizeTester(OBJECT, i -> i < value.asInt());
|
|
|
+ case "minProperties": return new SizeTester(OBJECT, i -> i >= value.asInt(0));
|
|
|
+ case "required": {
|
|
|
+ final List<String> reqKeys = JsonHelper.toArray(value, JsonNode::asText);
|
|
|
+ return new SimpleTester(OBJECT, json -> reqKeys.stream().allMatch(json::has));
|
|
|
+ }
|
|
|
+ case "additionalProperties": return new AllItemsTester(OBJECT, create(value));
|
|
|
// case "definitions": ; // TODO Implement definitions creation
|
|
|
case "properties": return new PropertyTester(JsonHelper.values(value,
|
|
|
(k, v) -> new PropertyTester.Pair(stringEqual(k), create(v))));
|
|
|
@@ -63,8 +70,8 @@ class SchemaV6Factory extends SchemaFactory {
|
|
|
(k, v) -> new PropertyTester.Pair(stringMatches(k), create(v))));
|
|
|
// case "dependencies": ; // TODO Implement array(required) and object(schema) versions
|
|
|
case "propertyNames": return new PropertyNameTester(create(value));
|
|
|
- case "const": return value::equals;
|
|
|
- case "enum": return new AnyOfTester(JsonHelper.toArray(value, v -> (Tester) v::equals));
|
|
|
+ case "const": return new EqualsTester(value);
|
|
|
+ case "enum": return new EqualsTester(JsonHelper.toArray(value));
|
|
|
case "type": return TypeTester.fromType(value.asText());
|
|
|
case "format": return FormatTester.forCode(value.asText());
|
|
|
case "allOf": return new AllOfTester(createArray(value));
|