diff options
author | Jim Hahn <jrh3@att.com> | 2019-02-04 18:19:15 -0500 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2019-02-05 15:38:49 -0500 |
commit | 20f911459a62058b854d0379acb348b93b56ede5 (patch) | |
tree | edb1dc00c3594db59b5fcf0821c4b1a4300e4ae6 /utils/src/main | |
parent | bda6bcb4f61cd4b42b216db9a9b2c7dcaa72997e (diff) |
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 <jrh3@att.com>
Diffstat (limited to 'utils/src/main')
-rw-r--r-- | utils/src/main/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategy.java | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/utils/src/main/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategy.java b/utils/src/main/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategy.java new file mode 100644 index 00000000..96213a65 --- /dev/null +++ b/utils/src/main/java/org/onap/policy/common/utils/gson/JacksonExclusionStrategy.java @@ -0,0 +1,104 @@ +/* + * ============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 com.google.gson.ExclusionStrategy; +import com.google.gson.FieldAttributes; +import com.google.gson.JsonElement; +import java.lang.reflect.GenericArrayType; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Excludes all fields from serialization/deserialization, if the class is managed. + */ +public class JacksonExclusionStrategy implements ExclusionStrategy { + + /** + * Classes that are explicitly not managed by the GSON jackson adapters. + */ + // @formatter:off + private static final Set<Class<?>> unmanaged = new HashSet<>(Arrays.asList( + boolean.class, + byte.class, + short.class, + int.class, + long.class, + float.class, + double.class, + char.class, + Boolean.class, + Byte.class, + Short.class, + Integer.class, + Long.class, + Float.class, + Double.class, + Character.class, + String.class)); + // @formatter:on + + /** + * Classes whose subclasses are explicitly not managed by the GSON jackson adapters. + */ + // @formatter:off + private static final Set<Class<?>> unmanagedSuper = new HashSet<>(Arrays.asList( + GenericArrayType.class, + Map.class, + Collection.class, + JsonElement.class)); + // @formatter:on + + @Override + public boolean shouldSkipField(FieldAttributes attrs) { + return isManaged(attrs.getDeclaringClass()); + } + + @Override + public boolean shouldSkipClass(Class<?> clazz) { + return false; + } + + /** + * Determines if a class is managed by this adapter, which typically means that it is + * <i>not</i> a generic class such as {@link JsonElement} or some type of collection. + * + * @param clazz the class to be examined + * @return {@code true} if the class is managed by this adapter, {@code false} + * otherwise + */ + public static boolean isManaged(Class<?> clazz) { + if (clazz.isArray() || clazz.isEnum() || clazz.isPrimitive() || unmanaged.contains(clazz)) { + return false; + } + + for (Class<?> sup : unmanagedSuper) { + if (sup.isAssignableFrom(clazz)) { + return false; + } + } + + return true; + } +} |