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