Skip to content

Commit

Permalink
Fix digital twins client not deserializing date times correctly (#16975)
Browse files Browse the repository at this point in the history
Also fix BasicDigitalTwinMetadata to use the DigitalTwinPropertyMetadata class
  • Loading branch information
timtay-microsoft committed Oct 29, 2020
1 parent d31124c commit 15e7cf0
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public final class BasicDigitalTwinMetadata {
private String modelId;

@JsonIgnore
private final Map<String, Object> propertyMetadata = new HashMap<>();
private final Map<String, DigitalTwinPropertyMetadata> propertyMetadata = new HashMap<>();

/**
* Creates an instance of digital twin metadata.
Expand Down Expand Up @@ -56,7 +56,7 @@ public BasicDigitalTwinMetadata setModelId(String modelId) {
* @return The metadata about changes on properties on a component.
*/
@JsonAnyGetter
public Map<String, Object> getPropertyMetadata() {
public Map<String, DigitalTwinPropertyMetadata> getPropertyMetadata() {
return propertyMetadata;
}

Expand All @@ -68,7 +68,7 @@ public Map<String, Object> getPropertyMetadata() {
* @return The BasicDigitalTwin object itself.
*/
@JsonAnySetter
public BasicDigitalTwinMetadata addPropertyMetadata(String key, Object value) {
public BasicDigitalTwinMetadata addPropertyMetadata(String key, DigitalTwinPropertyMetadata value) {
this.propertyMetadata.put(key, value);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

package com.azure.digitaltwins.core;

import com.azure.core.annotation.Fluent;
import com.azure.digitaltwins.core.models.DigitalTwinsJsonPropertyNames;
import com.fasterxml.jackson.annotation.JsonProperty;

Expand All @@ -11,7 +12,8 @@
/**
* Contains metadata about changes on properties on a digital twin or component.
*/
public class DigitalTwinPropertyMetadata {
@Fluent
public final class DigitalTwinPropertyMetadata {
@JsonProperty(value = DigitalTwinsJsonPropertyNames.METADATA_PROPERTY_LAST_UPDATE_TIME, required = true)
private OffsetDateTime lastUpdatedOn;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
Expand Down Expand Up @@ -53,17 +54,18 @@
@ServiceClient(builder = DigitalTwinsClientBuilder.class, isAsync = true)
public final class DigitalTwinsAsyncClient {
private static final ClientLogger logger = new ClientLogger(DigitalTwinsAsyncClient.class);
private static final ObjectMapper mapper = new ObjectMapper();
private ObjectMapper mapper;
private final DigitalTwinsServiceVersion serviceVersion;
private final AzureDigitalTwinsAPIImpl protocolLayer;
private static final Boolean includeModelDefinitionOnGet = true;
private final JsonSerializer serializer;

DigitalTwinsAsyncClient(String serviceEndpoint, HttpPipeline pipeline, DigitalTwinsServiceVersion serviceVersion, JsonSerializer jsonSerializer) {
final SimpleModule stringModule = new SimpleModule("String Serializer");
stringModule.addSerializer(new DigitalTwinsStringSerializer(String.class, mapper));

JacksonAdapter jacksonAdapter = new JacksonAdapter();
mapper = jacksonAdapter.serializer(); // Use the same mapper in this layer that the generated layer will use
stringModule.addSerializer(new DigitalTwinsStringSerializer(String.class, mapper));
jacksonAdapter.serializer().registerModule(stringModule);

this.serviceVersion = serviceVersion;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,15 @@
import com.azure.identity.ClientSecretCredentialBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import javax.net.ssl.HttpsURLConnection;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.function.Function;

public class ComponentSyncSamples {
Expand Down Expand Up @@ -46,6 +51,10 @@ public static void main(String[] args) throws IOException {
.setLogLevel(parsedArguments.getHttpLogDetailLevel()))
.buildClient();

// This mapper gets used to deserialize a digital twin that has a date time within a property metadata, so it
// needs to have this module in order to correctly deserialize that date time
mapper.registerModule(new JavaTimeModule());

runComponentSample();
}

Expand Down Expand Up @@ -145,6 +154,7 @@ public static void runComponentSample() throws JsonProcessingException {
ConsoleLogger.print("Retrieved component for digital twin " + basicDigitalTwinId + " :");
for (String key : getComponentResponse.getContents().keySet()) {
ConsoleLogger.print("\t" + key + " : " + getComponentResponse.getContents().get(key));
ConsoleLogger.print("\t\tLast updated on: " + getComponentResponse.getMetadata().get(key).getLastUpdatedOn());
}

// Clean up
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.azure.identity.ClientSecretCredentialBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import reactor.core.publisher.Mono;

import java.time.OffsetDateTime;
Expand Down Expand Up @@ -125,6 +126,6 @@ public Mono<AccessToken> getToken(TokenRequestContext tokenRequestContext) {

// Used for converting json strings into BasicDigitalTwins, BasicRelationships, etc.
static <T> T deserializeJsonString(String rawJsonString, Class<T> clazz) throws JsonProcessingException {
return new ObjectMapper().readValue(rawJsonString, clazz);
return new ObjectMapper().registerModule(new JavaTimeModule()).readValue(rawJsonString, clazz);
}
}

0 comments on commit 15e7cf0

Please sign in to comment.