Explorar el Código

Convert the rest of the testers

Sam Jaffe hace 6 años
padre
commit
f01953cefe

+ 12 - 0
src/main/lombok/org/leumasjaffe/json/schema/Schema.java

@@ -1,9 +1,13 @@
 package org.leumasjaffe.json.schema;
 
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -23,6 +27,14 @@ public class Schema implements Tester {
 		children.putAll(fields);
 	}
 
+	@Override
+	public JsonNodeType[] acceptedTypes() {
+		final Set<JsonNodeType> set = new HashSet<>();
+		children.values().stream().map(Tester::acceptedTypes)
+				.forEach(a -> set.addAll(Arrays.asList(a)));
+		return set.toArray(new JsonNodeType[0]);
+	}
+
 	@Override
 	public boolean accepts(JsonNode node) {
 		if (children.isEmpty()) {

+ 4 - 0
src/main/lombok/org/leumasjaffe/json/schema/Tester.java

@@ -5,5 +5,9 @@ import com.fasterxml.jackson.databind.node.JsonNodeType;
 
 public interface Tester {
 	default JsonNodeType[] acceptedTypes() { return null; }
+	static final JsonNodeType[] ANY = {
+			JsonNodeType.ARRAY, JsonNodeType.OBJECT, JsonNodeType.STRING,
+			JsonNodeType.NUMBER, JsonNodeType.BOOLEAN, JsonNodeType.NULL
+	};
 	boolean accepts(final JsonNode node);
 }

+ 6 - 0
src/main/lombok/org/leumasjaffe/json/schema/tester/EqualsTester.java

@@ -6,6 +6,7 @@ import java.util.List;
 import org.leumasjaffe.json.schema.Tester;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
 
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
@@ -20,6 +21,11 @@ public class EqualsTester implements Tester {
 		this(Arrays.asList(values));
 	}
 
+	@Override
+	public JsonNodeType[] acceptedTypes() {
+		return ANY;
+	}
+	
 	public boolean accepts(JsonNode node) {
 		return values.parallelStream().anyMatch(node::equals);
 	}

+ 0 - 4
src/main/lombok/org/leumasjaffe/json/schema/tester/FixedTester.java

@@ -15,10 +15,6 @@ public class FixedTester implements Tester {
 	public static final FixedTester ACCEPT = new FixedTester(true);
 	public static final FixedTester REJECT = new FixedTester(false);
 	
-	static final JsonNodeType[] ANY = {
-			JsonNodeType.ARRAY, JsonNodeType.OBJECT, JsonNodeType.STRING,
-			JsonNodeType.NUMBER, JsonNodeType.BOOLEAN, JsonNodeType.NULL
-	};
 	boolean returns;
 
 	@Override

+ 6 - 0
src/main/lombok/org/leumasjaffe/json/schema/tester/FormatTester.java

@@ -10,6 +10,7 @@ import org.apache.commons.validator.routines.InetAddressValidator;
 import org.leumasjaffe.json.schema.Tester;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
 
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
@@ -120,6 +121,11 @@ public abstract class FormatTester implements Tester {
 	
 	String format;
 	
+	@Override
+	public JsonNodeType[] acceptedTypes() {
+		return new JsonNodeType[] {JsonNodeType.STRING};
+	}
+	
 	public static Tester forCode(String asText) {
 		switch (asText) {
 		case "date-time": return DATE_TIME;

+ 6 - 0
src/main/lombok/org/leumasjaffe/json/schema/tester/NotTester.java

@@ -3,6 +3,7 @@ package org.leumasjaffe.json.schema.tester;
 import org.leumasjaffe.json.schema.Tester;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
 
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
@@ -13,6 +14,11 @@ import lombok.experimental.FieldDefaults;
 public class NotTester implements Tester {
 	Tester child;
 
+	@Override
+	public JsonNodeType[] acceptedTypes() {
+		return child.acceptedTypes();
+	}
+
 	public boolean accepts(JsonNode node) {
 		return !child.accepts(node);
 	}

+ 29 - 9
src/main/lombok/org/leumasjaffe/json/schema/tester/TypeTester.java

@@ -1,22 +1,42 @@
 package org.leumasjaffe.json.schema.tester;
 
+import java.util.function.Predicate;
+
 import org.leumasjaffe.json.schema.Tester;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
+
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.FieldDefaults;
 
-public abstract class TypeTester implements Tester {
+@RequiredArgsConstructor(access=AccessLevel.PRIVATE)
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class TypeTester implements Tester {
 
-	public static Tester fromType(final String type) {
+	public static TypeTester fromType(final String type) {
 		switch (type) {
-		case "array": return JsonNode::isArray;
-		case "boolean": return JsonNode::isBoolean;
-		case "integer": return JsonNode::isInt;
-		case "null": return JsonNode::isNull;
-		case "number": return JsonNode::isNumber;
-		case "object": return JsonNode::isObject;
-		case "string": return JsonNode::isTextual;
+		case "array": return new TypeTester(JsonNode::isArray);
+		case "boolean": return new TypeTester(JsonNode::isBoolean);
+		case "integer": return new TypeTester(JsonNode::isInt);
+		case "null": return new TypeTester(JsonNode::isNull);
+		case "number": return new TypeTester(JsonNode::isNumber);
+		case "object": return new TypeTester(JsonNode::isObject);
+		case "string": return new TypeTester(JsonNode::isTextual);
 		default: throw new IllegalArgumentException("Invalid type: " + type);
 		}
 	}
+	
+	Predicate<JsonNode> test;
+	
+	@Override
+	public JsonNodeType[] acceptedTypes() {
+		return ANY;
+	}
 
+	@Override
+	public boolean accepts(JsonNode node) {
+		return test.test(node);
+	}
 }