aboutsummaryrefslogtreecommitdiffstats
path: root/utils/src
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2019-04-10 20:08:30 -0400
committerJim Hahn <jrh3@att.com>2019-04-11 08:58:10 -0400
commitea29ed1a002ab282a36761448575ffc2e517284d (patch)
tree1127a1d9acd8899b5d39323b56465455e26320fe /utils/src
parentf5586edf6bb68016b4259829b57ca7e3528b126a (diff)
Don't map JSON values to Double
By default, gson treats all numbers as Double when placed into a generic Map. This is not backward compatible with existing policy APIs. Added a type adapter that walks Map objects and converts the Double values to Integer or Long, where possible. Made this the default behavior in the GsonMessageBodyHandler, the JacksonHandler, and the StandardCoder. Also fixed a couple of checkstyle errors in the gson project. Change-Id: I9ac0c77e6592d1c039646f0662c077b77a1e9aaf Issue-ID: POLICY-1542 Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'utils/src')
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java6
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java26
2 files changed, 30 insertions, 2 deletions
diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java
index 69a211b6..1c65be82 100644
--- a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java
+++ b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java
@@ -38,6 +38,7 @@ import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
+import org.onap.policy.common.gson.MapDoubleAdapterFactory;
/**
* JSON encoder and decoder using the "standard" mechanism, which is currently gson.
@@ -47,8 +48,9 @@ public class StandardCoder implements Coder {
/**
* Gson object used to encode and decode messages.
*/
- private static final Gson GSON = new GsonBuilder()
- .registerTypeAdapter(StandardCoderObject.class, new StandardTypeAdapter()).create();
+ private static final Gson GSON =
+ new GsonBuilder().registerTypeAdapter(StandardCoderObject.class, new StandardTypeAdapter())
+ .registerTypeAdapterFactory(new MapDoubleAdapterFactory()).create();
/**
* Constructs the object.
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java
index 7583d776..e8e3bb60 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java
@@ -43,7 +43,9 @@ import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.junit.Before;
import org.junit.Test;
@@ -235,6 +237,26 @@ public class StandardCoderTest {
assertThatThrownBy(() -> coder.fromJson(new StringReader("["), StandardCoderObject.class));
}
+ @Test
+ public void testMapDouble() throws Exception {
+ MyMap map = new MyMap();
+ map.props = new HashMap<>();
+ map.props.put("plainString", "def");
+ map.props.put("negInt", -10);
+ map.props.put("doubleVal", 12.5);
+ map.props.put("posLong", 100000000000L);
+
+ String json = coder.encode(map);
+
+ map.props.clear();
+ map = coder.decode(json, MyMap.class);
+
+ assertEquals("def", map.props.get("plainString"));
+ assertEquals(-10, map.props.get("negInt"));
+ assertEquals(100000000000L, map.props.get("posLong"));
+ assertEquals(12.5, map.props.get("doubleVal"));
+ }
+
private static class MyObject {
private String abc;
@@ -244,4 +266,8 @@ public class StandardCoderTest {
return "MyObject [abc=" + abc + "]";
}
}
+
+ private static class MyMap {
+ private Map<String, Object> props;
+ }
}