aboutsummaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2019-07-17 12:05:34 -0400
committerJim Hahn <jrh3@att.com>2019-07-17 14:46:31 -0400
commit37f4fef730a59fd5230b90e60039b05ed5e4d88b (patch)
treefd8adeff8a78f089fa2e263a59abc42a535f50c1 /utils
parentc82cc454fe4f08da7e27af31ac9c0a0ef9cf153b (diff)
Convert double to int when decoding via gson
Refactored MapDoubleAdapterFactory, extracting DoubleConverter to be used by code needing to convert Double to Integer/Long after being decoded by GSON. Enhanced StandardCoder to automatically use the above converter if the desired class is a generic Object. Change-Id: I1d4e83910de41ceda383f257bfea706db2b8fbbe Issue-ID: POLICY-1919 Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'utils')
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java22
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java9
2 files changed, 29 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 1c65be82..80eddb86 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.DoubleConverter;
import org.onap.policy.common.gson.MapDoubleAdapterFactory;
/**
@@ -238,7 +239,7 @@ public class StandardCoder implements Coder {
* @return the object represented by the given json string
*/
protected <T> T fromJson(String json, Class<T> clazz) {
- return GSON.fromJson(json, clazz);
+ return convertFromDouble(clazz, GSON.fromJson(json, clazz));
}
/**
@@ -249,7 +250,24 @@ public class StandardCoder implements Coder {
* @return the object represented by the given json string
*/
protected <T> T fromJson(Reader source, Class<T> clazz) {
- return GSON.fromJson(source, clazz);
+ return convertFromDouble(clazz, GSON.fromJson(source, clazz));
+ }
+
+ /**
+ * Converts a value from Double to Integer/Long, walking the value's contents if it's
+ * a List/Map. Only applies if the specified class refers to the Object class.
+ * Otherwise, it leaves the value unchanged.
+ *
+ * @param clazz class of object to be decoded
+ * @param value value to be converted
+ * @return the converted value
+ */
+ private <T> T convertFromDouble(Class<T> clazz, T value) {
+ if (clazz != Object.class) {
+ return value;
+ }
+
+ return clazz.cast(DoubleConverter.convertFromDouble(value));
}
/**
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 e8e3bb60..2992933f 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
@@ -201,6 +201,15 @@ public class StandardCoderTest {
}
@Test
+ public void testConvertFromDouble() throws Exception {
+ String text = "[listA, {keyA=100}, 200]";
+ assertEquals(text, coder.decode(text, Object.class).toString());
+
+ text = "{keyB=200}";
+ assertEquals(text, coder.decode(text, Object.class).toString());
+ }
+
+ @Test
public void testToStandard() throws Exception {
MyObject obj = new MyObject();
obj.abc = "xyz";