Skip to content

Commit 7d208e4

Browse files
committed
rework of ArraySchema in progress
1 parent 125f8fb commit 7d208e4

File tree

2 files changed

+41
-16
lines changed

2 files changed

+41
-16
lines changed

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

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Collection;
2020
import java.util.List;
2121
import java.util.Objects;
22+
import java.util.Optional;
2223

2324
import org.json.JSONArray;
2425

@@ -172,6 +173,15 @@ public Schema getSchemaOfAdditionalItems() {
172173
return schemaOfAdditionalItems;
173174
}
174175

176+
private Optional<ValidationException> ifFails(final Schema schema, final Object input) {
177+
try {
178+
schema.validate(input);
179+
return Optional.empty();
180+
} catch (ValidationException e) {
181+
return Optional.of(e);
182+
}
183+
}
184+
175185
public boolean needsUniqueItems() {
176186
return uniqueItems;
177187
}
@@ -196,7 +206,8 @@ private void testItemCount(final JSONArray subject) {
196206
}
197207
}
198208

199-
private void testItems(final JSONArray subject) {
209+
private List<ValidationException> testItems(final JSONArray subject) {
210+
List<ValidationException> rval = new ArrayList<>();
200211
if (allItemSchema != null) {
201212
for (int i = 0; i < subject.length(); ++i) {
202213
allItemSchema.validate(subject.get(i));
@@ -208,34 +219,43 @@ private void testItems(final JSONArray subject) {
208219
}
209220
int itemValidationUntil = Math.min(subject.length(), itemSchemas.size());
210221
for (int i = 0; i < itemValidationUntil; ++i) {
211-
itemSchemas.get(i).validate(subject.get(i));
222+
int copyOfI = i; // i is not effectively final so we copy it
223+
ifFails(itemSchemas.get(i), subject.get(i))
224+
.map(exc -> exc.prepend(String.valueOf(copyOfI)))
225+
.ifPresent(rval::add);
212226
}
213227
if (schemaOfAdditionalItems != null) {
214228
for (int i = itemValidationUntil; i < subject.length(); ++i) {
215-
schemaOfAdditionalItems.validate(subject.get(i));
229+
int copyOfI = i; // i is not effectively final so we copy it
230+
ifFails(schemaOfAdditionalItems, subject.get(i))
231+
.map(exc -> exc.prepend(String.valueOf(copyOfI)))
232+
.ifPresent(rval::add);
216233
}
217234
}
218235
}
236+
return rval;
219237
}
220238

221-
private void testUniqueness(final JSONArray subject) {
239+
private Optional<ValidationException> testUniqueness(final JSONArray subject) {
222240
if (subject.length() == 0) {
223-
return;
241+
return Optional.empty();
224242
}
225243
Collection<Object> uniqueItems = new ArrayList<Object>(subject.length());
226244
for (int i = 0; i < subject.length(); ++i) {
227245
Object item = subject.get(i);
228246
for (Object contained : uniqueItems) {
229247
if (ObjectComparator.deepEquals(contained, item)) {
230-
throw new ValidationException("array items are not unique");
248+
return Optional.of(new ValidationException(this, "array items are not unique"));
231249
}
232250
}
233251
uniqueItems.add(item);
234252
}
253+
return Optional.empty();
235254
}
236255

237256
@Override
238257
public void validate(final Object subject) {
258+
List<ValidationException> failures = new ArrayList<>();
239259
if (!(subject instanceof JSONArray)) {
240260
if (requiresArray) {
241261
throw new ValidationException(JSONArray.class, subject);
@@ -244,10 +264,11 @@ public void validate(final Object subject) {
244264
JSONArray arrSubject = (JSONArray) subject;
245265
testItemCount(arrSubject);
246266
if (uniqueItems) {
247-
testUniqueness(arrSubject);
267+
testUniqueness(arrSubject).ifPresent(failures::add);
248268
}
249-
testItems(arrSubject);
269+
failures.addAll(testItems(arrSubject));
250270
}
271+
ValidationException.throwFor(this, failures);
251272
}
252273

253274
}

core/src/test/java/org/everit/json/schema/ArraySchemaTest.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ public void additionalItemsSchema() {
3232
.build().validate(ARRAYS.get("additionalItemsSchema"));
3333
}
3434

35-
@Test(expected = ValidationException.class)
35+
@Test
3636
public void additionalItemsSchemaFailure() {
37-
ArraySchema.builder()
37+
ArraySchema subject = ArraySchema.builder()
3838
.addItemSchema(BooleanSchema.INSTANCE)
3939
.schemaOfAdditionalItems(NullSchema.INSTANCE)
40-
.build().validate(ARRAYS.get("additionalItemsSchemaFailure"));
40+
.build();
41+
TestSupport.expectFailure(subject, NullSchema.INSTANCE, "#/2",
42+
ARRAYS.get("additionalItemsSchemaFailure"));
4143
}
4244

4345
@Test(expected = ValidationException.class)
@@ -85,9 +87,10 @@ public void noItemSchema() {
8587
ArraySchema.builder().build().validate(ARRAYS.get("noItemSchema"));
8688
}
8789

88-
@Test(expected = ValidationException.class)
90+
@Test
8991
public void nonUniqueArrayOfArrays() {
90-
ArraySchema.builder().uniqueItems(true).build().validate(ARRAYS.get("nonUniqueArrayOfArrays"));
92+
ArraySchema subject = ArraySchema.builder().uniqueItems(true).build();
93+
TestSupport.expectFailure(subject, "#", ARRAYS.get("nonUniqueArrayOfArrays"));
9194
}
9295

9396
@Test(expected = SchemaException.class)
@@ -96,10 +99,11 @@ public void tupleAndListFailure() {
9699
.build();
97100
}
98101

99-
@Test(expected = ValidationException.class)
102+
@Test
100103
public void tupleWithOneItem() {
101-
ArraySchema.builder().addItemSchema(BooleanSchema.INSTANCE).build()
102-
.validate(ARRAYS.get("tupleWithOneItem"));
104+
ArraySchema subject = ArraySchema.builder().addItemSchema(BooleanSchema.INSTANCE).build();
105+
TestSupport.expectFailure(subject, BooleanSchema.INSTANCE, "#/0",
106+
ARRAYS.get("tupleWithOneItem"));
103107
}
104108

105109
@Test(expected = ValidationException.class)

0 commit comments

Comments
 (0)