Repository: johnzon
Updated Branches:
  refs/heads/master 12b25ba79 -> 0a45f1968


JOHNZON-117 patch from Kimmel Tamas to enhance our number handling in generic 
structures (map etc), thanks a lot


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

Branch: refs/heads/master
Commit: 0a45f19686ef2da774a1a939526942ea71c4dff6
Parents: 12b25ba
Author: rmannibucau <[email protected]>
Authored: Tue May 30 10:34:07 2017 +0200
Committer: rmannibucau <[email protected]>
Committed: Tue May 30 10:34:07 2017 +0200

----------------------------------------------------------------------
 .../jaxrs/ConfigurableJohnzonProvider.java      |  4 +++
 .../WildcardConfigurableJohnzonProvider.java    |  4 +++
 .../apache/johnzon/jsonb/JohnzonBuilder.java    |  3 ++
 .../johnzon/jsonb/DefaultMappingTest.java       |  6 ++--
 .../apache/johnzon/mapper/MapperBuilder.java    |  8 ++++-
 .../org/apache/johnzon/mapper/MapperConfig.java |  8 ++++-
 .../johnzon/mapper/MappingParserImpl.java       | 38 ++++++++++----------
 .../org/apache/johnzon/mapper/LiteralTest.java  | 10 ++++++
 .../apache/johnzon/mapper/MapperConfigTest.java |  2 +-
 .../java/org/superbiz/ExtendMappingTest.java    |  2 +-
 10 files changed, 60 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 f59d48e..160ee21 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
@@ -224,4 +224,8 @@ public class ConfigurableJohnzonProvider<T> implements 
MessageBodyWriter<T>, Mes
             throw new IllegalArgumentException(e.getCause());
         }
     }
+
+    public void setUseBigDecimalForFloats(final boolean 
useBigDecimalForFloats) {
+        builder.setUseBigDecimalForFloats(useBigDecimalForFloats);
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 2ca7e12..445d810 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
@@ -219,4 +219,8 @@ public class WildcardConfigurableJohnzonProvider<T> 
implements MessageBodyWriter
     public void setPrimitiveConverters(final boolean val) {
         builder.setPrimitiveConverters(val);
     }
+
+    public void setUseBigDecimalForFloats(final boolean 
useBigDecimalForFloats) {
+        builder.setUseBigDecimalForFloats(useBigDecimalForFloats);
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 36c21b6..e2b2708 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
@@ -210,6 +210,9 @@ public class JohnzonBuilder implements JsonbBuilder {
         config.getProperty("johnzon.primitiveConverters")
                 .map(v -> !Boolean.class.isInstance(v) ? 
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
                 .ifPresent(builder::setPrimitiveConverters);
+        config.getProperty("johnzon.useBigDecimalForFloats")
+                .map(v -> !Boolean.class.isInstance(v) ? 
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
+                .ifPresent(builder::setUseBigDecimalForFloats);
 
         final Map<AdapterKey, Adapter<?, ?>> defaultConverters = 
createJava8Converters(builder);
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java
index 5c99371..d638d5a 100644
--- 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java
@@ -340,11 +340,11 @@ public class DefaultMappingTest {
         //Map
         Map<String, Object> map = (Map<String, Object>) 
JSONB.fromJson("{\"name\":\"unknown object\"}", Object.class);
 
-        //mapping for number  -> Integer, Long, BigDecimal
-        Map<String, Object> mapWithBigDecimal = (Map<String, Object>) 
JSONB.fromJson("{\"intValue\":5,\"longValue\":17179869184,\"otherValue\":1.2}", 
Object.class);
+        //mapping for number  -> Integer, Long, Double
+        Map<String, Object> mapWithBigDecimal = (Map<String, Object>) 
JSONB.fromJson("{\"intValue\":5,\"longValue\":17179869184,\"doubleValue\":1.2}",
 Object.class);
         assertTrue(mapWithBigDecimal.get("intValue") instanceof Integer);
         assertTrue(mapWithBigDecimal.get("longValue") instanceof Long);
-        assertTrue(mapWithBigDecimal.get("otherValue") instanceof BigDecimal);
+        assertTrue(mapWithBigDecimal.get("doubleValue") instanceof Double);
 
         //Collection
         /* why collection and not array or sthg else?

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 059bf1e..ca0244f 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
@@ -131,6 +131,7 @@ public class MapperBuilder {
     private boolean primitiveConverters;
     private boolean failOnUnknownProperties;
     private SerializeValueFilter serializeValueFilter;
+    private boolean useBigDecimalForFloats;
 
     public Mapper build() {
         if (readerFactory == null || generatorFactory == null) {
@@ -218,7 +219,7 @@ public class MapperBuilder {
                         skipNull, skipEmptyArray,
                         treatByteArrayAsBase64, treatByteArrayAsBase64URL, 
readAttributeBeforeWrite,
                         accessMode, encoding, attributeOrder, 
enforceQuoteString, failOnUnknownProperties,
-                        serializeValueFilter),
+                        serializeValueFilter, useBigDecimalForFloats),
                 closeables);
     }
 
@@ -402,4 +403,9 @@ public class MapperBuilder {
         this.serializeValueFilter = serializeValueFilter;
         return this;
     }
+
+    public MapperBuilder setUseBigDecimalForFloats(final boolean 
useBigDecimalForFloats) {
+        this.useBigDecimalForFloats = useBigDecimalForFloats;
+        return this;
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 cbd3437..5e9ccea 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
@@ -65,6 +65,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
     private final boolean enforceQuoteString;
     private final boolean failOnUnknown;
     private final SerializeValueFilter serializeValueFilter;
+    private final boolean useBigDecimalForFloats;
 
     private final Map<Class<?>, ObjectConverter.Writer<?>> 
objectConverterWriterCache;
     private final Map<Class<?>, ObjectConverter.Reader<?>> 
objectConverterReaderCache;
@@ -81,7 +82,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
                         final AccessMode accessMode, final Charset encoding,
                         final Comparator<String> attributeOrder,
                         final boolean enforceQuoteString, final boolean 
failOnUnknown,
-                        final SerializeValueFilter serializeValueFilter) {
+                        final SerializeValueFilter serializeValueFilter, 
boolean useBigDecimalForFloats) {
     //CHECKSTYLE:ON
         this.objectConverterWriters = objectConverterWriters;
         this.objectConverterReaders = objectConverterReaders;
@@ -102,6 +103,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
 
         this.objectConverterWriterCache = new HashMap<Class<?>, 
ObjectConverter.Writer<?>>(objectConverterWriters.size());
         this.objectConverterReaderCache = new HashMap<Class<?>, 
ObjectConverter.Reader<?>>(objectConverterReaders.size());
+        this.useBigDecimalForFloats = useBigDecimalForFloats;
     }
 
     public SerializeValueFilter getSerializeValueFilter() {
@@ -294,4 +296,8 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
     public boolean isEnforceQuoteString() {
         return enforceQuoteString;
     }
+
+    public boolean isUseBigDecimalForFloats() {
+        return useBigDecimalForFloats;
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 4810f9d..a97427f 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
@@ -18,7 +18,6 @@
  */
 package org.apache.johnzon.mapper;
 
-import org.apache.johnzon.core.JsonLongImpl;
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.converter.CharacterConverter;
 import org.apache.johnzon.mapper.converter.EnumConverter;
@@ -247,18 +246,7 @@ public class MappingParserImpl implements MappingParser {
                         for (final Map.Entry<String, JsonValue> value : 
object.entrySet()) {
                             final JsonValue jsonValue = value.getValue();
                             if (JsonNumber.class.isInstance(jsonValue) && any) 
{
-                                final JsonNumber number = 
JsonNumber.class.cast(jsonValue);
-                                if (JsonLongImpl.class.isInstance(number)) {
-                                    final int integer = number.intValue();
-                                    final long asLong = number.longValue();
-                                    if (integer == asLong) {
-                                        map.put(value.getKey(), integer);
-                                    } else {
-                                        map.put(value.getKey(), asLong);
-                                    }
-                                } else {
-                                    map.put(value.getKey(), 
!number.isIntegral() ? number.bigDecimalValue() : number.intValue());
-                                }
+                                map.put(value.getKey(), 
toNumberValue(JsonNumber.class.cast(jsonValue)));
                             } else if (JsonString.class.isInstance(jsonValue) 
&& any) {
                                 map.put(value.getKey(), 
JsonString.class.cast(jsonValue).getString());
                             } else {
@@ -353,6 +341,24 @@ public class MappingParserImpl implements MappingParser {
         return t;
     }
 
+    private Number toNumberValue(JsonNumber jsonNumber) {
+        if (jsonNumber.isIntegral()) {
+            final int intValue = jsonNumber.intValue();
+            final long longValue = jsonNumber.longValue();
+            if (intValue == longValue) {
+                return intValue;
+            } else {
+                return longValue;
+            }
+        } else {
+            if (config.isUseBigDecimalForFloats()) {
+                return jsonNumber.bigDecimalValue();
+            } else {
+                return jsonNumber.doubleValue();
+            }
+        }
+    }
+
     private Object convertTo(final Adapter converter, final JsonValue 
jsonValue) {
         if (jsonValue.getValueType() == JsonValue.ValueType.OBJECT) {
 
@@ -462,11 +468,7 @@ public class MappingParserImpl implements MappingParser {
                 return false;
             }
             if (JsonNumber.class.isInstance(jsonValue)) {
-                final JsonNumber jsonNumber = JsonNumber.class.cast(jsonValue);
-                if (jsonNumber.isIntegral()) {
-                    return jsonNumber.intValue();
-                }
-                return jsonNumber.doubleValue();
+                return toNumberValue(JsonNumber.class.cast(jsonValue));
             }
         }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
index dc74f24..830779e 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
@@ -85,6 +85,16 @@ public class LiteralTest {
 
     }
 
+    @Test
+    public void readWhenUseBigDecimalForFloats() throws Exception {
+        final String json = "[1.5]";
+        final List<Object> expected = new ArrayList<Object>();
+        expected.add(new BigDecimal(1.5d));
+        final Collection<Object> read = new 
MapperBuilder().setUseBigDecimalForFloats(true).build()
+                .readCollection(new StringReader(json), new 
JohnzonParameterizedType(List.class, Object.class));
+        assertEquals(expected, read);
+    }
+
     @Test(expected = NumberFormatException.class)
     public void writeReadNumbersInf() {
         final NumberClass nc = new NumberClass();

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 949b230..a84a1cd 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, null);
+                                false, false, null, false);
     }
 
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/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 1960d4e..6c0c3de 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, null));
+                    }, false, false, null, false));
         }
 
         @Override

Reply via email to