Skip to content

Commit f939a70

Browse files
committed
Fix ConditionalSchema
Use ValidatingVisitor#getFailureOfSchema(Schema, Object) method instead of try-catch Treat schema as valid if "if" schema is invalid but there is no "else" schema
1 parent 22fee75 commit f939a70

File tree

2 files changed

+29
-19
lines changed

2 files changed

+29
-19
lines changed

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

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,32 @@ void visit(Schema schema) {
3232
this.failureReporter = failureReporter;
3333
}
3434

35-
@Override void visitNumberSchema(NumberSchema numberSchema) {
35+
@Override
36+
void visitNumberSchema(NumberSchema numberSchema) {
3637
numberSchema.accept(new NumberSchemaValidatingVisitor(subject, this));
3738
}
3839

39-
@Override void visitArraySchema(ArraySchema arraySchema) {
40+
@Override
41+
void visitArraySchema(ArraySchema arraySchema) {
4042
arraySchema.accept(new ArraySchemaValidatingVisitor(subject, this));
4143
}
4244

43-
@Override void visitBooleanSchema(BooleanSchema schema) {
45+
@Override
46+
void visitBooleanSchema(BooleanSchema schema) {
4447
if (!(subject instanceof Boolean)) {
4548
failureReporter.failure(Boolean.class, subject);
4649
}
4750
}
4851

49-
@Override void visitNullSchema(NullSchema nullSchema) {
52+
@Override
53+
void visitNullSchema(NullSchema nullSchema) {
5054
if (!(subject == null || subject == JSONObject.NULL)) {
5155
failureReporter.failure("expected: null, found: " + subject.getClass().getSimpleName(), "type");
5256
}
5357
}
5458

55-
@Override void visitConstSchema(ConstSchema constSchema) {
59+
@Override
60+
void visitConstSchema(ConstSchema constSchema) {
5661
if (isNull(subject) && isNull(constSchema.getPermittedValue())) {
5762
return;
5863
}
@@ -62,7 +67,8 @@ void visit(Schema schema) {
6267
}
6368
}
6469

65-
@Override void visitEnumSchema(EnumSchema enumSchema) {
70+
@Override
71+
void visitEnumSchema(EnumSchema enumSchema) {
6672
Object effectiveSubject = toJavaValue(subject);
6773
for (Object possibleValue : enumSchema.getPossibleValues()) {
6874
if (ObjectComparator.deepEquals(possibleValue, effectiveSubject)) {
@@ -72,19 +78,22 @@ void visit(Schema schema) {
7278
failureReporter.failure(format("%s is not a valid enum value", subject), "enum");
7379
}
7480

75-
@Override void visitFalseSchema(FalseSchema falseSchema) {
81+
@Override
82+
void visitFalseSchema(FalseSchema falseSchema) {
7683
failureReporter.failure("false schema always fails", "false");
7784
}
7885

79-
@Override void visitNotSchema(NotSchema notSchema) {
86+
@Override
87+
void visitNotSchema(NotSchema notSchema) {
8088
Schema mustNotMatch = notSchema.getMustNotMatch();
8189
ValidationException failure = getFailureOfSchema(mustNotMatch, subject);
8290
if (failure == null) {
8391
failureReporter.failure("subject must not be valid against schema " + mustNotMatch, "not");
8492
}
8593
}
8694

87-
@Override void visitReferenceSchema(ReferenceSchema referenceSchema) {
95+
@Override
96+
void visitReferenceSchema(ReferenceSchema referenceSchema) {
8897
Schema referredSchema = referenceSchema.getReferredSchema();
8998
if (referredSchema == null) {
9099
throw new IllegalStateException("referredSchema must be injected before validation");
@@ -95,15 +104,18 @@ void visit(Schema schema) {
95104
}
96105
}
97106

98-
@Override void visitObjectSchema(ObjectSchema objectSchema) {
107+
@Override
108+
void visitObjectSchema(ObjectSchema objectSchema) {
99109
objectSchema.accept(new ObjectSchemaValidatingVisitor(subject, this));
100110
}
101111

102-
@Override void visitStringSchema(StringSchema stringSchema) {
112+
@Override
113+
void visitStringSchema(StringSchema stringSchema) {
103114
stringSchema.accept(new StringSchemaValidatingVisitor(subject, this));
104115
}
105116

106-
@Override void visitCombinedSchema(CombinedSchema combinedSchema) {
117+
@Override
118+
void visitCombinedSchema(CombinedSchema combinedSchema) {
107119
List<ValidationException> failures = new ArrayList<>();
108120
Collection<Schema> subschemas = combinedSchema.getSubschemas();
109121
CombinedSchema.ValidationCriterion criterion = combinedSchema.getCriterion();
@@ -132,11 +144,9 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) {
132144
(!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) {
133145
return;
134146
}
135-
try {
136-
conditionalSchema.getIfSchema().get().validate(subject);
137-
} catch (ValidationException ifSchemaValidationException) {
138-
Schema elseSchema = conditionalSchema.getElseSchema().orElseThrow(() -> ifSchemaValidationException);
139-
elseSchema.validate(subject);
147+
ValidationException exception = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject);
148+
if (exception != null) {
149+
conditionalSchema.getElseSchema().ifPresent(elseSchema -> elseSchema.validate(subject));
140150
return;
141151
}
142152
conditionalSchema.getThenSchema().ifPresent(schema -> schema.validate(subject));

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void ifSubschemaSuccessThenSubschemaFailure() {
5151
ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).build().validate("bar");
5252
}
5353

54-
@Test(expected = ValidationException.class)
54+
@Test
5555
public void ifSubschemaFailureThenSubschemaFailure() {
5656
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbar");
5757
}
@@ -61,7 +61,7 @@ public void ifSubschemaSuccessThenSubschemaSuccess() {
6161
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo");
6262
}
6363

64-
@Test(expected = ValidationException.class)
64+
@Test
6565
public void ifSubschemaFailureThenSubschemaSuccess() {
6666
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar");
6767
}

0 commit comments

Comments
 (0)