diff --git a/pom.xml b/pom.xml index 98c152b5d..4a74a0e28 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ com.networknt json-schema-validator - 1.5.9 + 2.0.0-SNAPSHOT bundle JsonSchemaValidator A json schema validator that supports draft v4, v6, v7, v2019-09 and v2020-12 diff --git a/src/main/java/com/networknt/schema/AdditionalPropertiesValidator.java b/src/main/java/com/networknt/schema/AdditionalPropertiesValidator.java index 0f978a0fd..6b498c4fb 100644 --- a/src/main/java/com/networknt/schema/AdditionalPropertiesValidator.java +++ b/src/main/java/com/networknt/schema/AdditionalPropertiesValidator.java @@ -81,17 +81,17 @@ public AdditionalPropertiesValidator(SchemaLocation schemaLocation, JsonNodePath } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return validate(executionContext, node, rootNode, instanceLocation, false); + validate(executionContext, node, rootNode, instanceLocation, false); } - protected Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + protected void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!node.isObject()) { // ignore no object - return Collections.emptySet(); + return; } Set matchedInstancePropertyNames = null; @@ -108,8 +108,6 @@ protected Set validate(ExecutionContext executionContext, Jso } } - Set errors = null; - for (Iterator> it = node.fields(); it.hasNext(); ) { Entry entry = it.next(); String pname = entry.getKey(); @@ -119,25 +117,18 @@ protected Set validate(ExecutionContext executionContext, Jso } if (!allowedProperties.contains(pname) && !handledByPatternProperties(pname)) { if (!allowAdditionalProperties) { - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.add(message().instanceNode(node).property(pname) + executionContext.addError(message().instanceNode(node).property(pname) .instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(pname).build()); } else { if (additionalPropertiesSchema != null) { - Set results = !walk - ? additionalPropertiesSchema.validate(executionContext, entry.getValue(), rootNode, - instanceLocation.append(pname)) - : additionalPropertiesSchema.walk(executionContext, entry.getValue(), rootNode, - instanceLocation.append(pname), true); - if (!results.isEmpty()) { - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.addAll(results); + if (!walk) { + additionalPropertiesSchema.validate(executionContext, entry.getValue(), rootNode, + instanceLocation.append(pname)); + } else { + additionalPropertiesSchema.walk(executionContext, entry.getValue(), rootNode, + instanceLocation.append(pname), true); } } } @@ -149,18 +140,18 @@ protected Set validate(ExecutionContext executionContext, Jso .value(matchedInstancePropertyNames != null ? matchedInstancePropertyNames : Collections.emptySet()) .build()); } - return errors == null ? Collections.emptySet() : Collections.unmodifiableSet(errors); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (shouldValidateSchema && node != null) { - return validate(executionContext, node, rootNode, instanceLocation, true); + validate(executionContext, node, rootNode, instanceLocation, true); + return; } if (node == null || !node.isObject()) { // ignore no object - return Collections.emptySet(); + return; } // Else continue walking. @@ -179,7 +170,6 @@ public Set walk(ExecutionContext executionContext, JsonNode n } } } - return Collections.emptySet(); } private boolean handledByPatternProperties(String pname) { diff --git a/src/main/java/com/networknt/schema/AllOfValidator.java b/src/main/java/com/networknt/schema/AllOfValidator.java index cd4d9c1f2..a74e7aeec 100644 --- a/src/main/java/com/networknt/schema/AllOfValidator.java +++ b/src/main/java/com/networknt/schema/AllOfValidator.java @@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.networknt.schema.utils.SetView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,31 +51,19 @@ public AllOfValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return validate(executionContext, node, rootNode, instanceLocation, false); + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + validate(executionContext, node, rootNode, instanceLocation, false); } - protected Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { + protected void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { debug(logger, executionContext, node, rootNode, instanceLocation); - SetView childSchemaErrors = null; - for (JsonSchema schema : this.schemas) { - Set localErrors = null; - if (!walk) { - localErrors = schema.validate(executionContext, node, rootNode, instanceLocation); + schema.validate(executionContext, node, rootNode, instanceLocation); } else { - localErrors = schema.walk(executionContext, node, rootNode, instanceLocation, true); - } - - if (localErrors != null && !localErrors.isEmpty()) { - if (childSchemaErrors == null) { - childSchemaErrors = new SetView<>(); - } - childSchemaErrors.union(localErrors); + schema.walk(executionContext, node, rootNode, instanceLocation, true); } - if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled()) { final Iterator arrayElements = this.schemaNode.elements(); while (arrayElements.hasNext()) { @@ -106,21 +93,19 @@ protected Set validate(ExecutionContext executionContext, Jso } } } - - return childSchemaErrors != null ? childSchemaErrors : Collections.emptySet(); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (shouldValidateSchema && node != null) { - return validate(executionContext, node, rootNode, instanceLocation, true); + validate(executionContext, node, rootNode, instanceLocation, true); + return; } for (JsonSchema schema : this.schemas) { // Walk through the schema schema.walk(executionContext, node, rootNode, instanceLocation, false); } - return Collections.emptySet(); - } + } @Override public void preloadJsonSchema() { diff --git a/src/main/java/com/networknt/schema/AnnotationKeyword.java b/src/main/java/com/networknt/schema/AnnotationKeyword.java index 484d1eb1a..65aae35ee 100644 --- a/src/main/java/com/networknt/schema/AnnotationKeyword.java +++ b/src/main/java/com/networknt/schema/AnnotationKeyword.java @@ -18,9 +18,6 @@ import com.fasterxml.jackson.databind.JsonNode; -import java.util.Collections; -import java.util.Set; - /** * Used for Keywords that have no validation aspect, but are part of the metaschema, where annotations may need to be collected. */ @@ -33,7 +30,7 @@ public Validator(SchemaLocation schemaLocation, JsonNodePath evaluationPath, Jso } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { if (collectAnnotations(executionContext)) { Object value = getAnnotationValue(getSchemaNode()); if (value != null) { @@ -41,7 +38,6 @@ public Set validate(ExecutionContext executionContext, JsonNo annotation -> annotation.instanceLocation(instanceLocation).value(value)); } } - return Collections.emptySet(); } private Object getAnnotationValue(JsonNode schemaNode) { diff --git a/src/main/java/com/networknt/schema/AnyOfValidator.java b/src/main/java/com/networknt/schema/AnyOfValidator.java index 8dd18d4e1..8245b1673 100644 --- a/src/main/java/com/networknt/schema/AnyOfValidator.java +++ b/src/main/java/com/networknt/schema/AnyOfValidator.java @@ -17,7 +17,6 @@ package com.networknt.schema; import com.fasterxml.jackson.databind.JsonNode; -import com.networknt.schema.utils.SetView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,45 +53,48 @@ public AnyOfValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return validate(executionContext, node, rootNode, instanceLocation, false); + validate(executionContext, node, rootNode, instanceLocation, false); } - protected Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + protected void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { debug(logger, executionContext, node, rootNode, instanceLocation); if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled()) { executionContext.enterDiscriminatorContext(new DiscriminatorContext(), instanceLocation); } - SetView allErrors = null; - int numberOfValidSubSchemas = 0; + List existingErrors = executionContext.getErrors(); + List allErrors = null; + List errors = new ArrayList<>(); + executionContext.setErrors(errors); try { // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); try { executionContext.setFailFast(false); for (JsonSchema schema : this.schemas) { - Set errors = Collections.emptySet(); + errors.clear(); TypeValidator typeValidator = schema.getTypeValidator(); if (typeValidator != null) { // If schema has type validator and node type doesn't match with schemaType then // ignore it // For union type, it is a must to call TypeValidator if (typeValidator.getSchemaType() != JsonType.UNION && !typeValidator.equalsToSchemaType(node)) { + typeValidator.validate(executionContext, node, rootNode, instanceLocation); if (allErrors == null) { - allErrors = new SetView<>(); + allErrors = new ArrayList<>(); } - allErrors.union(typeValidator.validate(executionContext, node, rootNode, instanceLocation)); + allErrors.addAll(errors); continue; } } if (!walk) { - errors = schema.validate(executionContext, node, rootNode, instanceLocation); + schema.validate(executionContext, node, rootNode, instanceLocation); } else { - errors = schema.walk(executionContext, node, rootNode, instanceLocation, true); + schema.walk(executionContext, node, rootNode, instanceLocation, true); } // check if any validation errors have occurred @@ -105,8 +107,8 @@ protected Set validate(ExecutionContext executionContext, Jso && canShortCircuit() && canShortCircuit(executionContext)) { // Clear all errors. Note that this is checked in finally. allErrors = null; - // return empty errors. - return errors; + executionContext.setErrors(existingErrors); + return; } else if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled()) { DiscriminatorContext currentDiscriminatorContext = executionContext.getCurrentDiscriminatorContext(); if (currentDiscriminatorContext.isDiscriminatorMatchFound() @@ -116,24 +118,25 @@ && canShortCircuit() && canShortCircuit(executionContext)) { // which is generally discarded as it returns errors but the allErrors // is getting processed in finally if (allErrors == null) { - allErrors = new SetView<>(); + allErrors = new ArrayList<>(); } - allErrors.union(Collections - .singleton(message().instanceNode(node).instanceLocation(instanceLocation) - .locale(executionContext.getExecutionConfig().getLocale()) - .failFast(executionContext.isFailFast()).arguments(DISCRIMINATOR_REMARK) - .build())); + allErrors.add(message().instanceNode(node).instanceLocation(instanceLocation) + .locale(executionContext.getExecutionConfig().getLocale()) + .failFast(executionContext.isFailFast()).arguments(DISCRIMINATOR_REMARK) + .build()); } else { // Clear all errors. Note that this is checked in finally. allErrors = null; } - return errors; + existingErrors.addAll(errors); + executionContext.setErrors(existingErrors); + return; } } if (allErrors == null) { - allErrors = new SetView<>(); + allErrors = new ArrayList<>(); } - allErrors.union(errors); + allErrors.addAll(errors); } } finally { // Restore flag @@ -143,11 +146,13 @@ && canShortCircuit() && canShortCircuit(executionContext)) { if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled() && executionContext.getCurrentDiscriminatorContext().isActive() && !executionContext.getCurrentDiscriminatorContext().isDiscriminatorIgnore()) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + existingErrors.add(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .arguments( "based on the provided discriminator. No alternative could be chosen based on the discriminator property") .build()); + executionContext.setErrors(existingErrors); + return; } } finally { if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled()) { @@ -155,20 +160,24 @@ && canShortCircuit() && canShortCircuit(executionContext)) { } } if (numberOfValidSubSchemas >= 1) { - return Collections.emptySet(); + executionContext.setErrors(existingErrors); + } else { + if (allErrors != null) { + existingErrors.addAll(allErrors); + } + executionContext.setErrors(existingErrors); } - return allErrors != null ? allErrors : Collections.emptySet(); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (shouldValidateSchema && node != null) { - return validate(executionContext, node, rootNode, instanceLocation, true); + validate(executionContext, node, rootNode, instanceLocation, true); + return; } for (JsonSchema schema : this.schemas) { schema.walk(executionContext, node, rootNode, instanceLocation, false); } - return Collections.emptySet(); } /** diff --git a/src/main/java/com/networknt/schema/ConstValidator.java b/src/main/java/com/networknt/schema/ConstValidator.java index bcabec560..db53eee8c 100644 --- a/src/main/java/com/networknt/schema/ConstValidator.java +++ b/src/main/java/com/networknt/schema/ConstValidator.java @@ -19,9 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for const. */ @@ -33,20 +30,19 @@ public ConstValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath super(schemaLocation, evaluationPath, schemaNode, parentSchema, ValidatorTypeCode.CONST, validationContext); } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (schemaNode.isNumber() && node.isNumber()) { if (schemaNode.decimalValue().compareTo(node.decimalValue()) != 0) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(schemaNode.asText(), node.asText()) .build()); } } else if (!schemaNode.equals(node)) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()).arguments(schemaNode.asText(), node.asText()).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/ContainsValidator.java b/src/main/java/com/networknt/schema/ContainsValidator.java index ebfde5564..a5f971454 100644 --- a/src/main/java/com/networknt/schema/ContainsValidator.java +++ b/src/main/java/com/networknt/schema/ContainsValidator.java @@ -23,11 +23,9 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Optional; -import java.util.Set; import static com.networknt.schema.VersionCode.MinV201909; @@ -81,42 +79,48 @@ public ContainsValidator(SchemaLocation schemaLocation, JsonNodePath evaluationP } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); // ignores non-arrays - Set results = null; int actual = 0, i = 0; List indexes = new ArrayList<>(); // for the annotation if (null != this.schema && node.isArray()) { // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); + List existingErrors = executionContext.getErrors(); try { executionContext.setFailFast(false); + List test = new ArrayList<>(); + executionContext.setErrors(test); for (JsonNode n : node) { JsonNodePath path = instanceLocation.append(i); - if (this.schema.validate(executionContext, n, rootNode, path).isEmpty()) { + this.schema.validate(executionContext, n, rootNode, path); + if (test.isEmpty()) { ++actual; indexes.add(i); + } else { + test.clear(); } ++i; } } finally { // Restore flag executionContext.setFailFast(failFast); + executionContext.setErrors(existingErrors); } int m = 1; // default to 1 if "min" not specified if (this.min != null) { m = this.min; } if (actual < m) { - results = boundsViolated(isMinV201909 ? ValidatorTypeCode.MIN_CONTAINS : ValidatorTypeCode.CONTAINS, + boundsViolated(executionContext, isMinV201909 ? ValidatorTypeCode.MIN_CONTAINS : ValidatorTypeCode.CONTAINS, executionContext.getExecutionConfig().getLocale(), executionContext.isFailFast(), node, instanceLocation, m); } if (this.max != null && actual > this.max) { - results = boundsViolated(isMinV201909 ? ValidatorTypeCode.MAX_CONTAINS : ValidatorTypeCode.CONTAINS, + boundsViolated(executionContext, isMinV201909 ? ValidatorTypeCode.MAX_CONTAINS : ValidatorTypeCode.CONTAINS, executionContext.getExecutionConfig().getLocale(), executionContext.isFailFast(), node, instanceLocation, this.max); } @@ -172,7 +176,6 @@ public Set validate(ExecutionContext executionContext, JsonNo } } } - return results == null ? Collections.emptySet() : results; } @Override @@ -181,7 +184,7 @@ public void preloadJsonSchema() { collectAnnotations(); // cache the flag } - private Set boundsViolated(ValidatorTypeCode validatorTypeCode, Locale locale, boolean failFast, + private void boundsViolated(ExecutionContext executionContext, ValidatorTypeCode validatorTypeCode, Locale locale, boolean failFast, JsonNode instanceNode, JsonNodePath instanceLocation, int bounds) { String messageKey = "contains"; if (ValidatorTypeCode.MIN_CONTAINS.equals(validatorTypeCode)) { @@ -189,8 +192,7 @@ private Set boundsViolated(ValidatorTypeCode validatorTypeCod } else if (ValidatorTypeCode.MAX_CONTAINS.equals(validatorTypeCode)) { messageKey = CONTAINS_MAX; } - return Collections - .singleton(message().instanceNode(instanceNode).instanceLocation(instanceLocation).messageKey(messageKey) + executionContext.addError(message().instanceNode(instanceNode).instanceLocation(instanceLocation).messageKey(messageKey) .locale(locale).failFast(failFast).arguments(String.valueOf(bounds), this.schema.getSchemaNode().toString()) .code(validatorTypeCode.getErrorCode()).type(validatorTypeCode.getValue()).build()); } diff --git a/src/main/java/com/networknt/schema/ContentEncodingValidator.java b/src/main/java/com/networknt/schema/ContentEncodingValidator.java index 5c9e29608..66335052d 100644 --- a/src/main/java/com/networknt/schema/ContentEncodingValidator.java +++ b/src/main/java/com/networknt/schema/ContentEncodingValidator.java @@ -22,8 +22,7 @@ import org.slf4j.LoggerFactory; import java.util.Base64; -import java.util.Collections; -import java.util.Set; + /** * {@link JsonValidator} for contentEncoding. *

@@ -64,14 +63,14 @@ private boolean matches(String value) { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); // Ignore non-strings JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig()); if (nodeType != JsonType.STRING) { - return Collections.emptySet(); + return; } if (collectAnnotations(executionContext)) { @@ -80,11 +79,10 @@ public Set validate(ExecutionContext executionContext, JsonNo } if (!matches(node.asText())) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.contentEncoding) .build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/ContentMediaTypeValidator.java b/src/main/java/com/networknt/schema/ContentMediaTypeValidator.java index 28e435b68..465f0d5f3 100644 --- a/src/main/java/com/networknt/schema/ContentMediaTypeValidator.java +++ b/src/main/java/com/networknt/schema/ContentMediaTypeValidator.java @@ -18,8 +18,6 @@ import java.nio.charset.StandardCharsets; import java.util.Base64; -import java.util.Collections; -import java.util.Set; import java.util.regex.Pattern; import org.slf4j.Logger; @@ -88,14 +86,14 @@ else if (!PATTERN.matcher(this.contentMediaType).matches()) { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); // Ignore non-strings JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig()); if (nodeType != JsonType.STRING) { - return Collections.emptySet(); + return; } if (collectAnnotations(executionContext)) { @@ -104,11 +102,10 @@ public Set validate(ExecutionContext executionContext, JsonNo } if (!matches(node.asText())) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.contentMediaType) .build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/DependenciesValidator.java b/src/main/java/com/networknt/schema/DependenciesValidator.java index 882d66592..876f431bc 100644 --- a/src/main/java/com/networknt/schema/DependenciesValidator.java +++ b/src/main/java/com/networknt/schema/DependenciesValidator.java @@ -62,21 +62,16 @@ public DependenciesValidator(SchemaLocation schemaLocation, JsonNodePath evaluat } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); - Set errors = null; - for (Iterator it = node.fieldNames(); it.hasNext(); ) { String pname = it.next(); List deps = propertyDeps.get(pname); if (deps != null && !deps.isEmpty()) { for (String field : deps) { if (node.get(field) == null) { - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.add(message().instanceNode(node).property(pname).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).property(pname).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()) .arguments(propertyDeps.toString()).build()); @@ -85,16 +80,9 @@ public Set validate(ExecutionContext executionContext, JsonNo } JsonSchema schema = schemaDeps.get(pname); if (schema != null) { - Set schemaDepsErrors = schema.validate(executionContext, node, rootNode, instanceLocation); - if (!schemaDepsErrors.isEmpty()) { - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.addAll(schemaDepsErrors); - } + schema.validate(executionContext, node, rootNode, instanceLocation); } } - return errors == null || errors.isEmpty() ? Collections.emptySet() : Collections.unmodifiableSet(errors); } @Override diff --git a/src/main/java/com/networknt/schema/DependentRequired.java b/src/main/java/com/networknt/schema/DependentRequired.java index 14a7bc21b..da9294af7 100644 --- a/src/main/java/com/networknt/schema/DependentRequired.java +++ b/src/main/java/com/networknt/schema/DependentRequired.java @@ -46,18 +46,16 @@ public DependentRequired(SchemaLocation schemaLocation, JsonNodePath evaluationP } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); - Set errors = new LinkedHashSet<>(); - for (Iterator it = node.fieldNames(); it.hasNext(); ) { String pname = it.next(); List dependencies = propertyDependencies.get(pname); if (dependencies != null && !dependencies.isEmpty()) { for (String field : dependencies) { if (node.get(field) == null) { - errors.add(message().instanceNode(node).property(pname).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).property(pname).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(field, pname) .build()); @@ -65,8 +63,6 @@ public Set validate(ExecutionContext executionContext, JsonNo } } } - - return Collections.unmodifiableSet(errors); } } diff --git a/src/main/java/com/networknt/schema/DependentSchemas.java b/src/main/java/com/networknt/schema/DependentSchemas.java index 589a8e5c3..b9bfa47b4 100644 --- a/src/main/java/com/networknt/schema/DependentSchemas.java +++ b/src/main/java/com/networknt/schema/DependentSchemas.java @@ -44,32 +44,26 @@ public DependentSchemas(SchemaLocation schemaLocation, JsonNodePath evaluationPa } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return validate(executionContext, node, rootNode, instanceLocation, false); + validate(executionContext, node, rootNode, instanceLocation, false); } - protected Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + protected void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { debug(logger, executionContext, node, rootNode, instanceLocation); - Set errors = null; for (Iterator it = node.fieldNames(); it.hasNext(); ) { String pname = it.next(); JsonSchema schema = this.schemaDependencies.get(pname); if (schema != null) { - Set schemaDependenciesErrors = !walk - ? schema.validate(executionContext, node, rootNode, instanceLocation) - : schema.walk(executionContext, node, rootNode, instanceLocation, true); - if (!schemaDependenciesErrors.isEmpty()) { - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.addAll(schemaDependenciesErrors); + if(!walk) { + schema.validate(executionContext, node, rootNode, instanceLocation); + } else { + schema.walk(executionContext, node, rootNode, instanceLocation, true); } } } - return errors == null || errors.isEmpty() ? Collections.emptySet() : Collections.unmodifiableSet(errors); } @Override @@ -78,14 +72,14 @@ public void preloadJsonSchema() { } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (shouldValidateSchema) { - return validate(executionContext, node, rootNode, instanceLocation, true); + validate(executionContext, node, rootNode, instanceLocation, true); + return; } for (JsonSchema schema : this.schemaDependencies.values()) { schema.walk(executionContext, node, rootNode, instanceLocation, false); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/DiscriminatorValidator.java b/src/main/java/com/networknt/schema/DiscriminatorValidator.java index 8cc08df18..c87ef6f7a 100644 --- a/src/main/java/com/networknt/schema/DiscriminatorValidator.java +++ b/src/main/java/com/networknt/schema/DiscriminatorValidator.java @@ -21,7 +21,6 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -59,9 +58,9 @@ public DiscriminatorValidator(SchemaLocation schemaLocation, JsonNodePath evalua } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return Collections.emptySet(); + // Do nothing } /** diff --git a/src/main/java/com/networknt/schema/DynamicRefValidator.java b/src/main/java/com/networknt/schema/DynamicRefValidator.java index 10ce6017b..1cf2d0632 100644 --- a/src/main/java/com/networknt/schema/DynamicRefValidator.java +++ b/src/main/java/com/networknt/schema/DynamicRefValidator.java @@ -20,8 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; import java.util.function.Supplier; /** @@ -92,7 +90,7 @@ private static String resolve(JsonSchema parentSchema, String refValue) { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); JsonSchema refSchema = this.schema.getSchema(); if (refSchema == null) { @@ -102,11 +100,11 @@ public Set validate(ExecutionContext executionContext, JsonNo .arguments(schemaNode.asText()).build(); throw new InvalidSchemaRefException(validationMessage); } - return refSchema.validate(executionContext, node, rootNode, instanceLocation); + refSchema.validate(executionContext, node, rootNode, instanceLocation); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { debug(logger, executionContext, node, rootNode, instanceLocation); // This is important because if we use same JsonSchemaFactory for creating multiple JSONSchema instances, // these schemas will be cached along with config. We have to replace the config for cached $ref references @@ -132,10 +130,10 @@ public Set walk(ExecutionContext executionContext, JsonNode n } } if (circularDependency) { - return Collections.emptySet(); + return; } } - return refSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); + refSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } public JsonSchemaRef getSchemaRef() { diff --git a/src/main/java/com/networknt/schema/EnumValidator.java b/src/main/java/com/networknt/schema/EnumValidator.java index 44983f26c..e474bcd4d 100644 --- a/src/main/java/com/networknt/schema/EnumValidator.java +++ b/src/main/java/com/networknt/schema/EnumValidator.java @@ -89,7 +89,7 @@ public EnumValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath, } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (node.isNumber()) { @@ -98,12 +98,10 @@ public Set validate(ExecutionContext executionContext, JsonNo node = processArrayNode((ArrayNode) node); } if (!nodes.contains(node) && !( this.validationContext.getConfig().isTypeLoose() && isTypeLooseContainsInEnum(node))) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(error).build()); } - - return Collections.emptySet(); } /** diff --git a/src/main/java/com/networknt/schema/ExclusiveMaximumValidator.java b/src/main/java/com/networknt/schema/ExclusiveMaximumValidator.java index 0460481a1..c461a01c8 100644 --- a/src/main/java/com/networknt/schema/ExclusiveMaximumValidator.java +++ b/src/main/java/com/networknt/schema/ExclusiveMaximumValidator.java @@ -24,8 +24,6 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.util.Collections; -import java.util.Set; /** * {@link JsonValidator} for exclusiveMaximum. @@ -97,20 +95,19 @@ public String thresholdValue() { } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!JsonNodeUtil.isNumber(node, validationContext.getConfig())) { // maximum only applies to numbers - return Collections.emptySet(); + return; } if (typedMaximum.crossesThreshold(node)) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()) .arguments(typedMaximum.thresholdValue()).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/ExclusiveMinimumValidator.java b/src/main/java/com/networknt/schema/ExclusiveMinimumValidator.java index aea9c36d8..c00281ae1 100644 --- a/src/main/java/com/networknt/schema/ExclusiveMinimumValidator.java +++ b/src/main/java/com/networknt/schema/ExclusiveMinimumValidator.java @@ -24,8 +24,6 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.util.Collections; -import java.util.Set; /** * {@link JsonValidator} for exclusiveMinimum. @@ -104,21 +102,20 @@ public String thresholdValue() { } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!JsonNodeUtil.isNumber(node, this.validationContext.getConfig())) { // minimum only applies to numbers - return Collections.emptySet(); + return; } if (typedMinimum.crossesThreshold(node)) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()) .arguments(typedMinimum.thresholdValue()).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/ExecutionContext.java b/src/main/java/com/networknt/schema/ExecutionContext.java index f2ca8e198..57e6b7ac8 100644 --- a/src/main/java/com/networknt/schema/ExecutionContext.java +++ b/src/main/java/com/networknt/schema/ExecutionContext.java @@ -19,6 +19,9 @@ import com.networknt.schema.annotation.JsonNodeAnnotations; import com.networknt.schema.result.JsonNodeResults; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Stack; /** @@ -30,6 +33,7 @@ public class ExecutionContext { private Stack discriminatorContexts = null; private JsonNodeAnnotations annotations = null; private JsonNodeResults results = null; + private List errors = new ArrayList<>(); /** * This is used during the execution to determine if the validator should fail fast. @@ -173,4 +177,20 @@ public void enterDiscriminatorContext(final DiscriminatorContext ctx, @SuppressW public void leaveDiscriminatorContextImmediately(@SuppressWarnings("unused") JsonNodePath instanceLocation) { this.discriminatorContexts.pop(); } + + public List getErrors() { + return this.errors; + } + + public void addError(ValidationMessage error) { + if (this.isFailFast()) { + this.errors = Collections.singletonList(error); + throw new FailFastAssertionException(error); + } + this.errors.add(error); + } + + public void setErrors(List errors) { + this.errors = errors; + } } diff --git a/src/main/java/com/networknt/schema/FailFastAssertionException.java b/src/main/java/com/networknt/schema/FailFastAssertionException.java index 6ea3cf455..84f8f6e84 100644 --- a/src/main/java/com/networknt/schema/FailFastAssertionException.java +++ b/src/main/java/com/networknt/schema/FailFastAssertionException.java @@ -17,8 +17,8 @@ package com.networknt.schema; import java.util.Collections; +import java.util.List; import java.util.Objects; -import java.util.Set; /** * Thrown when an assertion happens and the evaluation can fail fast. @@ -32,15 +32,15 @@ public class FailFastAssertionException extends RuntimeException { private static final long serialVersionUID = 1L; - private final ValidationMessage validationMessage; + private final ValidationMessage error; /** * Constructor. * - * @param validationMessage the validation message + * @param error the validation message */ - public FailFastAssertionException(ValidationMessage validationMessage) { - this.validationMessage = Objects.requireNonNull(validationMessage); + public FailFastAssertionException(ValidationMessage error) { + this.error = Objects.requireNonNull(error); } /** @@ -48,8 +48,8 @@ public FailFastAssertionException(ValidationMessage validationMessage) { * * @return the validation message */ - public ValidationMessage getValidationMessage() { - return this.validationMessage; + public ValidationMessage getError() { + return this.error; } /** @@ -57,13 +57,13 @@ public ValidationMessage getValidationMessage() { * * @return the validation message */ - public Set getValidationMessages() { - return Collections.singleton(this.validationMessage); + public List getErrors() { + return Collections.singletonList(this.error); } @Override public String getMessage() { - return this.validationMessage != null ? this.validationMessage.getMessage() : super.getMessage(); + return this.error != null ? this.error.getMessage() : super.getMessage(); } @Override diff --git a/src/main/java/com/networknt/schema/FalseValidator.java b/src/main/java/com/networknt/schema/FalseValidator.java index 8032e3ecc..a33a2b745 100644 --- a/src/main/java/com/networknt/schema/FalseValidator.java +++ b/src/main/java/com/networknt/schema/FalseValidator.java @@ -19,9 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for false. */ @@ -35,10 +32,10 @@ public FalseValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath this.reason = this.evaluationPath.getParent().getName(-1); } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); // For the false validator, it is always not valid - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(reason).build()); } diff --git a/src/main/java/com/networknt/schema/Format.java b/src/main/java/com/networknt/schema/Format.java index 6f79b1021..f1632c0f4 100644 --- a/src/main/java/com/networknt/schema/Format.java +++ b/src/main/java/com/networknt/schema/Format.java @@ -16,8 +16,6 @@ package com.networknt.schema; -import java.util.Collections; -import java.util.Set; import java.util.function.Supplier; import com.fasterxml.jackson.databind.JsonNode; @@ -139,20 +137,17 @@ default boolean matches(ExecutionContext executionContext, ValidationContext val * @param assertionsEnabled if assertions are enabled * @param message the message builder * @param formatValidator the format validator - * @return the messages */ - default Set validate(ExecutionContext executionContext, ValidationContext validationContext, + default void validate(ExecutionContext executionContext, ValidationContext validationContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean assertionsEnabled, Supplier message, FormatValidator formatValidator) { if (assertionsEnabled) { if (!matches(executionContext, validationContext, node, rootNode, instanceLocation, assertionsEnabled, formatValidator)) { - return Collections - .singleton(message.get() + executionContext.addError(message.get() .arguments(this.getName(), this.getErrorMessageDescription(), node.asText()).build()); } } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/FormatValidator.java b/src/main/java/com/networknt/schema/FormatValidator.java index 7177f3f30..4725786f0 100644 --- a/src/main/java/com/networknt/schema/FormatValidator.java +++ b/src/main/java/com/networknt/schema/FormatValidator.java @@ -22,8 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; import java.util.regex.PatternSyntaxException; /** @@ -58,7 +56,7 @@ protected Object getAnnotationValue() { return this.schemaNode.isTextual() ? schemaNode.textValue() : null; } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); /* * Annotations must be collected even if the format is unknown according to the specification. @@ -74,7 +72,7 @@ public Set validate(ExecutionContext executionContext, JsonNo boolean assertionsEnabled = isAssertionsEnabled(executionContext); if (this.format != null) { try { - return format.validate(executionContext, validationContext, node, rootNode, instanceLocation, + format.validate(executionContext, validationContext, node, rootNode, instanceLocation, assertionsEnabled, () -> this.message().instanceNode(node).instanceLocation(instanceLocation) .messageKey(format.getMessageKey()) @@ -85,10 +83,9 @@ public Set validate(ExecutionContext executionContext, JsonNo // String is considered valid if pattern is invalid logger.error("Failed to apply pattern on {}: Invalid RE syntax [{}]", instanceLocation, format.getName(), pse); - return Collections.emptySet(); } } else { - return validateUnknownFormat(executionContext, node, rootNode, instanceLocation); + validateUnknownFormat(executionContext, node, rootNode, instanceLocation); } } @@ -99,19 +96,17 @@ public Set validate(ExecutionContext executionContext, JsonNo * @param node the node * @param rootNode the root node * @param instanceLocation the instance location - * @return the messages */ - protected Set validateUnknownFormat(ExecutionContext executionContext, + protected void validateUnknownFormat(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { /* * Unknown formats should create an assertion if the vocab is specified * according to the specification. */ if (createUnknownFormatAssertions(executionContext) && this.schemaNode.isTextual()) { - return Collections.singleton(message().instanceLocation(instanceLocation).instanceNode(node) + executionContext.addError(message().instanceLocation(instanceLocation).instanceNode(node) .messageKey("format.unknown").arguments(schemaNode.textValue()).build()); } - return Collections.emptySet(); } /** diff --git a/src/main/java/com/networknt/schema/IfValidator.java b/src/main/java/com/networknt/schema/IfValidator.java index 13ed4e855..5a4bfb2e5 100644 --- a/src/main/java/com/networknt/schema/IfValidator.java +++ b/src/main/java/com/networknt/schema/IfValidator.java @@ -64,27 +64,31 @@ public IfValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath, J } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); boolean ifConditionPassed = false; // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); + List existingErrors = executionContext.getErrors(); + List test = new ArrayList<>(); + executionContext.setErrors(test); try { executionContext.setFailFast(false); - ifConditionPassed = this.ifSchema.validate(executionContext, node, rootNode, instanceLocation).isEmpty(); + this.ifSchema.validate(executionContext, node, rootNode, instanceLocation); + ifConditionPassed = test.isEmpty(); } finally { // Restore flag + executionContext.setErrors(existingErrors); executionContext.setFailFast(failFast); } if (ifConditionPassed && this.thenSchema != null) { - return this.thenSchema.validate(executionContext, node, rootNode, instanceLocation); + this.thenSchema.validate(executionContext, node, rootNode, instanceLocation); } else if (!ifConditionPassed && this.elseSchema != null) { - return this.elseSchema.validate(executionContext, node, rootNode, instanceLocation); + this.elseSchema.validate(executionContext, node, rootNode, instanceLocation); } - return Collections.emptySet(); } @Override @@ -101,17 +105,22 @@ public void preloadJsonSchema() { } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { boolean checkCondition = node != null && shouldValidateSchema; boolean ifConditionPassed = false; // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); + List existingErrors = executionContext.getErrors(); + List test = new ArrayList<>(); + executionContext.setErrors(test); try { executionContext.setFailFast(false); - ifConditionPassed = this.ifSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema).isEmpty(); + this.ifSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); + ifConditionPassed = test.isEmpty(); } finally { // Restore flag + executionContext.setErrors(existingErrors); executionContext.setFailFast(failFast); } if (!checkCondition) { @@ -123,13 +132,12 @@ public Set walk(ExecutionContext executionContext, JsonNode n } } else { if (this.thenSchema != null && ifConditionPassed) { - return this.thenSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); + this.thenSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } else if (this.elseSchema != null && !ifConditionPassed) { - return this.elseSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); + this.elseSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/ItemsValidator.java b/src/main/java/com/networknt/schema/ItemsValidator.java index 26f2813f6..0cf913cd4 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator.java +++ b/src/main/java/com/networknt/schema/ItemsValidator.java @@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; import com.networknt.schema.utils.JsonSchemaRefs; -import com.networknt.schema.utils.SetView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,12 +86,12 @@ public ItemsValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!node.isArray() && !this.validationContext.getConfig().isTypeLoose()) { // ignores non-arrays - return Collections.emptySet(); + return; } boolean collectAnnotations = collectAnnotations(); @@ -125,17 +124,16 @@ public Set validate(ExecutionContext executionContext, JsonNo } boolean hasAdditionalItem = false; - SetView errors = new SetView<>(); if (node.isArray()) { int i = 0; for (JsonNode n : node) { - if (doValidate(executionContext, errors, i, n, rootNode, instanceLocation)) { + if (doValidate(executionContext, i, n, rootNode, instanceLocation)) { hasAdditionalItem = true; } i++; } } else { - if (doValidate(executionContext, errors, 0, node, rootNode, instanceLocation)) { + if (doValidate(executionContext, 0, node, rootNode, instanceLocation)) { hasAdditionalItem = true; } } @@ -149,10 +147,9 @@ public Set validate(ExecutionContext executionContext, JsonNo .keyword("additionalItems").value(true).build()); } } - return errors.isEmpty() ? Collections.emptySet() : errors; } - private boolean doValidate(ExecutionContext executionContext, SetView errors, int i, JsonNode node, + private boolean doValidate(ExecutionContext executionContext, int i, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { boolean isAdditionalItem = false; JsonNodePath path = instanceLocation.append(i); @@ -160,17 +157,11 @@ private boolean doValidate(ExecutionContext executionContext, SetView results = this.schema.validate(executionContext, node, rootNode, path); - if (!results.isEmpty()) { - errors.union(results); - } + this.schema.validate(executionContext, node, rootNode, path); } else if (this.tupleSchema != null) { if (i < this.tupleSchema.size()) { // validate against tuple schema - Set results = this.tupleSchema.get(i).validate(executionContext, node, rootNode, path); - if (!results.isEmpty()) { - errors.union(results); - } + this.tupleSchema.get(i).validate(executionContext, node, rootNode, path); } else { if ((this.additionalItems != null && this.additionalItems) || this.additionalSchema != null) { isAdditionalItem = true; @@ -178,23 +169,20 @@ private boolean doValidate(ExecutionContext executionContext, SetView results = this.additionalSchema.validate(executionContext, node, rootNode, path); - if (!results.isEmpty()) { - errors.union(results); - } + this.additionalSchema.validate(executionContext, node, rootNode, path); } else if (this.additionalItems != null) { if (this.additionalItems) { // evaluatedItems.add(path); } else { // no additional item allowed, return error - errors.union(Collections.singleton(message().instanceNode(rootNode).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(rootNode).instanceLocation(instanceLocation) .type("additionalItems") .messageKey("additionalItems") .evaluationPath(this.additionalItemsEvaluationPath) .schemaLocation(this.additionalItemsSchemaLocation) .schemaNode(this.additionalItemsSchemaNode) .locale(executionContext.getExecutionConfig().getLocale()) - .failFast(executionContext.isFailFast()).arguments(i).build())); + .failFast(executionContext.isFailFast()).arguments(i).build()); } } } @@ -203,8 +191,7 @@ private boolean doValidate(ExecutionContext executionContext, SetView walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { - Set validationMessages = new LinkedHashSet<>(); + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { boolean collectAnnotations = collectAnnotations(); // Add items annotation @@ -252,10 +239,10 @@ public Set walk(ExecutionContext executionContext, JsonNode n n = defaultNode; } } - walkSchema(executionContext, this.schema, n, rootNode, instanceLocation.append(i), shouldValidateSchema, validationMessages, ValidatorTypeCode.ITEMS.getValue()); + walkSchema(executionContext, this.schema, n, rootNode, instanceLocation.append(i), shouldValidateSchema, ValidatorTypeCode.ITEMS.getValue()); } } else { - walkSchema(executionContext, this.schema, null, rootNode, instanceLocation.append(0), shouldValidateSchema, validationMessages, ValidatorTypeCode.ITEMS.getValue()); + walkSchema(executionContext, this.schema, null, rootNode, instanceLocation.append(0), shouldValidateSchema, ValidatorTypeCode.ITEMS.getValue()); } } else if (this.tupleSchema != null) { @@ -276,10 +263,10 @@ else if (this.tupleSchema != null) { } } walkSchema(executionContext, this.tupleSchema.get(i), n, rootNode, instanceLocation.append(i), - shouldValidateSchema, validationMessages, ValidatorTypeCode.ITEMS.getValue()); + shouldValidateSchema, ValidatorTypeCode.ITEMS.getValue()); } else { walkSchema(executionContext, this.tupleSchema.get(i), null, rootNode, instanceLocation.append(i), - shouldValidateSchema, validationMessages, ValidatorTypeCode.ITEMS.getValue()); + shouldValidateSchema, ValidatorTypeCode.ITEMS.getValue()); } } if (this.additionalSchema != null) { @@ -303,13 +290,13 @@ else if (this.tupleSchema != null) { } } walkSchema(executionContext, this.additionalSchema, n, rootNode, instanceLocation.append(i), - shouldValidateSchema, validationMessages, PROPERTY_ADDITIONAL_ITEMS); + shouldValidateSchema, PROPERTY_ADDITIONAL_ITEMS); if (n != null) { hasAdditionalItem = true; } } else { walkSchema(executionContext, this.additionalSchema, null, rootNode, instanceLocation.append(i), - shouldValidateSchema, validationMessages, PROPERTY_ADDITIONAL_ITEMS); + shouldValidateSchema, PROPERTY_ADDITIONAL_ITEMS); } } @@ -324,7 +311,6 @@ else if (this.tupleSchema != null) { } } } - return validationMessages; } private static JsonNode getDefaultNode(JsonSchema schema) { @@ -339,14 +325,15 @@ private static JsonNode getDefaultNode(JsonSchema schema) { } private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema, JsonNode node, JsonNode rootNode, - JsonNodePath instanceLocation, boolean shouldValidateSchema, Set validationMessages, String keyword) { + JsonNodePath instanceLocation, boolean shouldValidateSchema, String keyword) { boolean executeWalk = this.validationContext.getConfig().getItemWalkListenerRunner().runPreWalkListeners(executionContext, keyword, node, rootNode, instanceLocation, walkSchema, this); + int currentErrors = executionContext.getErrors().size(); if (executeWalk) { - validationMessages.addAll(walkSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema)); + walkSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } this.validationContext.getConfig().getItemWalkListenerRunner().runPostWalkListeners(executionContext, keyword, node, rootNode, - instanceLocation, walkSchema, this, validationMessages); + instanceLocation, walkSchema, this, executionContext.getErrors().subList(currentErrors, executionContext.getErrors().size())); } diff --git a/src/main/java/com/networknt/schema/ItemsValidator202012.java b/src/main/java/com/networknt/schema/ItemsValidator202012.java index b37971141..859f7542a 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator202012.java +++ b/src/main/java/com/networknt/schema/ItemsValidator202012.java @@ -20,13 +20,10 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; import com.networknt.schema.utils.JsonSchemaRefs; -import com.networknt.schema.utils.SetView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; - /** * {@link JsonValidator} for items from V2012-12. */ @@ -63,36 +60,26 @@ public ItemsValidator202012(SchemaLocation schemaLocation, JsonNodePath evaluati } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); // ignores non-arrays if (node.isArray()) { - SetView errors = null; boolean evaluated = false; for (int i = this.prefixCount; i < node.size(); ++i) { JsonNodePath path = instanceLocation.append(i); // validate with item schema (the whole array has the same item schema) - Set results = null; if (additionalItems) { - results = this.schema.validate(executionContext, node.get(i), rootNode, path); + this.schema.validate(executionContext, node.get(i), rootNode, path); } else { // This handles the case where "items": false as the boolean false schema doesn't // generate a helpful message int x = i; - results = Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(x).build()); } - if (results.isEmpty()) { -// evaluatedItems.add(path); - } else { - if (errors == null) { - errors = new SetView<>(); - } - errors.union(results); - } evaluated = true; } if (evaluated) { @@ -104,17 +91,12 @@ public Set validate(ExecutionContext executionContext, JsonNo .keyword(getKeyword()).value(true).build()); } } - return errors == null || errors.isEmpty() ? Collections.emptySet() : errors; - } else { - return Collections.emptySet(); } } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { - Set validationMessages = new LinkedHashSet<>(); - if (node instanceof ArrayNode) { ArrayNode arrayNode = (ArrayNode) node; JsonNode defaultNode = null; @@ -130,8 +112,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n n = defaultNode; } // Walk the schema. - walkSchema(executionContext, this.schema, n, rootNode, instanceLocation.append(i), shouldValidateSchema, - validationMessages); + walkSchema(executionContext, this.schema, n, rootNode, instanceLocation.append(i), shouldValidateSchema); if (n != null) { evaluated = true; } @@ -149,10 +130,8 @@ public Set walk(ExecutionContext executionContext, JsonNode n // If the node is not an ArrayNode, e.g. ObjectNode or null then the instance is null. // The instance location starts at the end of the prefix count. walkSchema(executionContext, this.schema, null, rootNode, instanceLocation.append(this.prefixCount), - shouldValidateSchema, validationMessages); + shouldValidateSchema); } - - return validationMessages; } private static JsonNode getDefaultNode(JsonSchema schema) { @@ -167,7 +146,7 @@ private static JsonNode getDefaultNode(JsonSchema schema) { } private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema, JsonNode node, JsonNode rootNode, - JsonNodePath instanceLocation, boolean shouldValidateSchema, Set validationMessages) { + JsonNodePath instanceLocation, boolean shouldValidateSchema) { //@formatter:off boolean executeWalk = this.validationContext.getConfig().getItemWalkListenerRunner().runPreWalkListeners( executionContext, @@ -177,8 +156,9 @@ private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema instanceLocation, walkSchema, this ); + int currentErrors = executionContext.getErrors().size(); if (executeWalk) { - validationMessages.addAll(walkSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema)); + walkSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } this.validationContext.getConfig().getItemWalkListenerRunner().runPostWalkListeners( executionContext, @@ -187,7 +167,7 @@ private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema rootNode, instanceLocation, walkSchema, - this, validationMessages + this, executionContext.getErrors().subList(currentErrors, executionContext.getErrors().size()) ); //@formatter:on } diff --git a/src/main/java/com/networknt/schema/JsonSchema.java b/src/main/java/com/networknt/schema/JsonSchema.java index a3627e58f..69626417f 100644 --- a/src/main/java/com/networknt/schema/JsonSchema.java +++ b/src/main/java/com/networknt/schema/JsonSchema.java @@ -23,19 +23,16 @@ import java.util.Collections; import java.util.Comparator; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; -import java.util.Set; import java.util.function.Consumer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.networknt.schema.SpecVersion.VersionFlag; import com.networknt.schema.utils.JsonNodes; -import com.networknt.schema.utils.SetView; /** * Used for creating a schema with validators for validating inputs. This is @@ -142,8 +139,8 @@ public static JsonNodePath getInstance() { } } - public Set validate(ExecutionContext executionContext, JsonNode node) { - return validate(executionContext, node, node, atRoot()); + public void validate(ExecutionContext executionContext, JsonNode node) { + validate(executionContext, node, node, atRoot()); } /** @@ -711,7 +708,7 @@ private long activeDialect() { /************************ START OF VALIDATE METHODS **********************************/ @Override - public Set validate(ExecutionContext executionContext, JsonNode jsonNode, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode jsonNode, JsonNode rootNode, JsonNodePath instanceLocation) { if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled()) { ObjectNode discriminator = (ObjectNode) schemaNode.get("discriminator"); if (null != discriminator && null != executionContext.getCurrentDiscriminatorContext()) { @@ -719,21 +716,9 @@ public Set validate(ExecutionContext executionContext, JsonNo discriminator); } } - - SetView errors = null; + int currentErrors = executionContext.getErrors().size(); for (JsonValidator v : getValidators()) { - Set results = null; - - try { - results = v.validate(executionContext, jsonNode, rootNode, instanceLocation); - } finally { - if (results != null && !results.isEmpty()) { - if (errors == null) { - errors = new SetView<>(); - } - errors.union(results); - } - } + v.validate(executionContext, jsonNode, rootNode, instanceLocation); } if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled()) { @@ -765,12 +750,11 @@ public Set validate(ExecutionContext executionContext, JsonNo } } - if (errors != null && !errors.isEmpty()) { + if (executionContext.getErrors().size() > currentErrors) { // Failed with assertion set result and drop all annotations from this schema // and all subschemas executionContext.getResults().setResult(instanceLocation, getSchemaLocation(), getEvaluationPath(), false); } - return errors == null ? Collections.emptySet() : errors; } /** @@ -786,7 +770,7 @@ public Set validate(ExecutionContext executionContext, JsonNo * @return A list of ValidationMessage if there is any validation error, or an * empty list if there is no error. */ - public Set validate(JsonNode rootNode) { + public List validate(JsonNode rootNode) { return validate(rootNode, OutputFormat.DEFAULT); } @@ -803,7 +787,7 @@ public Set validate(JsonNode rootNode) { * @param executionCustomizer the execution customizer * @return the assertions */ - public Set validate(JsonNode rootNode, ExecutionContextCustomizer executionCustomizer) { + public List validate(JsonNode rootNode, ExecutionContextCustomizer executionCustomizer) { return validate(rootNode, OutputFormat.DEFAULT, executionCustomizer); } @@ -820,7 +804,7 @@ public Set validate(JsonNode rootNode, ExecutionContextCustom * @param executionCustomizer the execution customizer * @return the assertions */ - public Set validate(JsonNode rootNode, Consumer executionCustomizer) { + public List validate(JsonNode rootNode, Consumer executionCustomizer) { return validate(rootNode, OutputFormat.DEFAULT, executionCustomizer); } @@ -898,7 +882,7 @@ public T validate(JsonNode rootNode, OutputFormat format, Consumer validate(String input, InputFormat inputFormat) { + public List validate(String input, InputFormat inputFormat) { return validate(deserialize(input, inputFormat), OutputFormat.DEFAULT); } @@ -917,7 +901,7 @@ public Set validate(String input, InputFormat inputFormat) { * @param executionCustomizer the execution customizer * @return the assertions */ - public Set validate(String input, InputFormat inputFormat, ExecutionContextCustomizer executionCustomizer) { + public List validate(String input, InputFormat inputFormat, ExecutionContextCustomizer executionCustomizer) { return validate(deserialize(input, inputFormat), OutputFormat.DEFAULT, executionCustomizer); } @@ -936,7 +920,7 @@ public Set validate(String input, InputFormat inputFormat, Ex * @param executionCustomizer the execution customizer * @return the assertions */ - public Set validate(String input, InputFormat inputFormat, Consumer executionCustomizer) { + public List validate(String input, InputFormat inputFormat, Consumer executionCustomizer) { return validate(deserialize(input, inputFormat), OutputFormat.DEFAULT, executionCustomizer); } @@ -1031,13 +1015,12 @@ public T validate(ExecutionContext executionContext, JsonNode node, OutputFo if (executionCustomizer != null) { executionCustomizer.customize(executionContext, this.validationContext); } - Set validationMessages = null; try { - validationMessages = validate(executionContext, node); + validate(executionContext, node); } catch (FailFastAssertionException e) { - validationMessages = e.getValidationMessages(); + executionContext.setErrors(e.getErrors()); } - return format.format(this, validationMessages, executionContext, this.validationContext); + return format.format(this, executionContext, this.validationContext); } /** @@ -1083,7 +1066,7 @@ public ValidationResult validateAndCollect(ExecutionContext executionContext, Js @Deprecated private ValidationResult validateAndCollect(ExecutionContext executionContext, JsonNode jsonNode, JsonNode rootNode, JsonNodePath instanceLocation) { // Validate. - Set errors = validate(executionContext, jsonNode, rootNode, instanceLocation); + validate(executionContext, jsonNode, rootNode, instanceLocation); // Get the config. SchemaValidatorsConfig config = this.validationContext.getConfig(); @@ -1097,7 +1080,7 @@ private ValidationResult validateAndCollect(ExecutionContext executionContext, J collectorContext.loadCollectors(); } // Collect errors and collector context into validation result. - return new ValidationResult(errors, executionContext); + return new ValidationResult(executionContext); } /** @@ -1356,7 +1339,7 @@ private T walkAtNodeInternal(ExecutionContext executionContext, JsonNode nod executionCustomizer.customize(executionContext, this.validationContext); } // Walk through the schema. - Set errors = walk(executionContext, node, rootNode, instanceLocation, validate); + walk(executionContext, node, rootNode, instanceLocation, validate); // Get the config. SchemaValidatorsConfig config = this.validationContext.getConfig(); @@ -1369,14 +1352,14 @@ private T walkAtNodeInternal(ExecutionContext executionContext, JsonNode nod // Load all the data from collectors into the context. collectorContext.loadCollectors(); } - return format.format(this, errors, executionContext, this.validationContext); + return format.format(this, executionContext, this.validationContext); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { - Set errors = new LinkedHashSet<>(); // Walk through all the JSONWalker's. + int currentErrors = executionContext.getErrors().size(); for (JsonValidator validator : getValidators()) { JsonNodePath evaluationPathWithKeyword = validator.getEvaluationPath(); try { @@ -1385,23 +1368,16 @@ public Set walk(ExecutionContext executionContext, JsonNode n if (this.validationContext.getConfig().getKeywordWalkListenerRunner().runPreWalkListeners(executionContext, evaluationPathWithKeyword.getName(-1), node, rootNode, instanceLocation, this, validator)) { - Set results = null; - try { - results = validator.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); - } finally { - if (results != null && !results.isEmpty()) { - errors.addAll(results); - } - } + validator.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } } finally { // Call all the post-walk listeners. this.validationContext.getConfig().getKeywordWalkListenerRunner().runPostWalkListeners(executionContext, evaluationPathWithKeyword.getName(-1), node, rootNode, instanceLocation, - this, validator, errors); + this, validator, + executionContext.getErrors().subList(currentErrors, executionContext.getErrors().size())); } } - return errors; } /************************ END OF WALK METHODS **********************************/ diff --git a/src/main/java/com/networknt/schema/JsonSchemaException.java b/src/main/java/com/networknt/schema/JsonSchemaException.java index d667e8701..1add66f77 100644 --- a/src/main/java/com/networknt/schema/JsonSchemaException.java +++ b/src/main/java/com/networknt/schema/JsonSchemaException.java @@ -17,42 +17,42 @@ package com.networknt.schema; import java.util.Collections; -import java.util.Set; +import java.util.List; /** * Represents an error when processing the JsonSchema. */ public class JsonSchemaException extends RuntimeException { private static final long serialVersionUID = -7805792737596582110L; - private final ValidationMessage validationMessage; + private final ValidationMessage error; - public JsonSchemaException(ValidationMessage validationMessage) { - this.validationMessage = validationMessage; + public JsonSchemaException(ValidationMessage error) { + this.error = error; } public JsonSchemaException(String message) { super(message); - this.validationMessage = null; + this.error = null; } public JsonSchemaException(Throwable throwable) { super(throwable); - this.validationMessage = null; + this.error = null; } @Override public String getMessage() { - return this.validationMessage != null ? this.validationMessage.getMessage() : super.getMessage(); + return this.error != null ? this.error.getMessage() : super.getMessage(); } - public ValidationMessage getValidationMessage() { - return this.validationMessage; + public ValidationMessage getError() { + return this.error; } - public Set getValidationMessages() { - if (validationMessage == null) { - return Collections.emptySet(); + public List getErrors() { + if (error == null) { + return Collections.emptyList(); } - return Collections.singleton(validationMessage); + return Collections.singletonList(error); } } diff --git a/src/main/java/com/networknt/schema/JsonSchemaValidator.java b/src/main/java/com/networknt/schema/JsonSchemaValidator.java index 3216b1ac0..cb551a1b4 100644 --- a/src/main/java/com/networknt/schema/JsonSchemaValidator.java +++ b/src/main/java/com/networknt/schema/JsonSchemaValidator.java @@ -16,9 +16,6 @@ package com.networknt.schema; -import java.util.Collections; -import java.util.Set; - import com.fasterxml.jackson.databind.JsonNode; import com.networknt.schema.walk.JsonSchemaWalker; @@ -33,11 +30,8 @@ public interface JsonSchemaValidator extends JsonSchemaWalker { * @param node JsonNode * @param rootNode JsonNode * @param instanceLocation JsonNodePath - * - * @return A list of ValidationMessage if there is any validation error, or an empty - * list if there is no error. */ - Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation); /** @@ -45,14 +39,15 @@ Set validate(ExecutionContext executionContext, JsonNode node * validate method if shouldValidateSchema is enabled. */ @Override - default Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + default void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (node == null) { // Note that null is not the same as NullNode - return Collections.emptySet(); + return; + } + if (shouldValidateSchema) { + validate(executionContext, node, rootNode, instanceLocation); } - return shouldValidateSchema ? validate(executionContext, node, rootNode, instanceLocation) - : Collections.emptySet(); } /** diff --git a/src/main/java/com/networknt/schema/MaxItemsValidator.java b/src/main/java/com/networknt/schema/MaxItemsValidator.java index 1f7748bf7..75a4fbcae 100644 --- a/src/main/java/com/networknt/schema/MaxItemsValidator.java +++ b/src/main/java/com/networknt/schema/MaxItemsValidator.java @@ -20,9 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for maxItems. */ @@ -41,24 +38,22 @@ public MaxItemsValidator(SchemaLocation schemaLocation, JsonNodePath evaluationP } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (node.isArray()) { if (node.size() > this.max) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.max, node.size()).build()); } } else if (this.validationContext.getConfig().isTypeLoose()) { if (1 > this.max) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.max, 1).build()); } } - - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/MaxLengthValidator.java b/src/main/java/com/networknt/schema/MaxLengthValidator.java index ec587fdef..fb8504d49 100644 --- a/src/main/java/com/networknt/schema/MaxLengthValidator.java +++ b/src/main/java/com/networknt/schema/MaxLengthValidator.java @@ -20,9 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for maxLength. */ @@ -40,20 +37,19 @@ public MaxLengthValidator(SchemaLocation schemaLocation, JsonNodePath evaluation } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig()); if (nodeType != JsonType.STRING) { // ignore no-string typs - return Collections.emptySet(); + return; } if (node.textValue().codePointCount(0, node.textValue().length()) > this.maxLength) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.maxLength).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/MaxPropertiesValidator.java b/src/main/java/com/networknt/schema/MaxPropertiesValidator.java index f6e58724d..432186140 100644 --- a/src/main/java/com/networknt/schema/MaxPropertiesValidator.java +++ b/src/main/java/com/networknt/schema/MaxPropertiesValidator.java @@ -20,9 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator}for maxProperties. */ @@ -41,18 +38,16 @@ public MaxPropertiesValidator(SchemaLocation schemaLocation, JsonNodePath evalua } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (node.isObject()) { if (node.size() > max) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(max).build()); } } - - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/MaximumValidator.java b/src/main/java/com/networknt/schema/MaximumValidator.java index 1bbef9e7a..0c6630b94 100644 --- a/src/main/java/com/networknt/schema/MaximumValidator.java +++ b/src/main/java/com/networknt/schema/MaximumValidator.java @@ -24,8 +24,6 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.util.Collections; -import java.util.Set; /** * {@link JsonValidator} for maxmimum. @@ -109,20 +107,19 @@ public String thresholdValue() { } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!JsonNodeUtil.isNumber(node, this.validationContext.getConfig())) { // maximum only applies to numbers - return Collections.emptySet(); + return; } if (this.typedMaximum.crossesThreshold(node)) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()) .arguments(this.typedMaximum.thresholdValue()).build()); } - return Collections.emptySet(); } } \ No newline at end of file diff --git a/src/main/java/com/networknt/schema/MinItemsValidator.java b/src/main/java/com/networknt/schema/MinItemsValidator.java index 52f927b14..41da79afb 100644 --- a/src/main/java/com/networknt/schema/MinItemsValidator.java +++ b/src/main/java/com/networknt/schema/MinItemsValidator.java @@ -20,9 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for minItems. */ @@ -38,25 +35,23 @@ public MinItemsValidator(SchemaLocation schemaLocation, JsonNodePath evaluationP } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (node.isArray()) { if (node.size() < min) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(min, node.size()) .build()); } } else if (this.validationContext.getConfig().isTypeLoose()) { if (1 < min) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(min, 1).build()); } } - - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/MinLengthValidator.java b/src/main/java/com/networknt/schema/MinLengthValidator.java index 1161ba2f5..cce1f97b4 100644 --- a/src/main/java/com/networknt/schema/MinLengthValidator.java +++ b/src/main/java/com/networknt/schema/MinLengthValidator.java @@ -20,9 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for minLength. */ @@ -39,21 +36,20 @@ public MinLengthValidator(SchemaLocation schemaLocation, JsonNodePath evaluation } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig()); if (nodeType != JsonType.STRING) { // ignore non-string types - return Collections.emptySet(); + return; } if (node.textValue().codePointCount(0, node.textValue().length()) < minLength) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(minLength).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/MinMaxContainsValidator.java b/src/main/java/com/networknt/schema/MinMaxContainsValidator.java index 768aba654..3cbcc476e 100644 --- a/src/main/java/com/networknt/schema/MinMaxContainsValidator.java +++ b/src/main/java/com/networknt/schema/MinMaxContainsValidator.java @@ -2,10 +2,8 @@ import com.fasterxml.jackson.databind.JsonNode; -import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; -import java.util.stream.Collectors; /** * {@link JsonValidator} for {@literal maxContains} and {@literal minContains} in a schema. @@ -59,16 +57,18 @@ public MinMaxContainsValidator(SchemaLocation schemaLocation, JsonNodePath evalu } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return this.analysis != null ? this.analysis.stream() - .map(analysis -> message().instanceNode(node) - .instanceLocation(instanceLocation) - .messageKey(analysis.getMessageKey()).locale(executionContext.getExecutionConfig().getLocale()) - .failFast(executionContext.isFailFast()) - .type(analysis.getMessageKey()) - .arguments(parentSchema.getSchemaNode().toString()).build()) - .collect(Collectors.toCollection(LinkedHashSet::new)) : Collections.emptySet(); + if (this.analysis != null) { + this.analysis.stream() + .map(analysis -> message().instanceNode(node) + .instanceLocation(instanceLocation) + .messageKey(analysis.getMessageKey()).locale(executionContext.getExecutionConfig().getLocale()) + .failFast(executionContext.isFailFast()) + .type(analysis.getMessageKey()) + .arguments(parentSchema.getSchemaNode().toString()).build()) + .forEach(executionContext::addError); + } } public static class Analysis { diff --git a/src/main/java/com/networknt/schema/MinPropertiesValidator.java b/src/main/java/com/networknt/schema/MinPropertiesValidator.java index 2867a0832..36584c162 100644 --- a/src/main/java/com/networknt/schema/MinPropertiesValidator.java +++ b/src/main/java/com/networknt/schema/MinPropertiesValidator.java @@ -20,9 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for minProperties. */ @@ -41,18 +38,16 @@ public MinPropertiesValidator(SchemaLocation schemaLocation, JsonNodePath evalua } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (node.isObject()) { if (node.size() < min) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(min).build()); } } - - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/MinimumValidator.java b/src/main/java/com/networknt/schema/MinimumValidator.java index dc557a185..877518732 100644 --- a/src/main/java/com/networknt/schema/MinimumValidator.java +++ b/src/main/java/com/networknt/schema/MinimumValidator.java @@ -24,8 +24,6 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.util.Collections; -import java.util.Set; /** * {@link JsonValidator} for minimum. @@ -116,21 +114,20 @@ public String thresholdValue() { } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!JsonNodeUtil.isNumber(node, this.validationContext.getConfig())) { // minimum only applies to numbers - return Collections.emptySet(); + return; } if (this.typedMinimum.crossesThreshold(node)) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()) .arguments(this.typedMinimum.thresholdValue()).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/MultipleOfValidator.java b/src/main/java/com/networknt/schema/MultipleOfValidator.java index bcd29d2db..e3089cdea 100644 --- a/src/main/java/com/networknt/schema/MultipleOfValidator.java +++ b/src/main/java/com/networknt/schema/MultipleOfValidator.java @@ -23,8 +23,6 @@ import org.slf4j.LoggerFactory; import java.math.BigDecimal; -import java.util.Collections; -import java.util.Set; /** * {@link JsonValidator} for multipleOf. @@ -40,21 +38,20 @@ public MultipleOfValidator(SchemaLocation schemaLocation, JsonNodePath evaluatio this.divisor = getDivisor(schemaNode); } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (this.divisor != null) { BigDecimal dividend = getDividend(node); if (dividend != null) { if (dividend.divideAndRemainder(this.divisor)[1].abs().compareTo(BigDecimal.ZERO) > 0) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.divisor) .build()); } } } - return Collections.emptySet(); } /** diff --git a/src/main/java/com/networknt/schema/NonValidationKeyword.java b/src/main/java/com/networknt/schema/NonValidationKeyword.java index a5f2c15fb..2b2cde777 100644 --- a/src/main/java/com/networknt/schema/NonValidationKeyword.java +++ b/src/main/java/com/networknt/schema/NonValidationKeyword.java @@ -18,10 +18,8 @@ import com.fasterxml.jackson.databind.JsonNode; -import java.util.Collections; import java.util.Iterator; import java.util.Map.Entry; -import java.util.Set; /** * Used for Keywords that have no validation aspect, but are part of the metaschema. @@ -51,8 +49,8 @@ public Validator(SchemaLocation schemaLocation, JsonNodePath evaluationPath, Jso } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return Collections.emptySet(); + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + // Do nothing } } diff --git a/src/main/java/com/networknt/schema/NotAllowedValidator.java b/src/main/java/com/networknt/schema/NotAllowedValidator.java index 448bd978b..78f6c0c84 100644 --- a/src/main/java/com/networknt/schema/NotAllowedValidator.java +++ b/src/main/java/com/networknt/schema/NotAllowedValidator.java @@ -43,26 +43,19 @@ public NotAllowedValidator(SchemaLocation schemaLocation, JsonNodePath evaluatio } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); - Set errors = null; - for (String fieldName : fieldNames) { JsonNode propertyNode = node.get(fieldName); if (propertyNode != null) { - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.add(message().property(fieldName).instanceNode(node) + executionContext.addError(message().property(fieldName).instanceNode(node) .instanceLocation(instanceLocation.append(fieldName)) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(fieldName).build()); } } - - return errors == null ? Collections.emptySet() : Collections.unmodifiableSet(errors); } } diff --git a/src/main/java/com/networknt/schema/NotValidator.java b/src/main/java/com/networknt/schema/NotValidator.java index c63ae34ac..67c607994 100644 --- a/src/main/java/com/networknt/schema/NotValidator.java +++ b/src/main/java/com/networknt/schema/NotValidator.java @@ -37,42 +37,49 @@ public NotValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath, } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return validate(executionContext, node, rootNode, instanceLocation, false); + validate(executionContext, node, rootNode, instanceLocation, false); } - protected Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + protected void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { - Set errors = null; + debug(logger, executionContext, node, rootNode, instanceLocation); // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); + List existingErrors = executionContext.getErrors(); + List test = new ArrayList<>(); + executionContext.setErrors(test); try { executionContext.setFailFast(false); - errors = !walk ? this.schema.validate(executionContext, node, rootNode, instanceLocation) - : this.schema.walk(executionContext, node, rootNode, instanceLocation, true); + if (!walk) { + this.schema.validate(executionContext, node, rootNode, instanceLocation); + } else { + this.schema.walk(executionContext, node, rootNode, instanceLocation, true); + } } finally { // Restore flag executionContext.setFailFast(failFast); + executionContext.setErrors(existingErrors); } - if (errors.isEmpty()) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + if (test.isEmpty()) { + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.schema.toString()) .build()); } - return Collections.emptySet(); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (shouldValidateSchema && node != null) { - return validate(executionContext, node, rootNode, instanceLocation, true); + validate(executionContext, node, rootNode, instanceLocation, true); + return; } - return this.schema.walk(executionContext, node, rootNode, instanceLocation, false); + this.schema.walk(executionContext, node, rootNode, instanceLocation, false); } @Override diff --git a/src/main/java/com/networknt/schema/OneOfValidator.java b/src/main/java/com/networknt/schema/OneOfValidator.java index caca84353..0ad80e99c 100644 --- a/src/main/java/com/networknt/schema/OneOfValidator.java +++ b/src/main/java/com/networknt/schema/OneOfValidator.java @@ -17,18 +17,13 @@ package com.networknt.schema; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.networknt.schema.utils.SetView; /** * {@link JsonValidator} for oneOf. @@ -59,23 +54,24 @@ public OneOfValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return validate(executionContext, node, rootNode, instanceLocation, false); + validate(executionContext, node, rootNode, instanceLocation, false); } - protected Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + protected void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { - Set errors = null; - debug(logger, executionContext, node, rootNode, instanceLocation); int numberOfValidSchema = 0; int index = 0; - SetView childErrors = null; List indexes = null; - + List existingErrors = executionContext.getErrors(); + List childErrors = null; + List schemaErrors = new ArrayList<>(); + executionContext.setErrors(schemaErrors); // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); + boolean addMessages = true; try { DiscriminatorValidator discriminator = null; if (this.validationContext.getConfig().isDiscriminatorKeywordEnabled()) { @@ -93,16 +89,15 @@ protected Set validate(ExecutionContext executionContext, Jso } executionContext.setFailFast(false); for (JsonSchema schema : this.schemas) { - Set schemaErrors = Collections.emptySet(); + schemaErrors.clear(); if (!walk) { - schemaErrors = schema.validate(executionContext, node, rootNode, instanceLocation); + schema.validate(executionContext, node, rootNode, instanceLocation); } else { - schemaErrors = schema.walk(executionContext, node, rootNode, instanceLocation, - true); + schema.walk(executionContext, node, rootNode, instanceLocation, true); } // check if any validation errors have occurred - if (schemaErrors.isEmpty()) { + if (schemaErrors.isEmpty()) { // No new errors numberOfValidSchema++; if (indexes == null) { indexes = new ArrayList<>(); @@ -144,22 +139,22 @@ protected Set validate(ExecutionContext executionContext, Jso if (currentDiscriminatorContext.isDiscriminatorMatchFound() && childErrors == null) { // Note that the match is set if found and not reset so checking if childErrors // found is null triggers on the correct schema - childErrors = new SetView<>(); - childErrors.union(schemaErrors); + childErrors = new ArrayList<>(); + childErrors.addAll(schemaErrors); } else if (currentDiscriminatorContext.isDiscriminatorIgnore() || !currentDiscriminatorContext.isActive()) { // This is the normal handling when discriminators aren't enabled if (childErrors == null) { - childErrors = new SetView<>(); + childErrors = new ArrayList<>(); } - childErrors.union(schemaErrors); + childErrors.addAll(schemaErrors); } } else if (!schemaErrors.isEmpty() && reportChildErrors(executionContext)) { // This is the normal handling when discriminators aren't enabled if (childErrors == null) { - childErrors = new SetView<>(); + childErrors = new ArrayList<>(); } - childErrors.union(schemaErrors); + childErrors.addAll(schemaErrors); } index++; } @@ -168,7 +163,8 @@ protected Set validate(ExecutionContext executionContext, Jso && (discriminator != null || executionContext.getCurrentDiscriminatorContext().isActive()) && !executionContext.getCurrentDiscriminatorContext().isDiscriminatorMatchFound() && !executionContext.getCurrentDiscriminatorContext().isDiscriminatorIgnore()) { - errors = Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + addMessages = false; + existingErrors.add(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .arguments( "based on the provided discriminator. No alternative could be chosen based on the discriminator property") @@ -186,19 +182,19 @@ protected Set validate(ExecutionContext executionContext, Jso // ensure there is always an "OneOf" error reported if number of valid schemas // is not equal to 1. // errors will only not be null in the discriminator case where no match is found - if (numberOfValidSchema != 1 && errors == null) { + if (numberOfValidSchema != 1 && addMessages) { ValidationMessage message = message().instanceNode(node).instanceLocation(instanceLocation) .messageKey(numberOfValidSchema > 1 ? "oneOf.indexes" : "oneOf") .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()) .arguments(Integer.toString(numberOfValidSchema), numberOfValidSchema > 1 ? String.join(", ", indexes) : "").build(); + existingErrors.add(message); if (childErrors != null) { - errors = new SetView().union(Collections.singleton(message)).union(childErrors); - } else { - errors = Collections.singleton(message); + existingErrors.addAll(childErrors); } } - return errors != null ? errors : Collections.emptySet(); + executionContext.setErrors(existingErrors); + return; } /** @@ -228,16 +224,14 @@ protected boolean canShortCircuit() { } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { - HashSet validationMessages = new LinkedHashSet<>(); + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (shouldValidateSchema && node != null) { - validationMessages.addAll(validate(executionContext, node, rootNode, instanceLocation, true)); + validate(executionContext, node, rootNode, instanceLocation, true); } else { for (JsonSchema schema : this.schemas) { schema.walk(executionContext, node, rootNode, instanceLocation, false); } } - return validationMessages; } @Override diff --git a/src/main/java/com/networknt/schema/OutputFormat.java b/src/main/java/com/networknt/schema/OutputFormat.java index 61e0c904d..93d1da44e 100644 --- a/src/main/java/com/networknt/schema/OutputFormat.java +++ b/src/main/java/com/networknt/schema/OutputFormat.java @@ -15,7 +15,6 @@ */ package com.networknt.schema; -import java.util.Set; import java.util.function.Function; import com.networknt.schema.output.HierarchicalOutputUnitFormatter; @@ -45,13 +44,12 @@ default void customize(ExecutionContext executionContext, ValidationContext vali * Formats the validation results. * * @param jsonSchema the schema - * @param validationMessages the validation messages * @param executionContext the execution context * @param validationContext the validation context * * @return the result */ - T format(JsonSchema jsonSchema, Set validationMessages, + T format(JsonSchema jsonSchema, ExecutionContext executionContext, ValidationContext validationContext); /** @@ -90,16 +88,16 @@ T format(JsonSchema jsonSchema, Set validationMessages, /** * The Default output format. */ - class Default implements OutputFormat> { + class Default implements OutputFormat> { @Override public void customize(ExecutionContext executionContext, ValidationContext validationContext) { executionContext.getExecutionConfig().setAnnotationCollectionEnabled(false); } @Override - public Set format(JsonSchema jsonSchema, - Set validationMessages, ExecutionContext executionContext, ValidationContext validationContext) { - return validationMessages; + public java.util.List format(JsonSchema jsonSchema, + ExecutionContext executionContext, ValidationContext validationContext) { + return executionContext.getErrors(); } } @@ -114,9 +112,9 @@ public void customize(ExecutionContext executionContext, ValidationContext valid } @Override - public OutputFlag format(JsonSchema jsonSchema, Set validationMessages, + public OutputFlag format(JsonSchema jsonSchema, ExecutionContext executionContext, ValidationContext validationContext) { - return new OutputFlag(validationMessages.isEmpty()); + return new OutputFlag(executionContext.getErrors().isEmpty()); } } @@ -131,9 +129,9 @@ public void customize(ExecutionContext executionContext, ValidationContext valid } @Override - public java.lang.Boolean format(JsonSchema jsonSchema, Set validationMessages, + public java.lang.Boolean format(JsonSchema jsonSchema, ExecutionContext executionContext, ValidationContext validationContext) { - return validationMessages.isEmpty(); + return executionContext.getErrors().isEmpty(); } } @@ -161,9 +159,9 @@ public void customize(ExecutionContext executionContext, ValidationContext valid } @Override - public OutputUnit format(JsonSchema jsonSchema, Set validationMessages, + public OutputUnit format(JsonSchema jsonSchema, ExecutionContext executionContext, ValidationContext validationContext) { - return ListOutputUnitFormatter.format(validationMessages, executionContext, validationContext, + return ListOutputUnitFormatter.format(executionContext.getErrors(), executionContext, validationContext, this.assertionMapper); } } @@ -192,9 +190,9 @@ public void customize(ExecutionContext executionContext, ValidationContext valid } @Override - public OutputUnit format(JsonSchema jsonSchema, Set validationMessages, + public OutputUnit format(JsonSchema jsonSchema, ExecutionContext executionContext, ValidationContext validationContext) { - return HierarchicalOutputUnitFormatter.format(jsonSchema, validationMessages, executionContext, + return HierarchicalOutputUnitFormatter.format(jsonSchema, executionContext.getErrors(), executionContext, validationContext, this.assertionMapper); } } @@ -210,9 +208,8 @@ public void customize(ExecutionContext executionContext, ValidationContext valid } @Override - public ValidationResult format(JsonSchema jsonSchema, - Set validationMessages, ExecutionContext executionContext, ValidationContext validationContext) { - return new ValidationResult(validationMessages, executionContext); + public ValidationResult format(JsonSchema jsonSchema,ExecutionContext executionContext, ValidationContext validationContext) { + return new ValidationResult(executionContext); } } } diff --git a/src/main/java/com/networknt/schema/PatternPropertiesValidator.java b/src/main/java/com/networknt/schema/PatternPropertiesValidator.java index 94cb16cd1..95403ad0d 100644 --- a/src/main/java/com/networknt/schema/PatternPropertiesValidator.java +++ b/src/main/java/com/networknt/schema/PatternPropertiesValidator.java @@ -49,13 +49,12 @@ public PatternPropertiesValidator(SchemaLocation schemaLocation, JsonNodePath ev } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!node.isObject()) { - return Collections.emptySet(); + return; } - Set errors = null; Set matchedInstancePropertyNames = null; Iterator names = node.fieldNames(); boolean collectAnnotations = collectAnnotations() || collectAnnotations(executionContext); @@ -65,19 +64,15 @@ public Set validate(ExecutionContext executionContext, JsonNo for (Map.Entry entry : schemas.entrySet()) { if (entry.getKey().matches(name)) { JsonNodePath path = instanceLocation.append(name); - Set results = entry.getValue().validate(executionContext, n, rootNode, path); - if (results.isEmpty()) { + int currentErrors = executionContext.getErrors().size(); + entry.getValue().validate(executionContext, n, rootNode, path); + if (currentErrors == executionContext.getErrors().size()) { // No new errors if (collectAnnotations) { if (matchedInstancePropertyNames == null) { matchedInstancePropertyNames = new LinkedHashSet<>(); } matchedInstancePropertyNames.add(name); } - } else { - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.addAll(results); } } } @@ -91,7 +86,6 @@ public Set validate(ExecutionContext executionContext, JsonNo : Collections.emptySet()) .build()); } - return errors == null ? Collections.emptySet() : Collections.unmodifiableSet(errors); } private boolean collectAnnotations() { diff --git a/src/main/java/com/networknt/schema/PatternValidator.java b/src/main/java/com/networknt/schema/PatternValidator.java index 166c553a4..b4b29e733 100644 --- a/src/main/java/com/networknt/schema/PatternValidator.java +++ b/src/main/java/com/networknt/schema/PatternValidator.java @@ -21,9 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; import java.util.Optional; -import java.util.Set; public class PatternValidator extends BaseJsonValidator { private static final Logger logger = LoggerFactory.getLogger(PatternValidator.class); @@ -48,19 +46,20 @@ private boolean matches(String value) { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig()); if (nodeType != JsonType.STRING) { - return Collections.emptySet(); + return; } try { if (!matches(node.asText())) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(this.pattern).build()); + return; } } catch (JsonSchemaException | FailFastAssertionException e) { throw e; @@ -68,7 +67,5 @@ public Set validate(ExecutionContext executionContext, JsonNo logger.error("Failed to apply pattern '{}' at {}: {}", this.pattern, instanceLocation, e.getMessage()); throw e; } - - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/PrefixItemsValidator.java b/src/main/java/com/networknt/schema/PrefixItemsValidator.java index c390a5af9..9abaa1848 100644 --- a/src/main/java/com/networknt/schema/PrefixItemsValidator.java +++ b/src/main/java/com/networknt/schema/PrefixItemsValidator.java @@ -20,16 +20,12 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; import com.networknt.schema.utils.JsonSchemaRefs; -import com.networknt.schema.utils.SetView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; /** * {@link JsonValidator} for prefixItems. @@ -58,21 +54,14 @@ public PrefixItemsValidator(SchemaLocation schemaLocation, JsonNodePath evaluati } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); // ignores non-arrays if (node.isArray()) { - SetView errors = null; int count = Math.min(node.size(), this.tupleSchema.size()); for (int i = 0; i < count; ++i) { JsonNodePath path = instanceLocation.append(i); - Set results = this.tupleSchema.get(i).validate(executionContext, node.get(i), rootNode, path); - if (!results.isEmpty()) { - if (errors == null) { - errors = new SetView<>(); - } - errors.union(results); - } + this.tupleSchema.get(i).validate(executionContext, node.get(i), rootNode, path); } // Add annotation @@ -94,15 +83,11 @@ public Set validate(ExecutionContext executionContext, JsonNo .keyword(getKeyword()).value(true).build()); } } - return errors == null || errors.isEmpty() ? Collections.emptySet() : errors; - } else { - return Collections.emptySet(); } } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { - Set validationMessages = new LinkedHashSet<>(); + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (node instanceof ArrayNode) { ArrayNode array = (ArrayNode) node; int count = this.tupleSchema.size(); @@ -118,7 +103,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n } } } - doWalk(executionContext, validationMessages, i, n, rootNode, instanceLocation, shouldValidateSchema); + doWalk(executionContext, i, n, rootNode, instanceLocation, shouldValidateSchema); } // Add annotation @@ -143,10 +128,9 @@ public Set walk(ExecutionContext executionContext, JsonNode n } else { int count = this.tupleSchema.size(); for (int i = 0; i < count; ++i) { - doWalk(executionContext, validationMessages, i, null, rootNode, instanceLocation, shouldValidateSchema); + doWalk(executionContext, i, null, rootNode, instanceLocation, shouldValidateSchema); } } - return validationMessages; } private static JsonNode getDefaultNode(JsonSchema schema) { @@ -160,14 +144,14 @@ private static JsonNode getDefaultNode(JsonSchema schema) { return result; } - private void doWalk(ExecutionContext executionContext, Set validationMessages, int i, + private void doWalk(ExecutionContext executionContext, int i, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { walkSchema(executionContext, this.tupleSchema.get(i), node, rootNode, instanceLocation.append(i), - shouldValidateSchema, validationMessages); + shouldValidateSchema); } private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema, JsonNode node, JsonNode rootNode, - JsonNodePath instanceLocation, boolean shouldValidateSchema, Set validationMessages) { + JsonNodePath instanceLocation, boolean shouldValidateSchema) { //@formatter:off boolean executeWalk = this.validationContext.getConfig().getItemWalkListenerRunner().runPreWalkListeners( executionContext, @@ -177,8 +161,9 @@ private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema instanceLocation, walkSchema, this ); + int currentErrors = executionContext.getErrors().size(); if (executeWalk) { - validationMessages.addAll(walkSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema)); + walkSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } this.validationContext.getConfig().getItemWalkListenerRunner().runPostWalkListeners( executionContext, @@ -187,7 +172,7 @@ private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema rootNode, instanceLocation, walkSchema, - this, validationMessages + this, executionContext.getErrors().subList(currentErrors, executionContext.getErrors().size()) ); //@formatter:on } diff --git a/src/main/java/com/networknt/schema/PropertiesValidator.java b/src/main/java/com/networknt/schema/PropertiesValidator.java index 36bcab846..c64e767ef 100644 --- a/src/main/java/com/networknt/schema/PropertiesValidator.java +++ b/src/main/java/com/networknt/schema/PropertiesValidator.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.networknt.schema.annotation.JsonNodeAnnotation; import com.networknt.schema.utils.JsonSchemaRefs; -import com.networknt.schema.utils.SetView; import com.networknt.schema.walk.WalkListenerRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,17 +55,15 @@ public PropertiesValidator(SchemaLocation schemaLocation, JsonNodePath evaluatio } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return validate(executionContext, node, rootNode, instanceLocation, false); + validate(executionContext, node, rootNode, instanceLocation, false); } - protected Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + protected void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean walk) { debug(logger, executionContext, node, rootNode, instanceLocation); - SetView errors = null; - Set matchedInstancePropertyNames = null; boolean collectAnnotations = collectAnnotations() || collectAnnotations(executionContext); for (Entry entry : this.schemas.entrySet()) { @@ -81,20 +78,10 @@ protected Set validate(ExecutionContext executionContext, Jso } if (!walk) { //validate the child element(s) - Set result = entry.getValue().validate(executionContext, propertyNode, rootNode, - path); - if (!result.isEmpty()) { - if (errors == null) { - errors = new SetView<>(); - } - errors.union(result); - } + entry.getValue().validate(executionContext, propertyNode, rootNode, path); } else { // check if walker is enabled. If it is enabled it is upto the walker implementation to decide about the validation. - if (errors == null) { - errors = new SetView<>(); - } - walkSchema(executionContext, entry, node, rootNode, instanceLocation, true, errors, this.validationContext.getConfig().getPropertyWalkListenerRunner()); + walkSchema(executionContext, entry, node, rootNode, instanceLocation, true, this.validationContext.getConfig().getPropertyWalkListenerRunner()); } } else { if (walk) { @@ -103,10 +90,7 @@ protected Set validate(ExecutionContext executionContext, Jso // null. // The actual walk needs to be skipped as the validators assume that node is not // null. - if (errors == null) { - errors = new SetView<>(); - } - walkSchema(executionContext, entry, node, rootNode, instanceLocation, true, errors, this.validationContext.getConfig().getPropertyWalkListenerRunner()); + walkSchema(executionContext, entry, node, rootNode, instanceLocation, true, this.validationContext.getConfig().getPropertyWalkListenerRunner()); } } } @@ -118,27 +102,23 @@ protected Set validate(ExecutionContext executionContext, Jso : matchedInstancePropertyNames) .build()); } - - return errors == null || errors.isEmpty() ? Collections.emptySet() : errors; } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { - SetView validationMessages = new SetView<>(); + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyPropertyDefaults() && null != node && node.getNodeType() == JsonNodeType.OBJECT) { applyPropertyDefaults((ObjectNode) node); } if (shouldValidateSchema) { - validationMessages.union(validate(executionContext, node == null ? MissingNode.getInstance() : node, rootNode, - instanceLocation, true)); + validate(executionContext, node == null ? MissingNode.getInstance() : node, rootNode, + instanceLocation, true); } else { WalkListenerRunner propertyWalkListenerRunner = this.validationContext.getConfig().getPropertyWalkListenerRunner(); for (Map.Entry entry : this.schemas.entrySet()) { - walkSchema(executionContext, entry, node, rootNode, instanceLocation, shouldValidateSchema, validationMessages, propertyWalkListenerRunner); + walkSchema(executionContext, entry, node, rootNode, instanceLocation, shouldValidateSchema, propertyWalkListenerRunner); } } - return validationMessages; } private boolean collectAnnotations() { @@ -180,8 +160,7 @@ private static JsonNode getDefaultNode(JsonSchema schema) { } private void walkSchema(ExecutionContext executionContext, Map.Entry entry, JsonNode node, - JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema, - SetView validationMessages, WalkListenerRunner propertyWalkListenerRunner) { + JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema, WalkListenerRunner propertyWalkListenerRunner) { JsonSchema propertySchema = entry.getValue(); JsonNode propertyNode = (node == null ? null : node.get(entry.getKey())); JsonNodePath path = instanceLocation.append(entry.getKey()); @@ -192,20 +171,19 @@ private void walkSchema(ExecutionContext executionContext, Map.Entry getSchemas() { return this.schemas; } - @Override public void preloadJsonSchema() { preloadJsonSchemas(this.schemas.values()); diff --git a/src/main/java/com/networknt/schema/PropertyNamesValidator.java b/src/main/java/com/networknt/schema/PropertyNamesValidator.java index 3d895f031..0fa90bed5 100644 --- a/src/main/java/com/networknt/schema/PropertyNamesValidator.java +++ b/src/main/java/com/networknt/schema/PropertyNamesValidator.java @@ -15,10 +15,9 @@ */ package com.networknt.schema; -import java.util.Collections; +import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,30 +33,30 @@ public PropertyNamesValidator(SchemaLocation schemaLocation, JsonNodePath evalua innerSchema = validationContext.newSchema(schemaLocation, evaluationPath, schemaNode, parentSchema); } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); - Set errors = null; + List existingErrors = executionContext.getErrors(); + List schemaErrors = new ArrayList<>(); + executionContext.setErrors(schemaErrors); for (Iterator it = node.fieldNames(); it.hasNext(); ) { final String pname = it.next(); final TextNode pnameText = TextNode.valueOf(pname); - final Set schemaErrors = innerSchema.validate(executionContext, pnameText, node, instanceLocation.append(pname)); + innerSchema.validate(executionContext, pnameText, node, instanceLocation.append(pname)); for (final ValidationMessage schemaError : schemaErrors) { final String path = schemaError.getInstanceLocation().toString(); String msg = schemaError.getMessage(); if (msg.startsWith(path)) { msg = msg.substring(path.length()).replaceFirst("^:\\s*", ""); } - if (errors == null) { - errors = new LinkedHashSet<>(); - } - errors.add( + existingErrors.add( message().property(pname).instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(pname, msg).build()); } + schemaErrors.clear(); } - return errors == null || errors.isEmpty() ? Collections.emptySet() : Collections.unmodifiableSet(errors); + executionContext.setErrors(existingErrors); } diff --git a/src/main/java/com/networknt/schema/ReadOnlyValidator.java b/src/main/java/com/networknt/schema/ReadOnlyValidator.java index c7b0b9a2d..f9416fe07 100644 --- a/src/main/java/com/networknt/schema/ReadOnlyValidator.java +++ b/src/main/java/com/networknt/schema/ReadOnlyValidator.java @@ -16,9 +16,6 @@ package com.networknt.schema; -import java.util.Collections; -import java.util.Set; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,14 +37,14 @@ public ReadOnlyValidator(SchemaLocation schemaLocation, JsonNodePath evaluationP } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (this.readOnly) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).build()); } - return Collections.emptySet(); + return; } } \ No newline at end of file diff --git a/src/main/java/com/networknt/schema/RecursiveRefValidator.java b/src/main/java/com/networknt/schema/RecursiveRefValidator.java index 711fe932d..31688aa2f 100644 --- a/src/main/java/com/networknt/schema/RecursiveRefValidator.java +++ b/src/main/java/com/networknt/schema/RecursiveRefValidator.java @@ -20,8 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; import java.util.function.Supplier; /** @@ -87,7 +85,7 @@ static JsonSchema getSchema(JsonSchema parentSchema, ValidationContext validatio } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); JsonSchema refSchema = this.schema.getSchema(); if (refSchema == null) { @@ -97,11 +95,11 @@ public Set validate(ExecutionContext executionContext, JsonNo .arguments(schemaNode.asText()).build(); throw new InvalidSchemaRefException(validationMessage); } - return refSchema.validate(executionContext, node, rootNode, instanceLocation); + refSchema.validate(executionContext, node, rootNode, instanceLocation); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { debug(logger, executionContext, node, rootNode, instanceLocation); // This is important because if we use same JsonSchemaFactory for creating multiple JSONSchema instances, // these schemas will be cached along with config. We have to replace the config for cached $ref references @@ -127,10 +125,10 @@ public Set walk(ExecutionContext executionContext, JsonNode n } } if (circularDependency) { - return Collections.emptySet(); + return; } } - return refSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); + refSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } public JsonSchemaRef getSchemaRef() { diff --git a/src/main/java/com/networknt/schema/RefValidator.java b/src/main/java/com/networknt/schema/RefValidator.java index 823e43c78..c173f8140 100644 --- a/src/main/java/com/networknt/schema/RefValidator.java +++ b/src/main/java/com/networknt/schema/RefValidator.java @@ -20,8 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; import java.util.function.Supplier; /** @@ -176,7 +174,7 @@ private static JsonSchema getJsonSchema(JsonSchema parent, } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); JsonSchema refSchema = this.schema.getSchema(); if (refSchema == null) { @@ -186,11 +184,11 @@ public Set validate(ExecutionContext executionContext, JsonNo .arguments(schemaNode.asText()).build(); throw new InvalidSchemaRefException(validationMessage); } - return refSchema.validate(executionContext, node, rootNode, instanceLocation); + refSchema.validate(executionContext, node, rootNode, instanceLocation); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { debug(logger, executionContext, node, rootNode, instanceLocation); // This is important because if we use same JsonSchemaFactory for creating multiple JSONSchema instances, // these schemas will be cached along with config. We have to replace the config for cached $ref references @@ -216,10 +214,10 @@ public Set walk(ExecutionContext executionContext, JsonNode n } } if (circularDependency) { - return Collections.emptySet(); + return; } } - return refSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); + refSchema.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } public JsonSchemaRef getSchemaRef() { diff --git a/src/main/java/com/networknt/schema/RequiredValidator.java b/src/main/java/com/networknt/schema/RequiredValidator.java index 7084b6b92..41bfa3c5b 100644 --- a/src/main/java/com/networknt/schema/RequiredValidator.java +++ b/src/main/java/com/networknt/schema/RequiredValidator.java @@ -42,15 +42,13 @@ public RequiredValidator(SchemaLocation schemaLocation, JsonNodePath evaluationP } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (!node.isObject()) { - return Collections.emptySet(); + return; } - Set errors = null; - for (String fieldName : fieldNames) { JsonNode propertyNode = node.get(fieldName); @@ -68,21 +66,16 @@ public Set validate(ExecutionContext executionContext, JsonNo continue; } } - if (errors == null) { - errors = new LinkedHashSet<>(); - } /** * Note that for the required validation the instanceLocation does not contain the missing property *

* @see Basic */ - errors.add(message().instanceNode(node).property(fieldName).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).property(fieldName).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(fieldName).build()); } } - - return errors == null ? Collections.emptySet() : Collections.unmodifiableSet(errors); } protected JsonNode getFieldKeyword(String fieldName, String keyword) { diff --git a/src/main/java/com/networknt/schema/TrueValidator.java b/src/main/java/com/networknt/schema/TrueValidator.java index 380ed5d09..0c02cbb85 100644 --- a/src/main/java/com/networknt/schema/TrueValidator.java +++ b/src/main/java/com/networknt/schema/TrueValidator.java @@ -19,9 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Set; - /** * {@link JsonValidator} for true. */ @@ -32,9 +29,8 @@ public TrueValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPath, super(schemaLocation, evaluationPath, schemaNode, parentSchema, ValidatorTypeCode.TRUE, validationContext); } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); // For the true validator, it is always valid which means there is no ValidationMessage. - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/TypeValidator.java b/src/main/java/com/networknt/schema/TypeValidator.java index 2cadb1b7a..bbe0b54d6 100644 --- a/src/main/java/com/networknt/schema/TypeValidator.java +++ b/src/main/java/com/networknt/schema/TypeValidator.java @@ -21,8 +21,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; - /** * {@link JsonValidator} for type. */ @@ -51,20 +49,20 @@ public boolean equalsToSchemaType(JsonNode node) { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (this.schemaType == JsonType.UNION) { - return this.unionTypeValidator.validate(executionContext, node, rootNode, instanceLocation); + this.unionTypeValidator.validate(executionContext, node, rootNode, instanceLocation); + return; } if (!equalsToSchemaType(node)) { JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig()); - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()) .arguments(nodeType.toString(), this.schemaType.toString()).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/UnevaluatedItemsValidator.java b/src/main/java/com/networknt/schema/UnevaluatedItemsValidator.java index 43ceb3eb7..fc08adc37 100644 --- a/src/main/java/com/networknt/schema/UnevaluatedItemsValidator.java +++ b/src/main/java/com/networknt/schema/UnevaluatedItemsValidator.java @@ -53,9 +53,9 @@ public UnevaluatedItemsValidator(SchemaLocation schemaLocation, JsonNodePath eva } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { if (!node.isArray()) { - return Collections.emptySet(); + return; } debug(logger, executionContext, node, rootNode, instanceLocation); @@ -149,8 +149,8 @@ public Set validate(ExecutionContext executionContext, JsonNo } } } - Set messages = null; if (!valid) { + int currentErrors = executionContext.getErrors().size(); // Get all the "contains" for the instanceLocation List contains = instanceLocationAnnotations.stream() .filter(a -> "contains".equals(a.getKeyword())).filter(adjacentEvaluationPathFilter) @@ -167,7 +167,6 @@ public Set validate(ExecutionContext executionContext, JsonNo } } - messages = new LinkedHashSet<>(); if (!containsEvaluatedAll) { // Start evaluating from the valid count for (int x = validCount; x < node.size(); x++) { @@ -175,19 +174,18 @@ public Set validate(ExecutionContext executionContext, JsonNo if (!containsEvaluated.contains(x)) { if (this.schemaNode.isBoolean() && this.schemaNode.booleanValue() == false) { // All fails as "unevaluatedItems: false" - messages.add(message().instanceNode(node).instanceLocation(instanceLocation).arguments(x) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation).arguments(x) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).build()); } else { // Schema errors will be reported as is - messages.addAll(this.schema.validate(executionContext, node.get(x), node, - instanceLocation.append(x))); + this.schema.validate(executionContext, node.get(x), node, instanceLocation.append(x)); } evaluated = true; } } } - if (messages.isEmpty()) { + if (currentErrors == executionContext.getErrors().size()) { // No new errors valid = true; } } @@ -203,6 +201,5 @@ public Set validate(ExecutionContext executionContext, JsonNo .evaluationPath(this.evaluationPath).schemaLocation(this.schemaLocation) .keyword("unevaluatedItems").value(true).build()); } - return messages == null || messages.isEmpty() ? Collections.emptySet() : messages; } } diff --git a/src/main/java/com/networknt/schema/UnevaluatedPropertiesValidator.java b/src/main/java/com/networknt/schema/UnevaluatedPropertiesValidator.java index c35115b46..db09c16e7 100644 --- a/src/main/java/com/networknt/schema/UnevaluatedPropertiesValidator.java +++ b/src/main/java/com/networknt/schema/UnevaluatedPropertiesValidator.java @@ -45,9 +45,9 @@ public UnevaluatedPropertiesValidator(SchemaLocation schemaLocation, JsonNodePat } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { if (!node.isObject()) { - return Collections.emptySet(); + return; } debug(logger, executionContext, node, rootNode, instanceLocation); @@ -106,7 +106,6 @@ public Set validate(ExecutionContext executionContext, JsonNo } } - Set messages = new LinkedHashSet<>(); // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); try { @@ -117,13 +116,13 @@ public Set validate(ExecutionContext executionContext, JsonNo evaluatedProperties.add(fieldName); if (this.schemaNode.isBoolean() && this.schemaNode.booleanValue() == false) { // All fails as "unevaluatedProperties: false" - messages.add(message().instanceNode(node).instanceLocation(instanceLocation).property(fieldName) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation).property(fieldName) .arguments(fieldName).locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).build()); } else { // Schema errors will be reported as is - messages.addAll(this.schema.validate(executionContext, node.get(fieldName), node, - instanceLocation.append(fieldName))); + this.schema.validate(executionContext, node.get(fieldName), node, + instanceLocation.append(fieldName)); } } } @@ -134,6 +133,6 @@ public Set validate(ExecutionContext executionContext, JsonNo .put(JsonNodeAnnotation.builder().instanceLocation(instanceLocation).evaluationPath(this.evaluationPath) .schemaLocation(this.schemaLocation).keyword(getKeyword()).value(evaluatedProperties).build()); - return messages == null || messages.isEmpty() ? Collections.emptySet() : messages; + return; } } diff --git a/src/main/java/com/networknt/schema/UnionTypeValidator.java b/src/main/java/com/networknt/schema/UnionTypeValidator.java index 07806b3cf..2a271b258 100644 --- a/src/main/java/com/networknt/schema/UnionTypeValidator.java +++ b/src/main/java/com/networknt/schema/UnionTypeValidator.java @@ -21,9 +21,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Set; /** * {@link JsonValidator} for type union. @@ -67,7 +65,7 @@ public UnionTypeValidator(SchemaLocation schemaLocation, JsonNodePath evaluation error = errorBuilder.toString(); } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); JsonType nodeType = TypeFactory.getValueNodeType(node, validationContext.getConfig()); @@ -76,29 +74,33 @@ public Set validate(ExecutionContext executionContext, JsonNo // Save flag as nested schema evaluation shouldn't trigger fail fast boolean failFast = executionContext.isFailFast(); + List existingErrors = executionContext.getErrors(); try { + List test = new ArrayList<>(); executionContext.setFailFast(false); + executionContext.setErrors(test); for (JsonSchemaValidator schema : schemas) { - Set errors = schema.validate(executionContext, node, rootNode, instanceLocation); - if (errors == null || errors.isEmpty()) { + schema.validate(executionContext, node, rootNode, instanceLocation); + if (test.isEmpty()) { valid = true; break; + } else { + test.clear(); } } } finally { // Restore flag executionContext.setFailFast(failFast); + executionContext.setErrors(existingErrors); } if (!valid) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .type("type") .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).arguments(nodeType.toString(), error) .build()); } - - return Collections.emptySet(); } @Override diff --git a/src/main/java/com/networknt/schema/UniqueItemsValidator.java b/src/main/java/com/networknt/schema/UniqueItemsValidator.java index 9ee15e959..37486e4db 100644 --- a/src/main/java/com/networknt/schema/UniqueItemsValidator.java +++ b/src/main/java/com/networknt/schema/UniqueItemsValidator.java @@ -20,7 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -41,21 +40,19 @@ public UniqueItemsValidator(SchemaLocation schemaLocation, JsonNodePath evaluati } } - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (unique) { Set set = new HashSet<>(); for (JsonNode n : node) { if (!set.add(n)) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).build()); } } } - - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/ValidationResult.java b/src/main/java/com/networknt/schema/ValidationResult.java index 74cd7ca20..5495fedb1 100644 --- a/src/main/java/com/networknt/schema/ValidationResult.java +++ b/src/main/java/com/networknt/schema/ValidationResult.java @@ -15,25 +15,21 @@ */ package com.networknt.schema; -import java.util.Set; +import java.util.List; /** * Represents a validation result. */ public class ValidationResult { - - private final Set validationMessages; - private final ExecutionContext executionContext; - public ValidationResult(Set validationMessages, ExecutionContext executionContext) { + public ValidationResult(ExecutionContext executionContext) { super(); - this.validationMessages = validationMessages; this.executionContext = executionContext; } - public Set getValidationMessages() { - return validationMessages; + public List getValidationMessages() { + return getExecutionContext().getErrors(); } public ExecutionContext getExecutionContext() { diff --git a/src/main/java/com/networknt/schema/WriteOnlyValidator.java b/src/main/java/com/networknt/schema/WriteOnlyValidator.java index c441e6bee..e28eccaaa 100644 --- a/src/main/java/com/networknt/schema/WriteOnlyValidator.java +++ b/src/main/java/com/networknt/schema/WriteOnlyValidator.java @@ -1,8 +1,5 @@ package com.networknt.schema; -import java.util.Collections; -import java.util.Set; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,14 +21,13 @@ public WriteOnlyValidator(SchemaLocation schemaLocation, JsonNodePath evaluation } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { debug(logger, executionContext, node, rootNode, instanceLocation); if (this.writeOnly) { - return Collections.singleton(message().instanceNode(node).instanceLocation(instanceLocation) + executionContext.addError(message().instanceNode(node).instanceLocation(instanceLocation) .locale(executionContext.getExecutionConfig().getLocale()) .failFast(executionContext.isFailFast()).build()); } - return Collections.emptySet(); } } diff --git a/src/main/java/com/networknt/schema/output/HierarchicalOutputUnitFormatter.java b/src/main/java/com/networknt/schema/output/HierarchicalOutputUnitFormatter.java index e4cffae1a..eea8d67d6 100644 --- a/src/main/java/com/networknt/schema/output/HierarchicalOutputUnitFormatter.java +++ b/src/main/java/com/networknt/schema/output/HierarchicalOutputUnitFormatter.java @@ -20,6 +20,7 @@ import java.util.Deque; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.function.Function; @@ -107,7 +108,7 @@ public static OutputUnit format(OutputUnit root, OutputUnitData data, JsonNodePa return root; } - public static OutputUnit format(JsonSchema jsonSchema, Set validationMessages, + public static OutputUnit format(JsonSchema jsonSchema, List validationMessages, ExecutionContext executionContext, ValidationContext validationContext, Function assertionMapper) { OutputUnit root = new OutputUnit(); diff --git a/src/main/java/com/networknt/schema/output/ListOutputUnitFormatter.java b/src/main/java/com/networknt/schema/output/ListOutputUnitFormatter.java index 529eb346f..44bb20260 100644 --- a/src/main/java/com/networknt/schema/output/ListOutputUnitFormatter.java +++ b/src/main/java/com/networknt/schema/output/ListOutputUnitFormatter.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.function.Function; -import java.util.Set; import com.networknt.schema.ExecutionContext; import com.networknt.schema.ValidationContext; @@ -91,7 +90,7 @@ public static OutputUnit format(OutputUnit root, OutputUnitData data) { return root; } - public static OutputUnit format(Set validationMessages, ExecutionContext executionContext, + public static OutputUnit format(List validationMessages, ExecutionContext executionContext, ValidationContext validationContext, Function assertionMapper) { OutputUnit root = new OutputUnit(); root.setValid(validationMessages.isEmpty()); diff --git a/src/main/java/com/networknt/schema/output/OutputUnitData.java b/src/main/java/com/networknt/schema/output/OutputUnitData.java index 8867f71c2..0f195f6e6 100644 --- a/src/main/java/com/networknt/schema/output/OutputUnitData.java +++ b/src/main/java/com/networknt/schema/output/OutputUnitData.java @@ -19,7 +19,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Function; import com.networknt.schema.ExecutionContext; @@ -73,7 +72,7 @@ public static String formatMessage(String message) { } @SuppressWarnings("unchecked") - public static OutputUnitData from(Set validationMessages, ExecutionContext executionContext, + public static OutputUnitData from(List validationMessages, ExecutionContext executionContext, Function assertionMapper) { OutputUnitData data = new OutputUnitData(); diff --git a/src/main/java/com/networknt/schema/walk/AbstractWalkListenerRunner.java b/src/main/java/com/networknt/schema/walk/AbstractWalkListenerRunner.java index 92d564c10..cb0d197a9 100644 --- a/src/main/java/com/networknt/schema/walk/AbstractWalkListenerRunner.java +++ b/src/main/java/com/networknt/schema/walk/AbstractWalkListenerRunner.java @@ -8,7 +8,6 @@ import com.networknt.schema.ValidationMessage; import java.util.List; -import java.util.Set; public abstract class AbstractWalkListenerRunner implements WalkListenerRunner { @@ -36,7 +35,7 @@ protected boolean runPreWalkListeners(List walkListeners } protected void runPostWalkListeners(List walkListeners, WalkEvent walkEvent, - Set validationMessages) { + List validationMessages) { if (walkListeners != null) { for (JsonSchemaWalkListener walkListener : walkListeners) { walkListener.onWalkEnd(walkEvent, validationMessages); diff --git a/src/main/java/com/networknt/schema/walk/DefaultItemWalkListenerRunner.java b/src/main/java/com/networknt/schema/walk/DefaultItemWalkListenerRunner.java index fbd5c36c6..6d0e3d865 100644 --- a/src/main/java/com/networknt/schema/walk/DefaultItemWalkListenerRunner.java +++ b/src/main/java/com/networknt/schema/walk/DefaultItemWalkListenerRunner.java @@ -8,7 +8,6 @@ import com.networknt.schema.ValidationMessage; import java.util.List; -import java.util.Set; public class DefaultItemWalkListenerRunner extends AbstractWalkListenerRunner { @@ -28,7 +27,7 @@ public boolean runPreWalkListeners(ExecutionContext executionContext, String key @Override public void runPostWalkListeners(ExecutionContext executionContext, String keyword, JsonNode instanceNode, - JsonNode rootNode, JsonNodePath instanceLocation, JsonSchema schema, JsonValidator validator, Set validationMessages) { + JsonNode rootNode, JsonNodePath instanceLocation, JsonSchema schema, JsonValidator validator, List validationMessages) { WalkEvent walkEvent = constructWalkEvent(executionContext, keyword, instanceNode, rootNode, instanceLocation, schema, validator); runPostWalkListeners(itemWalkListeners, walkEvent, validationMessages); diff --git a/src/main/java/com/networknt/schema/walk/DefaultKeywordWalkListenerRunner.java b/src/main/java/com/networknt/schema/walk/DefaultKeywordWalkListenerRunner.java index fd75835f8..6f3692f51 100644 --- a/src/main/java/com/networknt/schema/walk/DefaultKeywordWalkListenerRunner.java +++ b/src/main/java/com/networknt/schema/walk/DefaultKeywordWalkListenerRunner.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; -import java.util.Set; public class DefaultKeywordWalkListenerRunner extends AbstractWalkListenerRunner { @@ -34,7 +33,7 @@ public boolean runPreWalkListeners(ExecutionContext executionContext, String key @Override public void runPostWalkListeners(ExecutionContext executionContext, String keyword, JsonNode instanceNode, JsonNode rootNode, JsonNodePath instanceLocation, - JsonSchema schema, JsonValidator validator, Set validationMessages) { + JsonSchema schema, JsonValidator validator, List validationMessages) { WalkEvent keywordWalkEvent = constructWalkEvent(executionContext, keyword, instanceNode, rootNode, instanceLocation, schema, validator); // Run Listeners that are setup only for this keyword. List currentKeywordListeners = keywordWalkListenersMap.get(keyword); diff --git a/src/main/java/com/networknt/schema/walk/DefaultPropertyWalkListenerRunner.java b/src/main/java/com/networknt/schema/walk/DefaultPropertyWalkListenerRunner.java index f0c101b72..7acdc407d 100644 --- a/src/main/java/com/networknt/schema/walk/DefaultPropertyWalkListenerRunner.java +++ b/src/main/java/com/networknt/schema/walk/DefaultPropertyWalkListenerRunner.java @@ -8,7 +8,6 @@ import com.networknt.schema.ValidationMessage; import java.util.List; -import java.util.Set; public class DefaultPropertyWalkListenerRunner extends AbstractWalkListenerRunner { @@ -27,7 +26,7 @@ public boolean runPreWalkListeners(ExecutionContext executionContext, String key @Override public void runPostWalkListeners(ExecutionContext executionContext, String keyword, JsonNode instanceNode, JsonNode rootNode, JsonNodePath instanceLocation, - JsonSchema schema, JsonValidator validator, Set validationMessages) { + JsonSchema schema, JsonValidator validator, List validationMessages) { WalkEvent walkEvent = constructWalkEvent(executionContext, keyword, instanceNode, rootNode, instanceLocation, schema, validator); runPostWalkListeners(propertyWalkListeners, walkEvent, validationMessages); diff --git a/src/main/java/com/networknt/schema/walk/JsonSchemaWalkListener.java b/src/main/java/com/networknt/schema/walk/JsonSchemaWalkListener.java index 4c830c2ac..a93c49367 100644 --- a/src/main/java/com/networknt/schema/walk/JsonSchemaWalkListener.java +++ b/src/main/java/com/networknt/schema/walk/JsonSchemaWalkListener.java @@ -2,7 +2,7 @@ import com.networknt.schema.ValidationMessage; -import java.util.Set; +import java.util.List; /** * @@ -13,5 +13,5 @@ public interface JsonSchemaWalkListener { WalkFlow onWalkStart(WalkEvent walkEvent); - void onWalkEnd(WalkEvent walkEvent, Set validationMessages); + void onWalkEnd(WalkEvent walkEvent, List validationMessages); } diff --git a/src/main/java/com/networknt/schema/walk/JsonSchemaWalker.java b/src/main/java/com/networknt/schema/walk/JsonSchemaWalker.java index c6bd6ac7c..091f6f3ac 100644 --- a/src/main/java/com/networknt/schema/walk/JsonSchemaWalker.java +++ b/src/main/java/com/networknt/schema/walk/JsonSchemaWalker.java @@ -4,9 +4,6 @@ import com.networknt.schema.BaseJsonValidator; import com.networknt.schema.ExecutionContext; import com.networknt.schema.JsonNodePath; -import com.networknt.schema.ValidationMessage; - -import java.util.Set; public interface JsonSchemaWalker { /** @@ -26,8 +23,7 @@ public interface JsonSchemaWalker { * @param rootNode JsonNode * @param instanceLocation JsonNodePath * @param shouldValidateSchema boolean - * @return a set of validation messages if shouldValidateSchema is true. */ - Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema); } diff --git a/src/main/java/com/networknt/schema/walk/WalkListenerRunner.java b/src/main/java/com/networknt/schema/walk/WalkListenerRunner.java index 9001f753b..4a0ef3dcf 100644 --- a/src/main/java/com/networknt/schema/walk/WalkListenerRunner.java +++ b/src/main/java/com/networknt/schema/walk/WalkListenerRunner.java @@ -7,7 +7,7 @@ import com.networknt.schema.JsonValidator; import com.networknt.schema.ValidationMessage; -import java.util.Set; +import java.util.List; public interface WalkListenerRunner { @@ -15,6 +15,6 @@ boolean runPreWalkListeners(ExecutionContext executionContext, String keyword, J JsonNode rootNode, JsonNodePath instanceLocation, JsonSchema schema, JsonValidator validator); void runPostWalkListeners(ExecutionContext executionContext, String keyword, JsonNode instanceNode, - JsonNode rootNode, JsonNodePath instanceLocation, JsonSchema schema, JsonValidator validator, Set validationMessages); + JsonNode rootNode, JsonNodePath instanceLocation, JsonSchema schema, JsonValidator validator, List errors); } diff --git a/src/test/java/com/networknt/schema/AbstractJsonSchemaTest.java b/src/test/java/com/networknt/schema/AbstractJsonSchemaTest.java index 197e8871f..aab62c27c 100644 --- a/src/test/java/com/networknt/schema/AbstractJsonSchemaTest.java +++ b/src/test/java/com/networknt/schema/AbstractJsonSchemaTest.java @@ -7,8 +7,8 @@ import java.io.IOException; import java.io.InputStream; import java.text.MessageFormat; +import java.util.List; import java.util.Optional; -import java.util.Set; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -25,13 +25,13 @@ abstract class AbstractJsonSchemaTest { private static final String ASSERT_MSG_ERROR_CODE = "Validation result should contain {0} error code"; private static final String ASSERT_MSG_TYPE = "Validation result should contain {0} type"; - protected Set validate(String dataPath) { + protected List validate(String dataPath) { JsonNode dataNode = getJsonNodeFromPath(dataPath); return getJsonSchemaFromDataNode(dataNode).validate(dataNode); } protected void assertValidatorType(String filename, ValidatorTypeCode validatorTypeCode) { - Set validationMessages = validate(getDataTestFolder() + filename); + List validationMessages = validate(getDataTestFolder() + filename); assertTrue( validationMessages.stream().anyMatch(vm -> validatorTypeCode.getErrorCode().equals(vm.getCode())), diff --git a/src/test/java/com/networknt/schema/AbstractJsonSchemaTestSuite.java b/src/test/java/com/networknt/schema/AbstractJsonSchemaTestSuite.java index 50d4871e7..7b98ef3d1 100644 --- a/src/test/java/com/networknt/schema/AbstractJsonSchemaTestSuite.java +++ b/src/test/java/com/networknt/schema/AbstractJsonSchemaTestSuite.java @@ -55,7 +55,7 @@ private static String toForwardSlashPath(Path file) { } private static void executeTest(JsonSchema schema, TestSpec testSpec) { - Set errors = schema.validate(testSpec.getData(), OutputFormat.DEFAULT, (executionContext, validationContext) -> { + List errors = schema.validate(testSpec.getData(), OutputFormat.DEFAULT, (executionContext, validationContext) -> { if (testSpec.getTestCase().getSource().getPath().getParent().toString().endsWith("format")) { executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); } diff --git a/src/test/java/com/networknt/schema/AdditionalPropertiesValidatorTest.java b/src/test/java/com/networknt/schema/AdditionalPropertiesValidatorTest.java index 23bf922c6..af20d956a 100644 --- a/src/test/java/com/networknt/schema/AdditionalPropertiesValidatorTest.java +++ b/src/test/java/com/networknt/schema/AdditionalPropertiesValidatorTest.java @@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -52,7 +52,7 @@ void messageFalse() { + " \"foo\":\"hello\",\r\n" + " \"bar\":\"world\"\r\n" + "}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/additionalProperties", message.getEvaluationPath().toString()); @@ -87,7 +87,7 @@ void messageSchema() { + " \"foo\":\"hello\",\r\n" + " \"bar\":\"world\"\r\n" + "}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/additionalProperties/type", message.getEvaluationPath().toString()); diff --git a/src/test/java/com/networknt/schema/AllOfValidatorTest.java b/src/test/java/com/networknt/schema/AllOfValidatorTest.java index 0b5597f94..3db78312b 100644 --- a/src/test/java/com/networknt/schema/AllOfValidatorTest.java +++ b/src/test/java/com/networknt/schema/AllOfValidatorTest.java @@ -35,7 +35,7 @@ void invalidTypeShouldThrowJsonSchemaException() { + "}"; JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); JsonSchemaException ex = assertThrows(JsonSchemaException.class, () -> factory.getSchema(schemaData)); - assertEquals("type", ex.getValidationMessage().getMessageKey()); + assertEquals("type", ex.getError().getMessageKey()); } @Test diff --git a/src/test/java/com/networknt/schema/AnyOfValidatorTest.java b/src/test/java/com/networknt/schema/AnyOfValidatorTest.java index d6914ff18..f230b2d7b 100644 --- a/src/test/java/com/networknt/schema/AnyOfValidatorTest.java +++ b/src/test/java/com/networknt/schema/AnyOfValidatorTest.java @@ -35,7 +35,7 @@ void invalidTypeShouldThrowJsonSchemaException() { + "}"; JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); JsonSchemaException ex = assertThrows(JsonSchemaException.class, () -> factory.getSchema(schemaData)); - assertEquals("type", ex.getValidationMessage().getMessageKey()); + assertEquals("type", ex.getError().getMessageKey()); } @Test diff --git a/src/test/java/com/networknt/schema/CollectorContextTest.java b/src/test/java/com/networknt/schema/CollectorContextTest.java index c19d6294c..a39e8d42f 100644 --- a/src/test/java/com/networknt/schema/CollectorContextTest.java +++ b/src/test/java/com/networknt/schema/CollectorContextTest.java @@ -109,9 +109,9 @@ void testCollectorGetAll() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); ExecutionContext executionContext = jsonSchemaForCombine.createExecutionContext(); executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); - Set messages = jsonSchemaForCombine.validate(executionContext, objectMapper + jsonSchemaForCombine.validate(executionContext, objectMapper .readTree("{\"property1\":\"sample1\",\"property2\":\"sample2\",\"property3\":\"sample3\" }")); - ValidationResult validationResult = new ValidationResult(messages, executionContext); + ValidationResult validationResult = new ValidationResult(executionContext); CollectorContext collectorContext = validationResult.getCollectorContext(); collectorContext.loadCollectors(); Assertions.assertEquals(((List) collectorContext.get(SAMPLE_COLLECTOR)).size(), 1); @@ -285,19 +285,17 @@ public CustomValidator(SchemaLocation schemaLocation, JsonNodePath evaluationPat } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { CollectorContext collectorContext = executionContext.getCollectorContext(); CustomCollector customCollector = (CustomCollector) collectorContext.getCollectorMap().computeIfAbsent(SAMPLE_COLLECTOR, key -> new CustomCollector()); customCollector.combine(node.textValue()); - return Collections.emptySet(); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { // Ignore this method for testing. - return null; } } @@ -360,7 +358,7 @@ public CustomValidator1(SchemaLocation schemaLocation, JsonNodePath evaluationPa @SuppressWarnings("unchecked") @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { // Get an instance of collector context. CollectorContext collectorContext = executionContext.getCollectorContext(); // If collector type is not added to context add one. @@ -369,22 +367,20 @@ public Set validate(ExecutionContext executionContext, JsonNo synchronized(returnList) { returnList.add(node.textValue()); } - return Collections.emptySet(); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { // Ignore this method for testing. - return null; } } private ValidationResult validate(String jsonData) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); ExecutionContext executionContext = this.jsonSchema.createExecutionContext(); - Set messages = this.jsonSchema.validate(executionContext, objectMapper.readTree(jsonData)); + this.jsonSchema.validate(executionContext, objectMapper.readTree(jsonData)); executionContext.getCollectorContext().loadCollectors(); - return new ValidationResult(messages, executionContext); + return new ValidationResult(executionContext); } private Map getDatasourceMap() { @@ -432,17 +428,16 @@ private class CollectValidator extends AbstractJsonValidator { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { // Get an instance of collector context. CollectorContext collectorContext = executionContext.getCollectorContext(); AtomicInteger count = (AtomicInteger) collectorContext.getCollectorMap().computeIfAbsent("collect", (key) -> new AtomicInteger(0)); count.incrementAndGet(); - return Collections.emptySet(); } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { if (!shouldValidateSchema) { CollectorContext collectorContext = executionContext.getCollectorContext(); @@ -450,7 +445,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n (key) -> new AtomicInteger(0)); count.incrementAndGet(); } - return super.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); + super.walk(executionContext, node, rootNode, instanceLocation, shouldValidateSchema); } } diff --git a/src/test/java/com/networknt/schema/ConstValidatorTest.java b/src/test/java/com/networknt/schema/ConstValidatorTest.java index f412fd722..94794f6b5 100644 --- a/src/test/java/com/networknt/schema/ConstValidatorTest.java +++ b/src/test/java/com/networknt/schema/ConstValidatorTest.java @@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -41,7 +41,7 @@ void localeMessageOthers() { .build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); String inputData = "\"bb\""; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(": must be the constant value 'aa' but is 'bb'", messages.iterator().next().getMessage()); } @@ -55,7 +55,7 @@ void localeMessageNumber() { .build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); String inputData = "2"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(": must be the constant value '1' but is '2'", messages.iterator().next().getMessage()); } @@ -67,7 +67,7 @@ void validOthers() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); String inputData = "\"aa\""; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -79,7 +79,7 @@ void validNumber() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); String inputData = "1234.56789"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -91,7 +91,7 @@ void invalidNumber() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); String inputData = "\"1234.56789\""; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); } diff --git a/src/test/java/com/networknt/schema/CustomMetaSchemaTest.java b/src/test/java/com/networknt/schema/CustomMetaSchemaTest.java index 22b57ffbe..6e616893b 100644 --- a/src/test/java/com/networknt/schema/CustomMetaSchemaTest.java +++ b/src/test/java/com/networknt/schema/CustomMetaSchemaTest.java @@ -22,9 +22,7 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -59,21 +57,19 @@ private Validator(SchemaLocation schemaLocation, JsonNodePath evaluationPath, St } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { String value = node.asText(); int idx = enumValues.indexOf(value); if (idx < 0) { throw new IllegalArgumentException("value not found in enum. value: " + value + " enum: " + enumValues); } String valueName = enumNames.get(idx); - Set messages = new HashSet<>(); ValidationMessage validationMessage = ValidationMessage.builder().type(keyword) .schemaNode(node) .instanceNode(node) .code("tests.example.enumNames").message("{0}: enumName is {1}").instanceLocation(instanceLocation) .arguments(valueName).build(); - messages.add(validationMessage); - return messages; + executionContext.addError(validationMessage); } } @@ -130,7 +126,7 @@ void customMetaSchemaWithIgnoredKeyword() throws IOException { " \"enumNames\": [\"Foo !\", \"Bar !\"]\n" + "}"); - Set messages = schema.validate(objectMapper.readTree("\"foo\"")); + List messages = schema.validate(objectMapper.readTree("\"foo\"")); assertEquals(1, messages.size()); ValidationMessage message = messages.iterator().next(); diff --git a/src/test/java/com/networknt/schema/CustomUriTest.java b/src/test/java/com/networknt/schema/CustomUriTest.java index 191fdaa83..bfd613469 100644 --- a/src/test/java/com/networknt/schema/CustomUriTest.java +++ b/src/test/java/com/networknt/schema/CustomUriTest.java @@ -8,7 +8,7 @@ import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; -import java.util.Set; +import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -24,7 +24,7 @@ void customUri() throws Exception { final JsonNode value = mapper.readTree("{\"customAnyOf\": null,\"customOneOf\": null}"); /* When */ - final Set errors = schema.validate(value); + final List errors = schema.validate(value); /* Then */ assertThat(errors.isEmpty(), is(true)); diff --git a/src/test/java/com/networknt/schema/DateTimeDSTTest.java b/src/test/java/com/networknt/schema/DateTimeDSTTest.java index 200035562..ea182bf83 100644 --- a/src/test/java/com/networknt/schema/DateTimeDSTTest.java +++ b/src/test/java/com/networknt/schema/DateTimeDSTTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class DateTimeDSTTest { protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) { @@ -28,7 +28,7 @@ void shouldWorkV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } } diff --git a/src/test/java/com/networknt/schema/DependentRequiredTest.java b/src/test/java/com/networknt/schema/DependentRequiredTest.java index ffa346b4f..3455d8cf9 100644 --- a/src/test/java/com/networknt/schema/DependentRequiredTest.java +++ b/src/test/java/com/networknt/schema/DependentRequiredTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Set; +import java.util.List; import java.util.stream.Collectors; import static org.hamcrest.MatcherAssert.assertThat; @@ -35,7 +35,7 @@ class DependentRequiredTest { @Test void shouldReturnNoErrorMessagesForObjectWithoutOptionalField() throws IOException { - Set messages = whenValidate("{}"); + List messages = whenValidate("{}"); assertThat(messages, empty()); } @@ -43,7 +43,7 @@ void shouldReturnNoErrorMessagesForObjectWithoutOptionalField() throws IOExcepti @Test void shouldReturnErrorMessageForObjectWithoutDependentRequiredField() throws IOException { - Set messages = whenValidate("{ \"optional\": \"present\" }"); + List messages = whenValidate("{ \"optional\": \"present\" }"); assertThat( messages.stream().map(ValidationMessage::getMessage).collect(Collectors.toList()), @@ -53,13 +53,13 @@ void shouldReturnErrorMessageForObjectWithoutDependentRequiredField() throws IOE @Test void shouldReturnNoErrorMessagesForObjectWithOptionalAndDependentRequiredFieldSet() throws JsonProcessingException { - Set messages = + List messages = whenValidate("{ \"optional\": \"present\", \"requiredWhenOptionalPresent\": \"present\" }"); assertThat(messages, empty()); } - private static Set whenValidate(String content) throws JsonProcessingException { + private static List whenValidate(String content) throws JsonProcessingException { return schema.validate(mapper.readTree(content)); } diff --git a/src/test/java/com/networknt/schema/DiscriminatorValidatorTest.java b/src/test/java/com/networknt/schema/DiscriminatorValidatorTest.java index 7106053fe..0133260b8 100644 --- a/src/test/java/com/networknt/schema/DiscriminatorValidatorTest.java +++ b/src/test/java/com/networknt/schema/DiscriminatorValidatorTest.java @@ -19,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -119,7 +118,7 @@ void discriminatorInArray() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -151,7 +150,7 @@ void anyOfWithConfigEnabledButNoDiscriminator() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -244,7 +243,7 @@ void discriminatorInArrayInvalidDiscriminatorPropertyAnyOf() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(1, messages.size()); } @@ -337,7 +336,7 @@ void discriminatorInArrayInvalidDiscriminatorPropertyOneOf() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(1, messages.size()); } @@ -427,7 +426,7 @@ void discriminatorInArrayOneOfShouldOnlyReportErrorsInMatchingDiscriminator() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); // Only the oneOf and the error in the BedRoom discriminator is reported // the mismatch in Kitchen is not reported assertEquals(2, messages.size()); @@ -523,7 +522,7 @@ void discriminatorInOneOfShouldOnlyReportErrorsInMatchingDiscriminator() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); // Only the oneOf and the error in the BedRoom discriminator is reported // the mismatch in Kitchen is not reported assertEquals(2, messages.size()); @@ -623,7 +622,7 @@ void discriminatorMappingInOneOfShouldOnlyReportErrorsInMatchingDiscriminator() JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); // Only the oneOf and the error in the BedRoom discriminator is reported // the mismatch in Kitchen is not reported assertEquals(2, messages.size()); @@ -678,7 +677,7 @@ void oneOfMissingDiscriminatorValue() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(3, messages.size()); List list = messages.stream().collect(Collectors.toList()); assertEquals("oneOf", list.get(0).getType()); @@ -774,7 +773,7 @@ void anyOfMissingDiscriminatorValue() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build(); JsonSchema schema = factory.getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); List list = messages.stream().collect(Collectors.toList()); assertEquals("required", list.get(0).getType()); } diff --git a/src/test/java/com/networknt/schema/DurationFormatValidatorTest.java b/src/test/java/com/networknt/schema/DurationFormatValidatorTest.java index bd1609593..00b1086cc 100644 --- a/src/test/java/com/networknt/schema/DurationFormatValidatorTest.java +++ b/src/test/java/com/networknt/schema/DurationFormatValidatorTest.java @@ -16,13 +16,12 @@ package com.networknt.schema; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Set; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -38,7 +37,7 @@ void durationFormatValidatorTest() throws IOException { final JsonSchemaFactory validatorFactory = JsonSchemaFactory.builder(JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V201909)).build(); final JsonSchema validatorSchema = validatorFactory.getSchema(schema); - Set messages = validatorSchema.validate(validTargetNode); + List messages = validatorSchema.validate(validTargetNode); assertEquals(0, messages.size()); messages = validatorSchema.validate(invalidTargetNode, OutputFormat.DEFAULT, (executionContext, validationContext) -> { diff --git a/src/test/java/com/networknt/schema/ExampleTest.java b/src/test/java/com/networknt/schema/ExampleTest.java index efbdb9886..8b559e7a2 100644 --- a/src/test/java/com/networknt/schema/ExampleTest.java +++ b/src/test/java/com/networknt/schema/ExampleTest.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -41,7 +41,7 @@ void exampleSchemaLocation() { + "}"; // The example-main.json schema defines $schema with Draft 07 assertEquals(SchemaId.V7, schema.getValidationContext().getMetaSchema().getIri()); - Set assertions = schema.validate(input, InputFormat.JSON); + List assertions = schema.validate(input, InputFormat.JSON); assertEquals(1, assertions.size()); // The example-ref.json schema defines $schema with Draft 2019-09 @@ -64,7 +64,7 @@ void exampleClasspath() { + "}"; // The example-main.json schema defines $schema with Draft 07 assertEquals(SchemaId.V7, schema.getValidationContext().getMetaSchema().getIri()); - Set assertions = schema.validate(input, InputFormat.JSON); + List assertions = schema.validate(input, InputFormat.JSON); assertEquals(1, assertions.size()); // The example-ref.json schema defines $schema with Draft 2019-09 diff --git a/src/test/java/com/networknt/schema/ExclusiveMinimumValidatorTest.java b/src/test/java/com/networknt/schema/ExclusiveMinimumValidatorTest.java index e30bb28ca..3d75bc16f 100644 --- a/src/test/java/com/networknt/schema/ExclusiveMinimumValidatorTest.java +++ b/src/test/java/com/networknt/schema/ExclusiveMinimumValidatorTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -48,7 +48,7 @@ void draftV4ShouldHaveExclusiveMinimum() { String inputData = "{\"value1\":0}"; String validData = "{\"value1\":0.1}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(1, messages.size()); assertEquals(1, messages.stream().filter(m -> "minimum".equals(m.getType())).count()); diff --git a/src/test/java/com/networknt/schema/FormatValidatorTest.java b/src/test/java/com/networknt/schema/FormatValidatorTest.java index 8e41110be..801555e1a 100644 --- a/src/test/java/com/networknt/schema/FormatValidatorTest.java +++ b/src/test/java/com/networknt/schema/FormatValidatorTest.java @@ -21,7 +21,7 @@ import java.math.BigDecimal; import java.util.Collections; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -42,7 +42,7 @@ void unknownFormatNoVocab() { + " \"format\":\"unknown\"\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData); - Set messages = schema.validate("\"hello\"", InputFormat.JSON, executionContext -> { + List messages = schema.validate("\"hello\"", InputFormat.JSON, executionContext -> { executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); }); assertEquals(0, messages.size()); @@ -55,7 +55,7 @@ void unknownFormatNoVocabStrictTrue() { + "}"; SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().strict("format", true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"hello\"", InputFormat.JSON, executionContext -> { + List messages = schema.validate("\"hello\"", InputFormat.JSON, executionContext -> { executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); }); assertEquals(1, messages.size()); @@ -88,7 +88,7 @@ void unknownFormatAssertionsVocab() { builder -> builder .schemaLoaders(schemaLoaders -> schemaLoaders.schemas(Collections.singletonMap("https://www.example.com/format-assertion/schema", metaSchemaData)))) .getSchema(schemaData, config); - Set messages = schema.validate("\"hello\"", InputFormat.JSON); + List messages = schema.validate("\"hello\"", InputFormat.JSON); assertEquals(1, messages.size()); assertEquals("format.unknown", messages.iterator().next().getMessageKey()); } @@ -144,7 +144,7 @@ void formatAssertions(FormatInput formatInput) { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(formatSchema, config); - Set messages = schema.validate("\"inval!i:d^(abc]\"", InputFormat.JSON, executionConfiguration -> { + List messages = schema.validate("\"inval!i:d^(abc]\"", InputFormat.JSON, executionConfiguration -> { executionConfiguration.getExecutionConfig().setFormatAssertionsEnabled(true); }); assertFalse(messages.isEmpty()); @@ -173,7 +173,7 @@ void patternFormatDeprecated() { + "}"; SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(formatSchema, config); - Set messages = schema.validate("\"inval!i:d^(abc]\"", InputFormat.JSON, executionConfiguration -> { + List messages = schema.validate("\"inval!i:d^(abc]\"", InputFormat.JSON, executionConfiguration -> { executionConfiguration.getExecutionConfig().setFormatAssertionsEnabled(true); }); assertFalse(messages.isEmpty()); @@ -222,7 +222,7 @@ void shouldAllowNumberFormat() { + "}"; SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(formatSchema, config); - Set messages = schema.validate("123451", InputFormat.JSON, executionConfiguration -> { + List messages = schema.validate("123451", InputFormat.JSON, executionConfiguration -> { executionConfiguration.getExecutionConfig().setFormatAssertionsEnabled(true); }); assertFalse(messages.isEmpty()); @@ -240,7 +240,7 @@ void draft7DisableFormat() { + " \"format\":\"uri\"\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V7).getSchema(schemaData); - Set messages = schema.validate("\"hello\"", InputFormat.JSON, executionContext -> { + List messages = schema.validate("\"hello\"", InputFormat.JSON, executionContext -> { executionContext.getExecutionConfig().setFormatAssertionsEnabled(false); }); assertEquals(0, messages.size()); diff --git a/src/test/java/com/networknt/schema/IfValidatorTest.java b/src/test/java/com/networknt/schema/IfValidatorTest.java index 6b6f1dcec..04573e8ee 100644 --- a/src/test/java/com/networknt/schema/IfValidatorTest.java +++ b/src/test/java/com/networknt/schema/IfValidatorTest.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.junit.jupiter.api.Test; @@ -57,7 +56,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List types = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -100,7 +99,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List types = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -143,7 +142,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List types = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -184,7 +183,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List types = (List) walkEvent.getExecutionContext() .getCollectorContext() diff --git a/src/test/java/com/networknt/schema/Issue255Test.java b/src/test/java/com/networknt/schema/Issue255Test.java index 7755784f1..4af40b527 100644 --- a/src/test/java/com/networknt/schema/Issue255Test.java +++ b/src/test/java/com/networknt/schema/Issue255Test.java @@ -21,7 +21,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue255Test { protected JsonSchema getJsonSchemaFromStreamContent(InputStream schemaContent) { @@ -43,7 +43,7 @@ void shouldFailWhenRequiredPropertiesDoNotExistInReferencedSubSchema() throws Ex JsonSchema schema = getJsonSchemaFromStreamContent(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(2, errors.size()); } } diff --git a/src/test/java/com/networknt/schema/Issue285Test.java b/src/test/java/com/networknt/schema/Issue285Test.java index c9782b7ca..c9611d073 100644 --- a/src/test/java/com/networknt/schema/Issue285Test.java +++ b/src/test/java/com/networknt/schema/Issue285Test.java @@ -5,9 +5,8 @@ import org.junit.jupiter.api.Test; import java.io.IOException; -import java.net.URISyntaxException; import java.util.Arrays; -import java.util.Set; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -58,7 +57,7 @@ class Issue285Test { @Test void nestedValidation() throws IOException { JsonSchema jsonSchema = schemaFactory.getSchema(schemaStr); - Set validationMessages = jsonSchema.validate(mapper.readTree(person)); + List validationMessages = jsonSchema.validate(mapper.readTree(person)); System.err.println("\n" + Arrays.toString(validationMessages.toArray())); @@ -99,7 +98,7 @@ void nestedValidation() throws IOException { void nestedTypeValidation() throws IOException { SchemaLocation uri = SchemaLocation.of("https://json-schema.org/draft/2019-09/schema"); JsonSchema jsonSchema = schemaFactory.getSchema(uri); - Set validationMessages = jsonSchema.validate(mapper.readTree(invalidNestedSchema)); + List validationMessages = jsonSchema.validate(mapper.readTree(invalidNestedSchema)); System.err.println("\n" + Arrays.toString(validationMessages.toArray())); @@ -122,7 +121,7 @@ void nestedTypeValidation() throws IOException { void typeValidation() throws IOException { SchemaLocation uri = SchemaLocation.of("https://json-schema.org/draft/2019-09/schema"); JsonSchema jsonSchema = schemaFactory.getSchema(uri); - Set validationMessages = jsonSchema.validate(mapper.readTree(invalidSchema)); + List validationMessages = jsonSchema.validate(mapper.readTree(invalidSchema)); System.err.println("\n" + Arrays.toString(validationMessages.toArray())); diff --git a/src/test/java/com/networknt/schema/Issue295Test.java b/src/test/java/com/networknt/schema/Issue295Test.java index 487a77a58..79f85f7a9 100644 --- a/src/test/java/com/networknt/schema/Issue295Test.java +++ b/src/test/java/com/networknt/schema/Issue295Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue295Test { protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) { @@ -28,7 +28,7 @@ void shouldWorkV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } } diff --git a/src/test/java/com/networknt/schema/Issue313Test.java b/src/test/java/com/networknt/schema/Issue313Test.java index a6eb2ba5c..002c5cd67 100644 --- a/src/test/java/com/networknt/schema/Issue313Test.java +++ b/src/test/java/com/networknt/schema/Issue313Test.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue313Test { protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) { @@ -35,7 +35,7 @@ void shouldFailV201909() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV201909(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(2, errors.size()); } @@ -47,7 +47,7 @@ void shouldFailV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(2, errors.size()); } diff --git a/src/test/java/com/networknt/schema/Issue327Test.java b/src/test/java/com/networknt/schema/Issue327Test.java index a53fb2461..ba74134db 100644 --- a/src/test/java/com/networknt/schema/Issue327Test.java +++ b/src/test/java/com/networknt/schema/Issue327Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue327Test { protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) { @@ -28,7 +28,7 @@ void shouldWorkV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } } diff --git a/src/test/java/com/networknt/schema/Issue342Test.java b/src/test/java/com/networknt/schema/Issue342Test.java index bf14d125d..89e3f7e9c 100644 --- a/src/test/java/com/networknt/schema/Issue342Test.java +++ b/src/test/java/com/networknt/schema/Issue342Test.java @@ -1,7 +1,7 @@ package com.networknt.schema; import java.io.InputStream; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -29,7 +29,7 @@ void propertyNameEnumShouldFailV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(1, errors.size()); final ValidationMessage error = errors.iterator().next(); Assertions.assertEquals("$", error.getInstanceLocation().toString()); diff --git a/src/test/java/com/networknt/schema/Issue366FailFastTest.java b/src/test/java/com/networknt/schema/Issue366FailFastTest.java index 701b6ebfb..3fde9a6d8 100644 --- a/src/test/java/com/networknt/schema/Issue366FailFastTest.java +++ b/src/test/java/com/networknt/schema/Issue366FailFastTest.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; -import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -51,7 +50,7 @@ void firstOneValid() throws Exception { List testNodes = node.findValues("tests"); JsonNode testNode = testNodes.get(0).get(0); JsonNode dataNode = testNode.get("data"); - Set errors = jsonSchema.validate(dataNode); + List errors = jsonSchema.validate(dataNode); assertTrue(errors.isEmpty()); } @@ -64,7 +63,7 @@ void secondOneValid() throws Exception { List testNodes = node.findValues("tests"); JsonNode testNode = testNodes.get(0).get(1); JsonNode dataNode = testNode.get("data"); - Set errors = jsonSchema.validate(dataNode); + List errors = jsonSchema.validate(dataNode); assertTrue(errors.isEmpty()); } diff --git a/src/test/java/com/networknt/schema/Issue366FailSlowTest.java b/src/test/java/com/networknt/schema/Issue366FailSlowTest.java index 65c06e6d5..b395ebd57 100644 --- a/src/test/java/com/networknt/schema/Issue366FailSlowTest.java +++ b/src/test/java/com/networknt/schema/Issue366FailSlowTest.java @@ -9,7 +9,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; -import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -52,7 +51,7 @@ void firstOneValid() throws Exception { List testNodes = node.findValues("tests"); JsonNode testNode = testNodes.get(0).get(0); JsonNode dataNode = testNode.get("data"); - Set errors = jsonSchema.validate(dataNode); + List errors = jsonSchema.validate(dataNode); assertTrue(errors.isEmpty()); } @@ -65,7 +64,7 @@ void secondOneValid() throws Exception { List testNodes = node.findValues("tests"); JsonNode testNode = testNodes.get(0).get(1); JsonNode dataNode = testNode.get("data"); - Set errors = jsonSchema.validate(dataNode); + List errors = jsonSchema.validate(dataNode); assertTrue(errors.isEmpty()); } @@ -78,7 +77,7 @@ void bothValid() throws Exception { List testNodes = node.findValues("tests"); JsonNode testNode = testNodes.get(0).get(2); JsonNode dataNode = testNode.get("data"); - Set errors = jsonSchema.validate(dataNode); + List errors = jsonSchema.validate(dataNode); assertFalse(errors.isEmpty()); assertEquals(errors.size(), 1); } @@ -92,7 +91,7 @@ void neitherValid() throws Exception { List testNodes = node.findValues("tests"); JsonNode testNode = testNodes.get(0).get(3); JsonNode dataNode = testNode.get("data"); - Set errors = jsonSchema.validate(dataNode); + List errors = jsonSchema.validate(dataNode); assertFalse(errors.isEmpty()); assertEquals(errors.size(), 3); } diff --git a/src/test/java/com/networknt/schema/Issue375Test.java b/src/test/java/com/networknt/schema/Issue375Test.java index 7711ba32b..7e60581d2 100644 --- a/src/test/java/com/networknt/schema/Issue375Test.java +++ b/src/test/java/com/networknt/schema/Issue375Test.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Set; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; @@ -46,7 +45,7 @@ void shouldFailAndShowValidationValuesWithError() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContent(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); List errorMessages = new ArrayList(); for (ValidationMessage error: errors) { errorMessages.add(error.getMessage()); diff --git a/src/test/java/com/networknt/schema/Issue383Test.java b/src/test/java/com/networknt/schema/Issue383Test.java index 083810907..d22009c98 100644 --- a/src/test/java/com/networknt/schema/Issue383Test.java +++ b/src/test/java/com/networknt/schema/Issue383Test.java @@ -1,7 +1,7 @@ package com.networknt.schema; import java.io.InputStream; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -29,7 +29,7 @@ void nestedOneOfsShouldStillMatchV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } } diff --git a/src/test/java/com/networknt/schema/Issue396Test.java b/src/test/java/com/networknt/schema/Issue396Test.java index 3e41d821f..df89d7a6e 100644 --- a/src/test/java/com/networknt/schema/Issue396Test.java +++ b/src/test/java/com/networknt/schema/Issue396Test.java @@ -2,6 +2,7 @@ import java.io.InputStream; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -38,7 +39,7 @@ void testComplexPropertyNamesV7() throws Exception { expected.add(entry.getKey()); }); - Set errors = schema.validate(node); + List errors = schema.validate(node); final Set actual = errors.stream().map(ValidationMessage::getProperty).map(Object::toString).collect(Collectors.toSet()); Assertions.assertEquals(expected, actual); } diff --git a/src/test/java/com/networknt/schema/Issue404Test.java b/src/test/java/com/networknt/schema/Issue404Test.java index 23d434d6c..52581d49d 100644 --- a/src/test/java/com/networknt/schema/Issue404Test.java +++ b/src/test/java/com/networknt/schema/Issue404Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue404Test { protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) { @@ -28,7 +28,7 @@ void expectObjectNotIntegerV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } diff --git a/src/test/java/com/networknt/schema/Issue426Test.java b/src/test/java/com/networknt/schema/Issue426Test.java index 1bd93952c..c7dd2f547 100644 --- a/src/test/java/com/networknt/schema/Issue426Test.java +++ b/src/test/java/com/networknt/schema/Issue426Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; /** * Validating custom message @@ -30,7 +30,7 @@ void shouldWorkV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(2, errors.size()); final JsonNode message = schema.schemaNode.get("message"); for(ValidationMessage error : errors) { diff --git a/src/test/java/com/networknt/schema/Issue451Test.java b/src/test/java/com/networknt/schema/Issue451Test.java index a59591229..5d873377b 100644 --- a/src/test/java/com/networknt/schema/Issue451Test.java +++ b/src/test/java/com/networknt/schema/Issue451Test.java @@ -10,8 +10,8 @@ import java.io.InputStream; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Set; /** * Validating anyOf walker @@ -77,7 +77,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } diff --git a/src/test/java/com/networknt/schema/Issue456Test.java b/src/test/java/com/networknt/schema/Issue456Test.java index d7c1f99a0..473ab9996 100644 --- a/src/test/java/com/networknt/schema/Issue456Test.java +++ b/src/test/java/com/networknt/schema/Issue456Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue456Test { @@ -29,7 +29,7 @@ void shouldWorkT2() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } @@ -41,7 +41,7 @@ void shouldWorkT3() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } diff --git a/src/test/java/com/networknt/schema/Issue461Test.java b/src/test/java/com/networknt/schema/Issue461Test.java index 3f9159341..a95788fb4 100644 --- a/src/test/java/com/networknt/schema/Issue461Test.java +++ b/src/test/java/com/networknt/schema/Issue461Test.java @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Set; +import java.util.List; class Issue461Test { protected ObjectMapper mapper = JsonMapperFactory.getInstance(); @@ -42,7 +42,7 @@ public WalkFlow onWalkStart(final WalkEvent walkEvent) { @Override public void onWalkEnd(final WalkEvent walkEvent, - final Set validationMessages) { + final List validationMessages) { } } } diff --git a/src/test/java/com/networknt/schema/Issue467Test.java b/src/test/java/com/networknt/schema/Issue467Test.java index 280208b82..ff92735ba 100644 --- a/src/test/java/com/networknt/schema/Issue467Test.java +++ b/src/test/java/com/networknt/schema/Issue467Test.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -53,7 +54,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set set) { + public void onWalkEnd(WalkEvent walkEvent, List set) { } }) .build(); @@ -78,7 +79,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set set) { + public void onWalkEnd(WalkEvent walkEvent, List set) { } }) .build(); diff --git a/src/test/java/com/networknt/schema/Issue471Test.java b/src/test/java/com/networknt/schema/Issue471Test.java index c74108d4f..fc4f7bf1e 100644 --- a/src/test/java/com/networknt/schema/Issue471Test.java +++ b/src/test/java/com/networknt/schema/Issue471Test.java @@ -9,7 +9,7 @@ import java.io.InputStream; import java.util.Locale; import java.util.Map; -import java.util.Set; +import java.util.List; import java.util.stream.Collectors; class Issue471Test { @@ -69,11 +69,11 @@ private Map validate() throws Exception { InputStream dataInputStream = Issue471Test.class.getResourceAsStream(DATA_PATH); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set validationMessages = schema.validate(node); + List validationMessages = schema.validate(node); return convertValidationMessagesToMap(validationMessages); } - private Map convertValidationMessagesToMap(Set validationMessages) { + private Map convertValidationMessagesToMap(List validationMessages) { return validationMessages.stream().collect(Collectors.toMap(m -> m.getInstanceLocation().toString(), ValidationMessage::getMessage)); } diff --git a/src/test/java/com/networknt/schema/Issue475Test.java b/src/test/java/com/networknt/schema/Issue475Test.java index 0c4d53e9c..9cb928b94 100644 --- a/src/test/java/com/networknt/schema/Issue475Test.java +++ b/src/test/java/com/networknt/schema/Issue475Test.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -55,7 +55,7 @@ void draft4() throws Exception { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = jsonSchemaFactory.getSchema(SchemaLocation.of(SchemaId.V4), config); - Set assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); + List assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); assertEquals(2, assertions.size()); assertions = schema.validate(JsonMapperFactory.getInstance().readTree(VALID_INPUT)); @@ -69,7 +69,7 @@ void draft6() throws Exception { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = jsonSchemaFactory.getSchema(SchemaLocation.of(SchemaId.V6), config); - Set assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); + List assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); assertEquals(2, assertions.size()); assertions = schema.validate(JsonMapperFactory.getInstance().readTree(VALID_INPUT)); @@ -83,7 +83,7 @@ void draft7() throws Exception { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = jsonSchemaFactory.getSchema(SchemaLocation.of(SchemaId.V7), config); - Set assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); + List assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); assertEquals(2, assertions.size()); assertions = schema.validate(JsonMapperFactory.getInstance().readTree(VALID_INPUT)); @@ -97,7 +97,7 @@ void draft201909() throws Exception { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = jsonSchemaFactory.getSchema(SchemaLocation.of(SchemaId.V201909), config); - Set assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); + List assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); assertEquals(2, assertions.size()); assertions = schema.validate(JsonMapperFactory.getInstance().readTree(VALID_INPUT)); @@ -111,7 +111,7 @@ void draft202012() throws Exception { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = jsonSchemaFactory.getSchema(SchemaLocation.of(SchemaId.V202012), config); - Set assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); + List assertions = schema.validate(JsonMapperFactory.getInstance().readTree(INVALID_INPUT)); assertEquals(2, assertions.size()); assertions = schema.validate(JsonMapperFactory.getInstance().readTree(VALID_INPUT)); diff --git a/src/test/java/com/networknt/schema/Issue493Test.java b/src/test/java/com/networknt/schema/Issue493Test.java index 7d84368b9..591fbab9d 100644 --- a/src/test/java/com/networknt/schema/Issue493Test.java +++ b/src/test/java/com/networknt/schema/Issue493Test.java @@ -4,6 +4,7 @@ import java.io.InputStream; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.hamcrest.Matchers; @@ -36,7 +37,7 @@ void testValidJson1 () InputStream schemaInputStream = Issue493Test.class.getResourceAsStream(schemaPath1); JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue493-valid-1.json"); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertTrue(errors.isEmpty()); } @@ -48,7 +49,7 @@ void testValidJson2 () InputStream schemaInputStream = Issue493Test.class.getResourceAsStream(schemaPath1); JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue493-valid-2.json"); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertTrue(errors.isEmpty()); } @@ -60,7 +61,7 @@ void testInvalidJson1 () InputStream schemaInputStream = Issue493Test.class.getResourceAsStream(schemaPath1); JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue493-invalid-1.json"); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(2, errors.size()); Set allErrorMessages = new HashSet<>(); @@ -80,7 +81,7 @@ void testInvalidJson2 () InputStream schemaInputStream = Issue493Test.class.getResourceAsStream(schemaPath1); JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue493-invalid-2.json"); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(3, errors.size()); Set allErrorMessages = new HashSet<>(); diff --git a/src/test/java/com/networknt/schema/Issue550Test.java b/src/test/java/com/networknt/schema/Issue550Test.java index d52986110..fbe39f7f3 100644 --- a/src/test/java/com/networknt/schema/Issue550Test.java +++ b/src/test/java/com/networknt/schema/Issue550Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue550Test { @@ -30,7 +30,7 @@ void testValidationMessageDoContainSchemaPath() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaPath); JsonNode node = getJsonNodeFromStreamContent(dataPath); - Set errors = schema.validate(node); + List errors = schema.validate(node); ValidationMessage validationMessage = errors.stream().findFirst().get(); Assertions.assertEquals("https://example.com/person.schema.json#/properties/age/minimum", validationMessage.getSchemaLocation().toString()); @@ -44,7 +44,7 @@ void testValidationMessageDoContainSchemaPathForOneOf() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaPath); JsonNode node = getJsonNodeFromStreamContent(dataPath); - Set errors = schema.validate(node); + List errors = schema.validate(node); ValidationMessage validationMessage = errors.stream().findFirst().get(); // Instead of capturing all subSchema within oneOf, a pointer to oneOf should be provided. diff --git a/src/test/java/com/networknt/schema/Issue575Test.java b/src/test/java/com/networknt/schema/Issue575Test.java index 1b07b9ff5..52cdddc87 100644 --- a/src/test/java/com/networknt/schema/Issue575Test.java +++ b/src/test/java/com/networknt/schema/Issue575Test.java @@ -9,7 +9,7 @@ import org.junit.jupiter.params.provider.MethodSource; import java.io.InputStream; -import java.util.Set; +import java.util.List; import java.util.stream.Stream; /** @@ -79,7 +79,7 @@ static Stream validTimeZoneOffsets() { @ParameterizedTest @MethodSource("validTimeZoneOffsets") void testValidTimeZoneOffsets(String jsonObject) throws JsonProcessingException { - Set errors = schema.validate(new ObjectMapper().readTree(jsonObject)); + List errors = schema.validate(new ObjectMapper().readTree(jsonObject)); Assertions.assertTrue(errors.isEmpty()); } @@ -121,7 +121,7 @@ static Stream invalidTimeRepresentations() { @ParameterizedTest @MethodSource("invalidTimeRepresentations") void testInvalidTimeRepresentations(String jsonObject) throws JsonProcessingException { - Set errors = schema.validate(new ObjectMapper().readTree(jsonObject), OutputFormat.DEFAULT, (executionContext, validationContext) -> { + List errors = schema.validate(new ObjectMapper().readTree(jsonObject), OutputFormat.DEFAULT, (executionContext, validationContext) -> { executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); }); Assertions.assertFalse(errors.isEmpty()); diff --git a/src/test/java/com/networknt/schema/Issue606Test.java b/src/test/java/com/networknt/schema/Issue606Test.java index 5efae90cc..999b2fc5b 100644 --- a/src/test/java/com/networknt/schema/Issue606Test.java +++ b/src/test/java/com/networknt/schema/Issue606Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.Set; +import java.util.List; class Issue606Test { protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) { @@ -28,7 +28,7 @@ void shouldWorkV7() throws Exception { JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(0, errors.size()); } } diff --git a/src/test/java/com/networknt/schema/Issue650Test.java b/src/test/java/com/networknt/schema/Issue650Test.java index 888e740d8..0d15bdb0f 100644 --- a/src/test/java/com/networknt/schema/Issue650Test.java +++ b/src/test/java/com/networknt/schema/Issue650Test.java @@ -1,7 +1,7 @@ package com.networknt.schema; import java.io.InputStream; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import com.fasterxml.jackson.annotation.JsonInclude; @@ -46,7 +46,7 @@ void testBinaryNode() throws Exception { JsonNode node = mapper.valueToTree(model); // validate: - Set errors = schema.validate(node); + List errors = schema.validate(node); // check result: Assertions.assertTrue(errors.isEmpty()); diff --git a/src/test/java/com/networknt/schema/Issue662Test.java b/src/test/java/com/networknt/schema/Issue662Test.java index 9290118a9..3e1eaba9c 100644 --- a/src/test/java/com/networknt/schema/Issue662Test.java +++ b/src/test/java/com/networknt/schema/Issue662Test.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.util.List; -import java.util.Set; import static java.util.stream.Collectors.toList; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -24,21 +23,21 @@ static void setup() { @Test void testNoErrorsForEmptyObject() throws IOException { JsonNode node = getJsonNodeFromClasspath(resource("emptyObject.json")); - Set errors = schema.validate(node); + List errors = schema.validate(node); assertTrue(errors.isEmpty(), "No validation errors for empty optional object"); } @Test void testNoErrorsForValidObject() throws IOException { JsonNode node = getJsonNodeFromClasspath(resource("validObject.json")); - Set errors = schema.validate(node); + List errors = schema.validate(node); assertTrue(errors.isEmpty(), "No validation errors for a valid optional object"); } @Test void testCorrectErrorForInvalidValue() throws IOException { JsonNode node = getJsonNodeFromClasspath(resource("objectInvalidValue.json")); - Set errors = schema.validate(node); + List errors = schema.validate(node); List errorMessages = errors.stream() .map(v -> v.getEvaluationPath() + " = " + v.getMessage()) .collect(toList()); diff --git a/src/test/java/com/networknt/schema/Issue665Test.java b/src/test/java/com/networknt/schema/Issue665Test.java index 38f9f4235..d05f7bd9b 100644 --- a/src/test/java/com/networknt/schema/Issue665Test.java +++ b/src/test/java/com/networknt/schema/Issue665Test.java @@ -7,7 +7,7 @@ import java.io.InputStream; import java.io.UncheckedIOException; import java.util.Collections; -import java.util.Set; +import java.util.List; class Issue665Test extends BaseJsonSchemaValidatorTest { @@ -16,9 +16,9 @@ void testUrnUriAsLocalRef() throws IOException { JsonSchema schema = getJsonSchemaFromClasspath("draft7/urn/issue665.json", SpecVersion.VersionFlag.V7); Assertions.assertNotNull(schema); Assertions.assertDoesNotThrow(schema::initializeValidators); - Set messages = schema.validate(getJsonNodeFromStringContent( + List messages = schema.validate(getJsonNodeFromStringContent( "{\"myData\": {\"value\": \"hello\"}}")); - Assertions.assertEquals(messages, Collections.emptySet()); + Assertions.assertTrue(messages.isEmpty()); } @Test @@ -36,9 +36,9 @@ void testUrnUriAsLocalRef_ExternalURN() { JsonSchema schema = factory.getSchema(is); Assertions.assertNotNull(schema); Assertions.assertDoesNotThrow(schema::initializeValidators); - Set messages = schema.validate(getJsonNodeFromStringContent( + List messages = schema.validate(getJsonNodeFromStringContent( "{\"myData\": {\"value\": \"hello\"}}")); - Assertions.assertEquals(messages, Collections.emptySet()); + Assertions.assertTrue(messages.isEmpty()); } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/src/test/java/com/networknt/schema/Issue686Test.java b/src/test/java/com/networknt/schema/Issue686Test.java index af2ba2f28..9fd5556ac 100644 --- a/src/test/java/com/networknt/schema/Issue686Test.java +++ b/src/test/java/com/networknt/schema/Issue686Test.java @@ -8,9 +8,9 @@ import org.junit.jupiter.api.Test; import java.text.MessageFormat; +import java.util.List; import java.util.Locale; import java.util.ResourceBundle; -import java.util.Set; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -59,7 +59,7 @@ private JsonSchema getSchema(SchemaValidatorsConfig config) { } private void verify(SchemaValidatorsConfig config, String expectedMessage) throws JsonProcessingException { - Set messages = getSchema(config).validate(new ObjectMapper().readTree(" { \"foo\": 123 } ")); + List messages = getSchema(config).validate(new ObjectMapper().readTree(" { \"foo\": 123 } ")); assertEquals(1, messages.size()); assertEquals(expectedMessage, messages.iterator().next().getMessage()); } diff --git a/src/test/java/com/networknt/schema/Issue687Test.java b/src/test/java/com/networknt/schema/Issue687Test.java index 0789acd54..457ace08f 100644 --- a/src/test/java/com/networknt/schema/Issue687Test.java +++ b/src/test/java/com/networknt/schema/Issue687Test.java @@ -7,7 +7,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import java.util.Set; +import java.util.List; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -83,7 +83,7 @@ void testValidationMessage(PathType pathType, String schemaPath, String content, SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().pathType(pathType).build(); JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V201909); JsonSchema schema = factory.getSchema(Issue687Test.class.getResourceAsStream(schemaPath), config); - Set messages = schema.validate(new ObjectMapper().readTree(content)); + List messages = schema.validate(new ObjectMapper().readTree(content)); assertEquals(expectedMessagePaths.length, messages.size()); for (String expectedPath: expectedMessagePaths) { assertTrue(messages.stream().anyMatch(msg -> expectedPath.equals(msg.getInstanceLocation().toString()))); @@ -124,7 +124,7 @@ void testSpecialCharacters(PathType pathType, String propertyName, String expect " }\n" + " }\n" + "}"), schemaValidatorsConfig); - Set validationMessages = schema.validate(mapper.readTree("{\""+propertyName+"\": 1}")); + List validationMessages = schema.validate(mapper.readTree("{\""+propertyName+"\": 1}")); assertEquals(1, validationMessages.size()); assertEquals(expectedPath, validationMessages.iterator().next().getInstanceLocation().toString()); } diff --git a/src/test/java/com/networknt/schema/Issue724Test.java b/src/test/java/com/networknt/schema/Issue724Test.java index b4d0c0faa..8cdbe9cc9 100644 --- a/src/test/java/com/networknt/schema/Issue724Test.java +++ b/src/test/java/com/networknt/schema/Issue724Test.java @@ -6,7 +6,6 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.Set; import org.junit.jupiter.api.Test; @@ -78,7 +77,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { // nothing to do here } } diff --git a/src/test/java/com/networknt/schema/Issue784Test.java b/src/test/java/com/networknt/schema/Issue784Test.java index 0e5f79b8a..dbdcff706 100644 --- a/src/test/java/com/networknt/schema/Issue784Test.java +++ b/src/test/java/com/networknt/schema/Issue784Test.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Set; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -56,7 +56,7 @@ void useDefaultValidatorIfNotOverriden() throws IOException { } - private Set validate(JsonSchema jsonSchema, String myDateTimeContent) throws JsonProcessingException { + private List validate(JsonSchema jsonSchema, String myDateTimeContent) throws JsonProcessingException { return jsonSchema.validate(new ObjectMapper().readTree(" { \"my-date-time\": \"" + myDateTimeContent + "\" } ")); } diff --git a/src/test/java/com/networknt/schema/Issue824Test.java b/src/test/java/com/networknt/schema/Issue824Test.java index 5367f471b..cfa8ba0f2 100644 --- a/src/test/java/com/networknt/schema/Issue824Test.java +++ b/src/test/java/com/networknt/schema/Issue824Test.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -26,8 +26,8 @@ void validate() throws JsonProcessingException { "}"); // Validate same JSON schema against v2019-09 spec schema twice - final Set validationErrors1 = v201909SpecSchema.validate(invalidSchema); - final Set validationErrors2 = v201909SpecSchema.validate(invalidSchema); + final List validationErrors1 = v201909SpecSchema.validate(invalidSchema); + final List validationErrors2 = v201909SpecSchema.validate(invalidSchema); // Validation errors should be the same assertEquals(validationErrors1, validationErrors2); diff --git a/src/test/java/com/networknt/schema/Issue832Test.java b/src/test/java/com/networknt/schema/Issue832Test.java index 02c776304..76e5ae0d2 100644 --- a/src/test/java/com/networknt/schema/Issue832Test.java +++ b/src/test/java/com/networknt/schema/Issue832Test.java @@ -9,7 +9,6 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import java.util.Set; class Issue832Test { private class NoMatchFormat implements Format { @@ -56,7 +55,7 @@ void testV7WithNonMatchingCustomFormat() throws IOException { JsonSchema schema = factory.getSchema(schemaInputStream); InputStream dataInputStream = getClass().getResourceAsStream(dataPath); JsonNode node = getJsonNodeFromStreamContent(dataInputStream); - Set errors = schema.validate(node); + List errors = schema.validate(node); // Both the custom no_match format and the standard email format should fail. // This ensures that both the standard and custom formatters have been invoked. Assertions.assertEquals(2, errors.size()); diff --git a/src/test/java/com/networknt/schema/Issue857Test.java b/src/test/java/com/networknt/schema/Issue857Test.java index 51115765d..722080918 100644 --- a/src/test/java/com/networknt/schema/Issue857Test.java +++ b/src/test/java/com/networknt/schema/Issue857Test.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -50,7 +50,7 @@ void test() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().failFast(true).build(); JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); - Set result = factory.getSchema(schema, config).validate(input, InputFormat.JSON); + List result = factory.getSchema(schema, config).validate(input, InputFormat.JSON); assertTrue(result.isEmpty()); } } diff --git a/src/test/java/com/networknt/schema/Issue927Test.java b/src/test/java/com/networknt/schema/Issue927Test.java index 7e723ff21..690abbe40 100644 --- a/src/test/java/com/networknt/schema/Issue927Test.java +++ b/src/test/java/com/networknt/schema/Issue927Test.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -127,7 +127,7 @@ void test() throws JsonProcessingException { + " ]\r\n" + " }\r\n" + "}"; - Set messages = jsonSchema.validate(input, InputFormat.JSON); + List messages = jsonSchema.validate(input, InputFormat.JSON); assertEquals(0, messages.size()); } diff --git a/src/test/java/com/networknt/schema/Issue939Test.java b/src/test/java/com/networknt/schema/Issue939Test.java index ae8eea594..7ca3a449d 100644 --- a/src/test/java/com/networknt/schema/Issue939Test.java +++ b/src/test/java/com/networknt/schema/Issue939Test.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -50,7 +50,7 @@ void shouldNotThrowException() { + " }"; JsonSchema jsonSchema = JsonSchemaFactory.getInstance(VersionFlag.V7).getSchema(schema); assertDoesNotThrow(() -> jsonSchema.initializeValidators()); - Set assertions = jsonSchema + List assertions = jsonSchema .validate("{\"someUuid\":\"invalid\"}", InputFormat.JSON); assertEquals(2, assertions.size()); } diff --git a/src/test/java/com/networknt/schema/ItemsValidator202012Test.java b/src/test/java/com/networknt/schema/ItemsValidator202012Test.java index ed8dda7da..f6f6fccb1 100644 --- a/src/test/java/com/networknt/schema/ItemsValidator202012Test.java +++ b/src/test/java/com/networknt/schema/ItemsValidator202012Test.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.junit.jupiter.api.Test; @@ -49,7 +48,7 @@ void messageInvalid() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, config); String inputData = "[1, \"x\"]"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/items/type", message.getEvaluationPath().toString()); @@ -76,7 +75,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -115,7 +114,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() diff --git a/src/test/java/com/networknt/schema/ItemsValidatorTest.java b/src/test/java/com/networknt/schema/ItemsValidatorTest.java index a09d86359..78c37ff28 100644 --- a/src/test/java/com/networknt/schema/ItemsValidatorTest.java +++ b/src/test/java/com/networknt/schema/ItemsValidatorTest.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.junit.jupiter.api.Test; @@ -52,7 +51,7 @@ void messageInvalid() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, config); String inputData = "[1, \"x\"]"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/items/type", message.getEvaluationPath().toString()); @@ -79,7 +78,7 @@ void messageAdditionalItemsInvalid() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, config); String inputData = "[ null, 2, 3, \"foo\" ]"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/additionalItems/type", message.getEvaluationPath().toString()); @@ -106,7 +105,7 @@ void messageAdditionalItemsFalseInvalid() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, config); String inputData = "[ null, 2, 3, \"foo\" ]"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/additionalItems", message.getEvaluationPath().toString()); @@ -133,7 +132,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -169,7 +168,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -211,7 +210,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -261,7 +260,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -318,7 +317,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() diff --git a/src/test/java/com/networknt/schema/JsonWalkApplyDefaultsTest.java b/src/test/java/com/networknt/schema/JsonWalkApplyDefaultsTest.java index 6fb41efc0..5ca6fb561 100644 --- a/src/test/java/com/networknt/schema/JsonWalkApplyDefaultsTest.java +++ b/src/test/java/com/networknt/schema/JsonWalkApplyDefaultsTest.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; -import java.util.Set; +import java.util.List; import java.util.stream.Collectors; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; @@ -79,7 +79,7 @@ void testApplyDefaults0(String method) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); JsonNode inputNode = objectMapper.readTree(getClass().getClassLoader().getResourceAsStream("data/walk-data-default.json")); JsonNode inputNodeOriginal = objectMapper.readTree(getClass().getClassLoader().getResourceAsStream("data/walk-data-default.json")); - Set validationMessages; + List validationMessages; switch (method) { case "walkWithEmptyStrategy": { JsonSchema jsonSchema = createSchema(new ApplyDefaultsStrategy(false, false, false)); diff --git a/src/test/java/com/networknt/schema/JsonWalkTest.java b/src/test/java/com/networknt/schema/JsonWalkTest.java index af1c2ac07..573cdb096 100644 --- a/src/test/java/com/networknt/schema/JsonWalkTest.java +++ b/src/test/java/com/networknt/schema/JsonWalkTest.java @@ -13,9 +13,7 @@ import java.io.IOException; import java.io.InputStream; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.TreeSet; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -168,14 +166,14 @@ private static class CustomValidator extends AbstractJsonValidator { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { - return new TreeSet<>(); + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { + return; } @Override - public Set walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void walk(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { - return new LinkedHashSet(); + return; } } } @@ -199,7 +197,7 @@ public WalkFlow onWalkStart(WalkEvent keywordWalkEvent) { } @Override - public void onWalkEnd(WalkEvent keywordWalkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent keywordWalkEvent, List validationMessages) { } } @@ -220,7 +218,7 @@ public WalkFlow onWalkStart(WalkEvent keywordWalkEvent) { } @Override - public void onWalkEnd(WalkEvent keywordWalkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent keywordWalkEvent, List validationMessages) { } } @@ -237,7 +235,7 @@ public WalkFlow onWalkStart(WalkEvent keywordWalkEvent) { } @Override - public void onWalkEnd(WalkEvent keywordWalkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent keywordWalkEvent, List validationMessages) { } } diff --git a/src/test/java/com/networknt/schema/LocaleTest.java b/src/test/java/com/networknt/schema/LocaleTest.java index 31363b9ad..e4bd7f8be 100644 --- a/src/test/java/com/networknt/schema/LocaleTest.java +++ b/src/test/java/com/networknt/schema/LocaleTest.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; import org.junit.jupiter.api.Test; @@ -58,7 +57,8 @@ void executionContextLocale() throws JsonMappingException, JsonProcessingExcepti ExecutionContext executionContext = jsonSchema.createExecutionContext(); assertEquals(config.getLocale(), executionContext.getExecutionConfig().getLocale()); executionContext.getExecutionConfig().setLocale(locale); - Set messages = jsonSchema.validate(executionContext, rootNode); + jsonSchema.validate(executionContext, rootNode); + List messages = executionContext.getErrors(); assertEquals(1, messages.size()); assertEquals("/foo: integer trouvé, string attendu", messages.iterator().next().getMessage()); @@ -66,7 +66,8 @@ void executionContextLocale() throws JsonMappingException, JsonProcessingExcepti executionContext = jsonSchema.createExecutionContext(); assertEquals(config.getLocale(), executionContext.getExecutionConfig().getLocale()); executionContext.getExecutionConfig().setLocale(locale); - messages = jsonSchema.validate(executionContext, rootNode); + jsonSchema.validate(executionContext, rootNode); + messages = executionContext.getErrors(); assertEquals(1, messages.size()); assertEquals("/foo: integer trovato, string previsto", messages.iterator().next().getMessage()); } @@ -92,7 +93,7 @@ void englishLocale() throws JsonMappingException, JsonProcessingException { JsonSchema jsonSchema = JsonSchemaFactory.getInstance(VersionFlag.V7) .getSchema(JsonMapperFactory.getInstance().readTree(schema)); String input = "1"; - Set messages = jsonSchema.validate(input, InputFormat.JSON); + List messages = jsonSchema.validate(input, InputFormat.JSON); assertEquals(1, messages.size()); assertEquals("$: integer gefunden, object erwartet", messages.iterator().next().toString()); @@ -158,7 +159,7 @@ void encoding() { JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V7).getSchema(schemaData); List locales = Locales.getSupportedLocales(); for (Locale locale : locales) { - Set messages = schema.validate("\"aaaaaa\"", InputFormat.JSON, executionContext -> { + List messages = schema.validate("\"aaaaaa\"", InputFormat.JSON, executionContext -> { executionContext.getExecutionConfig().setLocale(locale); }); String msg = messages.iterator().next().toString(); diff --git a/src/test/java/com/networknt/schema/MaximumValidatorTest.java b/src/test/java/com/networknt/schema/MaximumValidatorTest.java index 5d16fd7e1..27c34beb2 100644 --- a/src/test/java/com/networknt/schema/MaximumValidatorTest.java +++ b/src/test/java/com/networknt/schema/MaximumValidatorTest.java @@ -23,7 +23,7 @@ import java.io.IOException; import java.math.BigDecimal; -import java.util.Set; +import java.util.List; import static java.lang.String.format; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -189,13 +189,13 @@ void negativeDoubleOverflowTest() throws IOException { // Schema and document parsed with just double JsonSchema v = factory.getSchema(mapper.readTree(schema), config); JsonNode doc = mapper.readTree(value); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), format("Maximum %s and value %s are interpreted as Infinity, thus no schema violation should be reported", maximum, value)); // document parsed with BigDecimal doc = bigDecimalMapper.readTree(value); - Set messages2 = v.validate(doc); + List messages2 = v.validate(doc); if (Double.valueOf(maximum).equals(Double.POSITIVE_INFINITY)) { assertTrue(messages2.isEmpty(), format("Maximum %s and value %s are equal, thus no schema violation should be reported", maximum, value)); } else { @@ -205,7 +205,7 @@ void negativeDoubleOverflowTest() throws IOException { // schema and document parsed with BigDecimal v = factory.getSchema(bigDecimalMapper.readTree(schema), config); - Set messages3 = v.validate(doc); + List messages3 = v.validate(doc); //when the schema and value are both using BigDecimal, the value should be parsed in same mechanism. String theValue = value.toLowerCase().replace("\"", ""); if (maximum.toLowerCase().equals(theValue)) { @@ -228,7 +228,7 @@ void doubleValueCoarsing() throws IOException { JsonNode doc = mapper.readTree(content); JsonSchema v = factory.getSchema(mapper.readTree(schema)); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), "Validation should succeed as by default double values are used by mapper"); doc = bigDecimalMapper.readTree(content); @@ -260,7 +260,7 @@ void doubleValueCoarsingExceedRange() throws IOException { JsonNode doc = mapper.readTree(content); JsonSchema v = factory.getSchema(mapper.readTree(schema)); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), "Validation should succeed as by default double values are used by mapper"); doc = bigDecimalMapper.readTree(content); @@ -299,7 +299,7 @@ private static void expectNoMessages(String[][] values, String schemaTemplate, O JsonSchema v = factory.getSchema(mapper.readTree(schema), config); JsonNode doc = mapper.readTree(value); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), format(MaximumValidatorTest.POSITIVE_TEST_CASE_TEMPLATE, maximum, value)); } } @@ -319,7 +319,7 @@ private static void expectSomeMessages(String[][] values, String schemaTemplate, JsonSchema v = factory.getSchema(mapper.readTree(schema)); JsonNode doc = mapper2.readTree(value); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertFalse(messages.isEmpty(), format(MaximumValidatorTest.NEGATIVE_TEST_CASE_TEMPLATE, value, maximum)); } } diff --git a/src/test/java/com/networknt/schema/MessageTest.java b/src/test/java/com/networknt/schema/MessageTest.java index 095d72c8b..424322867 100644 --- a/src/test/java/com/networknt/schema/MessageTest.java +++ b/src/test/java/com/networknt/schema/MessageTest.java @@ -17,8 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Collections; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -42,15 +41,13 @@ static class EqualsValidator extends BaseJsonValidator { } @Override - public Set validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, + public void validate(ExecutionContext executionContext, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation) { if (!node.asText().equals(value)) { - return Collections - .singleton(message().message("{0}: must be equal to ''{1}''") + executionContext.addError(message().message("{0}: must be equal to ''{1}''") .arguments(value) .instanceLocation(instanceLocation).instanceNode(node).build()); } - return Collections.emptySet(); } } @@ -79,7 +76,7 @@ void message() { + " \"equals\": \"helloworld\"\r\n" + "}"; JsonSchema schema = factory.getSchema(schemaData); - Set messages = schema.validate("\"helloworlda\"", InputFormat.JSON); + List messages = schema.validate("\"helloworlda\"", InputFormat.JSON); assertEquals(1, messages.size()); assertEquals("$: must be equal to 'helloworld'", messages.iterator().next().getMessage()); diff --git a/src/test/java/com/networknt/schema/MetaSchemaValidationTest.java b/src/test/java/com/networknt/schema/MetaSchemaValidationTest.java index 5abb681de..4cb345774 100644 --- a/src/test/java/com/networknt/schema/MetaSchemaValidationTest.java +++ b/src/test/java/com/networknt/schema/MetaSchemaValidationTest.java @@ -19,7 +19,7 @@ import java.io.IOException; import java.io.InputStream; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -46,7 +46,7 @@ void oas31() throws IOException { builder -> builder.schemaMappers(schemaMappers -> schemaMappers .mapPrefix("https://spec.openapis.org/oas/3.1", "classpath:oas/3.1"))) .getSchema(SchemaLocation.of("https://spec.openapis.org/oas/3.1/schema-base/2022-10-07"), config); - Set messages = schema.validate(inputData); + List messages = schema.validate(inputData); assertEquals(0, messages.size()); } } diff --git a/src/test/java/com/networknt/schema/MinimumValidatorTest.java b/src/test/java/com/networknt/schema/MinimumValidatorTest.java index baedd665a..5a23b0aa8 100644 --- a/src/test/java/com/networknt/schema/MinimumValidatorTest.java +++ b/src/test/java/com/networknt/schema/MinimumValidatorTest.java @@ -23,7 +23,7 @@ import java.io.IOException; import java.math.BigDecimal; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -177,12 +177,12 @@ void negativeDoubleOverflowTest() throws IOException { // Schema and document parsed with just double JsonSchema v = factory.getSchema(mapper.readTree(schema), config); JsonNode doc = mapper.readTree(value); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), format("Minimum %s and value %s are interpreted as Infinity, thus no schema violation should be reported", minimum, value)); // document parsed with BigDecimal doc = bigDecimalMapper.readTree(value); - Set messages2 = v.validate(doc); + List messages2 = v.validate(doc); //when the schema and value are both using BigDecimal, the value should be parsed in same mechanism. if (Double.valueOf(minimum).equals(Double.NEGATIVE_INFINITY)) { @@ -197,7 +197,7 @@ void negativeDoubleOverflowTest() throws IOException { // schema and document parsed with BigDecimal v = factory.getSchema(bigDecimalMapper.readTree(schema), config); - Set messages3 = v.validate(doc); + List messages3 = v.validate(doc); //when the schema and value are both using BigDecimal, the value should be parsed in same mechanism. String theValue = value.toLowerCase().replace("\"", ""); if (minimum.toLowerCase().equals(theValue)) { @@ -220,7 +220,7 @@ void doubleValueCoarsing() throws IOException { JsonNode doc = mapper.readTree(content); JsonSchema v = factory.getSchema(mapper.readTree(schema)); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), "Validation should succeed as by default double values are used by mapper"); doc = bigDecimalMapper.readTree(content); @@ -250,7 +250,7 @@ void doubleValueCoarsingExceedRange() throws IOException { JsonNode doc = mapper.readTree(content); JsonSchema v = factory.getSchema(mapper.readTree(schema)); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), "Validation should succeed as by default double values are used by mapper"); doc = bigDecimalMapper.readTree(content); @@ -273,7 +273,7 @@ private void expectSomeMessages(String[][] values, String number, ObjectMapper m JsonSchema v = factory.getSchema(mapper.readTree(schema)); JsonNode doc = mapper2.readTree(value); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertFalse(messages.isEmpty(), format(MinimumValidatorTest.NEGATIVE_MESSAGE_TEMPLATE, value, minimum)); } } @@ -292,7 +292,7 @@ private void expectNoMessages(String[][] values, String integer, ObjectMapper ma JsonSchema v = factory.getSchema(mapper.readTree(schema), config); JsonNode doc = bigIntegerMapper.readTree(value); - Set messages = v.validate(doc); + List messages = v.validate(doc); assertTrue(messages.isEmpty(), format(MinimumValidatorTest.POSITIVT_MESSAGE_TEMPLATE, value, minimum)); } } diff --git a/src/test/java/com/networknt/schema/MultipleOfValidatorTest.java b/src/test/java/com/networknt/schema/MultipleOfValidatorTest.java index cc6810d5c..cc50aeb30 100644 --- a/src/test/java/com/networknt/schema/MultipleOfValidatorTest.java +++ b/src/test/java/com/networknt/schema/MultipleOfValidatorTest.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -52,7 +52,7 @@ void test() { String inputData = "{\"value1\":123.892,\"value2\":123456.2934,\"value3\":123.123}"; String validData = "{\"value1\":123.89,\"value2\":123456,\"value3\":123.010}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(3, messages.size()); assertEquals(3, messages.stream().filter(m -> "multipleOf".equals(m.getType())).count()); @@ -69,7 +69,7 @@ void testTypeLoose() { String validTypeLooseInputData = "{\"value1\":\"123.89\",\"value2\":\"123456.29\",\"value3\":123.12}"; // Without type loose this has 2 type and 1 multipleOf errors - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(3, messages.size()); assertEquals(2, messages.stream().filter(m -> "type".equals(m.getType())).count()); assertEquals(1, messages.stream().filter(m -> "multipleOf".equals(m.getType())).count()); diff --git a/src/test/java/com/networknt/schema/OneOfValidatorTest.java b/src/test/java/com/networknt/schema/OneOfValidatorTest.java index 1df5bd463..774d35f2e 100644 --- a/src/test/java/com/networknt/schema/OneOfValidatorTest.java +++ b/src/test/java/com/networknt/schema/OneOfValidatorTest.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -66,7 +65,7 @@ void oneOfMultiple() { + " \"world\" : \"test\"\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(3, messages.size()); // even if more than 1 matches the mismatch errors are still reported List assertions = messages.stream().collect(Collectors.toList()); assertEquals("oneOf", assertions.get(0).getType()); @@ -107,7 +106,7 @@ void oneOfZero() { + " \"test\" : 1\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(4, messages.size()); List assertions = messages.stream().collect(Collectors.toList()); assertEquals("oneOf", assertions.get(0).getType()); @@ -140,7 +139,7 @@ void invalidTypeShouldThrowJsonSchemaException() { + "}"; JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); JsonSchemaException ex = assertThrows(JsonSchemaException.class, () -> factory.getSchema(schemaData)); - assertEquals("type", ex.getValidationMessage().getMessageKey()); + assertEquals("type", ex.getError().getMessageKey()); } /** @@ -305,7 +304,7 @@ void oneOfDiscriminatorEnabled() { JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(true).build()); String inputData = "{}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(3, messages.size()); } @@ -363,7 +362,7 @@ void oneOfDiscriminatorEnabledWithDiscriminator() { + " \"type\": \"number\",\r\n" + " \"value\": 1\r\n" + "}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(0, messages.size()); // Invalid only 1 message returned for number @@ -371,13 +370,13 @@ void oneOfDiscriminatorEnabledWithDiscriminator() { + " \"type\": \"number\",\r\n" + " \"value\": {}\r\n" + "}"; - Set messages2 = schema.validate(inputData2, InputFormat.JSON); + List messages2 = schema.validate(inputData2, InputFormat.JSON); assertEquals(2, messages2.size()); // Invalid both messages for string and object returned JsonSchema schema2 = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(false).build()); - Set messages3 = schema2.validate(inputData2, InputFormat.JSON); + List messages3 = schema2.validate(inputData2, InputFormat.JSON); assertEquals(3, messages3.size()); } @@ -451,7 +450,7 @@ void oneOfDiscriminatorEnabledWithDiscriminatorInSubclass() { + " \"type\": \"number\",\r\n" + " \"value\": 1\r\n" + "}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(0, messages.size()); // Invalid only 1 message returned for number @@ -459,13 +458,13 @@ void oneOfDiscriminatorEnabledWithDiscriminatorInSubclass() { + " \"type\": \"number\",\r\n" + " \"value\": {}\r\n" + "}"; - Set messages2 = schema.validate(inputData2, InputFormat.JSON); + List messages2 = schema.validate(inputData2, InputFormat.JSON); assertEquals(2, messages2.size()); // Invalid both messages for string and object returned JsonSchema schema2 = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, SchemaValidatorsConfig.builder().discriminatorKeywordEnabled(false).build()); - Set messages3 = schema2.validate(inputData2, InputFormat.JSON); + List messages3 = schema2.validate(inputData2, InputFormat.JSON); assertEquals(3, messages3.size()); } diff --git a/src/test/java/com/networknt/schema/OutputFormatTest.java b/src/test/java/com/networknt/schema/OutputFormatTest.java index c834e0a9b..84a87169c 100644 --- a/src/test/java/com/networknt/schema/OutputFormatTest.java +++ b/src/test/java/com/networknt/schema/OutputFormatTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.InputStream; -import java.util.LinkedHashSet; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Supplier; @@ -38,7 +38,7 @@ void testInvalidJson() throws Exception { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaInputStream, config); JsonNode node = getJsonNodeFromJsonData("/data/output-format-input.json"); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(3, errors.size()); Set messages = errors.stream().map(m -> new String[] { m.getEvaluationPath().toString(), @@ -53,7 +53,7 @@ void testInvalidJson() throws Exception { new String[] { "/items/$ref/required", "https://example.com/polygon#/$defs/point/required", "/1", "/1: required property 'y' not found"})); } - public static class Detailed implements OutputFormat> { + public static class Detailed implements OutputFormat> { private ValidationMessage format(ValidationMessage message) { Supplier messageSupplier = () -> { StringBuilder builder = new StringBuilder(); @@ -84,13 +84,13 @@ private ValidationMessage format(ValidationMessage message) { } @Override - public Set format(JsonSchema jsonSchema, Set validationMessages, + public java.util.List format(JsonSchema jsonSchema, ExecutionContext executionContext, ValidationContext validationContext) { - return validationMessages.stream().map(this::format).collect(Collectors.toCollection(LinkedHashSet::new)); + return executionContext.getErrors().stream().map(this::format).collect(Collectors.toCollection(ArrayList::new)); } } - public static final OutputFormat> DETAILED = new Detailed(); + public static final OutputFormat> DETAILED = new Detailed(); @Test void customFormat() { diff --git a/src/test/java/com/networknt/schema/OverrideValidatorTest.java b/src/test/java/com/networknt/schema/OverrideValidatorTest.java index 2b1e1059d..9f12297ac 100644 --- a/src/test/java/com/networknt/schema/OverrideValidatorTest.java +++ b/src/test/java/com/networknt/schema/OverrideValidatorTest.java @@ -25,7 +25,7 @@ import java.io.IOException; import java.util.Arrays; -import java.util.Set; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -56,7 +56,7 @@ void overrideDefaultValidator() throws JsonProcessingException, IOException { final JsonSchemaFactory validatorFactory = JsonSchemaFactory.builder(JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V201909)).metaSchema(validatorMetaSchema).build(); final JsonSchema validatorSchema = validatorFactory.getSchema(schema); - Set messages = validatorSchema.validate(targetNode, OutputFormat.DEFAULT, (executionContext, validationContext) -> { + List messages = validatorSchema.validate(targetNode, OutputFormat.DEFAULT, (executionContext, validationContext) -> { executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); }); diff --git a/src/test/java/com/networknt/schema/OverwritingCustomMessageBugTest.java b/src/test/java/com/networknt/schema/OverwritingCustomMessageBugTest.java index 35076ca46..3018a8eef 100644 --- a/src/test/java/com/networknt/schema/OverwritingCustomMessageBugTest.java +++ b/src/test/java/com/networknt/schema/OverwritingCustomMessageBugTest.java @@ -5,8 +5,8 @@ import com.networknt.schema.SpecVersion.VersionFlag; import java.io.InputStream; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -23,7 +23,7 @@ private JsonNode getJsonNodeFromStreamContent(InputStream content) throws Except @Test void customMessageIsNotOverwritten() throws Exception { - Set errors = validate(); + List errors = validate(); Map errorMsgMap = transferErrorMsg(errors); Assertions.assertTrue(errorMsgMap.containsKey("$.toplevel[1].foos"), "error message must contains key: $.foos"); Assertions.assertTrue(errorMsgMap.containsKey("$.toplevel[1].bars"), "error message must contains key: $.bars"); @@ -32,7 +32,7 @@ void customMessageIsNotOverwritten() throws Exception { } - private Set validate() throws Exception { + private List validate() throws Exception { String schemaPath = "/schema/OverwritingCustomMessageBug.json"; String dataPath = "/data/OverwritingCustomMessageBug.json"; InputStream schemaInputStream = OverwritingCustomMessageBugTest.class.getResourceAsStream(schemaPath); @@ -42,7 +42,7 @@ private Set validate() throws Exception { return schema.validate(node); } - private Map transferErrorMsg(Set validationMessages) { + private Map transferErrorMsg(List validationMessages) { Map pathToMessage = new HashMap<>(); validationMessages.forEach(msg -> { pathToMessage.put(msg.getInstanceLocation().toString(), msg.getMessage()); diff --git a/src/test/java/com/networknt/schema/PatternPropertiesValidatorTest.java b/src/test/java/com/networknt/schema/PatternPropertiesValidatorTest.java index 444b7ea75..de7d298a9 100644 --- a/src/test/java/com/networknt/schema/PatternPropertiesValidatorTest.java +++ b/src/test/java/com/networknt/schema/PatternPropertiesValidatorTest.java @@ -30,6 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -44,7 +45,7 @@ void testInvalidPatternPropertiesValidator() throws Exception { JsonSchema schema = factory.getSchema("{\"patternProperties\":6}"); JsonNode node = getJsonNodeFromStringContent(""); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(errors.size(), 0); }); } @@ -59,7 +60,7 @@ void testInvalidPatternPropertiesValidatorECMA262() throws Exception { JsonSchema schema = factory.getSchema("{\"patternProperties\":6}", config); JsonNode node = getJsonNodeFromStringContent(""); - Set errors = schema.validate(node); + List errors = schema.validate(node); Assertions.assertEquals(errors.size(), 0); }); } @@ -86,7 +87,7 @@ void message() { + " \"valid_string\": \"string_value\",\n" + " \"valid_key\": 5\n" + "}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/patternProperties/^valid_/type", message.getEvaluationPath().toString()); diff --git a/src/test/java/com/networknt/schema/PrefixItemsValidatorTest.java b/src/test/java/com/networknt/schema/PrefixItemsValidatorTest.java index d103650e7..27bc08db8 100644 --- a/src/test/java/com/networknt/schema/PrefixItemsValidatorTest.java +++ b/src/test/java/com/networknt/schema/PrefixItemsValidatorTest.java @@ -14,7 +14,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -58,7 +57,7 @@ void messageInvalid() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, config); String inputData = "[1, \"x\"]"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/prefixItems/0/type", message.getEvaluationPath().toString()); @@ -84,7 +83,7 @@ void messageValid() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, config); String inputData = "[\"x\", 1, 1]"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -103,7 +102,7 @@ void messageInvalidAdditionalItems() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, config); String inputData = "[\"x\", 1, 1, 2]"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/items", message.getEvaluationPath().toString()); @@ -138,7 +137,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -194,7 +193,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() diff --git a/src/test/java/com/networknt/schema/PropertyNamesValidatorTest.java b/src/test/java/com/networknt/schema/PropertyNamesValidatorTest.java index 28216e173..9100c6429 100644 --- a/src/test/java/com/networknt/schema/PropertyNamesValidatorTest.java +++ b/src/test/java/com/networknt/schema/PropertyNamesValidatorTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -45,7 +45,7 @@ void messageInvalid() { + " \"foo\": {},\r\n" + " \"foobar\": {}\r\n" + "}"; - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); ValidationMessage message = messages.iterator().next(); assertEquals("/propertyNames", message.getEvaluationPath().toString()); diff --git a/src/test/java/com/networknt/schema/ReadOnlyValidatorTest.java b/src/test/java/com/networknt/schema/ReadOnlyValidatorTest.java index 0beeb701f..dc2ba4c0d 100644 --- a/src/test/java/com/networknt/schema/ReadOnlyValidatorTest.java +++ b/src/test/java/com/networknt/schema/ReadOnlyValidatorTest.java @@ -6,7 +6,7 @@ import java.io.IOException; import java.io.InputStream; -import java.util.Set; +import java.util.List; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -19,14 +19,14 @@ class ReadOnlyValidatorTest { @Test void givenConfigWriteFalseWhenReadOnlyTrueThenAllows() throws IOException { ObjectNode node = getJsonNode(); - Set errors = loadJsonSchema(false).validate(node); + List errors = loadJsonSchema(false).validate(node); assertTrue(errors.isEmpty()); } @Test void givenConfigWriteTrueWhenReadOnlyTrueThenDenies() throws IOException { ObjectNode node = getJsonNode(); - Set errors = loadJsonSchema(true).validate(node); + List errors = loadJsonSchema(true).validate(node); assertFalse(errors.isEmpty()); assertEquals("/firstName: is a readonly field, it cannot be changed", errors.stream().map(e -> e.getMessage()).collect(Collectors.toList()).get(0)); diff --git a/src/test/java/com/networknt/schema/RefTest.java b/src/test/java/com/networknt/schema/RefTest.java index 4ebcb3f08..6ad35635e 100644 --- a/src/test/java/com/networknt/schema/RefTest.java +++ b/src/test/java/com/networknt/schema/RefTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -26,7 +26,7 @@ void shouldLoadRelativeClasspathReference() throws JsonProcessingException { + " }\r\n" + "}"; assertEquals(SchemaId.V4, schema.getValidationContext().getMetaSchema().getIri()); - Set errors = schema.validate(OBJECT_MAPPER.readTree(input)); + List errors = schema.validate(OBJECT_MAPPER.readTree(input)); assertEquals(1, errors.size()); ValidationMessage error = errors.iterator().next(); assertEquals("classpath:///schema/ref-ref.json#/definitions/DriverProperties/required", @@ -49,7 +49,7 @@ void shouldLoadSchemaResource() throws JsonProcessingException { + " }\r\n" + "}"; assertEquals(SchemaId.V4, schema.getValidationContext().getMetaSchema().getIri()); - Set errors = schema.validate(OBJECT_MAPPER.readTree(input)); + List errors = schema.validate(OBJECT_MAPPER.readTree(input)); assertEquals(1, errors.size()); ValidationMessage error = errors.iterator().next(); assertEquals("https://www.example.org/common#/definitions/DriverProperties/required", diff --git a/src/test/java/com/networknt/schema/RefValidatorTest.java b/src/test/java/com/networknt/schema/RefValidatorTest.java index 9c26df4a8..6f15bd19f 100644 --- a/src/test/java/com/networknt/schema/RefValidatorTest.java +++ b/src/test/java/com/networknt/schema/RefValidatorTest.java @@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import java.util.Collections; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -44,7 +44,7 @@ void resolveSamePathDotSlash() { builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas( Collections.singletonMap("https://www.example.com/schema/integer.json", otherSchema)))); JsonSchema jsonSchema = factory.getSchema(mainSchema); - Set messages = jsonSchema.validate("\"string\"", InputFormat.JSON); + List messages = jsonSchema.validate("\"string\"", InputFormat.JSON); assertEquals(1, messages.size()); } @@ -63,7 +63,7 @@ void resolveSamePath() { builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas( Collections.singletonMap("https://www.example.com/schema/integer.json", otherSchema)))); JsonSchema jsonSchema = factory.getSchema(mainSchema); - Set messages = jsonSchema.validate("\"string\"", InputFormat.JSON); + List messages = jsonSchema.validate("\"string\"", InputFormat.JSON); assertEquals(1, messages.size()); } @@ -82,7 +82,7 @@ void resolveParent() { builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas( Collections.singletonMap("https://www.example.com/integer.json", otherSchema)))); JsonSchema jsonSchema = factory.getSchema(mainSchema); - Set messages = jsonSchema.validate("\"string\"", InputFormat.JSON); + List messages = jsonSchema.validate("\"string\"", InputFormat.JSON); assertEquals(1, messages.size()); } @@ -101,7 +101,7 @@ void resolveComplex() { builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas( Collections.singletonMap("https://www.example.com/schema/hello/integer.json", otherSchema)))); JsonSchema jsonSchema = factory.getSchema(mainSchema); - Set messages = jsonSchema.validate("\"string\"", InputFormat.JSON); + List messages = jsonSchema.validate("\"string\"", InputFormat.JSON); assertEquals(1, messages.size()); } diff --git a/src/test/java/com/networknt/schema/SampleTest.java b/src/test/java/com/networknt/schema/SampleTest.java index 80568730c..650008220 100644 --- a/src/test/java/com/networknt/schema/SampleTest.java +++ b/src/test/java/com/networknt/schema/SampleTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Collections; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -31,7 +31,7 @@ void schemaFromSchemaLocationMapping() { * initializeValidators() */ schemaFromSchemaLocation.initializeValidators(); - Set errors = schemaFromSchemaLocation.validate("{\"id\": \"2\"}", InputFormat.JSON, + List errors = schemaFromSchemaLocation.validate("{\"id\": \"2\"}", InputFormat.JSON, executionContext -> executionContext.getExecutionConfig().setFormatAssertionsEnabled(true)); assertEquals(1, errors.size()); } @@ -54,7 +54,7 @@ void schemaFromSchemaLocationContent() { * initializeValidators() */ schemaFromSchemaLocation.initializeValidators(); - Set errors = schemaFromSchemaLocation.validate("{\"id\": \"2\"}", InputFormat.JSON, + List errors = schemaFromSchemaLocation.validate("{\"id\": \"2\"}", InputFormat.JSON, executionContext -> executionContext.getExecutionConfig().setFormatAssertionsEnabled(true)); assertEquals(1, errors.size()); } @@ -75,7 +75,7 @@ void schemaFromClasspath() { * initializeValidators() */ schemaFromClasspath.initializeValidators(); - Set errors = schemaFromClasspath.validate("{\"id\": \"2\"}", InputFormat.JSON, + List errors = schemaFromClasspath.validate("{\"id\": \"2\"}", InputFormat.JSON, executionContext -> executionContext.getExecutionConfig().setFormatAssertionsEnabled(true)); assertEquals(1, errors.size()); } @@ -91,7 +91,7 @@ void schemaFromString() { */ JsonSchema schemaFromString = factory .getSchema("{\"enum\":[1, 2, 3, 4]}"); - Set errors = schemaFromString.validate("7", InputFormat.JSON, + List errors = schemaFromString.validate("7", InputFormat.JSON, executionContext -> executionContext.getExecutionConfig().setFormatAssertionsEnabled(true)); assertEquals(1, errors.size()); } @@ -117,7 +117,7 @@ void schemaFromJsonNode() throws JsonProcessingException { * initializeValidators() */ schemaFromNode.initializeValidators(); - Set errors = schemaFromNode.validate("{\"id\": \"2\"}", InputFormat.JSON, + List errors = schemaFromNode.validate("{\"id\": \"2\"}", InputFormat.JSON, executionContext -> executionContext.getExecutionConfig().setFormatAssertionsEnabled(true)); assertEquals(1, errors.size()); } diff --git a/src/test/java/com/networknt/schema/SchemaLocationTest.java b/src/test/java/com/networknt/schema/SchemaLocationTest.java index 7562e2b42..f8663039b 100644 --- a/src/test/java/com/networknt/schema/SchemaLocationTest.java +++ b/src/test/java/com/networknt/schema/SchemaLocationTest.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.*; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -220,7 +220,7 @@ void shouldLoadEscapedFragment() { JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012); JsonSchema schema = factory.getSchema(SchemaLocation .of("classpath:schema/example-escaped.yaml#/paths/~1users/post/requestBody/application~1json/schema")); - Set result = schema.validate("1", InputFormat.JSON); + List result = schema.validate("1", InputFormat.JSON); assertFalse(result.isEmpty()); result = schema.validate("{}", InputFormat.JSON); assertTrue(result.isEmpty()); diff --git a/src/test/java/com/networknt/schema/SharedConfigTest.java b/src/test/java/com/networknt/schema/SharedConfigTest.java index d18fce110..a7f469006 100644 --- a/src/test/java/com/networknt/schema/SharedConfigTest.java +++ b/src/test/java/com/networknt/schema/SharedConfigTest.java @@ -1,6 +1,6 @@ package com.networknt.schema; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -24,7 +24,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } } diff --git a/src/test/java/com/networknt/schema/TypeValidatorTest.java b/src/test/java/com/networknt/schema/TypeValidatorTest.java index 3687d3e59..d7f642e13 100644 --- a/src/test/java/com/networknt/schema/TypeValidatorTest.java +++ b/src/test/java/com/networknt/schema/TypeValidatorTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -68,7 +68,7 @@ void testTypeLoose() { + " \"array_of_objects\": {}\r\n" + "}"; // Without type loose this has 2 type errors - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(2, messages.size()); assertEquals(2, messages.stream().filter(m -> "type".equals(m.getType())).count()); @@ -102,7 +102,7 @@ void integer() { + " \"type\": \"integer\"\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData); - Set messages = schema.validate("1", InputFormat.JSON); + List messages = schema.validate("1", InputFormat.JSON); assertEquals(0, messages.size()); messages = schema.validate("2.0", InputFormat.JSON); assertEquals(0, messages.size()); @@ -131,7 +131,7 @@ void integerDraft4() { + " \"type\": \"integer\"\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V4).getSchema(schemaData); - Set messages = schema.validate("1", InputFormat.JSON); + List messages = schema.validate("1", InputFormat.JSON); assertEquals(0, messages.size()); // The logic in JsonNodeUtil specifically excludes V4 from this handling messages = schema.validate("2.0", InputFormat.JSON); @@ -178,7 +178,7 @@ void nullable() { .nullableKeywordEnabled(false) .build()); - final Set errors = validator.validate(inputData, InputFormat.JSON); + final List errors = validator.validate(inputData, InputFormat.JSON); assertEquals(1, errors.size()); } } diff --git a/src/test/java/com/networknt/schema/UnevaluatedItemsValidatorTest.java b/src/test/java/com/networknt/schema/UnevaluatedItemsValidatorTest.java index 6445f7685..bfad6228e 100644 --- a/src/test/java/com/networknt/schema/UnevaluatedItemsValidatorTest.java +++ b/src/test/java/com/networknt/schema/UnevaluatedItemsValidatorTest.java @@ -19,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -45,7 +44,7 @@ void unevaluatedItemsFalse() { + "}"; String inputData = "[1,2,3]"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(2, messages.size()); List assertions = messages.stream().collect(Collectors.toList()); assertEquals("unevaluatedItems", assertions.get(0).getType()); @@ -71,7 +70,7 @@ void unevaluatedItemsSchema() { + "}"; String inputData = "[1,2,3]"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(2, messages.size()); List assertions = messages.stream().collect(Collectors.toList()); assertEquals("type", assertions.get(0).getType()); diff --git a/src/test/java/com/networknt/schema/UnevaluatedPropertiesValidatorTest.java b/src/test/java/com/networknt/schema/UnevaluatedPropertiesValidatorTest.java index 6b8db6dea..5e7ec489d 100644 --- a/src/test/java/com/networknt/schema/UnevaluatedPropertiesValidatorTest.java +++ b/src/test/java/com/networknt/schema/UnevaluatedPropertiesValidatorTest.java @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -63,7 +62,7 @@ void annotationsOnlyDroppedAtTheEndOfSchemaProcessing() { + " \"key4\": \"value4\"\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(2, messages.size()); List assertions = messages.stream().collect(Collectors.toList()); assertEquals("required", assertions.get(0).getType()); @@ -118,7 +117,7 @@ void subschemaProcessing() { + " }\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V201909).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(1, messages.size()); List assertions = messages.stream().collect(Collectors.toList()); assertEquals("additionalProperties", assertions.get(0).getType()); @@ -146,7 +145,7 @@ void unevaluatedPropertiesSchema() { + " }\r\n" + "}"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V201909).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(1, messages.size()); List assertions = messages.stream().collect(Collectors.toList()); assertEquals("type", assertions.get(0).getType()); @@ -191,7 +190,7 @@ void ref() { + "}"; String inputData = "{ \"pontoons\": {}, \"wheels\": {}, \"surfboard\": \"2\" }"; JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V201909).getSchema(schemaData); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertEquals(0, messages.size()); } diff --git a/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java b/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java index 252c29367..dc4688053 100644 --- a/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java +++ b/src/test/java/com/networknt/schema/UnknownMetaSchemaTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Set; +import java.util.List; class UnknownMetaSchemaTest { @@ -24,7 +24,7 @@ void testSchema1() throws IOException { JsonSchemaFactory factory = JsonSchemaFactory.builder(JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7)).build(); JsonSchema jsonSchema = factory.getSchema(schema1); - Set errors = jsonSchema.validate(jsonNode); + List errors = jsonSchema.validate(jsonNode); for(ValidationMessage error:errors) { System.out.println(error.getMessage()); } @@ -38,7 +38,7 @@ void testSchema2() throws IOException { JsonSchemaFactory factory = JsonSchemaFactory.builder(JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7)).build(); JsonSchema jsonSchema = factory.getSchema(schema2); - Set errors = jsonSchema.validate(jsonNode); + List errors = jsonSchema.validate(jsonNode); for(ValidationMessage error:errors) { System.out.println(error.getMessage()); } @@ -51,7 +51,7 @@ void testSchema3() throws IOException { JsonSchemaFactory factory = JsonSchemaFactory.builder(JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7)).build(); JsonSchema jsonSchema = factory.getSchema(schema3); - Set errors = jsonSchema.validate(jsonNode); + List errors = jsonSchema.validate(jsonNode); for(ValidationMessage error:errors) { System.out.println(error.getMessage()); } diff --git a/src/test/java/com/networknt/schema/V4JsonSchemaTest.java b/src/test/java/com/networknt/schema/V4JsonSchemaTest.java index 50ab5c706..fca017322 100644 --- a/src/test/java/com/networknt/schema/V4JsonSchemaTest.java +++ b/src/test/java/com/networknt/schema/V4JsonSchemaTest.java @@ -24,6 +24,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.List; import java.util.Set; import static org.junit.jupiter.api.Assertions.*; @@ -47,7 +48,7 @@ void testLoadingWithId() throws Exception { */ @Test void testFailFast_AllErrors() throws IOException { - Set messages = validateFailingFastSchemaFor("extra/product/product.schema.json", + List messages = validateFailingFastSchemaFor("extra/product/product.schema.json", "extra/product/product-all-errors-data.json"); assertEquals(1, messages.size()); } @@ -57,7 +58,7 @@ void testFailFast_AllErrors() throws IOException { */ @Test void testFailFast_OneErrors() throws IOException { - Set messages = validateFailingFastSchemaFor("extra/product/product.schema.json", + List messages = validateFailingFastSchemaFor("extra/product/product.schema.json", "extra/product/product-one-error-data.json"); assertEquals(1, messages.size()); } @@ -67,7 +68,7 @@ void testFailFast_OneErrors() throws IOException { */ @Test void testFailFast_TwoErrors() throws IOException { - Set messages = validateFailingFastSchemaFor("extra/product/product.schema.json", + List messages = validateFailingFastSchemaFor("extra/product/product.schema.json", "extra/product/product-two-errors-data.json"); assertEquals(1, messages.size()); } @@ -78,12 +79,12 @@ void testFailFast_TwoErrors() throws IOException { */ @Test void testFailFast_NoErrors() throws IOException { - final Set messages = validateFailingFastSchemaFor("extra/product/product.schema.json", + final List messages = validateFailingFastSchemaFor("extra/product/product.schema.json", "extra/product/product-no-errors-data.json"); assertTrue(messages.isEmpty()); } - private Set validateFailingFastSchemaFor(final String schemaFileName, final String dataFileName) throws IOException { + private List validateFailingFastSchemaFor(final String schemaFileName, final String dataFileName) throws IOException { final ObjectMapper objectMapper = new ObjectMapper(); final JsonNode schema = getJsonNodeFromResource(objectMapper, schemaFileName); final JsonNode dataFile = getJsonNodeFromResource(objectMapper, dataFileName); diff --git a/src/test/java/com/networknt/schema/VocabularyTest.java b/src/test/java/com/networknt/schema/VocabularyTest.java index ccb5c823f..57da5b7a9 100644 --- a/src/test/java/com/networknt/schema/VocabularyTest.java +++ b/src/test/java/com/networknt/schema/VocabularyTest.java @@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.Collections; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -68,7 +68,7 @@ void noValidation() { + " \"numberProperty\": 1\r\n" + "}"; - Set messages = schema.validate(inputDataNoValidation, InputFormat.JSON); + List messages = schema.validate(inputDataNoValidation, InputFormat.JSON); assertEquals(0, messages.size()); // Set validation vocab @@ -120,7 +120,7 @@ void noFormatValidation() { + " \"dateProperty\": \"hello\"\r\n" + "}"; - Set messages = schema.validate(inputDataNoValidation, InputFormat.JSON, + List messages = schema.validate(inputDataNoValidation, InputFormat.JSON, executionContext -> executionContext.getExecutionConfig().setFormatAssertionsEnabled(true)); assertEquals(0, messages.size()); diff --git a/src/test/java/com/networknt/schema/format/IriFormatTest.java b/src/test/java/com/networknt/schema/format/IriFormatTest.java index 17dc5e51e..497604b6d 100644 --- a/src/test/java/com/networknt/schema/format/IriFormatTest.java +++ b/src/test/java/com/networknt/schema/format/IriFormatTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -38,7 +38,7 @@ void uriShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -51,7 +51,7 @@ void queryWithBracketsShouldFail() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", InputFormat.JSON); assertFalse(messages.isEmpty()); } @@ -64,7 +64,7 @@ void queryWithEncodedBracketsShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -77,7 +77,7 @@ void iriShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", + List messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -90,7 +90,7 @@ void noAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"http://\"", InputFormat.JSON); + List messages = schema.validate("\"http://\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -102,7 +102,7 @@ void noSchemeNoAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"//\"", InputFormat.JSON); + List messages = schema.validate("\"//\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -114,7 +114,7 @@ void noPathShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"about:\"", InputFormat.JSON); + List messages = schema.validate("\"about:\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } } diff --git a/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java b/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java index 0b5f1d4e8..b541ee3fc 100644 --- a/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java +++ b/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -38,7 +38,7 @@ void uriShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -51,7 +51,7 @@ void queryWithBracketsShouldFail() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", InputFormat.JSON); assertFalse(messages.isEmpty()); } @@ -64,7 +64,7 @@ void queryWithEncodedBracketsShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -77,7 +77,7 @@ void iriShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", + List messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -90,7 +90,7 @@ void noAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"http://\"", InputFormat.JSON); + List messages = schema.validate("\"http://\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -102,7 +102,7 @@ void noSchemeNoAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"//\"", InputFormat.JSON); + List messages = schema.validate("\"//\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -114,7 +114,7 @@ void noPathShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"about:\"", InputFormat.JSON); + List messages = schema.validate("\"about:\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } diff --git a/src/test/java/com/networknt/schema/format/TimeFormatTest.java b/src/test/java/com/networknt/schema/format/TimeFormatTest.java index f368d6e78..373e660c0 100644 --- a/src/test/java/com/networknt/schema/format/TimeFormatTest.java +++ b/src/test/java/com/networknt/schema/format/TimeFormatTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; @@ -61,7 +61,7 @@ void validTimeShouldPass(ValidTimeFormatInput input) { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -90,7 +90,7 @@ void invalidTimeShouldFail(InvalidTimeFormatInput input) { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate(inputData, InputFormat.JSON); + List messages = schema.validate(inputData, InputFormat.JSON); assertFalse(messages.isEmpty()); } } diff --git a/src/test/java/com/networknt/schema/format/UriFormatTest.java b/src/test/java/com/networknt/schema/format/UriFormatTest.java index 690980e92..02edd5cf2 100644 --- a/src/test/java/com/networknt/schema/format/UriFormatTest.java +++ b/src/test/java/com/networknt/schema/format/UriFormatTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -38,7 +38,7 @@ void uriShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -51,7 +51,7 @@ void queryWithBracketsShouldFail() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", InputFormat.JSON); assertFalse(messages.isEmpty()); } @@ -64,7 +64,7 @@ void queryWithEncodedBracketsShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -77,7 +77,7 @@ void iriShouldFail() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", + List messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", InputFormat.JSON); assertFalse(messages.isEmpty()); } @@ -90,7 +90,7 @@ void noAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"http://\"", InputFormat.JSON); + List messages = schema.validate("\"http://\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -102,7 +102,7 @@ void noSchemeNoAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"//\"", InputFormat.JSON); + List messages = schema.validate("\"//\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -114,7 +114,7 @@ void noPathShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"about:\"", InputFormat.JSON); + List messages = schema.validate("\"about:\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } } diff --git a/src/test/java/com/networknt/schema/format/UriReferenceFormatTest.java b/src/test/java/com/networknt/schema/format/UriReferenceFormatTest.java index bb8ced217..00c8b855e 100644 --- a/src/test/java/com/networknt/schema/format/UriReferenceFormatTest.java +++ b/src/test/java/com/networknt/schema/format/UriReferenceFormatTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Set; +import java.util.List; import org.junit.jupiter.api.Test; @@ -38,7 +38,7 @@ void uriShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -51,7 +51,7 @@ void queryWithBracketsShouldFail() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter[test]=1\"", InputFormat.JSON); assertFalse(messages.isEmpty()); } @@ -64,7 +64,7 @@ void queryWithEncodedBracketsShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", + List messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -77,7 +77,7 @@ void iriShouldFail() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", + List messages = schema.validate("\"https://test.com/assets/produktdatenblätter.pdf\"", InputFormat.JSON); assertFalse(messages.isEmpty()); } @@ -90,7 +90,7 @@ void noAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"http://\"", InputFormat.JSON); + List messages = schema.validate("\"http://\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -102,7 +102,7 @@ void noSchemeNoAuthorityShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"//\"", InputFormat.JSON); + List messages = schema.validate("\"//\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } @@ -114,7 +114,7 @@ void noPathShouldPass() { SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().formatAssertionsEnabled(true).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); - Set messages = schema.validate("\"about:\"", InputFormat.JSON); + List messages = schema.validate("\"about:\"", InputFormat.JSON); assertTrue(messages.isEmpty()); } } diff --git a/src/test/java/com/networknt/schema/oas/OpenApi30Test.java b/src/test/java/com/networknt/schema/oas/OpenApi30Test.java index d57ef51cf..08ba18786 100644 --- a/src/test/java/com/networknt/schema/oas/OpenApi30Test.java +++ b/src/test/java/com/networknt/schema/oas/OpenApi30Test.java @@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -55,7 +54,7 @@ void validateMetaSchema() { + " \"petType\": \"dog\",\r\n" + " \"bark\": \"woof\"\r\n" + "}"; - Set messages = schema.validate(input, InputFormat.JSON); + List messages = schema.validate(input, InputFormat.JSON); assertEquals(0, messages.size()); String invalid = "{\r\n" diff --git a/src/test/java/com/networknt/schema/oas/OpenApi31Test.java b/src/test/java/com/networknt/schema/oas/OpenApi31Test.java index 88888b034..74d9a12f8 100644 --- a/src/test/java/com/networknt/schema/oas/OpenApi31Test.java +++ b/src/test/java/com/networknt/schema/oas/OpenApi31Test.java @@ -18,7 +18,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -49,7 +48,7 @@ void validateVocabulary() { + " \"petType\": \"dog\",\r\n" + " \"bark\": \"woof\"\r\n" + "}"; - Set messages = schema.validate(input, InputFormat.JSON); + List messages = schema.validate(input, InputFormat.JSON); assertEquals(0, messages.size()); String invalid = "{\r\n" @@ -78,7 +77,7 @@ void validateMetaSchema() { + " \"petType\": \"dog\",\r\n" + " \"bark\": \"woof\"\r\n" + "}"; - Set messages = schema.validate(input, InputFormat.JSON); + List messages = schema.validate(input, InputFormat.JSON); assertEquals(0, messages.size()); String invalid = "{\r\n" @@ -109,7 +108,7 @@ void discriminatorOneOfMultipleMatchShouldFail() { + " \"bark\": \"woof\",\r\n" + " \"lovesRocks\": true\r\n" + "}"; - Set messages = schema.validate(input, InputFormat.JSON); + List messages = schema.validate(input, InputFormat.JSON); List list = messages.stream().collect(Collectors.toList()); assertEquals("oneOf", list.get(0).getType()); } @@ -128,7 +127,7 @@ void discriminatorOneOfNoMatchShouldFail() { + " \"petType\": \"lizard\",\r\n" + " \"none\": true\r\n" + "}"; - Set messages = schema.validate(input, InputFormat.JSON); + List messages = schema.validate(input, InputFormat.JSON); List list = messages.stream().collect(Collectors.toList()); assertEquals("oneOf", list.get(0).getType()); assertEquals("required", list.get(1).getType()); @@ -150,7 +149,7 @@ void discriminatorOneOfOneMatchWrongDiscriminatorShouldSucceed() { + " \"petType\": \"dog\",\r\n" + " \"lovesRocks\": true\r\n" + "}"; - Set messages = schema.validate(input, InputFormat.JSON); + List messages = schema.validate(input, InputFormat.JSON); assertEquals(0, messages.size()); } diff --git a/src/test/java/com/networknt/schema/regex/AllowRegularExpressionFactoryTest.java b/src/test/java/com/networknt/schema/regex/AllowRegularExpressionFactoryTest.java index 2ece4d5da..44e6116a9 100644 --- a/src/test/java/com/networknt/schema/regex/AllowRegularExpressionFactoryTest.java +++ b/src/test/java/com/networknt/schema/regex/AllowRegularExpressionFactoryTest.java @@ -38,7 +38,7 @@ void getRegularExpression() { String allowed = "testing"; RegularExpressionFactory factory = new AllowRegularExpressionFactory(delegate, allowed::equals); InvalidSchemaException exception = assertThrows(InvalidSchemaException.class, () -> factory.getRegularExpression("hello")); - assertEquals("hello", exception.getValidationMessage().getArguments()[0]); + assertEquals("hello", exception.getError().getArguments()[0]); assertDoesNotThrow(() -> factory.getRegularExpression(allowed)); assertTrue(called[0]); diff --git a/src/test/java/com/networknt/schema/resource/AllowSchemaLoaderTest.java b/src/test/java/com/networknt/schema/resource/AllowSchemaLoaderTest.java index c8a6a8b26..331a96b15 100644 --- a/src/test/java/com/networknt/schema/resource/AllowSchemaLoaderTest.java +++ b/src/test/java/com/networknt/schema/resource/AllowSchemaLoaderTest.java @@ -40,7 +40,7 @@ void integration() { InvalidSchemaException invalidSchemaException = assertThrows(InvalidSchemaException.class, () -> factory.getSchema(SchemaLocation.of("http://www.example.org/schema"))); assertEquals("http://www.example.org/schema", - invalidSchemaException.getValidationMessage().getArguments()[0].toString()); + invalidSchemaException.getError().getArguments()[0].toString()); JsonSchema schema = factory.getSchema(SchemaLocation.of("classpath:schema/example-main.json")); assertNotNull(schema); } diff --git a/src/test/java/com/networknt/schema/resource/DisallowSchemaLoaderTest.java b/src/test/java/com/networknt/schema/resource/DisallowSchemaLoaderTest.java index c226a8612..dde349e15 100644 --- a/src/test/java/com/networknt/schema/resource/DisallowSchemaLoaderTest.java +++ b/src/test/java/com/networknt/schema/resource/DisallowSchemaLoaderTest.java @@ -37,7 +37,7 @@ void integration() { InvalidSchemaException invalidSchemaException = assertThrows(InvalidSchemaException.class, () -> factory.getSchema(SchemaLocation.of("classpath:schema/example-main.json"))); assertEquals("classpath:schema/example-main.json", - invalidSchemaException.getValidationMessage().getArguments()[0].toString()); + invalidSchemaException.getError().getArguments()[0].toString()); } } diff --git a/src/test/java/com/networknt/schema/utils/JsonNodesTest.java b/src/test/java/com/networknt/schema/utils/JsonNodesTest.java index aa21c89b6..bb8184366 100644 --- a/src/test/java/com/networknt/schema/utils/JsonNodesTest.java +++ b/src/test/java/com/networknt/schema/utils/JsonNodesTest.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -92,7 +91,7 @@ void jsonLocation() { builder -> builder.jsonNodeReader(JsonNodeReader.builder().locationAware().build())); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, InputFormat.JSON, config); - Set messages = schema.validate(inputData, InputFormat.JSON, executionContext -> { + List messages = schema.validate(inputData, InputFormat.JSON, executionContext -> { executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); }); List list = messages.stream().collect(Collectors.toList()); @@ -138,7 +137,7 @@ void yamlLocation() { builder -> builder.jsonNodeReader(JsonNodeReader.builder().locationAware().build())); SchemaValidatorsConfig config = SchemaValidatorsConfig.builder().build(); JsonSchema schema = factory.getSchema(schemaData, InputFormat.YAML, config); - Set messages = schema.validate(inputData, InputFormat.YAML, executionContext -> { + List messages = schema.validate(inputData, InputFormat.YAML, executionContext -> { executionContext.getExecutionConfig().setFormatAssertionsEnabled(true); }); List list = messages.stream().collect(Collectors.toList()); diff --git a/src/test/java/com/networknt/schema/walk/JsonSchemaWalkListenerTest.java b/src/test/java/com/networknt/schema/walk/JsonSchemaWalkListenerTest.java index bdef7af7b..f8f4db5d0 100644 --- a/src/test/java/com/networknt/schema/walk/JsonSchemaWalkListenerTest.java +++ b/src/test/java/com/networknt/schema/walk/JsonSchemaWalkListenerTest.java @@ -25,7 +25,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Supplier; import org.junit.jupiter.api.Test; @@ -101,7 +100,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }) .build(); @@ -181,7 +180,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }) .build(); @@ -267,7 +266,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V7).getSchema(schemaData, config); @@ -340,7 +339,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }).build(); JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V7).getSchema(schemaData, config); @@ -388,7 +387,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }) .build(); @@ -608,7 +607,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }) .build(); @@ -665,7 +664,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }) .build(); @@ -733,7 +732,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }) .build(); @@ -803,7 +802,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { } }) .build(); @@ -846,7 +845,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext() @@ -909,7 +908,7 @@ public WalkFlow onWalkStart(WalkEvent walkEvent) { } @Override - public void onWalkEnd(WalkEvent walkEvent, Set validationMessages) { + public void onWalkEnd(WalkEvent walkEvent, List validationMessages) { @SuppressWarnings("unchecked") List items = (List) walkEvent.getExecutionContext() .getCollectorContext()