Skip to content
This repository has been archived by the owner on Jul 9, 2021. It is now read-only.

Commit

Permalink
fix: anyOf/oneOf now propagates sub-validation errors.
Browse files Browse the repository at this point in the history
  • Loading branch information
llfbandit committed Mar 27, 2020
1 parent 98eda47 commit 2b26e83
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import org.openapi4j.core.validation.ValidationResults;
import org.openapi4j.schema.validator.ValidationContext;

import java.util.ArrayList;
import java.util.List;

import static org.openapi4j.core.model.v3.OAI3SchemaKeywords.ANYOF;
import static org.openapi4j.core.validation.ValidationSeverity.ERROR;

Expand All @@ -17,8 +20,7 @@
* <a href="https://tools.ietf.org/html/draft-wright-json-schema-validation-00#page-11" />
*/
class AnyOfValidator extends DiscriminatorValidator {
private static final ValidationResult ERR = new ValidationResult(ERROR, 1001, "No valid schema.");

private static final ValidationResult ERR = new ValidationResult(ERROR, 1001, "Schema description is erroneous. anyOf should have at least 1 element.");
private static final ValidationResults.CrumbInfo CRUMB_INFO = new ValidationResults.CrumbInfo(ANYOF, true);

static AnyOfValidator create(ValidationContext<OAI3> context, JsonNode schemaNode, JsonNode schemaParentNode, SchemaValidator parentSchema) {
Expand All @@ -31,17 +33,28 @@ private AnyOfValidator(final ValidationContext<OAI3> context, final JsonNode sch

@Override
void validateWithoutDiscriminator(final JsonNode valueNode, final ValidationResults results) {
if (schemas.isEmpty()) {
results.add(CRUMB_INFO, ERR);
return;
}

List<ValidationResults> resultsOnError = new ArrayList<>();

for (SchemaValidator schema : schemas) {
ValidationResults anyOfResults = new ValidationResults();
schema.validate(valueNode, anyOfResults);
ValidationResults schemaResults = new ValidationResults();
schema.validate(valueNode, schemaResults);

if (anyOfResults.isValid()) {
if (schemaResults.isValid()) {
// Append potential results from sub validation (INFO / WARN)
results.add(results.crumbs(), anyOfResults);
results.add(results.crumbs(), schemaResults);
return;
} else {
resultsOnError.add(schemaResults);
}
}

results.add(CRUMB_INFO, ERR);
for (ValidationResults result : resultsOnError) {
results.add(results.crumbs(), result);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import org.openapi4j.core.validation.ValidationResults;
import org.openapi4j.schema.validator.ValidationContext;

import java.util.ArrayList;
import java.util.List;

import static org.openapi4j.core.model.v3.OAI3SchemaKeywords.ONEOF;
import static org.openapi4j.core.validation.ValidationSeverity.ERROR;

Expand All @@ -17,7 +20,7 @@
* <a href="https://tools.ietf.org/html/draft-wright-json-schema-validation-00#page-11" />
*/
class OneOfValidator extends DiscriminatorValidator {
private static final ValidationResult NO_VALID_SCHEMA_ERR = new ValidationResult(ERROR, 1022, "No valid schema.");
private static final ValidationResult NO_VALID_SCHEMA_ERR = new ValidationResult(ERROR, 1022, "Schema description is erroneous. oneOf should have at least 1 element.");
private static final ValidationResult MANY_VALID_SCHEMA_ERR = new ValidationResult(ERROR, 1023, "More than 1 schema is valid.");

private static final ValidationResults.CrumbInfo CRUMB_INFO = new ValidationResults.CrumbInfo(ONEOF, true);
Expand All @@ -36,27 +39,37 @@ private OneOfValidator(final ValidationContext<OAI3> context,

@Override
void validateWithoutDiscriminator(final JsonNode valueNode, final ValidationResults results) {
ValidationResults oneOfValidResults = null;
if (schemas.isEmpty()) {
results.add(CRUMB_INFO, NO_VALID_SCHEMA_ERR);
return;
}

List<ValidationResults> resultsOnError = new ArrayList<>();
ValidationResults validResults = null;

for (SchemaValidator schema : schemas) {
ValidationResults oneOfResults = new ValidationResults();
schema.validate(valueNode, oneOfResults);
ValidationResults schemaResults = new ValidationResults();
schema.validate(valueNode, schemaResults);

if (oneOfResults.isValid()) {
if (oneOfValidResults != null) {
if (schemaResults.isValid()) {
if (validResults != null) {
results.add(CRUMB_INFO, MANY_VALID_SCHEMA_ERR);
return;
}

oneOfValidResults = oneOfResults;
validResults = schemaResults;
} else {
resultsOnError.add(schemaResults);
}
}

if (oneOfValidResults != null) {
if (validResults != null) {
// Append potential results from sub validation (INFO / WARN)
results.add(results.crumbs(), oneOfValidResults);
results.add(results.crumbs(), validResults);
} else {
results.add(CRUMB_INFO, NO_VALID_SCHEMA_ERR);
for (ValidationResults result : resultsOnError) {
results.add(results.crumbs(), result);
}
}
}
}

0 comments on commit 2b26e83

Please sign in to comment.