From 20f911459a62058b854d0379acb348b93b56ede5 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Mon, 4 Feb 2019 18:19:15 -0500 Subject: Skip all fields in gson by default Created an exclusion strategy that will prevent gson from serializing any fields within a class. The strategy must be registered to take effect. Uses lists to identify classes to be excluded when using gson with the jackson default behavior. Change-Id: I747fb1159846ad3000f69603f9b5d3f03bc8764f Issue-ID: POLICY-1428 Signed-off-by: Jim Hahn --- .../utils/gson/JacksonExclusionStrategyTest.java | 202 +++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 utils/src/test/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategyTest.java (limited to 'utils/src/test/java') diff --git a/utils/src/test/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategyTest.java b/utils/src/test/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategyTest.java new file mode 100644 index 00000000..e8927902 --- /dev/null +++ b/utils/src/test/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategyTest.java @@ -0,0 +1,202 @@ +/* + * ============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.gson; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import com.google.gson.FieldAttributes; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import java.lang.reflect.GenericArrayType; +import java.util.LinkedList; +import java.util.TreeMap; +import org.junit.BeforeClass; +import org.junit.Test; + +public class JacksonExclusionStrategyTest { + + private static JacksonExclusionStrategy strategy; + private static Gson gson; + + @BeforeClass + public static void setUpBeforeClass() { + strategy = new JacksonExclusionStrategy(); + gson = new GsonBuilder().setExclusionStrategies(strategy).create(); + } + + @Test + public void testWithGson() { + Derived data = new Derived(); + data.setId(10); + data.setText("some text"); + data.setValue("some value"); + + // no fields should be serialized + String result = gson.toJson(data); + assertEquals("{}", result); + + // no fields should be deserialized + result = "{'id':20, 'text':'my text', 'value':'my value'}".replace('\'', '"'); + Derived data2 = gson.fromJson(result, Derived.class); + assertEquals(new Derived().toString(), data2.toString()); + } + + @Test + public void testShouldSkipField() throws Exception { + // should skip every field of Data + assertTrue(strategy.shouldSkipField(new FieldAttributes(Data.class.getDeclaredField("id")))); + assertTrue(strategy.shouldSkipField(new FieldAttributes(Data.class.getDeclaredField("text")))); + + // should not skip fields in Map + assertFalse(strategy.shouldSkipField(new FieldAttributes(MyMap.class.getDeclaredField("mapId")))); + } + + @Test + public void testShouldSkipClass() { + assertFalse(strategy.shouldSkipClass(null)); + assertFalse(strategy.shouldSkipClass(Object.class)); + } + + @Test + public void testIsManaged() { + assertTrue(JacksonExclusionStrategy.isManaged(Data.class)); + assertTrue(JacksonExclusionStrategy.isManaged(Intfc.class)); + assertTrue(JacksonExclusionStrategy.isManaged(com.google.gson.TypeAdapter.class)); + + // generic classes + assertFalse(JacksonExclusionStrategy.isManaged(new Data[0].getClass())); + assertFalse(JacksonExclusionStrategy.isManaged(Enum.class)); + assertFalse(JacksonExclusionStrategy.isManaged(boolean.class)); + assertFalse(JacksonExclusionStrategy.isManaged(byte.class)); + assertFalse(JacksonExclusionStrategy.isManaged(short.class)); + assertFalse(JacksonExclusionStrategy.isManaged(int.class)); + assertFalse(JacksonExclusionStrategy.isManaged(long.class)); + assertFalse(JacksonExclusionStrategy.isManaged(float.class)); + assertFalse(JacksonExclusionStrategy.isManaged(double.class)); + assertFalse(JacksonExclusionStrategy.isManaged(char.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Boolean.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Byte.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Short.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Integer.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Long.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Float.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Double.class)); + assertFalse(JacksonExclusionStrategy.isManaged(Character.class)); + assertFalse(JacksonExclusionStrategy.isManaged(String.class)); + assertFalse(JacksonExclusionStrategy.isManaged(MyMap.class)); + assertFalse(JacksonExclusionStrategy.isManaged(MyList.class)); + assertFalse(JacksonExclusionStrategy.isManaged(MyJson.class)); + assertFalse(JacksonExclusionStrategy.isManaged(GenericArrayType.class)); + } + + /** + * Used to verify that no fields are exposed. + */ + public static class Data { + private int id; + public String text; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public String toString() { + return "Data [id=" + id + ", text=" + text + "]"; + } + } + + public static class Derived extends Data { + protected String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "Derived [value=" + value + ", " + super.toString() + "]"; + } + } + + /** + * Used to verify that enums are not managed. + */ + public static enum Enum { + UP, DOWN, + } + + /** + * Used to verify that interfaces are managed. + */ + public static interface Intfc { + int getId(); + } + + /** + * Used to verify that Maps are not managed. + */ + public static class MyMap extends TreeMap { + private static final long serialVersionUID = 1L; + + private int mapId; + + public int getMapId() { + return mapId; + } + } + + /** + * Used to verify that Collections are not managed. + */ + public static class MyList extends LinkedList { + private static final long serialVersionUID = 1L; + } + + /** + * Used to verify that JsonElements are not managed. + */ + public static class MyJson extends JsonElement { + @Override + public JsonElement deepCopy() { + return null; + } + } +} -- cgit 1.2.3-korg