Преглед изворни кода

Convert manually defined testers to use classes.

Sam Jaffe пре 6 година
родитељ
комит
88ed09d285

+ 4 - 17
src/main/lombok/org/leumasjaffe/json/schema/factory/SchemaV6Factory.java

@@ -6,10 +6,12 @@ import java.util.regex.Pattern;
 
 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 +48,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;

+ 30 - 0
src/main/lombok/org/leumasjaffe/json/schema/tester/AllItemsTester.java

@@ -0,0 +1,30 @@
+package org.leumasjaffe.json.schema.tester;
+
+import java.util.List;
+
+import org.leumasjaffe.json.JsonHelper;
+import org.leumasjaffe.json.schema.Tester;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.FieldDefaults;
+
+@RequiredArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class AllItemsTester implements Tester {
+	Tester schema;
+
+	@Override
+	public boolean accepts(JsonNode node) {
+		List<JsonNode> data = JsonHelper.toArray(node);
+		for (int i = 0; i < data.size(); ++i) {
+			if (!schema.accepts(data.get(i))) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+}

+ 30 - 0
src/main/lombok/org/leumasjaffe/json/schema/tester/ItemsTester.java

@@ -0,0 +1,30 @@
+package org.leumasjaffe.json.schema.tester;
+
+import java.util.List;
+
+import org.leumasjaffe.json.JsonHelper;
+import org.leumasjaffe.json.schema.Tester;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.FieldDefaults;
+
+@RequiredArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class ItemsTester implements Tester {
+	List<Tester> schemas;
+
+	@Override
+	public boolean accepts(JsonNode node) {
+		List<JsonNode> data = JsonHelper.toArray(node);
+		for (int i = 0; i < Math.min(schemas.size(), data.size()); ++i) {
+			if (!schemas.get(i).accepts(data.get(i))) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+}