From dc95dd05944515849f27138dc50aabf3bb717161 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 20 Jul 2020 10:14:22 +0800 Subject: [PATCH 1/3] update package-info, move ManagementErrorDeserializer to impl namespace --- .../core/management/implementation/package-info.java | 2 +- .../management/implementation/polling/package-info.java | 3 ++- .../serializer/ManagementErrorDeserializer.java | 6 +++--- .../implementation/serializer/package-info.java | 8 ++++++++ .../com/azure/core/management/polling/package-info.java | 3 ++- .../core/management/serializer/AzureJacksonAdapter.java | 1 + .../azure/core/management/serializer/package-info.java | 2 +- 7 files changed, 18 insertions(+), 7 deletions(-) rename sdk/core/azure-core-management/src/main/java/com/azure/core/management/{ => implementation}/serializer/ManagementErrorDeserializer.java (94%) create mode 100644 sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/package-info.java diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/package-info.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/package-info.java index f27bea2b3877..f9f357436572 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/package-info.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/package-info.java @@ -2,6 +2,6 @@ // Licensed under the MIT License. /** - * Package containing the types for Azure ARM client side http communication with a REST endpoint. + * Package containing the implementation classes for Azure ARM client side http communication with a REST endpoint. */ package com.azure.core.management.implementation; diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/polling/package-info.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/polling/package-info.java index 0820ebc9fc00..3379446b9bd4 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/polling/package-info.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/polling/package-info.java @@ -2,6 +2,7 @@ // Licensed under the MIT License. /** - * Package containing the types for Azure ARM client side http communication with a REST endpoint. + * Package containing the implementation classes that handling long-running operation + * for Azure ARM client side http communication with a REST endpoint. */ package com.azure.core.management.implementation.polling; diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/ManagementErrorDeserializer.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java similarity index 94% rename from sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/ManagementErrorDeserializer.java rename to sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java index b1aa62eb2af2..862797dbbd41 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/ManagementErrorDeserializer.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.core.management.serializer; +package com.azure.core.management.implementation.serializer; import com.azure.core.management.exception.ManagementError; import com.fasterxml.jackson.core.JsonFactory; @@ -21,7 +21,7 @@ /** * Custom serializer for serializing {@link ManagementError} objects. */ -final class ManagementErrorDeserializer extends StdDeserializer { +public final class ManagementErrorDeserializer extends StdDeserializer { private static final long serialVersionUID = 1L; @@ -45,7 +45,7 @@ private ManagementErrorDeserializer(Class vc, ObjectMapper mapper) { * @param mapper the object mapper for default deserializations. * @return a simple module to be plugged onto Jackson ObjectMapper. */ - static SimpleModule getModule(ObjectMapper mapper) { + public static SimpleModule getModule(ObjectMapper mapper) { SimpleModule module = new SimpleModule(); module.setDeserializerModifier(new BeanDeserializerModifier() { @Override diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/package-info.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/package-info.java new file mode 100644 index 000000000000..8fa1c969027d --- /dev/null +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/package-info.java @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing the implementation classes that handle serialization and deserialization + * for the REST call payloads in Azure ARM. + */ +package com.azure.core.management.implementation.serializer; diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/polling/package-info.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/polling/package-info.java index 7dcd379009e5..aae943987b65 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/polling/package-info.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/polling/package-info.java @@ -2,6 +2,7 @@ // Licensed under the MIT License. /** - * Package containing the types for Azure ARM client side http communication with a REST endpoint. + * Package containing the classes that handling long-running operation + * for Azure ARM client side http communication with a REST endpoint. */ package com.azure.core.management.polling; diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java index 095bf123e98d..b887e5a9a517 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java @@ -3,6 +3,7 @@ package com.azure.core.management.serializer; +import com.azure.core.management.implementation.serializer.ManagementErrorDeserializer; import com.azure.core.util.serializer.JacksonAdapter; /** diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/package-info.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/package-info.java index b955eec7235d..7c87cc27470a 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/package-info.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/package-info.java @@ -2,6 +2,6 @@ // Licensed under the MIT License. /** - * Package containing classes that handle serialization and deserialization for the REST call payloads in Azure ARM. + * Package containing the classes that handle serialization and deserialization for the REST call payloads in Azure ARM. */ package com.azure.core.management.serializer; From 9bd28b98611d11e298ae6a4c2b692733f2e86dc9 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 20 Jul 2020 11:10:22 +0800 Subject: [PATCH 2/3] DateTimeDeserializer to adapt service not returning time zone in OffsetDateTime --- .../serializer/DateTimeDeserializer.java | 50 +++++++++++++++++++ .../ManagementErrorDeserializer.java | 2 +- .../serializer/AzureJacksonAdapter.java | 2 + .../serializer/DateTimeDeserializerTests.java | 43 ++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java create mode 100644 sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java new file mode 100644 index 000000000000..6d153880e061 --- /dev/null +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.management.implementation.serializer; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalQueries; + +// class can be deleted after fix on https://github.com/Azure/azure-sdk-for-java/issues/8266 + +/** + * Custom de-serializer for de-serializing {@link OffsetDateTime} objects, with default zone offset as UTC. + */ +public class DateTimeDeserializer extends JsonDeserializer { + + /** + * Gets a module wrapping this serializer as an adapter for the Jackson + * ObjectMapper. + * + * @return a simple module to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + SimpleModule module = new SimpleModule(); + module.addDeserializer(OffsetDateTime.class, new DateTimeDeserializer()); + return module; + } + + @Override + public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + String string = jsonParser.getText(); + TemporalAccessor temporal = + DateTimeFormatter.ISO_DATE_TIME.parseBest(string, OffsetDateTime::from, LocalDateTime::from); + if (temporal.query(TemporalQueries.offset()) == null) { + return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); + } else { + return OffsetDateTime.from(temporal); + } + } +} diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java index 862797dbbd41..5403b070c3b1 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java @@ -19,7 +19,7 @@ import java.io.IOException; /** - * Custom serializer for serializing {@link ManagementError} objects. + * Custom de-serializer for de-serializing {@link ManagementError} objects. */ public final class ManagementErrorDeserializer extends StdDeserializer { diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java index b887e5a9a517..f4c1d409ebcb 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java @@ -3,6 +3,7 @@ package com.azure.core.management.serializer; +import com.azure.core.management.implementation.serializer.DateTimeDeserializer; import com.azure.core.management.implementation.serializer.ManagementErrorDeserializer; import com.azure.core.util.serializer.JacksonAdapter; @@ -17,5 +18,6 @@ public final class AzureJacksonAdapter extends JacksonAdapter { public AzureJacksonAdapter() { super(); serializer().registerModule(ManagementErrorDeserializer.getModule(simpleMapper())); + serializer().registerModule(DateTimeDeserializer.getModule()); } } diff --git a/sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java b/sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java new file mode 100644 index 000000000000..274e06b4b236 --- /dev/null +++ b/sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.management.serializer; + +import com.azure.core.util.serializer.SerializerAdapter; +import com.azure.core.util.serializer.SerializerEncoding; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.time.OffsetDateTime; + +public class DateTimeDeserializerTests { + + @Test + public void testDeserializationWithNoZone() throws IOException { + SerializerAdapter serializerAdapter = new AzureJacksonAdapter(); + + DateModel dateModelWithZone = serializerAdapter.deserialize("{\"date\": \"2020-02-18T10:14:43.06Z\"}", + DateModel.class, SerializerEncoding.JSON); + + // some service returns date-time without time zone + DateModel dateModelWithNoZone = serializerAdapter.deserialize("{\"date\": \"2020-02-18T10:14:43.06\"}", + DateModel.class, SerializerEncoding.JSON); + Assertions.assertEquals(dateModelWithZone.date, dateModelWithNoZone.date); + } + + public static class DateModel { + private OffsetDateTime date; + + @JsonProperty("date") + public OffsetDateTime getDate() { + return date; + } + + @JsonProperty("date") + public void setDate(OffsetDateTime date) { + this.date = date; + } + } +} From 1619ac789fc46e00480ace164e9e177bdac6949f Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Thu, 23 Jul 2020 09:33:37 +0800 Subject: [PATCH 3/3] Revert "DateTimeDeserializer to adapt service not returning time zone in OffsetDateTime" DateTimeDeserializer is added to azure-core. This reverts commit 9bd28b98611d11e298ae6a4c2b692733f2e86dc9. --- .../serializer/DateTimeDeserializer.java | 50 ------------------- .../ManagementErrorDeserializer.java | 2 +- .../serializer/AzureJacksonAdapter.java | 2 - .../serializer/DateTimeDeserializerTests.java | 43 ---------------- 4 files changed, 1 insertion(+), 96 deletions(-) delete mode 100644 sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java delete mode 100644 sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java deleted file mode 100644 index 6d153880e061..000000000000 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/DateTimeDeserializer.java +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.core.management.implementation.serializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.module.SimpleModule; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; -import java.time.temporal.TemporalQueries; - -// class can be deleted after fix on https://github.com/Azure/azure-sdk-for-java/issues/8266 - -/** - * Custom de-serializer for de-serializing {@link OffsetDateTime} objects, with default zone offset as UTC. - */ -public class DateTimeDeserializer extends JsonDeserializer { - - /** - * Gets a module wrapping this serializer as an adapter for the Jackson - * ObjectMapper. - * - * @return a simple module to be plugged onto Jackson ObjectMapper. - */ - public static SimpleModule getModule() { - SimpleModule module = new SimpleModule(); - module.addDeserializer(OffsetDateTime.class, new DateTimeDeserializer()); - return module; - } - - @Override - public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException { - String string = jsonParser.getText(); - TemporalAccessor temporal = - DateTimeFormatter.ISO_DATE_TIME.parseBest(string, OffsetDateTime::from, LocalDateTime::from); - if (temporal.query(TemporalQueries.offset()) == null) { - return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); - } else { - return OffsetDateTime.from(temporal); - } - } -} diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java index 5403b070c3b1..862797dbbd41 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/implementation/serializer/ManagementErrorDeserializer.java @@ -19,7 +19,7 @@ import java.io.IOException; /** - * Custom de-serializer for de-serializing {@link ManagementError} objects. + * Custom serializer for serializing {@link ManagementError} objects. */ public final class ManagementErrorDeserializer extends StdDeserializer { diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java index f4c1d409ebcb..b887e5a9a517 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/serializer/AzureJacksonAdapter.java @@ -3,7 +3,6 @@ package com.azure.core.management.serializer; -import com.azure.core.management.implementation.serializer.DateTimeDeserializer; import com.azure.core.management.implementation.serializer.ManagementErrorDeserializer; import com.azure.core.util.serializer.JacksonAdapter; @@ -18,6 +17,5 @@ public final class AzureJacksonAdapter extends JacksonAdapter { public AzureJacksonAdapter() { super(); serializer().registerModule(ManagementErrorDeserializer.getModule(simpleMapper())); - serializer().registerModule(DateTimeDeserializer.getModule()); } } diff --git a/sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java b/sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java deleted file mode 100644 index 274e06b4b236..000000000000 --- a/sdk/core/azure-core-management/src/test/java/com/azure/core/management/serializer/DateTimeDeserializerTests.java +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.core.management.serializer; - -import com.azure.core.util.serializer.SerializerAdapter; -import com.azure.core.util.serializer.SerializerEncoding; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.time.OffsetDateTime; - -public class DateTimeDeserializerTests { - - @Test - public void testDeserializationWithNoZone() throws IOException { - SerializerAdapter serializerAdapter = new AzureJacksonAdapter(); - - DateModel dateModelWithZone = serializerAdapter.deserialize("{\"date\": \"2020-02-18T10:14:43.06Z\"}", - DateModel.class, SerializerEncoding.JSON); - - // some service returns date-time without time zone - DateModel dateModelWithNoZone = serializerAdapter.deserialize("{\"date\": \"2020-02-18T10:14:43.06\"}", - DateModel.class, SerializerEncoding.JSON); - Assertions.assertEquals(dateModelWithZone.date, dateModelWithNoZone.date); - } - - public static class DateModel { - private OffsetDateTime date; - - @JsonProperty("date") - public OffsetDateTime getDate() { - return date; - } - - @JsonProperty("date") - public void setDate(OffsetDateTime date) { - this.date = date; - } - } -}