diff options
author | Jim Hahn <jrh3@att.com> | 2019-02-13 10:42:19 -0500 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2019-02-13 15:45:44 -0500 |
commit | d299d6ecb966971fa0226d4da7415bb1de62fe8c (patch) | |
tree | ed9f87155b0c7c0bec3e3f23135fbd7d7d68ecb0 /gson/src/main/java/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java | |
parent | eaaf4f237ad0dce620b5385ce8c7424dd01d2c26 (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/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java')
-rw-r--r-- | gson/src/main/java/org/onap/policy/common/gson/JacksonMethodAdapterFactory.java | 162 |
1 files changed, 40 insertions, 122 deletions
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; } } |