You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2018/10/06 17:05:31 UTC

johnzon git commit: JOHNZON-191 ensure we validate the right value for meta validation (jsonschema): patternproperties and additionalProperties

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 <rm...@apache.org>
Authored: Sat Oct 6 19:05:19 2018 +0200
Committer: Romain Manni-Bucau <rm...@apache.org>
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());