summaryrefslogtreecommitdiffstats
path: root/gson/src/main/java
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2019-02-13 10:42:19 -0500
committerJim Hahn <jrh3@att.com>2019-02-13 15:45:44 -0500
commitd299d6ecb966971fa0226d4da7415bb1de62fe8c (patch)
treeed9f87155b0c7c0bec3e3f23135fbd7d7d68ecb0 /gson/src/main/java
parenteaaf4f237ad0dce620b5385ce8c7424dd01d2c26 (diff)
Refactor common class from gson code
The TypeAdapters in the gson-jackson code were nearly identical, so a common class was factored out. This also enabled junit tests to attain 100% coverage on that code, whereas there were a couple of branches that could not be tested previously. Addressed new sonar issues. Removed unused import. Change-Id: Id8e6460c881c6ce0239768f182e4e652cd10645f Issue-ID: POLICY-1428 Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'gson/src/main/java')
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java3
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java132
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java162
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java108
4 files changed, 175 insertions, 230 deletions
diff --git a/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java b/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java
index 66475e3e..6906696f 100644
--- a/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java
+++ b/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java
@@ -31,7 +31,6 @@ import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
@@ -117,7 +116,7 @@ public class GsonMessageBodyHandler implements MessageBodyReader<Object>, Messag
@Override
public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
- throws IOException, WebApplicationException {
+ throws IOException {
try (InputStreamReader streamReader = new InputStreamReader(entityStream, StandardCharsets.UTF_8)) {
Type jsonType = (type.equals(genericType) ? type : genericType);
diff --git a/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java b/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java
index 67c51449..3458a590 100644
--- a/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java
+++ b/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java
@@ -21,14 +21,9 @@
package org.onap.policy.common.gson;
import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonWriter;
-import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
@@ -36,6 +31,7 @@ import org.onap.policy.common.gson.internal.ClassWalker;
import org.onap.policy.common.gson.internal.Deserializer;
import org.onap.policy.common.gson.internal.FieldDeserializer;
import org.onap.policy.common.gson.internal.FieldSerializer;
+import org.onap.policy.common.gson.internal.JacksonTypeAdapter;
import org.onap.policy.common.gson.internal.Serializer;
/**
@@ -66,116 +62,40 @@ public class JacksonFieldAdapterFactory implements TypeAdapterFactory {
return null;
}
- return new JacksonFieldAdapter<>(gson, data, gson.getDelegateAdapter(this, type));
+ TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
+ List<Serializer> sers = makeSerializers(gson, data);
+ List<Deserializer> desers = makeDeserializers(gson, data);
+
+ return new JacksonTypeAdapter<>(gson, delegate, sers, desers);
}
/**
- * Adapter for a single class.
+ * Creates a complete list of serializers.
*
- * @param <T> type of class on which the adapter works
+ * @param gson the associated gson object
+ * @param data data used to configure the serializers
+ * @return a list of all serializers
*/
- private static class JacksonFieldAdapter<T> extends TypeAdapter<T> {
-
- /**
- * Used to create an object of the given class.
- */
- private final TypeAdapter<T> delegate;
-
- /**
- * Used to serialize/deserialize a JsonElement.
- */
- private final TypeAdapter<JsonElement> elementAdapter;
-
- /**
- * Serializers for each item within the object.
- */
- private final Serializer[] serializers;
-
- /**
- * Deserializers for each item within the object.
- */
- private final Deserializer[] deserializers;
-
- /**
- * Constructs the object.
- *
- * @param gson the associated gson object
- * @param data data used to configure the adapter
- * @param delegate default constructor for the type
- */
- public JacksonFieldAdapter(Gson gson, ClassWalker data, TypeAdapter<T> delegate) {
- this.delegate = delegate;
-
- this.elementAdapter = gson.getAdapter(JsonElement.class);
-
- // create serializers
- this.serializers = makeSerializers(gson, data).toArray(new Serializer[0]);
-
- // create deserializers
- this.deserializers = makeDeserializers(gson, data).toArray(new Deserializer[0]);
- }
-
- /**
- * Creates a complete list of serializers.
- *
- * @param gson the associated gson object
- * @param data data used to configure the serializers
- * @return a list of all serializers
- */
- private List<Serializer> makeSerializers(Gson gson, ClassWalker data) {
- List<Serializer> ser = new ArrayList<Serializer>();
-
- data.getOutProps(Field.class).forEach(field -> ser.add(new FieldSerializer(gson, field)));
-
- return ser;
- }
+ private List<Serializer> makeSerializers(Gson gson, ClassWalker data) {
+ List<Serializer> ser = new ArrayList<>();
- /**
- * Creates a complete list of deserializers.
- *
- * @param gson the associated gson object
- * @param data data used to configure the deserializers
- * @return a list of all deserializers
- */
- private List<Deserializer> makeDeserializers(Gson gson, ClassWalker data) {
- List<Deserializer> deser = new ArrayList<Deserializer>();
+ data.getOutProps(Field.class).forEach(field -> ser.add(new FieldSerializer(gson, field)));
- data.getInProps(Field.class).forEach(field -> deser.add(new FieldDeserializer(gson, field)));
-
- return deser;
- }
-
- @Override
- public void write(JsonWriter out, T value) throws IOException {
- JsonElement tree = delegate.toJsonTree(value);
-
- if (tree.isJsonObject()) {
- JsonObject jsonObj = tree.getAsJsonObject();
-
- // serialize each item from the value into the target tree
- for (Serializer serializer : serializers) {
- serializer.addToTree(value, jsonObj);
- }
- }
-
- elementAdapter.write(out, tree);
- }
-
- @Override
- public T read(JsonReader in) throws IOException {
- JsonElement tree = elementAdapter.read(in);
- T object = delegate.fromJsonTree(tree);
+ return ser;
+ }
- if (tree.isJsonObject()) {
- JsonObject jsonObj = tree.getAsJsonObject();
+ /**
+ * Creates a complete list of deserializers.
+ *
+ * @param gson the associated gson object
+ * @param data data used to configure the deserializers
+ * @return a list of all deserializers
+ */
+ private List<Deserializer> makeDeserializers(Gson gson, ClassWalker data) {
+ List<Deserializer> deser = new ArrayList<>();
- // deserialize each item from the tree into the target object
- for (Deserializer dser : deserializers) {
- dser.getFromTree(jsonObj, object);
- }
- }
+ data.getInProps(Field.class).forEach(field -> deser.add(new FieldDeserializer(gson, field)));
- return object;
- }
+ return deser;
}
}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java b/gson/src/main/java/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java
index 1c3039f7..de962316 100644
--- a/gson/src/main/java/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java
+++ b/gson/src/main/java/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java
@@ -21,14 +21,9 @@
package org.onap.policy.common.gson;
import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonWriter;
-import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
@@ -38,6 +33,7 @@ import org.onap.policy.common.gson.internal.AnyGetterSerializer;
import org.onap.policy.common.gson.internal.AnySetterDeserializer;
import org.onap.policy.common.gson.internal.ClassWalker;
import org.onap.policy.common.gson.internal.Deserializer;
+import org.onap.policy.common.gson.internal.JacksonTypeAdapter;
import org.onap.policy.common.gson.internal.MethodDeserializer;
import org.onap.policy.common.gson.internal.MethodSerializer;
import org.onap.policy.common.gson.internal.Serializer;
@@ -65,138 +61,60 @@ public class JacksonMethodAdapterFactory implements TypeAdapterFactory {
ClassWalker data = new ClassWalker();
data.walkClassHierarchy(clazz);
- if (data.getInProps(Method.class).isEmpty() && data.getOutProps(Method.class).isEmpty()) {
- if (data.getAnyGetter() == null && data.getAnySetter() == null) {
- // no methods to serialize
- return null;
- }
+ if (data.getInProps(Method.class).isEmpty() && data.getOutProps(Method.class).isEmpty()
+ && data.getAnyGetter() == null && data.getAnySetter() == null) {
+ // no methods to serialize
+ return null;
}
- return new JacksonMethodAdapter<>(gson, data, gson.getDelegateAdapter(this, type));
+ Set<String> unliftedProps = new HashSet<>();
+ unliftedProps.addAll(data.getInNotIgnored());
+ unliftedProps.addAll(data.getOutNotIgnored());
+
+ TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
+ List<Serializer> sers = makeSerializers(gson, data, unliftedProps);
+ List<Deserializer> desers = makeDeserializers(gson, data, unliftedProps);
+
+ return new JacksonTypeAdapter<>(gson, delegate, sers, desers);
}
/**
- * Adapter for a single class.
+ * Creates a complete list of serializers.
*
- * @param <T> type of class on which the adapter works
+ * @param gson the associated gson object
+ * @param data data used to configure the serializers
+ * @param unliftedProps properties that should not be lowered by "any-getters"
+ * @return a list of all serializers
*/
- private static class JacksonMethodAdapter<T> extends TypeAdapter<T> {
-
- /**
- * Used to create an object of the given class.
- */
- private final TypeAdapter<T> delegate;
-
- /**
- * Used to serialize/deserialize a JsonElement.
- */
- private final TypeAdapter<JsonElement> elementAdapter;
-
- /**
- * Serializers for each item within the object.
- */
- private final Serializer[] serializers;
-
- /**
- * Deserializers for each item within the object.
- */
- private final Deserializer[] deserializers;
-
- /**
- * Constructs the object.
- *
- * @param gson the associated gson object
- * @param data data used to configure the adapter
- * @param delegate default constructor for the type
- */
- public JacksonMethodAdapter(Gson gson, ClassWalker data, TypeAdapter<T> delegate) {
- this.delegate = delegate;
-
- this.elementAdapter = gson.getAdapter(JsonElement.class);
-
- Set<String> unliftedProps = new HashSet<>();
- unliftedProps.addAll(data.getInNotIgnored());
- unliftedProps.addAll(data.getOutNotIgnored());
-
- // create serializers
- this.serializers = makeSerializers(gson, data, unliftedProps).toArray(new Serializer[0]);
-
- // create deserializers
- this.deserializers = makeDeserializers(gson, data, unliftedProps).toArray(new Deserializer[0]);
- }
-
- /**
- * Creates a complete list of serializers.
- *
- * @param gson the associated gson object
- * @param data data used to configure the serializers
- * @param unliftedProps properties that should not be lowered by "any-getters"
- * @return a list of all serializers
- */
- private List<Serializer> makeSerializers(Gson gson, ClassWalker data, Set<String> unliftedProps) {
- List<Serializer> ser = new ArrayList<Serializer>();
-
- if (data.getAnyGetter() != null) {
- ser.add(new AnyGetterSerializer(gson, unliftedProps, data.getAnyGetter()));
- }
-
- data.getOutProps(Method.class).forEach(method -> ser.add(new MethodSerializer(gson, method)));
-
- return ser;
- }
-
- /**
- * Creates a complete list of deserializers.
- *
- * @param gson the associated gson object
- * @param data data used to configure the deserializers
- * @param unliftedProps properties that should not be lifted by "any-setters"
- * @return a list of all deserializers
- */
- private List<Deserializer> makeDeserializers(Gson gson, ClassWalker data, Set<String> unliftedProps) {
- List<Deserializer> deser = new ArrayList<Deserializer>();
+ private List<Serializer> makeSerializers(Gson gson, ClassWalker data, Set<String> unliftedProps) {
+ List<Serializer> ser = new ArrayList<>();
- if (data.getAnySetter() != null) {
- deser.add(new AnySetterDeserializer(gson, unliftedProps, data.getAnySetter()));
- }
-
- data.getInProps(Method.class).forEach(method -> deser.add(new MethodDeserializer(gson, method)));
-
- return deser;
+ if (data.getAnyGetter() != null) {
+ ser.add(new AnyGetterSerializer(gson, unliftedProps, data.getAnyGetter()));
}
- @Override
- public void write(JsonWriter out, T value) throws IOException {
- JsonElement tree = delegate.toJsonTree(value);
+ data.getOutProps(Method.class).forEach(method -> ser.add(new MethodSerializer(gson, method)));
- if (tree.isJsonObject()) {
- JsonObject jsonObj = tree.getAsJsonObject();
+ return ser;
+ }
- // serialize each item from the value into the target tree
- for (Serializer serializer : serializers) {
- serializer.addToTree(value, jsonObj);
- }
- }
+ /**
+ * Creates a complete list of deserializers.
+ *
+ * @param gson the associated gson object
+ * @param data data used to configure the deserializers
+ * @param unliftedProps properties that should not be lifted by "any-setters"
+ * @return a list of all deserializers
+ */
+ private List<Deserializer> makeDeserializers(Gson gson, ClassWalker data, Set<String> unliftedProps) {
+ List<Deserializer> deser = new ArrayList<>();
- elementAdapter.write(out, tree);
+ if (data.getAnySetter() != null) {
+ deser.add(new AnySetterDeserializer(gson, unliftedProps, data.getAnySetter()));
}
- @Override
- public T read(JsonReader in) throws IOException {
- JsonElement tree = elementAdapter.read(in);
-
- T object = delegate.fromJsonTree(tree);
-
- if (tree.isJsonObject()) {
- JsonObject jsonObj = tree.getAsJsonObject();
+ data.getInProps(Method.class).forEach(method -> deser.add(new MethodDeserializer(gson, method)));
- // deserialize each item from the tree into the target object
- for (Deserializer dser : deserializers) {
- dser.getFromTree(jsonObj, object);
- }
- }
-
- return object;
- }
+ return deser;
}
}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java
new file mode 100644
index 00000000..1171fd4d
--- /dev/null
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java
@@ -0,0 +1,108 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.common.gson.internal;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+import java.util.List;
+
+
+/**
+ * Adapter for a single class that implements a jackson-style behavior.
+ *
+ * @param <T> type of class on which the adapter works
+ */
+public class JacksonTypeAdapter<T> extends TypeAdapter<T> {
+
+ /**
+ * Used to create an object of the given class.
+ */
+ private final TypeAdapter<T> delegate;
+
+ /**
+ * Used to serialize/deserialize a JsonElement.
+ */
+ private final TypeAdapter<JsonElement> elementAdapter;
+
+ /**
+ * Serializers for each item within the object.
+ */
+ private final Serializer[] serializers;
+
+ /**
+ * Deserializers for each item within the object.
+ */
+ private final Deserializer[] deserializers;
+
+ /**
+ * Constructs the object.
+ *
+ * @param gson the associated gson object
+ * @param delegate default constructor for the type
+ * @param serializers the serializers to use to serialize items within the object
+ * @param deserializers the deserializers to use to deserialize items into the object
+ */
+ public JacksonTypeAdapter(Gson gson, TypeAdapter<T> delegate, List<Serializer> serializers,
+ List<Deserializer> deserializers) {
+ this.delegate = delegate;
+ this.elementAdapter = gson.getAdapter(JsonElement.class);
+ this.serializers = serializers.toArray(new Serializer[0]);
+ this.deserializers = deserializers.toArray(new Deserializer[0]);
+ }
+
+ @Override
+ public void write(JsonWriter out, T value) throws IOException {
+ JsonElement tree = delegate.toJsonTree(value);
+
+ if (tree.isJsonObject()) {
+ JsonObject jsonObj = tree.getAsJsonObject();
+
+ // serialize each item from the value into the target tree
+ for (Serializer serializer : serializers) {
+ serializer.addToTree(value, jsonObj);
+ }
+ }
+
+ elementAdapter.write(out, tree);
+ }
+
+ @Override
+ public T read(JsonReader in) throws IOException {
+ JsonElement tree = elementAdapter.read(in);
+ T object = delegate.fromJsonTree(tree);
+
+ if (tree.isJsonObject()) {
+ JsonObject jsonObj = tree.getAsJsonObject();
+
+ // deserialize each item from the tree into the target object
+ for (Deserializer dser : deserializers) {
+ dser.getFromTree(jsonObj, object);
+ }
+ }
+
+ return object;
+ }
+}