Skip to content

Commit 252e2d5

Browse files
committed
initial event triggering for conditional schemas
* supporting ValidationListener#ifSchemaMatch() #thenSchemaMatch() and #thenSchemaMismatch() events * added no-operation ValidationListener implementation and using it when nothing else is passed
1 parent 7a345a0 commit 252e2d5

File tree

7 files changed

+106
-9
lines changed

7 files changed

+106
-9
lines changed

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

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

33
import static java.util.Objects.requireNonNull;
4+
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.IF;
5+
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.THEN;
46

57
import java.util.Arrays;
68

9+
import org.everit.json.schema.listener.ConditionalSchemaMatchEvent;
10+
import org.everit.json.schema.listener.ConditionalSchemaMismatchEvent;
11+
712
class ConditionalSchemaValidatingVisitor extends Visitor {
813

914
private final Object subject;
@@ -34,7 +39,7 @@ void visitIfSchema(Schema ifSchema) {
3439
if (conditionalSchema.getIfSchema().isPresent()) {
3540
ifSchemaException = owner.getFailureOfSchema(ifSchema, subject);
3641
}
37-
// owner.reportSchemaMatchEvent(ifSchema, ifSchemaException);
42+
owner.validationListener.ifSchemaMatch(new ConditionalSchemaMatchEvent(conditionalSchema, subject, IF));
3843
}
3944

4045
@Override
@@ -49,10 +54,11 @@ void visitThenSchema(Schema thenSchema) {
4954
"then",
5055
conditionalSchema.getSchemaLocation());
5156

52-
// owner.reportSchemaMatchEvent(thenSchema, failure);
57+
owner.validationListener
58+
.thenSchemaMismatch(new ConditionalSchemaMismatchEvent(conditionalSchema, subject, THEN, thenSchemaException));
5359
owner.failure(failure);
5460
} else {
55-
// owner.reportSchemaMatchEvent(thenSchema, null);
61+
owner.validationListener.thenSchemaMatch(new ConditionalSchemaMatchEvent(conditionalSchema, subject, THEN));
5662
}
5763
}
5864
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private static boolean isNull(Object obj) {
3737

3838
protected Object subject;
3939

40-
private final ValidationListener validationListener;
40+
final ValidationListener validationListener;
4141

4242
private ValidationFailureReporter failureReporter;
4343

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class ValidatorBuilder {
1212

1313
private ReadWriteContext readWriteContext;
1414

15-
private ValidationListener validationListener;
15+
private ValidationListener validationListener = ValidationListener.NOOP;
1616

1717
public ValidatorBuilder failEarly() {
1818
this.failEarly = true;

core/src/main/java/org/everit/json/schema/listener/ConditionalSchemaMismatchEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class ConditionalSchemaMismatchEvent extends ConditionalSchemaValidationE
1010

1111
private final ValidationException failure;
1212

13-
protected ConditionalSchemaMismatchEvent(ConditionalSchema schema, Object instance, Keyword keyword, ValidationException failure) {
13+
public ConditionalSchemaMismatchEvent(ConditionalSchema schema, Object instance, Keyword keyword, ValidationException failure) {
1414
super(schema, instance, keyword);
1515
this.failure = failure;
1616
}

core/src/main/java/org/everit/json/schema/listener/ValidationListener.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,38 @@
55
*/
66
public interface ValidationListener {
77

8+
ValidationListener NOOP = new ValidationListener() {
9+
@Override public void mismatch(MismatchEvent event) {
10+
}
11+
12+
@Override public void combinedSchemaMatch(CombinedSchemaMatchEvent event) {
13+
}
14+
15+
@Override public void combinedSchemaMismatch(CombinedSchemaMismatchEvent event) {
16+
}
17+
18+
@Override public void schemaReferenced(SchemaReferencedEvent event) {
19+
}
20+
21+
@Override public void ifSchemaMatch(ConditionalSchemaMatchEvent event) {
22+
}
23+
24+
@Override public void ifSchemaMismatch(ConditionalSchemaMismatchEvent event) {
25+
}
26+
27+
@Override public void thenSchemaMatch(ConditionalSchemaMatchEvent event) {
28+
}
29+
30+
@Override public void thenSchemaMismatch(ConditionalSchemaMismatchEvent event) {
31+
}
32+
33+
@Override public void elseSchemaMatch(ConditionalSchemaMatchEvent event) {
34+
}
35+
36+
@Override public void elseSchemaMismatch(ConditionalSchemaMismatchEvent event) {
37+
}
38+
};
39+
840
void mismatch(MismatchEvent event);
941

1042
void combinedSchemaMatch(CombinedSchemaMatchEvent event);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.everit.json.schema;
2+
3+
import static org.everit.json.schema.ConditionalSchemaTest.MAX_LENGTH_STRING_SCHEMA;
4+
import static org.everit.json.schema.ConditionalSchemaTest.MIN_LENGTH_STRING_SCHEMA;
5+
import static org.everit.json.schema.ConditionalSchemaTest.PATTERN_STRING_SCHEMA;
6+
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.IF;
7+
import static org.everit.json.schema.listener.ConditionalSchemaValidationEvent.Keyword.THEN;
8+
import static org.mockito.Mockito.spy;
9+
import static org.mockito.Mockito.verify;
10+
import static org.mockito.Mockito.verifyNoMoreInteractions;
11+
12+
import org.everit.json.schema.listener.ConditionalSchemaMatchEvent;
13+
import org.everit.json.schema.listener.ConditionalSchemaMismatchEvent;
14+
import org.everit.json.schema.listener.ValidationListener;
15+
import org.junit.Test;
16+
import org.junit.runner.RunWith;
17+
import org.mockito.Mock;
18+
import org.mockito.Spy;
19+
import org.mockito.runners.MockitoJUnitRunner;
20+
21+
@RunWith(MockitoJUnitRunner.class)
22+
public class ConditionalSchemaEventsTest {
23+
24+
private ConditionalSchema schema = ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA)
25+
.thenSchema(MIN_LENGTH_STRING_SCHEMA)
26+
.elseSchema(MAX_LENGTH_STRING_SCHEMA).schemaLocation("#").build();
27+
28+
@Mock
29+
ValidationListener listener;
30+
31+
@Spy
32+
ValidationFailureReporter reporter = spy(new CollectingFailureReporter(schema));
33+
34+
private void validateInstance(String instance) {
35+
new ValidatingVisitor(instance, reporter, ReadWriteValidator.NONE, listener).visit(schema);
36+
}
37+
38+
@Test
39+
public void ifMatch_thenMatch() {
40+
String instance = "f###oo";
41+
validateInstance(instance);
42+
verify(listener).ifSchemaMatch(new ConditionalSchemaMatchEvent(schema, instance, IF));
43+
verify(listener).thenSchemaMatch(new ConditionalSchemaMatchEvent(schema, instance, THEN));
44+
verifyNoMoreInteractions(listener);
45+
}
46+
47+
@Test
48+
public void ifMatch_thenMismatch() {
49+
String instance = "foo";
50+
validateInstance(instance);
51+
verify(listener).ifSchemaMatch(new ConditionalSchemaMatchEvent(schema, instance, IF));
52+
ValidationException failure = new ValidationException(MIN_LENGTH_STRING_SCHEMA,
53+
"expected minLength: 6, actual: 3", "minLength",
54+
"#/then");
55+
verify(listener).thenSchemaMismatch(new ConditionalSchemaMismatchEvent(schema, instance, THEN, failure));
56+
verifyNoMoreInteractions(listener);
57+
}
58+
59+
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
public class ConditionalSchemaTest {
1010

11-
private static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).build();
11+
static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).schemaLocation("#/else").build();
1212

13-
private static final StringSchema MIN_LENGTH_STRING_SCHEMA = StringSchema.builder().minLength(6).build();
13+
static final StringSchema MIN_LENGTH_STRING_SCHEMA = StringSchema.builder().minLength(6).schemaLocation("#/then").build();
1414

15-
private static final StringSchema PATTERN_STRING_SCHEMA = StringSchema.builder().pattern("f.*o").build();
15+
static final StringSchema PATTERN_STRING_SCHEMA = StringSchema.builder().pattern("f.*o").schemaLocation("#/if").build();
1616

1717
private static final ResourceLoader LOADER = new ResourceLoader("/org/everit/jsonvalidator/tostring/");
1818

0 commit comments

Comments
 (0)