aboutsummaryrefslogtreecommitdiffstats
path: root/gson/src/main/java/org/onap/policy/common/gson/internal
diff options
context:
space:
mode:
Diffstat (limited to 'gson/src/main/java/org/onap/policy/common/gson/internal')
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java7
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/AnyGetterSerializer.java83
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/AnySetterDeserializer.java58
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/Lifter.java62
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/MethodAdapter.java69
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/MethodDeserializer.java53
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/MethodSerializer.java47
7 files changed, 375 insertions, 4 deletions
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java b/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
index b4ef53f7..bb8672bb 100644
--- a/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
@@ -86,12 +86,11 @@ public class Adapter {
*
* @param gson Gson object providing type adapters
* @param accessor method used to access the item from within an object
- * @param forGetter {@code true} if the name is for a "getter" method, {@code false}
- * if for a "setter"
* @param valueType the class of value on which this operates
*/
- public Adapter(Gson gson, Method accessor, boolean forGetter, Type valueType) {
- this.propName = (forGetter ? detmGetterPropName(accessor) : detmSetterPropName(accessor));
+ public Adapter(Gson gson, Method accessor, Type valueType) {
+ boolean forSetter = (accessor.getReturnType() == void.class);
+ this.propName = (forSetter ? detmSetterPropName(accessor) : detmGetterPropName(accessor));
this.reader = new ConvInfo(TypeToken.get(valueType));
this.gson = gson;
this.fullName = getQualifiedName(accessor);
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/AnyGetterSerializer.java b/gson/src/main/java/org/onap/policy/common/gson/internal/AnyGetterSerializer.java
new file mode 100644
index 00000000..da9ad173
--- /dev/null
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/AnyGetterSerializer.java
@@ -0,0 +1,83 @@
+/*
+ * ============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.JsonParseException;
+import java.lang.reflect.Method;
+import java.util.Map.Entry;
+import java.util.Set;
+
+/**
+ * Serializer for methods having a JsonAnyGetter annotation.
+ */
+public class AnyGetterSerializer extends Lifter implements Serializer {
+
+ public static final String NOT_AN_OBJECT_ERR = "expecting a JsonObject for ";
+
+ /**
+ * Constructs the object.
+ *
+ * @param gson Gson object providing type adapters
+ * @param propName property name associated with the lifted field
+ * @param unliftedProps property names that should not be lifted
+ * @param getter method used to get the item from within an object
+ */
+ public AnyGetterSerializer(Gson gson, Set<String> unliftedProps, Method getter) {
+ super(gson, unliftedProps, getter, getter.getGenericReturnType());
+ }
+
+ @Override
+ public void addToTree(Object source, JsonObject target) {
+ // get the value from the object
+ Object value = invoke(source);
+ if (value == null) {
+ // nothing to lift
+ return;
+ }
+
+ JsonElement inner = toJsonTree(value);
+ if (!inner.isJsonObject()) {
+ throw new JsonParseException(makeError(NOT_AN_OBJECT_ERR));
+ }
+
+ // lift items from inner into the target
+ copyLiftedItems(inner.getAsJsonObject(), target);
+ }
+
+ /**
+ * Copies lifted items from one tree into another, without removing them from the
+ * source tree.
+ *
+ * @param source tree from which items are to be copied
+ * @param target tree into which items are to be copied
+ */
+ private void copyLiftedItems(JsonObject source, JsonObject target) {
+ for (Entry<String, JsonElement> ent : source.entrySet()) {
+ String name = ent.getKey();
+ if (shouldLift(name)) {
+ target.add(name, ent.getValue());
+ }
+ }
+ }
+}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/AnySetterDeserializer.java b/gson/src/main/java/org/onap/policy/common/gson/internal/AnySetterDeserializer.java
new file mode 100644
index 00000000..85d42dfa
--- /dev/null
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/AnySetterDeserializer.java
@@ -0,0 +1,58 @@
+/*
+ * ============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 java.lang.reflect.Method;
+import java.util.Map.Entry;
+import java.util.Set;
+
+/**
+ * De-serializer for methods having a JsonAnySetter annotation.
+ */
+public class AnySetterDeserializer extends Lifter implements Deserializer {
+
+ /**
+ * Constructs the object.
+ *
+ * @param gson Gson object providing type adapters
+ * @param unliftedProps property names that should not be lifted
+ * @param getter method used to get the item from within an object
+ */
+ public AnySetterDeserializer(Gson gson, Set<String> unliftedProps, Method setter) {
+ super(gson, unliftedProps, setter, setter.getGenericParameterTypes()[1]);
+ }
+
+ @Override
+ public void getFromTree(JsonObject source, Object target) {
+ for (Entry<String, JsonElement> ent : source.entrySet()) {
+ String name = ent.getKey();
+
+ if (shouldLift(name)) {
+ Object value = fromJsonTree(ent.getValue());
+ invoke(target, name, value);
+ }
+ }
+ }
+
+}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/Lifter.java b/gson/src/main/java/org/onap/policy/common/gson/internal/Lifter.java
new file mode 100644
index 00000000..bb8ec321
--- /dev/null
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/Lifter.java
@@ -0,0 +1,62 @@
+/*
+ * ============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 java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Set;
+
+/**
+ * Super class of serializers and de-serializers that deal with "lifted" data, that is,
+ * data that is lifted from a nested json object into the containing object.
+ */
+public class Lifter extends MethodAdapter {
+
+ /**
+ * Names of the properties that are <i>not</i> to be lifted.
+ */
+ private final Set<String> unliftedProps;
+
+ /**
+ * Constructs the object.
+ *
+ * @param gson Gson object providing type adapters
+ * @param unliftedProps property names that should not be lifted
+ * @param accessor method used to access the item from within an object
+ * @param type the class of value on which this operates
+ */
+ public Lifter(Gson gson, Set<String> unliftedProps, Method accessor, Type type) {
+ super(gson, accessor, type);
+
+ this.unliftedProps = unliftedProps;
+ }
+
+ /**
+ * Determines if a property should be lifted.
+ *
+ * @param propName the name of the property
+ * @return {@code true} if the property should be lifted, {@code false} otherwise
+ */
+ public boolean shouldLift(String propName) {
+ return !unliftedProps.contains(propName);
+ }
+}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/MethodAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/internal/MethodAdapter.java
new file mode 100644
index 00000000..579864da
--- /dev/null
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/MethodAdapter.java
@@ -0,0 +1,69 @@
+/*
+ * ============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.JsonParseException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+
+/**
+ * Super class of adapters used to serialize and de-serialize a method.
+ */
+public class MethodAdapter extends Adapter {
+
+ public static final String INVOKE_ERR = "cannot invoke method to serialize/deserialize: ";
+
+ /**
+ * Method used to access the item within an object.
+ */
+ private final Method accessor;
+
+ /**
+ * Constructs the object.
+ *
+ * @param gson Gson object providing type adapters
+ * @param accessor method used to access the item from within an object
+ * @param type the class of value on which this operates
+ */
+ public MethodAdapter(Gson gson, Method accessor, Type type) {
+ super(gson, accessor, type);
+
+ this.accessor = accessor;
+ }
+
+ /**
+ * Invokes the accessor method.
+ *
+ * @param self object on which to invoke the method
+ * @param args arguments to be passed to the method
+ * @return the method's result
+ */
+ public Object invoke(Object self, Object... args) {
+ try {
+ return accessor.invoke(self, args);
+
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ throw new JsonParseException(makeError(INVOKE_ERR), e);
+ }
+ }
+}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/MethodDeserializer.java b/gson/src/main/java/org/onap/policy/common/gson/internal/MethodDeserializer.java
new file mode 100644
index 00000000..bb0724eb
--- /dev/null
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/MethodDeserializer.java
@@ -0,0 +1,53 @@
+/*
+ * ============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 java.lang.reflect.Method;
+
+/**
+ * De-serializer for methods that are exposed.
+ */
+public class MethodDeserializer extends MethodAdapter implements Deserializer {
+
+ /**
+ * Constructs the object.
+ *
+ * @param gson Gson object providing type adapters
+ * @param setter method used to set the item within an object
+ */
+ public MethodDeserializer(Gson gson, Method setter) {
+ super(gson, setter, setter.getGenericParameterTypes()[0]);
+ }
+
+ @Override
+ public void getFromTree(JsonObject source, Object target) {
+ JsonElement jsonEl = source.get(getPropName());
+ if (jsonEl == null || jsonEl.isJsonNull()) {
+ return;
+ }
+
+ invoke(target, fromJsonTree(jsonEl));
+ }
+
+}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/MethodSerializer.java b/gson/src/main/java/org/onap/policy/common/gson/internal/MethodSerializer.java
new file mode 100644
index 00000000..ab544614
--- /dev/null
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/MethodSerializer.java
@@ -0,0 +1,47 @@
+/*
+ * ============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.JsonObject;
+import java.lang.reflect.Method;
+
+/**
+ * Serializer for methods that are exposed.
+ */
+public class MethodSerializer extends MethodAdapter implements Serializer {
+
+ /**
+ * Constructs the object.
+ *
+ * @param gson Gson object providing type adapters
+ * @param getter method used to get the item from within an object
+ */
+ public MethodSerializer(Gson gson, Method getter) {
+ super(gson, getter, getter.getGenericReturnType());
+ }
+
+ @Override
+ public void addToTree(Object source, JsonObject target) {
+ Object value = invoke(source);
+ target.add(getPropName(), (value == null ? null : toJsonTree(value)));
+ }
+}