Skip to content

Commit 089140b

Browse files
author
Viktor Buldakov
committed
44: Add possibility to check if field exists in schema
1 parent 17d8ed4 commit 089140b

File tree

13 files changed

+173
-4
lines changed

13 files changed

+173
-4
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.everit.json.schema;
1717

18+
import org.json.JSONArray;
19+
1820
import java.util.ArrayList;
1921
import java.util.Collection;
2022
import java.util.List;
@@ -24,8 +26,6 @@
2426
import java.util.function.IntFunction;
2527
import java.util.stream.IntStream;
2628

27-
import org.json.JSONArray;
28-
2929
/**
3030
* Array schema validator.
3131
*/
@@ -291,4 +291,9 @@ public void validate(final Object subject) {
291291
ValidationException.throwFor(this, failures);
292292
}
293293

294+
@Override
295+
public boolean hasField(String field) {
296+
return false;
297+
}
298+
294299
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,9 @@ public void validate(final Object subject) {
4949
}
5050
}
5151

52+
@Override
53+
public boolean hasField(String field) {
54+
return false;
55+
}
56+
5257
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,17 @@ public void validate(final Object subject) {
178178
e.getKeyword());
179179
}
180180
}
181+
182+
@Override
183+
public boolean hasField(String field) {
184+
List<Schema> matching = subschemas.stream()
185+
.filter(schema -> schema.hasField(field))
186+
.collect(Collectors.toList());
187+
try {
188+
criterion.validate(subschemas.size(), matching.size());
189+
} catch (ValidationException e) {
190+
return false;
191+
}
192+
return true;
193+
}
181194
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,9 @@ public void validate(final Object subject) {
4747
// always passing
4848
}
4949

50+
@Override
51+
public boolean hasField(String field) {
52+
return false;
53+
}
54+
5055
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,9 @@ public void validate(final Object subject) {
7474
subject), "enum"));
7575
}
7676

77+
@Override
78+
public boolean hasField(String field) {
79+
return false;
80+
}
81+
7782
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,9 @@ public void validate(final Object subject) {
6161
}
6262
throw new ValidationException(this, "subject must not be valid agains schema " + mustNotMatch);
6363
}
64+
65+
@Override
66+
public boolean hasField(String field) {
67+
return !mustNotMatch.hasField(field);
68+
}
6469
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,9 @@ public void validate(final Object subject) {
5050
+ subject.getClass().getSimpleName());
5151
}
5252
}
53+
54+
@Override
55+
public boolean hasField(String field) {
56+
return false;
57+
}
5358
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,9 @@ public void validate(final Object subject) {
198198
}
199199
}
200200

201+
@Override
202+
public boolean hasField(String field) {
203+
return false;
204+
}
205+
201206
}

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
*/
1616
package org.everit.json.schema;
1717

18+
import com.google.common.base.Splitter;
19+
import com.google.common.collect.Lists;
20+
import org.json.JSONObject;
21+
1822
import java.util.ArrayList;
1923
import java.util.Arrays;
2024
import java.util.Collections;
@@ -30,8 +34,6 @@
3034
import java.util.stream.Collectors;
3135
import java.util.stream.Stream;
3236

33-
import org.json.JSONObject;
34-
3537
/**
3638
* Object schema validator.
3739
*/
@@ -392,4 +394,28 @@ public void validate(final Object subject) {
392394
}
393395
}
394396

397+
@Override
398+
public boolean hasField(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+
}
407+
List<String> fields = Lists.newArrayList(Splitter.on(".").limit(2).split(field));
408+
String current = fields.get(0);
409+
boolean hasSuffix = fields.size() > 1;
410+
if (propertySchemas.containsKey(current)) {
411+
if (hasSuffix) {
412+
String suffix = fields.get(1);
413+
return propertySchemas.get(current).hasField(suffix);
414+
} else {
415+
return true;
416+
}
417+
}
418+
return false;
419+
}
420+
395421
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ public void validate(final Object subject) {
6161
referredSchema.validate(subject);
6262
}
6363

64+
@Override
65+
public boolean hasField(String field) {
66+
if (referredSchema == null) {
67+
throw new IllegalStateException("referredSchema must be injected before validation");
68+
}
69+
return referredSchema.hasField(field);
70+
}
71+
6472
public Schema getReferredSchema() {
6573
return referredSchema;
6674
}

0 commit comments

Comments
 (0)