|
|
@@ -1,15 +1,15 @@
|
|
|
package org.leumasjaffe.json.schema.factory;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.regex.Pattern;
|
|
|
+import java.util.function.Predicate;
|
|
|
|
|
|
import org.leumasjaffe.json.JsonHelper;
|
|
|
import org.leumasjaffe.json.schema.Tester;
|
|
|
+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.FormatTester;
|
|
|
+import org.leumasjaffe.json.schema.tester.ItemsTester;
|
|
|
import org.leumasjaffe.json.schema.tester.NotTester;
|
|
|
import org.leumasjaffe.json.schema.tester.NumberTester;
|
|
|
import org.leumasjaffe.json.schema.tester.OneOfTester;
|
|
|
@@ -46,23 +46,8 @@ class SchemaV6Factory extends SchemaFactory {
|
|
|
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 j -> JsonHelper.toArray(j).stream().allMatch(create(value)::accepts);
|
|
|
- case "items":
|
|
|
- if (value.isArray()) {
|
|
|
- return j -> {
|
|
|
- List<Tester> tests = createArray(value);
|
|
|
- List<JsonNode> data = JsonHelper.toArray(j);
|
|
|
- for (int i = 0; i < Math.min(value.size(), data.size()); ++i) {
|
|
|
- if (!tests.get(i).accepts(data.get(i))) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- return true;
|
|
|
- };
|
|
|
- }
|
|
|
- else {
|
|
|
- return j -> JsonHelper.toArray(j).stream().allMatch(create(value)::accepts);
|
|
|
- }
|
|
|
+ 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;
|
|
|
@@ -72,22 +57,10 @@ class SchemaV6Factory extends SchemaFactory {
|
|
|
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 "definitions": ; // TODO Implement definitions creation
|
|
|
- case "properties": {
|
|
|
- final List<PropertyTester.Pair> list = new ArrayList<>();
|
|
|
- value.fields().forEachRemaining(e -> {
|
|
|
- final String k = e.getKey();
|
|
|
- list.add(new PropertyTester.Pair(s -> k.equals(s), create(e.getValue())));
|
|
|
- });
|
|
|
- return new PropertyTester(list);
|
|
|
- }
|
|
|
- case "patternProperties": {
|
|
|
- final List<PropertyTester.Pair> list = new ArrayList<>();
|
|
|
- value.fields().forEachRemaining(e -> {
|
|
|
- final Pattern k = Pattern.compile(e.getKey());
|
|
|
- list.add(new PropertyTester.Pair(s -> k.matcher(s).matches(), create(e.getValue())));
|
|
|
- });
|
|
|
- return new PropertyTester(list);
|
|
|
- }
|
|
|
+ case "properties": return new PropertyTester(JsonHelper.values(value,
|
|
|
+ (k, v) -> new PropertyTester.Pair(stringEqual(k), create(v))));
|
|
|
+ case "patternProperties": return new PropertyTester(JsonHelper.values(value,
|
|
|
+ (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;
|
|
|
@@ -102,4 +75,12 @@ class SchemaV6Factory extends SchemaFactory {
|
|
|
throw new IllegalArgumentException("Unknown matcher: " + key);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private static Predicate<String> stringEqual(String to) {
|
|
|
+ return s -> s.equals(to);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Predicate<String> stringMatches(String toRegex) {
|
|
|
+ return s -> s.matches(toRegex);
|
|
|
+ }
|
|
|
}
|