Skip to content

Commit ca6f4d2

Browse files
author
Viktor Buldakov
committed
check schemaDependencies and remove notSchema definesProperty
1 parent 3ccf56b commit ca6f4d2

File tree

4 files changed

+75
-14
lines changed

4 files changed

+75
-14
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,4 @@ public void validate(final Object subject) {
6262
throw new ValidationException(this, "subject must not be valid agains schema " + mustNotMatch);
6363
}
6464

65-
@Override
66-
public boolean definesProperty(String field) {
67-
return !mustNotMatch.definesProperty(field);
68-
}
6965
}

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

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

397397
@Override
398398
public boolean definesProperty(String field) {
399-
if (field.isEmpty()) {
400-
return false;
401-
}
402-
for (Entry<Pattern, Schema> entry : patternProperties.entrySet()) {
403-
if (entry.getKey().matcher(field).matches()) {
404-
return true;
405-
}
406-
}
399+
return !field.isEmpty() && (definesPatternProperty(field)
400+
|| definesSchemaDependencyProperty(field)
401+
|| definesSchemaProperty(field));
402+
}
403+
404+
private boolean definesSchemaProperty(String field) {
407405
List<String> fields = Lists.newArrayList(Splitter.on(".").limit(2).split(field));
408406
String current = fields.get(0);
409407
boolean hasSuffix = fields.size() > 1;
@@ -418,4 +416,26 @@ public boolean definesProperty(String field) {
418416
return false;
419417
}
420418

419+
private boolean definesPatternProperty(String field) {
420+
for (Entry<Pattern, Schema> entry : patternProperties.entrySet()) {
421+
if (entry.getKey().matcher(field).matches()) {
422+
return true;
423+
}
424+
}
425+
return false;
426+
}
427+
428+
private boolean definesSchemaDependencyProperty(String field) {
429+
if (schemaDependencies.containsKey(field)) {
430+
return true;
431+
}
432+
433+
for (Schema schema : schemaDependencies.values()) {
434+
if (schema.definesProperty(field)) {
435+
return true;
436+
}
437+
}
438+
return false;
439+
}
440+
421441
}

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525

2626
import java.io.InputStream;
2727

28-
public class HasFieldTest {
28+
public class DefinesPropertyTest {
2929

3030
private static JSONObject ALL_SCHEMAS;
3131

3232
@BeforeClass
3333
public static void before() {
34-
InputStream stream = HasFieldTest.class.getResourceAsStream(
34+
InputStream stream = DefinesPropertyTest.class.getResourceAsStream(
3535
"/org/everit/jsonvalidator/testschemas.json");
3636
ALL_SCHEMAS = new JSONObject(new JSONTokener(stream));
3737
}
@@ -77,4 +77,25 @@ public void patternPropertiesHasField() {
7777
Assert.assertFalse(actual.definesProperty("b"));
7878
}
7979

80+
@Test
81+
public void objectWithSchemaDep() {
82+
ObjectSchema actual = (ObjectSchema) SchemaLoader.load(get("objectWithSchemaDep"));
83+
Assert.assertTrue(actual.definesProperty("a"));
84+
Assert.assertTrue(actual.definesProperty("b"));
85+
86+
Assert.assertFalse(actual.definesProperty("c"));
87+
}
88+
89+
@Test
90+
public void objectWithSchemaRectangleDep() {
91+
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"));
95+
96+
Assert.assertFalse(actual.definesProperty("c"));
97+
Assert.assertFalse(actual.definesProperty("d.c"));
98+
Assert.assertFalse(actual.definesProperty("rectangle.c"));
99+
}
100+
80101
}

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,30 @@
113113
}
114114
}
115115
},
116+
"objectWithSchemaRectangleDep" : {
117+
"type" : "object",
118+
"dependencies" : {
119+
"d.e" : {
120+
"type" : "object",
121+
"properties" : {
122+
"rectangle" : {"$ref" : "#/definitions/Rectangle" }
123+
}
124+
}
125+
},
126+
"definitions" : {
127+
"size" : {
128+
"type" : "number",
129+
"minimum" : 0
130+
},
131+
"Rectangle" : {
132+
"type" : "object",
133+
"properties" : {
134+
"a" : {"$ref" : "#/definitions/size"},
135+
"b" : {"$ref" : "#/definitions/size"}
136+
}
137+
}
138+
}
139+
},
116140
"invalidDependency" : {
117141
"type" : "object",
118142
"dependencies" : {

0 commit comments

Comments
 (0)