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