Skip to content

Commit 667270e

Browse files
committed
implementing the following ConditionalSchema events: isMismatch(), elseMatch(), elseMismatch()
* also changing ValidationException#equals() to take the exception message into account
1 parent a0f7906 commit 667270e

File tree

3 files changed

+55
-12
lines changed

3 files changed

+55
-12
lines changed

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

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package org.everit.json.schema;
22

3+
import static java.util.Arrays.asList;
34
import static java.util.Objects.requireNonNull;
5+
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.ELSE;
46
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.IF;
57
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.THEN;
68

7-
import java.util.Arrays;
8-
99
import org.everit.json.schema.listener.ConditionalSchemaMatchEvent;
1010
import org.everit.json.schema.listener.ConditionalSchemaMismatchEvent;
11+
import org.everit.json.schema.listener.ConditionalSchemaValidationEvent;
1112

1213
class ConditionalSchemaValidatingVisitor extends Visitor {
1314

@@ -38,8 +39,12 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) {
3839
void visitIfSchema(Schema ifSchema) {
3940
if (conditionalSchema.getIfSchema().isPresent()) {
4041
ifSchemaException = owner.getFailureOfSchema(ifSchema, subject);
42+
if (ifSchemaException == null) {
43+
owner.validationListener.ifSchemaMatch(createMatchEvent(IF));
44+
} else {
45+
owner.validationListener.ifSchemaMismatch(createMismatchEvent(IF, ifSchemaException));
46+
}
4147
}
42-
owner.validationListener.ifSchemaMatch(new ConditionalSchemaMatchEvent(conditionalSchema, subject, IF));
4348
}
4449

4550
@Override
@@ -50,15 +55,14 @@ void visitThenSchema(Schema thenSchema) {
5055
ValidationException failure = new ValidationException(conditionalSchema,
5156
new StringBuilder(new StringBuilder("#")),
5257
"input is invalid against the \"then\" schema",
53-
Arrays.asList(thenSchemaException),
58+
asList(thenSchemaException),
5459
"then",
5560
conditionalSchema.getSchemaLocation());
5661

57-
owner.validationListener
58-
.thenSchemaMismatch(new ConditionalSchemaMismatchEvent(conditionalSchema, subject, THEN, thenSchemaException));
62+
owner.validationListener.thenSchemaMismatch(createMismatchEvent(THEN, thenSchemaException));
5963
owner.failure(failure);
6064
} else {
61-
owner.validationListener.thenSchemaMatch(new ConditionalSchemaMatchEvent(conditionalSchema, subject, THEN));
65+
owner.validationListener.thenSchemaMatch(createMatchEvent(THEN));
6266
}
6367
}
6468
}
@@ -71,15 +75,24 @@ void visitElseSchema(Schema elseSchema) {
7175
ValidationException failure = new ValidationException(conditionalSchema,
7276
new StringBuilder(new StringBuilder("#")),
7377
"input is invalid against both the \"if\" and \"else\" schema",
74-
Arrays.asList(ifSchemaException, elseSchemaException),
78+
asList(ifSchemaException, elseSchemaException),
7579
"else",
7680
conditionalSchema.getSchemaLocation());
77-
78-
// owner.reportSchemaMatchEvent(elseSchema, failure);
81+
owner.validationListener.elseSchemaMismatch(createMismatchEvent(ELSE, elseSchemaException));
7982
owner.failure(failure);
83+
} else {
84+
owner.validationListener.elseSchemaMatch(createMatchEvent(ELSE));
8085
}
81-
// owner.reportSchemaMatchEvent(elseSchema, null);
8286
}
8387
}
8488

89+
private ConditionalSchemaMatchEvent createMatchEvent(ConditionalSchemaValidationEvent.Keyword keyword) {
90+
return new ConditionalSchemaMatchEvent(conditionalSchema, subject, keyword);
91+
}
92+
93+
private ConditionalSchemaMismatchEvent createMismatchEvent(ConditionalSchemaValidationEvent.Keyword keyword,
94+
ValidationException failure) {
95+
return new ConditionalSchemaMismatchEvent(conditionalSchema, subject, keyword, failure);
96+
}
97+
8598
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ public String getSchemaLocation() {
469469
return false;
470470
if (!causingExceptions.equals(that.causingExceptions))
471471
return false;
472-
return Objects.equals(keyword, that.keyword);
472+
return Objects.equals(keyword, that.keyword) && Objects.equals(getMessage(), that.getMessage());
473473
}
474474

475475
@Override public int hashCode() {

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.everit.json.schema.ConditionalSchemaTest.MAX_LENGTH_STRING_SCHEMA;
44
import static org.everit.json.schema.ConditionalSchemaTest.MIN_LENGTH_STRING_SCHEMA;
55
import static org.everit.json.schema.ConditionalSchemaTest.PATTERN_STRING_SCHEMA;
6+
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.ELSE;
67
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.IF;
78
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.THEN;
89
import static org.mockito.Mockito.spy;
@@ -48,6 +49,7 @@ public void ifMatch_thenMatch() {
4849
public void ifMatch_thenMismatch() {
4950
String instance = "foo";
5051
validateInstance(instance);
52+
5153
verify(listener).ifSchemaMatch(new ConditionalSchemaMatchEvent(schema, instance, IF));
5254
ValidationException failure = new ValidationException(MIN_LENGTH_STRING_SCHEMA,
5355
"expected minLength: 6, actual: 3", "minLength",
@@ -56,4 +58,32 @@ public void ifMatch_thenMismatch() {
5658
verifyNoMoreInteractions(listener);
5759
}
5860

61+
@Test
62+
public void ifMismatch_elseMatch() {
63+
String instance = "boo";
64+
validateInstance(instance);
65+
66+
ValidationException failure = new ValidationException(PATTERN_STRING_SCHEMA, "string [boo] does not match pattern f.*o",
67+
"pattern", "#/if");
68+
verify(listener).ifSchemaMismatch(new ConditionalSchemaMismatchEvent(schema, instance, IF, failure));
69+
verify(listener).elseSchemaMatch(new ConditionalSchemaMatchEvent(schema, instance, ELSE));
70+
verifyNoMoreInteractions(listener);
71+
}
72+
73+
@Test
74+
public void ifMismatch_elseMismatch() {
75+
String instance = "booooooooooooo";
76+
validateInstance(instance);
77+
78+
ValidationException ifFailure = new ValidationException(PATTERN_STRING_SCHEMA,
79+
"string [booooooooooooo] does not match pattern f.*o",
80+
"pattern", "#/if");
81+
verify(listener).ifSchemaMismatch(new ConditionalSchemaMismatchEvent(schema, instance, IF, ifFailure));
82+
ValidationException elseFailure = new ValidationException(MAX_LENGTH_STRING_SCHEMA,
83+
"expected maxLength: 4, actual: 14",
84+
"maxLength", "#/else");
85+
verify(listener).elseSchemaMismatch(new ConditionalSchemaMismatchEvent(schema, instance, ELSE, elseFailure));
86+
verifyNoMoreInteractions(listener);
87+
}
88+
5989
}

0 commit comments

Comments
 (0)