diff options
Diffstat (limited to 'utils/src/main/java/org')
3 files changed, 166 insertions, 1 deletions
diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/Coder.java b/utils/src/main/java/org/onap/policy/common/utils/coder/Coder.java index 66a308f7..bb51f2b9 100644 --- a/utils/src/main/java/org/onap/policy/common/utils/coder/Coder.java +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/Coder.java @@ -106,4 +106,22 @@ public interface Coder { * @throws CoderException if an error occurs */ <T> T decode(File source, Class<T> clazz) throws CoderException; + + /** + * Converts an object/POJO to a standard object. + * + * @param object object to be converted + * @return a new standard object representing the original object + * @throws CoderException if an error occurs + */ + StandardCoderObject toStandard(Object object) throws CoderException; + + /** + * Converts a standard object to an object/POJO. + * + * @param sco the standard object to be converted + * @return a new object represented by the standard object + * @throws CoderException if an error occurs + */ + <T> T fromStandard(StandardCoderObject sco, Class<T> clazz) throws CoderException; } 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 389720f9..69a211b6 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 @@ -21,6 +21,11 @@ package org.onap.policy.common.utils.coder; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -42,7 +47,8 @@ public class StandardCoder implements Coder { /** * Gson object used to encode and decode messages. */ - private static final Gson GSON = new Gson(); + private static final Gson GSON = new GsonBuilder() + .registerTypeAdapter(StandardCoderObject.class, new StandardTypeAdapter()).create(); /** * Constructs the object. @@ -137,6 +143,26 @@ public class StandardCoder implements Coder { } } + @Override + public StandardCoderObject toStandard(Object object) throws CoderException { + try { + return new StandardCoderObject(GSON.toJsonTree(object)); + + } catch (RuntimeException e) { + throw new CoderException(e); + } + } + + @Override + public <T> T fromStandard(StandardCoderObject sco, Class<T> clazz) throws CoderException { + try { + return GSON.fromJson(sco.getData(), clazz); + + } catch (RuntimeException e) { + throw new CoderException(e); + } + } + // the remaining methods are wrappers that can be overridden by junit tests /** @@ -223,4 +249,32 @@ public class StandardCoder implements Coder { protected <T> T fromJson(Reader source, Class<T> clazz) { return GSON.fromJson(source, clazz); } + + /** + * Adapter for standard objects. + */ + private static class StandardTypeAdapter extends TypeAdapter<StandardCoderObject> { + + /** + * Used to read/write a JsonElement. + */ + private static TypeAdapter<JsonElement> elementAdapter = new Gson().getAdapter(JsonElement.class); + + /** + * Constructs the object. + */ + public StandardTypeAdapter() { + super(); + } + + @Override + public void write(JsonWriter out, StandardCoderObject value) throws IOException { + elementAdapter.write(out, value.getData()); + } + + @Override + public StandardCoderObject read(JsonReader in) throws IOException { + return new StandardCoderObject(elementAdapter.read(in)); + } + } } diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java new file mode 100644 index 00000000..60c5f4ef --- /dev/null +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java @@ -0,0 +1,93 @@ +/* + * ============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.utils.coder; + +import com.google.gson.JsonElement; + +/** + * Object type used by the {@link StandardCoder}. Different serialization tools have + * different "standard objects". For instance, GSON uses {@link JsonElement}. This class + * wraps that object so that it can be used without exposing the object, itself. + */ +public class StandardCoderObject { + + /** + * Data wrapped by this. + */ + private final JsonElement data; + + /** + * Constructs the object. + */ + public StandardCoderObject() { + data = null; + } + + /** + * Constructs the object. + * + * @param data data wrapped by this object. + */ + protected StandardCoderObject(JsonElement data) { + this.data = data; + } + + /** + * Gets the data wrapped by this. + * + * @return the data wrapped by this + */ + protected JsonElement getData() { + return data; + } + + /** + * Gets a field's value from this object, traversing the object hierarchy. + * + * @param fields field hierarchy + * @return the field value or {@code null} if the field does not exist or is not a + * primitive + */ + public String getString(String... fields) { + + /* + * This could be relatively easily modified to allow Integer arguments, as well, + * which would be used to specify indices within an array. + */ + + JsonElement jel = data; + + for (String field : fields) { + if (jel == null) { + return null; + } + + if (jel.isJsonObject()) { + jel = jel.getAsJsonObject().get(field); + + } else { + return null; + } + } + + return (jel != null && jel.isJsonPrimitive() ? jel.getAsString() : null); + } +} |