This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git


The following commit(s) were added to refs/heads/master by this push:
     new 12cd64c  JOHNZON-243 support of long as requested by jsonb (js range 
for serialization + BigDecimal on Number for deserialization)
12cd64c is described below

commit 12cd64ccb67e03cbbabf7d73ac714658d350aaa8
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Sun Aug 11 21:43:38 2019 +0200

    JOHNZON-243 support of long as requested by jsonb (js range for 
serialization + BigDecimal on Number for deserialization)
---
 .../johnzon/jaxrs/ConfigurableJohnzonProvider.java |  4 ++
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java      |  4 ++
 .../org/apache/johnzon/jsonb/JohnzonBuilder.java   |  3 ++
 .../org/apache/johnzon/mapper/MapperBuilder.java   |  8 +++-
 .../org/apache/johnzon/mapper/MapperConfig.java    |  9 +++-
 .../johnzon/mapper/MappingGeneratorImpl.java       | 18 ++++++-
 .../apache/johnzon/mapper/MappingParserImpl.java   |  6 +--
 .../johnzon/mapper/AdvancedGenericsTest.java       |  2 -
 .../apache/johnzon/mapper/MapperConfigTest.java    |  2 +-
 .../johnzon/mapper/NumberSerializationTest.java    | 56 ++++++++++++++++++++++
 .../test/java/org/superbiz/ExtendMappingTest.java  |  2 +-
 11 files changed, 103 insertions(+), 11 deletions(-)

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 0d34696..9aa9993 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
@@ -106,6 +106,10 @@ public class ConfigurableJohnzonProvider<T> implements 
MessageBodyWriter<T>, Mes
         instance().writeTo(t, rawType, genericType, annotations, mediaType, 
httpHeaders, entityStream);
     }
 
+    public void setUseJsRange(final boolean value) {
+        builder.setUseJsRange(value);
+    }
+
     // type=a,b,c|type2=d,e
     public void setIgnoreFieldsForType(final String mapping) {
         for (final String config : mapping.split(" *| *")) {
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 9ef611c..30bf771 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
@@ -86,6 +86,10 @@ public class JsonbJaxrsProvider<T> implements 
MessageBodyWriter<T>, MessageBodyR
         customized = true;
     }
 
+    public void setUseJsRange(final boolean value) {
+        config.setProperty("johnzon.use-js-range", value);
+    }
+
     public void setOtherProperties(final String others) {
         final Properties properties = new Properties() {{
             try {
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 722a1d0..b02a445 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
@@ -188,6 +188,9 @@ public class JohnzonBuilder implements JsonbBuilder {
         config.getProperty("johnzon.interfaceImplementationMapping")
                 .map(Map.class::cast)
                 .ifPresent(builder::setInterfaceImplementationMapping);
+        builder.setUseJsRange(config.getProperty("johnzon.use-js-range")
+                .map(v -> !Boolean.class.isInstance(v) ? 
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
+                .orElse(true));
 
         final Map<AdapterKey, Adapter<?, ?>> defaultConverters = 
createJava8Converters(builder);
 
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 258ce5f..4c286d6 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
@@ -143,6 +143,7 @@ public class MapperBuilder {
     private SerializeValueFilter serializeValueFilter;
     private boolean useBigDecimalForFloats;
     private Boolean deduplicateObjects = null;
+    private boolean useJsRange;
 
     public Mapper build() {
         if (readerFactory == null || generatorFactory == null) {
@@ -254,7 +255,7 @@ public class MapperBuilder {
                         treatByteArrayAsBase64, treatByteArrayAsBase64URL, 
readAttributeBeforeWrite,
                         accessMode, encoding, attributeOrder, 
enforceQuoteString, failOnUnknownProperties,
                         serializeValueFilter, useBigDecimalForFloats, 
deduplicateObjects,
-                        interfaceImplementationMapping),
+                        interfaceImplementationMapping, useJsRange),
                 closeables);
     }
 
@@ -516,4 +517,9 @@ public class MapperBuilder {
         this.deduplicateObjects = deduplicateObjects;
         return this;
     }
+
+    public MapperBuilder setUseJsRange(boolean value) {
+        this.useJsRange = value;
+        return this;
+    }
 }
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 02b150d..f13d83f 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
@@ -51,6 +51,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
     };
 
     private final int version;
+    private final boolean useJsRange;
     private final boolean close;
     private final boolean skipNull;
     private final boolean skipEmptyArray;
@@ -90,7 +91,8 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
                         final SerializeValueFilter serializeValueFilter,
                         final boolean useBigDecimalForFloats,
                         final Boolean deduplicateObjects,
-                        final Map<Class<?>, Class<?>> 
interfaceImplementationMapping) {
+                        final Map<Class<?>, Class<?>> 
interfaceImplementationMapping,
+                        final boolean useJsRange) {
     //CHECKSTYLE:ON
         this.objectConverterWriters = objectConverterWriters;
         this.objectConverterReaders = objectConverterReaders;
@@ -103,6 +105,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
         this.readAttributeBeforeWrite = readAttributeBeforeWrite;
         this.accessMode = accessMode;
         this.encoding = encoding;
+        this.useJsRange = useJsRange;
 
         // handle Adapters
         this.adapters = adapters;
@@ -122,6 +125,10 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
         this.deduplicateObjects = deduplicateObjects;
     }
 
+    public boolean isUseJsRange() {
+        return useJsRange;
+    }
+
     public Map<Class<?>, Class<?>> getInterfaceImplementationMapping() {
         return interfaceImplementationMapping;
     }
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
index ca1c049..43dc1c9 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
@@ -218,7 +218,12 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
             generator.write(value.toString());
             handled = true;
         } else if (type == long.class || type == Long.class) {
-            generator.write(Long.class.cast(value).longValue());
+            final long longValue = Long.class.cast(value).longValue();
+            if (isInJsRange(longValue)) {
+                generator.write(longValue);
+            } else {
+                generator.write(value.toString());
+            }
             handled = true;
         } else if (isInt(type)) {
             generator.write(Number.class.cast(value).intValue());
@@ -261,7 +266,12 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
             generator.write(key, JsonValue.class.cast(value));
             handled = true;
         } else if (type == long.class || type == Long.class) {
-            generator.write(key, Long.class.cast(value).longValue());
+            final long longValue = Long.class.cast(value).longValue();
+            if (isInJsRange(longValue)) {
+                generator.write(key, longValue);
+            } else {
+                generator.write(key, value.toString());
+            }
             handled = true;
         } else if (isInt(type)) {
             generator.write(key, Number.class.cast(value).intValue());
@@ -683,4 +693,8 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
         return converter.from(value);
     }
 
+    private boolean isInJsRange(final Number longValue) {
+        return !config.isUseJsRange() ||
+                (longValue.longValue() <= 9007199254740991L && 
longValue.longValue() >= -9007199254740991L);
+    }
 }
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 886f29a..64ce2b9 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
@@ -179,7 +179,7 @@ public class MappingParserImpl implements MappingParser {
             if (targetType == short.class || targetType == Short.class) {
                 return (T) Short.valueOf((short) number.intValue());
             }
-            if (targetType == BigDecimal.class) {
+            if (targetType == BigDecimal.class || Number.class == targetType) {
                 return (T) number.bigDecimalValue();
             }
             if (targetType == BigInteger.class) {
@@ -488,7 +488,7 @@ public class MappingParserImpl implements MappingParser {
                     return 
converter.to(JsonNumber.class.cast(jsonValue).doubleValue());
                 } else if (BigInteger.class == key.getTo()) {
                     return 
converter.to(JsonNumber.class.cast(jsonValue).bigIntegerValue());
-                } else if (BigDecimal.class == key.getTo()) {
+                } else if (BigDecimal.class == key.getTo() ||  Number.class == 
key.getTo()) {
                     return 
converter.to(JsonNumber.class.cast(jsonValue).bigDecimalValue());
                 } else if (JsonNumber.class == key.getTo()) {
                     return converter.to(JsonNumber.class.cast(jsonValue));
@@ -618,7 +618,7 @@ public class MappingParserImpl implements MappingParser {
                 return number.bigIntegerValue();
             }
 
-            if (type == BigDecimal.class) {
+            if (type == BigDecimal.class ||  Number.class == type) {
                 return number.bigDecimalValue();
             }
 
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
index fb0e219..318e8bf 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/AdvancedGenericsTest.java
@@ -36,8 +36,6 @@ public class AdvancedGenericsTest {
         return asList("field", "method", "both", "strict-method");
     }
 
-
-
     @Test
     public void testSerializeHierarchyOne() {
         Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
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 c447606..5cb7e57 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
@@ -169,7 +169,7 @@ public class MapperConfigTest {
                                 new FieldAccessMode(true, true),
                                 Charset.forName("UTF-8"),
                                 null,
-                                false, false, null, false, false, emptyMap());
+                                false, false, null, false, false, emptyMap(), 
true);
     }
 
 
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NumberSerializationTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NumberSerializationTest.java
new file mode 100644
index 0000000..1759018
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NumberSerializationTest.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.mapper;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.math.BigDecimal;
+
+import org.junit.Test;
+
+public class NumberSerializationTest {
+    @Test
+    public void toJson() {
+        final Mapper mapper = new MapperBuilder().setUseJsRange(true).build();
+        final Holder holder = new Holder();
+        holder.value = 1;
+        assertEquals("{\"value\":1}", mapper.writeObjectAsString(holder));
+        holder.value = Long.MAX_VALUE;
+        assertEquals("{\"value\":\"9223372036854775807\"}", 
mapper.writeObjectAsString(holder));
+        mapper.close();
+    }
+
+    @Test
+    public void numberFromJson() {
+        final Mapper mapper = new MapperBuilder().build();
+        final Num num = mapper.readObject("{\"value\":0}", Num.class);
+        assertTrue(BigDecimal.class.isInstance(num.value));
+        assertEquals(0, num.value.intValue());
+        mapper.close();
+    }
+
+    public static class Holder {
+        public long value;
+    }
+
+    public static class Num {
+        public Number value;
+    }
+}
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java 
b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
index 5e55ddf..7ecf5a4 100644
--- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
+++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
@@ -66,7 +66,7 @@ public class ExtendMappingTest {
                     -1, true, true, true, false, false, false,
                     new FieldAccessMode(false, false),
                     Charset.forName("UTF-8"), String::compareTo, false, false, 
null, false, false,
-                    emptyMap()));
+                    emptyMap(), true));
         }
 
         @Override

Reply via email to