diff --git a/pom.xml b/pom.xml
index 5a54bc5ff..f4bf9bfeb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
4.0.0
com.networknt
json-schema-validator
- 1.0.59
+ 1.0.60
bundle
A json schema validator that supports draft v4, v6, v7 and v2019-09
https://github.com/networknt/json-schema-validator
diff --git a/src/main/java/com/networknt/schema/AnyOfValidator.java b/src/main/java/com/networknt/schema/AnyOfValidator.java
index 15edf5c55..d93796c25 100644
--- a/src/main/java/com/networknt/schema/AnyOfValidator.java
+++ b/src/main/java/com/networknt/schema/AnyOfValidator.java
@@ -98,6 +98,17 @@ public Set validate(JsonNode node, JsonNode rootNode, String
return Collections.unmodifiableSet(allErrors);
}
+ @Override
+ public Set walk(JsonNode node, JsonNode rootNode, String at, boolean shouldValidateSchema) {
+ Set validationMessages = new LinkedHashSet();
+
+ for (JsonSchema schema : schemas) {
+ // Walk through the schema
+ validationMessages.addAll(schema.walk(node, rootNode, at, shouldValidateSchema));
+ }
+ return Collections.unmodifiableSet(validationMessages);
+ }
+
@Override
public void preloadJsonSchema() {
preloadJsonSchemas(schemas);
diff --git a/src/test/java/com/networknt/schema/Issue451Test.java b/src/test/java/com/networknt/schema/Issue451Test.java
new file mode 100644
index 000000000..cf735638c
--- /dev/null
+++ b/src/test/java/com/networknt/schema/Issue451Test.java
@@ -0,0 +1,70 @@
+package com.networknt.schema;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.networknt.schema.walk.JsonSchemaWalkListener;
+import com.networknt.schema.walk.WalkEvent;
+import com.networknt.schema.walk.WalkFlow;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Validating anyOf walker
+ */
+public class Issue451Test {
+ protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) {
+ JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7);
+ SchemaValidatorsConfig svc = new SchemaValidatorsConfig();
+ svc.addPropertyWalkListener(new CountingWalker());
+ return factory.getSchema(schemaContent, svc);
+ }
+
+ protected JsonNode getJsonNodeFromStreamContent(InputStream content) throws Exception {
+ ObjectMapper mapper = new ObjectMapper();
+ return mapper.readTree(content);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void shouldWalkAnyOfProperties() throws Exception {
+ String schemaPath = "/schema/issue451-v7.json";
+ InputStream schemaInputStream = getClass().getResourceAsStream(schemaPath);
+ JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream);
+
+ schema.walk(null, false);
+
+ Map collector = (Map) CollectorContext.getInstance().get("collector-451");
+ Assertions.assertEquals(2, collector.get("#/definitions/definition1/properties/a"));
+ Assertions.assertEquals(2, collector.get("#/definitions/definition2/properties/x"));
+ }
+
+ private static class CountingWalker implements JsonSchemaWalkListener {
+ @Override
+ public WalkFlow onWalkStart(WalkEvent walkEvent) {
+ String path = walkEvent.getSchemaPath();
+ collector().compute(path, (k, v) -> v == null ? 1 : v + 1);
+ return WalkFlow.CONTINUE;
+ }
+
+ @Override
+ public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) {
+
+ }
+
+ private Map collector() {
+ Map collector = (Map) CollectorContext.getInstance().get("collector-451");
+ if(collector == null) {
+ collector = new HashMap<>();
+ CollectorContext.getInstance().add("collector-451", collector);
+ }
+
+ return collector;
+ }
+ }
+}
+
diff --git a/src/test/resources/schema/issue451-v7.json b/src/test/resources/schema/issue451-v7.json
new file mode 100644
index 000000000..de37523ea
--- /dev/null
+++ b/src/test/resources/schema/issue451-v7.json
@@ -0,0 +1,41 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://example.com/issue-451.json",
+ "title": "AllOf structuring payload",
+ "description": "Test description",
+ "type": "object",
+ "properties": {
+ "allOfAttr" : {
+ "allOf" : [
+ {"$ref": "#/definitions/definition1"},
+ {"$ref": "#/definitions/definition2"}
+ ]
+ },
+ "anyOfAttr" : {
+ "anyOf" : [
+ {"$ref": "#/definitions/definition1"},
+ {"$ref": "#/definitions/definition2"}
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "definitions": {
+ "definition1" : {
+ "type": "object",
+ "properties": {
+ "a" : {"type": "string"},
+ "c" : {"type": "integer"}
+ },
+ "additionalProperties": false
+ },
+ "definition2" : {
+ "type": "object",
+ "properties": {
+ "x" : {"type": "number"},
+ "y" : {"type": "number"}
+ },
+ "required": ["x", "y"],
+ "additionalProperties": false
+ }
+ }
+}
\ No newline at end of file