Repository: johnzon
Updated Branches:
  refs/heads/master 174ffa5ba -> f48879137


JOHNZON-109 fail on unknown properties support


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/f4887913
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/f4887913
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/f4887913

Branch: refs/heads/master
Commit: f48879137e8cb5fcc62ff24a4863658a8f868079
Parents: 174ffa5
Author: rmannibucau <[email protected]>
Authored: Fri Mar 17 16:22:20 2017 +0100
Committer: rmannibucau <[email protected]>
Committed: Fri Mar 17 16:22:20 2017 +0100

----------------------------------------------------------------------
 .../org/apache/johnzon/core/JsonReaderImpl.java |  2 +-
 .../jaxrs/ConfigurableJohnzonProvider.java      |  4 ++
 .../WildcardConfigurableJohnzonProvider.java    | 16 +++---
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java   |  4 ++
 .../apache/johnzon/jsonb/JohnzonBuilder.java    |  1 +
 .../jsonb/FailOnUnknownPropertiesTest.java      | 56 ++++++++++++++++++++
 .../java/org/apache/johnzon/mapper/Mapper.java  |  2 +-
 .../apache/johnzon/mapper/MapperBuilder.java    |  8 ++-
 .../org/apache/johnzon/mapper/MapperConfig.java |  8 ++-
 .../johnzon/mapper/MappingParserImpl.java       | 53 ++++++++++--------
 .../apache/johnzon/mapper/MapperConfigTest.java |  2 +-
 .../java/org/superbiz/ExtendMappingTest.java    |  2 +-
 .../main/java/javax/json/bind/JsonbConfig.java  | 17 ++++++
 13 files changed, 142 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
index b0107ee..a209a56 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -42,7 +42,7 @@ public class JsonReaderImpl implements JsonReader {
         return JsonStructure.class.cast(readValue());
     }
 
-    //@Override
+    @Override
     public JsonValue readValue() {
         checkClosed();
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
index dd8b79c..6e35b0a 100644
--- 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
+++ 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
@@ -116,6 +116,10 @@ public class ConfigurableJohnzonProvider<T> implements 
MessageBodyWriter<T>, Mes
         }
     }
 
+    public void setFailOnUnknownProperties(final boolean active) {
+        builder.setFailOnUnknownProperties(active);
+    }
+
     public void setSupportConstructors(final boolean supportConstructors) {
         builder.setSupportConstructors(supportConstructors);
     }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
index 4df4a7c..2ca7e12 100644
--- 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
+++ 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
@@ -43,14 +43,14 @@ import static java.util.Arrays.asList;
 
 @Provider
 @Produces({
-    "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
+        "*/json",
+        "*/*+json", "*/x-json",
+        "*/javascript", "*/x-javascript"
 })
 @Consumes({
-    "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
+        "*/json",
+        "*/*+json", "*/x-json",
+        "*/javascript", "*/x-javascript"
 })
 public class WildcardConfigurableJohnzonProvider<T> implements 
MessageBodyWriter<T>, MessageBodyReader<T> {
     // build/configuration
@@ -124,6 +124,10 @@ public class WildcardConfigurableJohnzonProvider<T> 
implements MessageBodyWriter
         }
     }
 
+    public void setFailOnUnknownProperties(final boolean active) {
+        builder.setFailOnUnknownProperties(active);
+    }
+
     public void setSupportConstructors(final boolean supportConstructors) {
         builder.setSupportConstructors(supportConstructors);
     }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
index 189dce4..fc17494 100644
--- 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
+++ 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
@@ -68,6 +68,10 @@ public class JsonbJaxrsProvider<T> implements 
MessageBodyWriter<T>, MessageBodyR
     }
 
     // config - main containers support the configuration of providers this way
+    public void setFailOnUnknownProperties(final boolean active) {
+        config.withFailOnUnknownProperties(active);
+    }
+
     public void setIJson(final boolean active) {
         config.withStrictIJSON(active);
     }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 137cf4c..a3a86ba 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -253,6 +253,7 @@ public class JohnzonBuilder implements JsonbBuilder {
         
config.getProperty(JsonbConfig.STRICT_IJSON).map(Boolean.class::cast).ifPresent(ijson
 -> {
             // no-op: https://tools.ietf.org/html/rfc7493 the only MUST of the 
spec should be fine by default
         });
+        
config.getProperty(JsonbConfig.FAIL_ON_UNKNOWN_PROPERTIES).map(Boolean.class::cast).ifPresent(builder::setFailOnUnknownProperties);
 
         
config.getProperty(JsonbConfig.BINARY_DATA_STRATEGY).map(String.class::cast).ifPresent(bin
 -> {
             switch (bin) {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.java
 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.java
new file mode 100644
index 0000000..0c52308
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/FailOnUnknownPropertiesTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.johnzon.jsonb;
+
+import org.junit.Test;
+
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.JsonbException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class FailOnUnknownPropertiesTest {
+    @Test
+    public void failOnUnknownProperties() {
+        final Jsonb jsonb = JsonbBuilder.create(new 
JsonbConfig().withFailOnUnknownProperties(true));
+
+        // valid
+        assertEquals("ok", jsonb.fromJson("{\"known\":\"ok\"}", 
Model.class).known);
+
+        try { // invalid
+            assertEquals("ok", 
jsonb.fromJson("{\"known\":\"ok\",\"unknown\":\"whatever\"}", 
Model.class).known);
+            fail();
+        } catch (final JsonbException jsone) {
+            assertEquals("(fail on unknown properties): [unknown]", 
jsone.getMessage());
+        }
+        try { // invalid but a missing key from the model
+            assertEquals("ok", jsonb.fromJson("{\"unknown\":\"whatever\"}", 
Model.class).known);
+            fail();
+        } catch (final JsonbException jsone) {
+            assertEquals("(fail on unknown properties): [unknown]", 
jsone.getMessage());
+        }
+    }
+
+    public static class Model {
+        public String known;
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
index 58aed8b..9fe2bc8 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
@@ -63,7 +63,7 @@ public class Mapper implements Closeable {
         this.mappings = new Mappings(config);
         this.readerHandler = ReaderHandler.create(readerFactory);
         this.closeables = closeables;
-        this.charset = config.getEncoding() == null ? null : 
config.getEncoding();
+        this.charset = config.getEncoding();
     }
 
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
index b3e57eb..606e7a9 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -129,6 +129,7 @@ public class MapperBuilder {
     private Map<Class<?>, ObjectConverter.Writer<?>> objectConverterWriters = 
new HashMap<Class<?>, ObjectConverter.Writer<?>>();
     private Map<Class<?>, String[]> ignoredForFields = new HashMap<Class<?>, 
String[]>();
     private boolean primitiveConverters;
+    private boolean failOnUnknownProperties;
 
     public Mapper build() {
         if (readerFactory == null || generatorFactory == null) {
@@ -215,10 +216,15 @@ public class MapperBuilder {
                         version, close,
                         skipNull, skipEmptyArray,
                         treatByteArrayAsBase64, treatByteArrayAsBase64URL, 
readAttributeBeforeWrite,
-                        accessMode, encoding, attributeOrder, 
enforceQuoteString),
+                        accessMode, encoding, attributeOrder, 
enforceQuoteString, failOnUnknownProperties),
                 closeables);
     }
 
+    public MapperBuilder setFailOnUnknownProperties(final boolean 
failOnUnknownProperties) {
+        this.failOnUnknownProperties = failOnUnknownProperties;
+        return this;
+    }
+
     public MapperBuilder addCloseable(final Closeable closeable) {
         closeables.add(closeable);
         return this;

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index efb38f6..7b84f7a 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -63,6 +63,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
     private final Map<Class<?>, ObjectConverter.Reader<?>> 
objectConverterReaders;
     private final Comparator<String> attributeOrder;
     private final boolean enforceQuoteString;
+    private final boolean failOnUnknown;
 
     private final Map<Class<?>, ObjectConverter.Writer<?>> 
objectConverterWriterCache;
     private final Map<Class<?>, ObjectConverter.Reader<?>> 
objectConverterReaderCache;
@@ -78,7 +79,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
                         final boolean readAttributeBeforeWrite,
                         final AccessMode accessMode, final Charset encoding,
                         final Comparator<String> attributeOrder,
-                        final boolean enforceQuoteString) {
+                        final boolean enforceQuoteString, final boolean 
failOnUnknown) {
     //CHECKSTYLE:ON
         this.objectConverterWriters = objectConverterWriters;
         this.objectConverterReaders = objectConverterReaders;
@@ -94,6 +95,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
         this.adapters = adapters;
         this.attributeOrder = attributeOrder;
         this.enforceQuoteString = enforceQuoteString;
+        this.failOnUnknown = failOnUnknown;
 
         this.objectConverterWriterCache = new HashMap<Class<?>, 
ObjectConverter.Writer<?>>(objectConverterWriters.size());
         this.objectConverterReaderCache = new HashMap<Class<?>, 
ObjectConverter.Reader<?>>(objectConverterReaders.size());
@@ -220,6 +222,10 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
         return converter;
     }
 
+    public boolean isFailOnUnknown() {
+        return failOnUnknown;
+    }
+
     public int getVersion() {
         return version;
     }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index 9164f7a..3e2a66e 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -19,7 +19,6 @@
 package org.apache.johnzon.mapper;
 
 import org.apache.johnzon.core.JsonLongImpl;
-import org.apache.johnzon.core.JsonReaderImpl;
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.converter.CharacterConverter;
 import org.apache.johnzon.mapper.converter.EnumConverter;
@@ -82,6 +81,17 @@ public class MappingParserImpl implements MappingParser {
     private static final Adapter<Object, String> FALLBACK_CONVERTER = new 
ConverterAdapter<Object>(new FallbackConverter());
     private static final JohnzonParameterizedType ANY_LIST = new 
JohnzonParameterizedType(List.class, Object.class);
     private static final CharacterConverter CHARACTER_CONVERTER = new 
CharacterConverter(); // this one is particular, share the logic
+    private static final boolean HAS_READ_VALUE;
+    static {
+        boolean hasReadValue; // v1.0 vs v1.1
+        try {
+            JsonReader.class.getDeclaredMethod("readValue");
+            hasReadValue = true;
+        } catch (final Error | NoSuchMethodException e) {
+            hasReadValue = false;
+        }
+        HAS_READ_VALUE = hasReadValue;
+    }
 
     protected final ConcurrentMap<Adapter<?, ?>, AdapterKey> 
reverseAdaptersRegistry;
     protected final ConcurrentMap<Class<?>, Method> valueOfs = new 
ConcurrentHashMap<Class<?>, Method>();
@@ -92,27 +102,20 @@ public class MappingParserImpl implements MappingParser {
     private final JsonReader jsonReader;
 
 
-
     public MappingParserImpl(MapperConfig config, Mappings mappings, 
JsonReader jsonReader) {
         this.config = config;
         this.mappings = mappings;
 
         this.jsonReader = jsonReader;
 
-        reverseAdaptersRegistry = new ConcurrentHashMap<Adapter<?, ?>, 
AdapterKey>(config.getAdapters().size());
+        reverseAdaptersRegistry = new 
ConcurrentHashMap<>(config.getAdapters().size());
     }
 
 
     @Override
     public <T> T readObject(Type targetType) {
-
         try {
-            if 
(jsonReader.getClass().getName().equals("org.apache.johnzon.core.JsonReaderImpl"))
 {
-                // later in JSON-P 1.1 we can remove this hack again
-                return readObject(((JsonReaderImpl) jsonReader).readValue(), 
targetType);
-            }
-
-            return readObject(jsonReader.read(), targetType);
+            return readObject(HAS_READ_VALUE ? jsonReader.readValue() : 
jsonReader.read(), targetType);
         } finally {
             if (config.isClose()) {
                 jsonReader.close();
@@ -287,6 +290,14 @@ public class MappingParserImpl implements MappingParser {
             throw new MapperException(classMapping.clazz + " not 
instantiable");
         }
 
+        if (config.isFailOnUnknown()) {
+            if (!classMapping.setters.keySet().containsAll(object.keySet())) {
+                throw new MapperException("(fail on unknown properties): " + 
new HashSet<String>(object.keySet()) {{
+                    removeAll(classMapping.setters.keySet());
+                }});
+            }
+        }
+
         final Object t = classMapping.factory.getParameterTypes().length == 0 ?
                 classMapping.factory.create(null) : 
classMapping.factory.create(createParameters(classMapping, object));
         for (final Map.Entry<String, Mappings.Setter> setter : 
classMapping.setters.entrySet()) {
@@ -436,8 +447,8 @@ public class MappingParserImpl implements MappingParser {
             throw new MapperException("Unable to parse " + jsonValue + " to 
boolean");
         }
 
-        if(config.isTreatByteArrayAsBase64() && jsonValue.getValueType() == 
JsonValue.ValueType.STRING && (type == byte[].class /*|| type == 
Byte[].class*/)) {
-            return 
DatatypeConverter.parseBase64Binary(((JsonString)jsonValue).getString());
+        if (config.isTreatByteArrayAsBase64() && jsonValue.getValueType() == 
JsonValue.ValueType.STRING && (type == byte[].class /*|| type == 
Byte[].class*/)) {
+            return DatatypeConverter.parseBase64Binary(((JsonString) 
jsonValue).getString());
         }
 
         if (Object.class == type) { // handling specific types here to keep 
exception in standard handling
@@ -449,7 +460,7 @@ public class MappingParserImpl implements MappingParser {
             }
             if (JsonNumber.class.isInstance(jsonValue)) {
                 final JsonNumber jsonNumber = JsonNumber.class.cast(jsonValue);
-                if(jsonNumber.isIntegral()) {
+                if (jsonNumber.isIntegral()) {
                     return jsonNumber.intValue();
                 }
                 return jsonNumber.doubleValue();
@@ -609,11 +620,11 @@ public class MappingParserImpl implements MappingParser {
         for (int i = 0; i < length; i++) {
 
             objects[i] = toValue(null,
-                                 
object.get(mapping.factory.getParameterNames()[i]),
-                                 mapping.factory.getParameterConverter()[i],
-                                 
mapping.factory.getParameterItemConverter()[i],
-                                 mapping.factory.getParameterTypes()[i],
-                                 null); //X TODO ObjectConverter in 
@JOhnzonConverter with Constructors!
+                    object.get(mapping.factory.getParameterNames()[i]),
+                    mapping.factory.getParameterConverter()[i],
+                    mapping.factory.getParameterItemConverter()[i],
+                    mapping.factory.getParameterTypes()[i],
+                    null); //X TODO ObjectConverter in @JOhnzonConverter with 
Constructors!
         }
 
         return objects;
@@ -632,8 +643,8 @@ public class MappingParserImpl implements MappingParser {
         }
 
         return converter == null ? toObject(baseInstance, jsonValue, type, 
itemConverter)
-                                 : jsonValue.getValueType() == 
JsonValue.ValueType.STRING ? 
converter.to(JsonString.class.cast(jsonValue).getString())
-                                                                               
           : convertTo(converter, jsonValue);
+                : jsonValue.getValueType() == JsonValue.ValueType.STRING ? 
converter.to(JsonString.class.cast(jsonValue).getString())
+                : convertTo(converter, jsonValue);
     }
 
 
@@ -713,7 +724,7 @@ public class MappingParserImpl implements MappingParser {
         @Override
         public Object fromString(final String text) {
             throw new MapperException("Using fallback converter, " +
-                                      "this only works in write mode but not 
in read. Please register a custom converter to do so.");
+                    "this only works in write mode but not in read. Please 
register a custom converter to do so.");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
index f51ce91..ca693f4 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
@@ -166,7 +166,7 @@ public class MapperConfigTest {
                                 new FieldAccessMode(true, true),
                                 Charset.forName("UTF-8"),
                                 null,
-                                false);
+                                false, false);
     }
 
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java 
b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
index 14844bd..712a8e6 100644
--- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
+++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
@@ -71,7 +71,7 @@ public class ExtendMappingTest {
                         public int compare(final String o1, final String o2) {
                             return o1.compareTo(o2);
                         }
-                    }, false));
+                    }, false, false));
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f4887913/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java
----------------------------------------------------------------------
diff --git a/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java 
b/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java
index 597c88c..528b1b9 100644
--- a/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java
+++ b/jsonb-api/src/main/java/javax/json/bind/JsonbConfig.java
@@ -32,6 +32,7 @@ import java.util.Optional;
 public class JsonbConfig {
     private final Map<String, Object> configuration = new HashMap<>();
 
+    public static final String FAIL_ON_UNKNOWN_PROPERTIES = 
"jsonb.fail-on-unknown-properties";
     public static final String FORMATTING = "jsonb.formatting";
     public static final String ENCODING = "jsonb.encoding";
     public static final String PROPERTY_NAMING_STRATEGY = 
"jsonb.property-naming-strategy";
@@ -46,6 +47,10 @@ public class JsonbConfig {
     public static final String SERIALIZERS = "jsonb.serializers";
     public static final String DESERIALIZERS = "jsonb.derializers";
 
+    public final JsonbConfig withFailOnUnknownProperties(final Boolean 
failOnUnknownProperties) {
+        return setProperty(FAIL_ON_UNKNOWN_PROPERTIES, 
failOnUnknownProperties);
+    }
+
     public final JsonbConfig withDateFormat(final String dateFormat, final 
Locale locale) {
         return setProperty(DATE_FORMAT, dateFormat).setProperty(LOCALE, locale 
!= null ? locale : Locale.getDefault());
     }
@@ -100,6 +105,18 @@ public class JsonbConfig {
     }
 
     public final JsonbConfig withAdapters(final JsonbAdapter... adapters) {
+        if (adapters == null || adapters.length == 0) {
+            return this;
+        }
+
+        final Optional<Object> opt = getProperty(ADAPTERS);
+        if (opt.isPresent()) {
+            final JsonbAdapter[] existing = 
JsonbAdapter[].class.cast(opt.get());
+            final JsonbAdapter[] aggregated = new JsonbAdapter[existing.length 
+ adapters.length];
+            System.arraycopy(existing, 0, aggregated, 0, existing.length);
+            System.arraycopy(adapters, 0, aggregated, existing.length + 1, 
adapters.length);
+            return setProperty(ADAPTERS, aggregated);
+        }
         return setProperty(ADAPTERS, adapters);
     }
 

Reply via email to