diff options
author | Jim Hahn <jrh3@att.com> | 2019-04-10 20:08:30 -0400 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2019-04-11 08:58:10 -0400 |
commit | ea29ed1a002ab282a36761448575ffc2e517284d (patch) | |
tree | 1127a1d9acd8899b5d39323b56465455e26320fe /utils | |
parent | f5586edf6bb68016b4259829b57ca7e3528b126a (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')
-rw-r--r-- | utils/pom.xml | 5 | ||||
-rw-r--r-- | utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java | 6 | ||||
-rw-r--r-- | utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java | 26 |
3 files changed, 35 insertions, 2 deletions
diff --git a/utils/pom.xml b/utils/pom.xml index 15c00124..f20cdac1 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -43,6 +43,11 @@ <version>${project.version}</version> </dependency> <dependency> + <groupId>org.onap.policy.common</groupId> + <artifactId>gson</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> 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; + } } |