Переглянути джерело

Ass support for uri-template

Sam Jaffe 6 роки тому
батько
коміт
c401e04316

+ 16 - 1
src/main/lombok/org/leumasjaffe/json/schema/tester/FormatTester.java

@@ -95,6 +95,21 @@ public abstract class FormatTester implements Tester {
 		}
 	};
 	
+	static Tester URI_TEMPLATE = new FormatTester("uri-template") {
+		@Override
+		public boolean accepts(JsonNode node) {
+			if (!node.isTextual()) return false;
+			try {
+				// TODO: RFC 2396 -> RFC 3986
+				// TODO: Validate inside brackets
+				new java.net.URI(node.asText().replaceAll("\\{.*?\\}", "_temp_"));
+				return true;
+			} catch (URISyntaxException e) {
+				return false;
+			}
+		}
+	};
+	
 	static Tester JSON_POINTER = new FormatTester("json-pointer") {
 		@Override
 		public boolean accepts(JsonNode node) {
@@ -114,7 +129,7 @@ public abstract class FormatTester implements Tester {
 		case "ipv6": return IPV6;
 		case "uri": return URI;
 		case "uri-reference": return URI_REFERNCE;
-//		case "uri-template":
+		case "uri-template": return URI_TEMPLATE;
 		case "json-pointer": return JSON_POINTER;	
 		case "uuid": return UUID;
 		default: throw new IllegalArgumentException("Unknown format code '" + asText + "'");

+ 11 - 0
src/test/java/org/leumasjaffe/json/schema/tester/FormatTesterTest.java

@@ -95,6 +95,17 @@ public class FormatTesterTest {
 		assertFalse(test.accepts(new TextNode("100:file")));
 		assertFalse(test.accepts(new TextNode("http://google.com/{domain}")));
 	}
+
+	@Test
+	public void testURITemplateeMatcher() {
+		Tester test = FormatTester.forCode("uri-template");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("file:///var/log/syslog")));
+		assertTrue(test.accepts(new TextNode("#/definitions/schemaArray")));
+		assertTrue(test.accepts(new TextNode("http://google.com")));
+		assertFalse(test.accepts(new TextNode("100:file")));
+		assertTrue(test.accepts(new TextNode("http://google.com/{domain}")));
+	}
 	
 	@Test
 	public void testJsonPointerMatcher() {