Skip to content

Commit 751e367

Browse files
author
Viktor Buldakov
committed
support json pointer notation
1 parent 8685b93 commit 751e367

File tree

3 files changed

+59
-31
lines changed

3 files changed

+59
-31
lines changed

core/src/main/java/org/everit/json/schema/ObjectSchema.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,14 +396,15 @@ public void validate(final Object subject) {
396396

397397
@Override
398398
public boolean definesProperty(String field) {
399+
field = field.replaceFirst("^#", "").replaceFirst("^/", "");
399400
return !field.isEmpty() && (definesPatternProperty(field)
400401
|| definesSchemaDependencyProperty(field)
401402
|| definesSchemaProperty(field));
402403
}
403404

404405
private boolean definesSchemaProperty(String field) {
405-
List<String> fields = Lists.newArrayList(Splitter.on(".").limit(2).split(field));
406-
String current = fields.get(0);
406+
List<String> fields = Lists.newArrayList(Splitter.on("/").limit(2).split(field));
407+
String current = unescape(fields.get(0));
407408
boolean hasSuffix = fields.size() > 1;
408409
if (propertySchemas.containsKey(current)) {
409410
if (hasSuffix) {
@@ -427,4 +428,8 @@ private boolean definesSchemaDependencyProperty(String field) {
427428
.findAny().isPresent();
428429
}
429430

431+
private String unescape(String value) {
432+
return value.replace("~1", "/").replace("~0", "~");
433+
}
434+
430435
}

core/src/test/java/org/everit/json/schema/loader/DefinesPropertyTest.java

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,59 +43,68 @@ private JSONObject get(final String schemaName) {
4343
@Test
4444
public void objectSchemaHasField() {
4545
ObjectSchema actual = (ObjectSchema) SchemaLoader.load(get("pointerResolution"));
46-
Assert.assertTrue(actual.definesProperty("rectangle"));
47-
Assert.assertTrue(actual.definesProperty("rectangle.a"));
48-
Assert.assertTrue(actual.definesProperty("rectangle.b"));
49-
50-
Assert.assertFalse(actual.definesProperty("rectangle.c"));
51-
Assert.assertFalse(actual.definesProperty("rectangle."));
52-
Assert.assertFalse(actual.definesProperty("."));
53-
Assert.assertFalse(actual.definesProperty(".a"));
54-
Assert.assertFalse(actual.definesProperty(""));
55-
Assert.assertFalse(actual.definesProperty("rectangle.a.d"));
46+
Assert.assertTrue(actual.definesProperty("#/rectangle"));
47+
Assert.assertTrue(actual.definesProperty("#/rectangle/a"));
48+
Assert.assertTrue(actual.definesProperty("#/rectangle/b"));
49+
50+
Assert.assertFalse(actual.definesProperty("#/rectangle/c"));
51+
Assert.assertFalse(actual.definesProperty("#/rectangle/"));
52+
Assert.assertFalse(actual.definesProperty("#/"));
53+
Assert.assertFalse(actual.definesProperty("#/a"));
54+
Assert.assertFalse(actual.definesProperty("#"));
55+
Assert.assertFalse(actual.definesProperty("#/rectangle/a/d"));
5656
}
5757

5858
@Test
5959
public void recursiveSchemaHasField() {
6060
Schema recursiveSchema = SchemaLoader.load(get("recursiveSchema"));
6161

62-
Assert.assertTrue(recursiveSchema.definesProperty("prop"));
63-
Assert.assertTrue(recursiveSchema.definesProperty("prop.subprop"));
64-
Assert.assertTrue(recursiveSchema.definesProperty("prop.subprop.subprop"));
65-
Assert.assertTrue(recursiveSchema.definesProperty("prop.subprop.subprop.subprop"));
62+
Assert.assertTrue(recursiveSchema.definesProperty("#/prop"));
63+
Assert.assertTrue(recursiveSchema.definesProperty("#/prop/subprop"));
64+
Assert.assertTrue(recursiveSchema.definesProperty("#/prop/subprop/subprop"));
65+
Assert.assertTrue(recursiveSchema.definesProperty("#/prop/subprop/subprop/subprop"));
6666
}
6767

6868
@Test
6969
public void patternPropertiesHasField() {
7070
ObjectSchema actual = (ObjectSchema) SchemaLoader.load(get("patternProperties"));
71-
Assert.assertTrue(actual.definesProperty("a"));
72-
Assert.assertTrue(actual.definesProperty("aa"));
73-
Assert.assertTrue(actual.definesProperty("aaa"));
74-
Assert.assertTrue(actual.definesProperty("aaaa"));
75-
Assert.assertTrue(actual.definesProperty("aaaaa"));
71+
Assert.assertTrue(actual.definesProperty("#/a"));
72+
Assert.assertTrue(actual.definesProperty("#/aa"));
73+
Assert.assertTrue(actual.definesProperty("#/aaa"));
74+
Assert.assertTrue(actual.definesProperty("#/aaaa"));
75+
Assert.assertTrue(actual.definesProperty("#/aaaaa"));
7676

7777
Assert.assertFalse(actual.definesProperty("b"));
7878
}
7979

8080
@Test
8181
public void objectWithSchemaDep() {
8282
ObjectSchema actual = (ObjectSchema) SchemaLoader.load(get("objectWithSchemaDep"));
83-
Assert.assertTrue(actual.definesProperty("a"));
84-
Assert.assertTrue(actual.definesProperty("b"));
83+
Assert.assertTrue(actual.definesProperty("#/a"));
84+
Assert.assertTrue(actual.definesProperty("#/b"));
8585

86-
Assert.assertFalse(actual.definesProperty("c"));
86+
Assert.assertFalse(actual.definesProperty("#/c"));
8787
}
8888

8989
@Test
9090
public void objectWithSchemaRectangleDep() {
9191
ObjectSchema actual = (ObjectSchema) SchemaLoader.load(get("objectWithSchemaRectangleDep"));
92-
Assert.assertTrue(actual.definesProperty("d.e"));
93-
Assert.assertTrue(actual.definesProperty("rectangle.a"));
94-
Assert.assertTrue(actual.definesProperty("rectangle.b"));
92+
Assert.assertTrue(actual.definesProperty("#/d"));
93+
Assert.assertTrue(actual.definesProperty("#/rectangle/a"));
94+
Assert.assertTrue(actual.definesProperty("#/rectangle/b"));
9595

96-
Assert.assertFalse(actual.definesProperty("c"));
97-
Assert.assertFalse(actual.definesProperty("d.c"));
98-
Assert.assertFalse(actual.definesProperty("rectangle.c"));
96+
Assert.assertFalse(actual.definesProperty("#/c"));
97+
Assert.assertFalse(actual.definesProperty("#/d/c"));
98+
Assert.assertFalse(actual.definesProperty("#/rectangle/c"));
99+
}
100+
101+
@Test
102+
public void objectEscape() {
103+
ObjectSchema actual = (ObjectSchema) SchemaLoader.load(get("objectEscape"));
104+
Assert.assertTrue(actual.definesProperty("#/a~0b"));
105+
Assert.assertTrue(actual.definesProperty("#/a~0b/c~1d"));
106+
107+
Assert.assertFalse(actual.definesProperty("#/a~0b/c/d"));
99108
}
100109

101110
}

core/src/test/resources/org/everit/jsonvalidator/testschemas.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
"objectWithSchemaRectangleDep" : {
117117
"type" : "object",
118118
"dependencies" : {
119-
"d.e" : {
119+
"d" : {
120120
"type" : "object",
121121
"properties" : {
122122
"rectangle" : {"$ref" : "#/definitions/Rectangle" }
@@ -171,6 +171,20 @@
171171
}
172172
}
173173
},
174+
"objectEscape" : {
175+
"type" : "object",
176+
"properties" : {
177+
"a~b" : {"$ref" : "#/definitions/Prop" }
178+
},
179+
"definitions" : {
180+
"Prop" : {
181+
"type" : "object",
182+
"properties" : {
183+
"c/d" : {"type" : "string"}
184+
}
185+
}
186+
}
187+
},
174188
"pointerResolutionFailure" : {
175189
"type" : "object",
176190
"properties" : {

0 commit comments

Comments
 (0)