Repository: johnzon Updated Branches: refs/heads/master 6a7f7b2e2 -> d6bb9526b
JOHNZON-191 ensure we validate the right value for meta validation (jsonschema): patternproperties and additionalProperties Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/d6bb9526 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/d6bb9526 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/d6bb9526 Branch: refs/heads/master Commit: d6bb9526bbd84e9a81d25c333364966c28fef801 Parents: 6a7f7b2 Author: Romain Manni-Bucau <[email protected]> Authored: Sat Oct 6 19:05:19 2018 +0200 Committer: Romain Manni-Bucau <[email protected]> Committed: Sat Oct 6 19:05:19 2018 +0200 ---------------------------------------------------------------------- .../jsonschema/JsonSchemaValidatorFactory.java | 11 ++++---- .../jsonschema/spi/builtin/TypeValidation.java | 27 +++++++++++++------- .../jsonschema/JsonSchemaValidatorTest.java | 8 +++--- 3 files changed, 28 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/d6bb9526/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java index 1eb2fbb..a873dfe 100644 --- a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java +++ b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java @@ -192,10 +192,11 @@ public class JsonSchemaValidatorFactory implements AutoCloseable { } return validable.asJsonObject().entrySet().stream() .filter(e -> pattern.test(e.getKey())) - .flatMap(e -> buildValidator( - Stream.concat(Stream.of(path), Stream.of(e.getKey())).toArray(String[]::new), - currentSchema, - new ChainedValueAccessor(valueProvider, e.getKey())).apply(e.getValue())); + .flatMap(e -> { + final String[] subPath = Stream.concat(Stream.of(path), Stream.of(e.getKey())).toArray(String[]::new); + final Function<JsonValue, JsonValue> provider = new ChainedValueAccessor(valueProvider, e.getKey()); + return buildValidator(subPath, currentSchema, provider).apply(validable); + }); }; }) .collect(toList())) @@ -231,7 +232,7 @@ public class JsonSchemaValidatorFactory implements AutoCloseable { .flatMap(e -> buildValidator( Stream.concat(Stream.of(path), Stream.of(e.getKey())).toArray(String[]::new), currentSchema, - new ChainedValueAccessor(valueProvider, e.getKey())).apply(e.getValue())); + new ChainedValueAccessor(valueProvider, e.getKey())).apply(validable)); }; }) .orElse(NO_VALIDATION); http://git-wip-us.apache.org/repos/asf/johnzon/blob/d6bb9526/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/TypeValidation.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/TypeValidation.java b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/TypeValidation.java index b99685f..f44573f 100644 --- a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/TypeValidation.java +++ b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/TypeValidation.java @@ -18,13 +18,15 @@ */ package org.apache.johnzon.jsonschema.spi.builtin; -import static java.util.Arrays.asList; -import static java.util.stream.Collectors.joining; +import static java.util.Comparator.comparing; +import static java.util.stream.Collectors.toList; +import java.util.Collection; import java.util.Optional; import java.util.function.Function; import java.util.stream.Stream; +import javax.json.JsonString; import javax.json.JsonValue; import org.apache.johnzon.jsonschema.ValidationResult; @@ -34,7 +36,11 @@ import org.apache.johnzon.jsonschema.spi.ValidationExtension; public class TypeValidation implements ValidationExtension { @Override public Optional<Function<JsonValue, Stream<ValidationResult.ValidationError>>> create(final ValidationContext model) { - switch (model.getSchema().getString("type", "object")) { + final JsonString value = model.getSchema().getJsonString("type"); + if (value == null) { + return Optional.empty(); + } + switch (JsonString.class.cast(value).getString()) { case "string": return Optional.of(new Impl(model.toPointer(), model.getValueProvider(), JsonValue.ValueType.STRING)); case "number": @@ -50,11 +56,14 @@ public class TypeValidation implements ValidationExtension { } private static class Impl extends BaseValidation { - private final JsonValue.ValueType[] types; + private final Collection<JsonValue.ValueType> types; private Impl(final String pointer, final Function<JsonValue, JsonValue> extractor, final JsonValue.ValueType... types) { - super(pointer, extractor, JsonValue.ValueType.OBJECT /*ignored*/); - this.types = types; + super(pointer, extractor, types[0] /*ignored anyway*/); + this.types = Stream.concat(Stream.of(types), Stream.of(JsonValue.ValueType.NULL)) + .distinct() + .sorted(comparing(JsonValue.ValueType::name)) + .collect(toList()); } @Override @@ -63,18 +72,18 @@ public class TypeValidation implements ValidationExtension { return Stream.empty(); } final JsonValue value = extractor.apply(root); - if (value == null || Stream.of(types).anyMatch(it -> it == value.getValueType()) || JsonValue.ValueType.NULL == value.getValueType()) { + if (value == null || types.contains(value.getValueType())) { return Stream.empty(); } return Stream.of(new ValidationResult.ValidationError( pointer, - "Expected " + Stream.of(types).map(JsonValue.ValueType::name).collect(joining(", ")) + " but got " + value.getValueType())); + "Expected " + types + " but got " + value.getValueType())); } @Override public String toString() { return "Type{" + - "type=" + asList(types) + + "type=" + types + ", pointer='" + pointer + '\'' + '}'; } http://git-wip-us.apache.org/repos/asf/johnzon/blob/d6bb9526/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java index ff101c6..ed41c1e 100644 --- a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java +++ b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java @@ -105,7 +105,7 @@ public class JsonSchemaValidatorTest { assertEquals(1, errors.size()); final ValidationResult.ValidationError error = errors.iterator().next(); assertEquals("/name", error.getField()); - assertEquals("Expected STRING but got NUMBER", error.getMessage()); + assertEquals("Expected [NULL, STRING] but got NUMBER", error.getMessage()); validator.close(); } @@ -146,7 +146,7 @@ public class JsonSchemaValidatorTest { assertEquals(1, errors.size()); final ValidationResult.ValidationError error = errors.iterator().next(); assertEquals("/person/name", error.getField()); - assertEquals("Expected STRING but got OBJECT", error.getMessage()); + assertEquals("Expected [NULL, STRING] but got OBJECT", error.getMessage()); validator.close(); } @@ -172,7 +172,7 @@ public class JsonSchemaValidatorTest { assertEquals(1, errors.size()); final ValidationResult.ValidationError error = errors.iterator().next(); assertEquals("/name", error.getField()); - assertEquals("Expected STRING but got NUMBER", error.getMessage()); + assertEquals("Expected [NULL, STRING] but got NUMBER", error.getMessage()); validator.close(); } @@ -569,7 +569,7 @@ public class JsonSchemaValidatorTest { assertTrue(validator.apply(jsonFactory.createObjectBuilder() .add("1", 1) .build()).isSuccess()); - assertTrue(validator.apply(jsonFactory.createObjectBuilder() + assertFalse(validator.apply(jsonFactory.createObjectBuilder() .add("1", "test") .build()).isSuccess());
