diff options
Diffstat (limited to 'gson/src/main')
19 files changed, 485 insertions, 72 deletions
diff --git a/gson/src/main/java/org/onap/policy/common/gson/DoubleConverter.java b/gson/src/main/java/org/onap/policy/common/gson/DoubleConverter.java index 81803ff2..4d10bd13 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/DoubleConverter.java +++ b/gson/src/main/java/org/onap/policy/common/gson/DoubleConverter.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019, 2021 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. @@ -25,18 +25,17 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; /** * Converter for Double values. By default, GSON treats all Objects that are numbers, as * Double. This converts Doubles to Integer or Long, if possible. It converts stand-alone * Doubles, as well as those found within Arrays and Maps. */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class DoubleConverter { - private DoubleConverter() { - // do nothing - } - /** * Performs in-place conversion of all values in a list. * @@ -98,7 +97,7 @@ public class DoubleConverter { } Double num = (Double) value; - long longval = num.longValue(); + var longval = num.longValue(); if (Double.compare(num.doubleValue(), longval) != 0) { // it isn't integral - return unchanged value @@ -106,7 +105,7 @@ public class DoubleConverter { } // it's integral - determine if it's an integer or a long - int intval = (int) longval; + var intval = (int) longval; if (intval == longval) { return intval; diff --git a/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java b/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java index 75d58f2f..a693b7f4 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java +++ b/gson/src/main/java/org/onap/policy/common/gson/GsonMessageBodyHandler.java @@ -2,7 +2,8 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2023 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +23,13 @@ package org.onap.policy.common.gson; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -30,13 +38,13 @@ import java.io.OutputStreamWriter; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; -import javax.ws.rs.Consumes; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; import lombok.AccessLevel; import lombok.Getter; import org.slf4j.Logger; @@ -85,7 +93,14 @@ public class GsonMessageBodyHandler implements MessageBodyReader<Object>, Messag * @return the configured builder */ public static GsonBuilder configBuilder(GsonBuilder builder) { - return builder.disableHtmlEscaping().registerTypeAdapterFactory(new MapDoubleAdapterFactory()); + return builder.disableHtmlEscaping().registerTypeAdapterFactory(new MapDoubleAdapterFactory()) + .registerTypeAdapter(Instant.class, new InstantTypeAdapter()) + .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeTypeAdapter()) + .registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeTypeAdapter()) + .registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeTypeAdapter()) + .registerTypeAdapter(OffsetTime.class, new OffsetTimeTypeAdapter()) + .registerTypeAdapter(LocalDate.class, new LocalDateTypeAdapter()) + .registerTypeAdapter(ZoneOffset.class, new ZoneOffsetTypeAdapter()); } @Override @@ -102,7 +117,7 @@ public class GsonMessageBodyHandler implements MessageBodyReader<Object>, Messag public void writeTo(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException { - try (OutputStreamWriter writer = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) { + try (var writer = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) { Type jsonType = (type.equals(genericType) ? type : genericType); gson.toJson(object, jsonType, writer); } @@ -138,7 +153,7 @@ public class GsonMessageBodyHandler implements MessageBodyReader<Object>, Messag public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException { - try (InputStreamReader streamReader = new InputStreamReader(entityStream, StandardCharsets.UTF_8)) { + try (var streamReader = new InputStreamReader(entityStream, StandardCharsets.UTF_8)) { Type jsonType = (type.equals(genericType) ? type : genericType); return gson.fromJson(streamReader, jsonType); } diff --git a/gson/src/main/java/org/onap/policy/common/gson/InstantAsMillisTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/InstantAsMillisTypeAdapter.java new file mode 100644 index 00000000..c38a3e9b --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/InstantAsMillisTypeAdapter.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020-2021 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; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; +import java.time.Instant; + +/** + * GSON Type Adapter for "Instant" fields, that encodes them as milliseconds. + */ +public class InstantAsMillisTypeAdapter extends TypeAdapter<Instant> { + + @Override + public void write(JsonWriter out, Instant value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + out.value(value.toEpochMilli()); + } + } + + @Override + public Instant read(JsonReader in) throws IOException { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + return null; + } else { + var millis = in.nextLong(); + return Instant.ofEpochMilli(millis); + } + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/InstantTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/InstantTypeAdapter.java new file mode 100644 index 00000000..bad66af3 --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/InstantTypeAdapter.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020-2021 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; + +import java.time.Instant; + +/** + * GSON Type Adapter for "Instant" fields, that uses the standard ISO_INSTANT formatter. + */ +public class InstantTypeAdapter extends StringTypeAdapter<Instant> { + + /** + * Constructs an adapter. + */ + public InstantTypeAdapter() { + super("date", Instant::parse, Instant::toString); + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java b/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java index 3458a590..18157b03 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java +++ b/gson/src/main/java/org/onap/policy/common/gson/JacksonFieldAdapterFactory.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019, 2021 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. @@ -54,7 +54,7 @@ public class JacksonFieldAdapterFactory implements TypeAdapterFactory { return null; } - ClassWalker data = new ClassWalker(); + var data = new ClassWalker(); data.walkClassHierarchy(clazz); if (data.getInProps(Field.class).isEmpty() && data.getOutProps(Field.class).isEmpty()) { 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 de962316..b7414004 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 @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019, 2021 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. @@ -58,7 +58,7 @@ public class JacksonMethodAdapterFactory implements TypeAdapterFactory { return null; } - ClassWalker data = new ClassWalker(); + var data = new ClassWalker(); data.walkClassHierarchy(clazz); if (data.getInProps(Method.class).isEmpty() && data.getOutProps(Method.class).isEmpty() diff --git a/gson/src/main/java/org/onap/policy/common/gson/LocalDateTimeTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/LocalDateTimeTypeAdapter.java new file mode 100644 index 00000000..5dc597e2 --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/LocalDateTimeTypeAdapter.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020-2021 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; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * GSON Type Adapter for "LocalDateTime" fields, that uses the standard + * ISO_LOCAL_DATE_TIME formatter, by default. + */ +public class LocalDateTimeTypeAdapter extends StringTypeAdapter<LocalDateTime> { + + public LocalDateTimeTypeAdapter() { + this(DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } + + public LocalDateTimeTypeAdapter(DateTimeFormatter formatter) { + super("date", string -> LocalDateTime.parse(string, formatter), value -> value.format(formatter)); + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/LocalDateTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/LocalDateTypeAdapter.java new file mode 100644 index 00000000..0f666e5e --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/LocalDateTypeAdapter.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class LocalDateTypeAdapter extends StringTypeAdapter<LocalDate> { + + public LocalDateTypeAdapter() { + this(DateTimeFormatter.ISO_LOCAL_DATE); + } + + public LocalDateTypeAdapter(DateTimeFormatter formatter) { + super("date", string -> LocalDate.parse(string, formatter), value -> value.format(formatter)); + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/MapDoubleAdapterFactory.java b/gson/src/main/java/org/onap/policy/common/gson/MapDoubleAdapterFactory.java index bd031999..057e97f8 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/MapDoubleAdapterFactory.java +++ b/gson/src/main/java/org/onap/policy/common/gson/MapDoubleAdapterFactory.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019, 2021 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. @@ -51,24 +51,36 @@ public class MapDoubleAdapterFactory implements TypeAdapterFactory { } private <T> boolean isMapType(TypeToken<T> type) { - if (type.getRawType() != Map.class) { + if (!Map.class.isAssignableFrom(type.getRawType())) { return false; } + // only supports Map<String,Object> + + if (!(type.getType() instanceof ParameterizedType)) { + // untyped - assume the parameters are the correct type + return true; + } + Type[] actualParams = ((ParameterizedType) type.getType()).getActualTypeArguments(); - // only supports Map<String,Object> return (actualParams[0] == String.class && actualParams[1] == Object.class); } private <T> boolean isListType(TypeToken<T> type) { - if (type.getRawType() != List.class) { + if (!List.class.isAssignableFrom(type.getRawType())) { return false; } + // only supports List<Object> + + if (!(type.getType() instanceof ParameterizedType)) { + // untyped - assume the parameters are the correct type + return true; + } + Type[] actualParams = ((ParameterizedType) type.getType()).getActualTypeArguments(); - // only supports List<Object> return (actualParams[0] == Object.class); } @@ -100,7 +112,7 @@ public class MapDoubleAdapterFactory implements TypeAdapterFactory { @Override public T read(JsonReader in) throws IOException { - T value = delegate.read(in); + var value = delegate.read(in); DoubleConverter.convertFromDouble(value); diff --git a/gson/src/main/java/org/onap/policy/common/gson/OffsetDateTimeTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/OffsetDateTimeTypeAdapter.java new file mode 100644 index 00000000..3f046b01 --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/OffsetDateTimeTypeAdapter.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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; + +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; + +public class OffsetDateTimeTypeAdapter extends StringTypeAdapter<OffsetDateTime> { + + public OffsetDateTimeTypeAdapter() { + this(DateTimeFormatter.ISO_OFFSET_DATE_TIME); + } + + public OffsetDateTimeTypeAdapter(DateTimeFormatter formatter) { + super("date", string -> OffsetDateTime.parse(string, formatter), value -> value.format(formatter)); + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/OffsetTimeTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/OffsetTimeTypeAdapter.java new file mode 100644 index 00000000..895b9de6 --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/OffsetTimeTypeAdapter.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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; + +import java.time.OffsetTime; +import java.time.format.DateTimeFormatter; + +public class OffsetTimeTypeAdapter extends StringTypeAdapter<OffsetTime> { + + public OffsetTimeTypeAdapter() { + this(DateTimeFormatter.ISO_OFFSET_TIME); + } + + public OffsetTimeTypeAdapter(DateTimeFormatter formatter) { + super("time", string -> OffsetTime.parse(string, formatter), value -> value.format(formatter)); + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/StringTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/StringTypeAdapter.java new file mode 100644 index 00000000..22481697 --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/StringTypeAdapter.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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; + +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; +import java.util.function.Function; + +/** + * GSON Type Adapter for fields that are encoded as Strings. + */ +public class StringTypeAdapter<T> extends TypeAdapter<T> { + private final String exMessage; + private final Function<String, T> deserializer; + private final Function<T, String> serializer; + + /** + * Constructs an adapter. + * + * @param type type of value, used in exception messages + * @param deserializer function used to deserialize a String into a value + * @param serializer function used to serialize a value into a String + */ + public StringTypeAdapter(String type, Function<String, T> deserializer, Function<T, String> serializer) { + this.exMessage = "invalid " + type; + this.deserializer = deserializer; + this.serializer = serializer; + } + + @Override + public T read(JsonReader in) throws IOException { + try { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + return null; + } else { + return deserializer.apply(in.nextString()); + } + + } catch (RuntimeException e) { + throw new JsonParseException(exMessage, e); + } + } + + @Override + public void write(JsonWriter out, T value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + String text = serializer.apply(value); + out.value(text); + } + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/ZoneOffsetTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/ZoneOffsetTypeAdapter.java new file mode 100644 index 00000000..60758ff3 --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/ZoneOffsetTypeAdapter.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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; + +import java.time.ZoneOffset; + +public class ZoneOffsetTypeAdapter extends StringTypeAdapter<ZoneOffset> { + + public ZoneOffsetTypeAdapter() { + super("zone", ZoneOffset::of, ZoneOffset::toString); + } +} diff --git a/gson/src/main/java/org/onap/policy/common/gson/ZonedDateTimeTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/ZonedDateTimeTypeAdapter.java new file mode 100644 index 00000000..928fae95 --- /dev/null +++ b/gson/src/main/java/org/onap/policy/common/gson/ZonedDateTimeTypeAdapter.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020-2021 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; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +/** + * GSON Type Adapter for "ZonedDateTime" fields, that uses the standard + * ISO_ZONED_DATE_TIME formatter. + */ +public class ZonedDateTimeTypeAdapter extends StringTypeAdapter<ZonedDateTime> { + + /** + * Constructs an adapter that uses the ISO_ZONED_DATE_TIME formatter. + */ + public ZonedDateTimeTypeAdapter() { + this(DateTimeFormatter.ISO_ZONED_DATE_TIME); + } + + /** + * Constructs an adapter that uses the specified formatter for reading and writing. + * + * @param formatter date-time formatter + */ + public ZonedDateTimeTypeAdapter(DateTimeFormatter formatter) { + super("date", string -> ZonedDateTime.parse(string, formatter), value -> value.format(formatter)); + } +} 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 174b4912..af4a746c 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 @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2021 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. @@ -24,11 +24,12 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.TypeAdapter; import com.google.gson.reflect.TypeToken; +import com.google.re2j.Pattern; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.function.Supplier; -import java.util.regex.Pattern; +import lombok.Getter; import org.onap.policy.common.gson.annotation.GsonJsonProperty; /** @@ -49,6 +50,7 @@ public class Adapter { /** * Name of the property within the json structure containing the item. */ + @Getter private final String propName; /** @@ -69,6 +71,7 @@ public class Adapter { /** * Name of the item being lifted - used when throwing exceptions. */ + @Getter private final String fullName; /** @@ -83,7 +86,10 @@ public class Adapter { this.gson = gson; this.fullName = getQualifiedName(field); - field.setAccessible(true); + /* + * Turning off sonar, as this is required for emulation of "jackson". + */ + field.setAccessible(true); // NOSONAR } /** @@ -100,7 +106,10 @@ public class Adapter { this.gson = gson; this.fullName = getQualifiedName(accessor); - accessor.setAccessible(true); + /* + * Turning off sonar, as this is required for emulation of "jackson". + */ + accessor.setAccessible(true); // NOSONAR } /** @@ -121,8 +130,8 @@ public class Adapter { ConvInfo wtr = writer; - @SuppressWarnings("rawtypes") - TypeAdapter conv = (wtr.clazz == clazz ? wtr.getConverter() : gson.getAdapter(clazz)); + TypeAdapter<Object> conv = + (wtr.clazz == clazz ? wtr.getConverter() : (TypeAdapter<Object>) gson.getAdapter(clazz)); return conv.toJsonTree(object); } @@ -137,14 +146,6 @@ public class Adapter { return reader.getConverter().fromJsonTree(tree); } - public final String getPropName() { - return propName; - } - - public final String getFullName() { - return fullName; - } - /** * Makes an error message, appending the item's full name to the message prefix. * @@ -310,36 +311,33 @@ public class Adapter { /** * Type on which the converter works. */ - @SuppressWarnings("rawtypes") - private TypeToken type; + private TypeToken<?> type; /** * Class of object on which the converter works. */ - @SuppressWarnings("rawtypes") - private Class clazz; + private Class<?> clazz; /** * Converter to use, initialized lazily. */ - @SuppressWarnings("rawtypes") - private TypeAdapter conv = null; + private TypeAdapter<Object> conv = null; /** * Constructs the object. * * @param type type of object to be converted */ - public ConvInfo(@SuppressWarnings("rawtypes") TypeToken type) { + public ConvInfo(TypeToken<?> type) { this.type = type; this.clazz = type.getRawType(); } - @SuppressWarnings({"rawtypes", "unchecked"}) - public final TypeAdapter getConverter() { + @SuppressWarnings("unchecked") + public final TypeAdapter<Object> getConverter() { if (conv == null) { // race condition here, but it's ok to overwrite a previous value - this.conv = gson.getAdapter(type); + this.conv = (TypeAdapter<Object>) gson.getAdapter(type); } return conv; diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java b/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java index ef4eaae3..954d3f4c 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java +++ b/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019, 2021 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. @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import lombok.Getter; import org.onap.policy.common.gson.annotation.GsonJsonAnyGetter; import org.onap.policy.common.gson.annotation.GsonJsonAnySetter; import org.onap.policy.common.gson.annotation.GsonJsonIgnore; @@ -79,23 +80,16 @@ public class ClassWalker { * Method having {@link GsonJsonAnyGetter} annotation. Overwritten as new "any-getters" * are identified. */ + @Getter private Method anyGetter = null; /** * Method having {@link GsonJsonAnySetter} annotation. Overwritten as new "any-setters" * are identified. */ + @Getter private Method anySetter = null; - - public Method getAnyGetter() { - return anyGetter; - } - - public Method getAnySetter() { - return anySetter; - } - /** * Gets the names of input properties that are not being ignored. * diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/FieldDeserializer.java b/gson/src/main/java/org/onap/policy/common/gson/internal/FieldDeserializer.java index 14a432d1..123b0195 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/internal/FieldDeserializer.java +++ b/gson/src/main/java/org/onap/policy/common/gson/internal/FieldDeserializer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2020 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. @@ -49,7 +49,10 @@ public class FieldDeserializer extends Adapter implements Deserializer { this.field = field; - field.setAccessible(true); + /* + * Turning off sonar, as this is required for emulation of "jackson". + */ + field.setAccessible(true); // NOSONAR } @Override @@ -62,7 +65,10 @@ public class FieldDeserializer extends Adapter implements Deserializer { Object value = fromJsonTree(jsonEl); try { - field.set(target, value); + /* + * Turning off sonar, as this is required for emulation of "jackson". + */ + field.set(target, value); // NOSONAR } catch (IllegalArgumentException | IllegalAccessException e) { throw new JsonParseException(makeError(SET_ERR), e); diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/FieldSerializer.java b/gson/src/main/java/org/onap/policy/common/gson/internal/FieldSerializer.java index 1c9d8b37..348ef5a0 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/internal/FieldSerializer.java +++ b/gson/src/main/java/org/onap/policy/common/gson/internal/FieldSerializer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2020 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. @@ -50,7 +50,10 @@ public class FieldSerializer extends Adapter implements Serializer { this.field = field; - field.setAccessible(true); + /* + * Turning off sonar, as this is required for emulation of "jackson". + */ + field.setAccessible(true); // NOSONAR } @Override diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java b/gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java index 1171fd4d..34d61f47 100644 --- a/gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java +++ b/gson/src/main/java/org/onap/policy/common/gson/internal/JacksonTypeAdapter.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019, 2021 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. @@ -22,7 +22,6 @@ 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.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; @@ -78,7 +77,7 @@ public class JacksonTypeAdapter<T> extends TypeAdapter<T> { JsonElement tree = delegate.toJsonTree(value); if (tree.isJsonObject()) { - JsonObject jsonObj = tree.getAsJsonObject(); + var jsonObj = tree.getAsJsonObject(); // serialize each item from the value into the target tree for (Serializer serializer : serializers) { @@ -92,10 +91,10 @@ public class JacksonTypeAdapter<T> extends TypeAdapter<T> { @Override public T read(JsonReader in) throws IOException { JsonElement tree = elementAdapter.read(in); - T object = delegate.fromJsonTree(tree); + var object = delegate.fromJsonTree(tree); if (tree.isJsonObject()) { - JsonObject jsonObj = tree.getAsJsonObject(); + var jsonObj = tree.getAsJsonObject(); // deserialize each item from the tree into the target object for (Deserializer dser : deserializers) { |