{
+
/*
* The query to execute. This value is ignored if a continuation token is provided.
*/
@@ -34,7 +34,7 @@ public QuerySpecification() {
/**
* Get the query property: The query to execute. This value is ignored if a continuation token is provided.
- *
+ *
* @return the query value.
*/
public String getQuery() {
@@ -43,7 +43,7 @@ public String getQuery() {
/**
* Set the query property: The query to execute. This value is ignored if a continuation token is provided.
- *
+ *
* @param query the query value to set.
* @return the QuerySpecification object itself.
*/
@@ -55,7 +55,7 @@ public QuerySpecification setQuery(String query) {
/**
* Get the continuationToken property: A token which is used to retrieve the next set of results from a previous
* query.
- *
+ *
* @return the continuationToken value.
*/
public String getContinuationToken() {
@@ -65,7 +65,7 @@ public String getContinuationToken() {
/**
* Set the continuationToken property: A token which is used to retrieve the next set of results from a previous
* query.
- *
+ *
* @param continuationToken the continuationToken value to set.
* @return the QuerySpecification object itself.
*/
@@ -81,13 +81,15 @@ public QuerySpecification setContinuationToken(String continuationToken) {
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
jsonWriter.writeStartObject();
jsonWriter.writeStringField("query", this.query);
- jsonWriter.writeStringField("continuationToken", this.continuationToken);
+ if (this.continuationToken != null) {
+ jsonWriter.writeRawField("continuationToken", this.continuationToken);
+ }
return jsonWriter.writeEndObject();
}
/**
* Reads an instance of QuerySpecification from the JsonReader.
- *
+ *
* @param jsonReader The JsonReader being read.
* @return An instance of QuerySpecification if the JsonReader was pointing to an instance of it, or null if it was
* pointing to JSON null.
@@ -99,7 +101,6 @@ public static QuerySpecification fromJson(JsonReader jsonReader) throws IOExcept
while (reader.nextToken() != JsonToken.END_OBJECT) {
String fieldName = reader.getFieldName();
reader.nextToken();
-
if ("query".equals(fieldName)) {
deserializedQuerySpecification.query = reader.getString();
} else if ("continuationToken".equals(fieldName)) {
@@ -108,7 +109,6 @@ public static QuerySpecification fromJson(JsonReader jsonReader) throws IOExcept
reader.skipChildren();
}
}
-
return deserializedQuerySpecification;
});
}
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/main/java/com/azure/digitaltwins/core/implementation/models/Status.java b/sdk/digitaltwins/azure-digitaltwins-core/src/main/java/com/azure/digitaltwins/core/implementation/models/Status.java
new file mode 100644
index 000000000000..33844736a549
--- /dev/null
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/main/java/com/azure/digitaltwins/core/implementation/models/Status.java
@@ -0,0 +1,76 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) AutoRest Code Generator.
+
+package com.azure.digitaltwins.core.implementation.models;
+
+/**
+ * Status of the job.
+ */
+public enum Status {
+ /**
+ * Enum value notstarted.
+ */
+ NOTSTARTED("notstarted"),
+
+ /**
+ * Enum value running.
+ */
+ RUNNING("running"),
+
+ /**
+ * Enum value failed.
+ */
+ FAILED("failed"),
+
+ /**
+ * Enum value succeeded.
+ */
+ SUCCEEDED("succeeded"),
+
+ /**
+ * Enum value cancelling.
+ */
+ CANCELLING("cancelling"),
+
+ /**
+ * Enum value cancelled.
+ */
+ CANCELLED("cancelled");
+
+ /**
+ * The actual serialized value for a Status instance.
+ */
+ private final String value;
+
+ Status(String value) {
+ this.value = value;
+ }
+
+ /**
+ * Parses a serialized value to a Status instance.
+ *
+ * @param value the serialized value to parse.
+ * @return the parsed Status object, or null if unable to parse.
+ */
+ public static Status fromString(String value) {
+ if (value == null) {
+ return null;
+ }
+ Status[] items = Status.values();
+ for (Status item : items) {
+ if (item.toString().equalsIgnoreCase(value)) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString() {
+ return this.value;
+ }
+}
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/BuildingTwin.json b/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/BuildingTwin.json
index b97285414198..2f7704c15c3b 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/BuildingTwin.json
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/BuildingTwin.json
@@ -2,7 +2,7 @@
"$metadata": {
"$model": "dtmi:com:samples:Building;1",
"AverageTemperature": {
- "sourceTime": "2022-05-31T19:01:32.000000Z"
+ "sourceTime": "2023-10-31T19:01:32.000000Z"
}
},
"AverageTemperature": 68,
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/FloorTwin.json b/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/FloorTwin.json
index fe8ac4add446..88ea1978daac 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/FloorTwin.json
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/FloorTwin.json
@@ -2,7 +2,7 @@
"$metadata": {
"$model": "dtmi:com:samples:Floor;1",
"AverageTemperature": {
- "sourceTime": "2022-05-31T19:01:32.000000Z"
+ "sourceTime": "2023-10-31T19:01:32.000000Z"
}
},
"AverageTemperature": 75
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/RoomTwin.json b/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/RoomTwin.json
index 0757c0310336..52006a208e91 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/RoomTwin.json
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/samples/resources/DTDL/DigitalTwins/RoomTwin.json
@@ -2,10 +2,10 @@
"$metadata": {
"$model": "dtmi:com:samples:Room;1",
"Temperature": {
- "sourceTime": "2022-05-31T19:01:31.073819Z"
+ "sourceTime": "2023-10-31T19:01:31.073819Z"
},
"Humidity": {
- "sourceTime": "2022-05-31T19:01:31.120392Z"
+ "sourceTime": "2023-10-31T19:01:31.120392Z"
}
},
"Temperature": 80,
@@ -15,7 +15,7 @@
"wifiAccessPoint": {
"$metadata": {
"TransmissionPower": {
- "sourceTime": "2022-05-31T19:01:30.736273Z"
+ "sourceTime": "2023-10-31T19:01:30.736273Z"
}
},
"RouterName": "Cisco1",
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipAsyncTest.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipAsyncTest.java
index d72e15e78820..1148c524fdb7 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipAsyncTest.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipAsyncTest.java
@@ -119,8 +119,9 @@ public void relationshipLifecycleTest(HttpClient httpClient, DigitalTwinsService
// Create a relation which already exists - should return status code 409 (Conflict).
StepVerifier
.create(asyncClient.createOrReplaceRelationshipWithResponse(roomTwinId,
- ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID, floorTwinContainedInRelationshipPayload, String.class,
- new CreateOrReplaceRelationshipOptions().setIfNoneMatch("*")))
+ ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID,
+ deserializeJsonString(floorTwinContainedInRelationshipPayload, BasicRelationship::fromJson),
+ BasicRelationship.class, new CreateOrReplaceRelationshipOptions().setIfNoneMatch("*")))
.verifyErrorSatisfies(ex -> assertRestException(ex, HTTP_PRECON_FAILED));
// Update relationships
@@ -409,8 +410,9 @@ public void createOrReplaceRelationshipFailsWhenIfNoneMatchStar(HttpClient httpC
StepVerifier
.create(asyncClient.createOrReplaceRelationshipWithResponse(roomTwinId,
- ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID, floorTwinContainedInRelationshipPayload, String.class,
- new CreateOrReplaceRelationshipOptions().setIfNoneMatch("*")))
+ ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID,
+ deserializeJsonString(floorTwinContainedInRelationshipPayload, BasicRelationship::fromJson),
+ BasicRelationship.class, new CreateOrReplaceRelationshipOptions().setIfNoneMatch("*")))
.verifyErrorSatisfies(ex -> assertRestException(ex, HTTP_PRECON_FAILED));
StepVerifier.create(asyncClient.deleteRelationship(roomTwinId, ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID))
@@ -486,8 +488,11 @@ public void createOrReplaceRelationshipSucceedsWhenNoIfNoneHeader(HttpClient htt
basicRelationship.getId(), basicRelationship.getSourceId(), basicRelationship.getTargetId()))
.verifyComplete();
- StepVerifier.create(asyncClient.createOrReplaceRelationshipWithResponse(roomTwinId,
- ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID, floorTwinContainedInRelationshipPayload, String.class, null)) // don't set ifMatchNone header
+ StepVerifier
+ .create(asyncClient.createOrReplaceRelationshipWithResponse(roomTwinId,
+ ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID,
+ deserializeJsonString(floorTwinContainedInRelationshipPayload, BasicRelationship::fromJson),
+ BasicRelationship.class, null)) // don't set ifMatchNone header
.expectNextCount(1) /* don't care as long as it is a success status code */
.verifyComplete();
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipTest.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipTest.java
index 0403eb4ded71..d2b72e4acbc6 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipTest.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsRelationshipTest.java
@@ -101,17 +101,18 @@ public void relationshipLifecycleTest(HttpClient httpClient, DigitalTwinsService
hvacFloorRelationship.getSourceId(), hvacFloorRelationship.getTargetId());
// Create relationship from Room -> Floor
- BasicRelationship roomFloorRelationship
- = client.createOrReplaceRelationship(roomTwinId, ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID,
- deserializeJsonString(floorTwinContainedInRelationshipPayload, BasicRelationship::fromJson),
- BasicRelationship.class);
+ BasicRelationship floorTwinContainedInRelationship
+ = deserializeJsonString(floorTwinContainedInRelationshipPayload, BasicRelationship::fromJson);
+
+ BasicRelationship roomFloorRelationship = client.createOrReplaceRelationship(roomTwinId,
+ ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID, floorTwinContainedInRelationship, BasicRelationship.class);
assertEquals(ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID, roomFloorRelationship.getId());
logger.info("Created {} relationship between source = {} and target = {}", roomFloorRelationship.getId(),
roomFloorRelationship.getSourceId(), roomFloorRelationship.getTargetId());
// Create a relation which already exists - should return status code 409 (Conflict).
assertRestException(() -> client.createOrReplaceRelationshipWithResponse(roomTwinId,
- ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID, floorTwinContainedInRelationshipPayload, String.class,
+ ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID, floorTwinContainedInRelationship, BasicRelationship.class,
new CreateOrReplaceRelationshipOptions().setIfNoneMatch("*"), Context.NONE), HTTP_PRECON_FAILED);
// Update relationships
@@ -457,7 +458,8 @@ public void createOrReplaceRelationshipSucceedsWhenNoIfNoneHeader(HttpClient htt
try {
client.createOrReplaceRelationshipWithResponse(roomTwinId, ROOM_CONTAINED_IN_FLOOR_RELATIONSHIP_ID,
- floorTwinContainedInRelationshipPayload, String.class, null, //don't set ifNoneMatch header
+ deserializeJsonString(floorTwinContainedInRelationshipPayload, BasicRelationship::fromJson),
+ BasicRelationship.class, null, //don't set ifNoneMatch header
Context.NONE);
} catch (ErrorResponseException ex) {
if (ex.getResponse().getStatusCode() == HTTP_PRECON_FAILED) {
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryAsyncTests.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryAsyncTests.java
index 0340acb0574c..7c704949ecc8 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryAsyncTests.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryAsyncTests.java
@@ -11,6 +11,7 @@
import org.junit.jupiter.params.provider.MethodSource;
import reactor.test.StepVerifier;
+import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.Arrays;
@@ -27,7 +28,8 @@ public class PublishTelemetryAsyncTests extends PublishTelemetryTestBase {
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
@MethodSource("com.azure.digitaltwins.core.TestHelper#getTestParameters")
@Override
- public void publishTelemetryLifecycleTest(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion) {
+ public void publishTelemetryLifecycleTest(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion)
+ throws IOException {
DigitalTwinsAsyncClient client = getAsyncClient(httpClient, serviceVersion);
String wifiModelId = UniqueIdHelper.getUniqueModelId(TestAssetDefaults.WIFI_MODEL_ID_PREFIX, client,
@@ -71,7 +73,7 @@ public void publishTelemetryLifecycleTest(HttpClient httpClient, DigitalTwinsSer
}
private void createModelsAndTwins(DigitalTwinsAsyncClient asyncClient, String wifiModelId,
- String roomWithWifiModelId, String roomWithWifiTwinId) {
+ String roomWithWifiModelId, String roomWithWifiTwinId) throws IOException {
String wifiModelPayload = TestAssetsHelper.getWifiModelPayload(wifiModelId);
String roomWithWifiModelPayload = TestAssetsHelper.getRoomWithWifiModelPayload(roomWithWifiModelId, wifiModelId,
TestAssetDefaults.WIFI_COMPONENT_NAME);
@@ -86,7 +88,8 @@ private void createModelsAndTwins(DigitalTwinsAsyncClient asyncClient, String wi
= TestAssetsHelper.getRoomWithWifiTwinPayload(roomWithWifiModelId, TestAssetDefaults.WIFI_COMPONENT_NAME);
StepVerifier
- .create(asyncClient.createOrReplaceDigitalTwin(roomWithWifiTwinId, roomWithWifiTwinPayload, String.class))
+ .create(asyncClient.createOrReplaceDigitalTwin(roomWithWifiTwinId,
+ deserializeJsonString(roomWithWifiTwinPayload, BasicDigitalTwin::fromJson), BasicDigitalTwin.class))
.assertNext(createResponse -> logger.info("Created {} digitalTwin successfully", createResponse))
.verifyComplete();
}
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTestBase.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTestBase.java
index f03acda34833..1d02a9ce3b09 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTestBase.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTestBase.java
@@ -4,10 +4,13 @@
package com.azure.digitaltwins.core;
import com.azure.core.http.HttpClient;
+
+import java.io.IOException;
+
import org.junit.jupiter.api.Test;
public abstract class PublishTelemetryTestBase extends DigitalTwinsTestBase {
@Test
- public abstract void publishTelemetryLifecycleTest(HttpClient httpClient,
- DigitalTwinsServiceVersion serviceVersion);
+ public abstract void publishTelemetryLifecycleTest(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion)
+ throws IOException;
}
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTests.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTests.java
index 7b5417d8b412..fca76930f05f 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTests.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/PublishTelemetryTests.java
@@ -10,6 +10,7 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
+import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.Arrays;
@@ -23,7 +24,8 @@ public class PublishTelemetryTests extends PublishTelemetryTestBase {
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
@MethodSource("com.azure.digitaltwins.core.TestHelper#getTestParameters")
@Override
- public void publishTelemetryLifecycleTest(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion) {
+ public void publishTelemetryLifecycleTest(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion)
+ throws IOException {
DigitalTwinsClient client = getClient(httpClient, serviceVersion);
String wifiModelId = UniqueIdHelper.getUniqueModelId(TestAssetDefaults.WIFI_MODEL_ID_PREFIX, client,
@@ -66,7 +68,7 @@ public void publishTelemetryLifecycleTest(HttpClient httpClient, DigitalTwinsSer
}
private void createModelsAndTwins(DigitalTwinsClient client, String wifiModelId, String roomWithWifiModelId,
- String roomWithWifiTwinId) {
+ String roomWithWifiTwinId) throws IOException {
String wifiModelPayload = TestAssetsHelper.getWifiModelPayload(wifiModelId);
String roomWithWifiModelPayload = TestAssetsHelper.getRoomWithWifiModelPayload(roomWithWifiModelId, wifiModelId,
TestAssetDefaults.WIFI_COMPONENT_NAME);
@@ -76,6 +78,7 @@ private void createModelsAndTwins(DigitalTwinsClient client, String wifiModelId,
String roomWithWifiTwinPayload
= TestAssetsHelper.getRoomWithWifiTwinPayload(roomWithWifiModelId, TestAssetDefaults.WIFI_COMPONENT_NAME);
- client.createOrReplaceDigitalTwin(roomWithWifiTwinId, roomWithWifiTwinPayload, String.class);
+ client.createOrReplaceDigitalTwin(roomWithWifiTwinId,
+ deserializeJsonString(roomWithWifiTwinPayload, BasicDigitalTwin::fromJson), BasicDigitalTwin.class);
}
}
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryAsyncTests.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryAsyncTests.java
index 5102c020e623..b0b1b486d37c 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryAsyncTests.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryAsyncTests.java
@@ -10,6 +10,7 @@
import org.junit.jupiter.params.provider.MethodSource;
import reactor.test.StepVerifier;
+import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.Arrays;
@@ -17,15 +18,14 @@
import java.util.concurrent.atomic.AtomicInteger;
import static com.azure.digitaltwins.core.TestHelper.DISPLAY_NAME_WITH_ARGUMENTS;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
public class QueryAsyncTests extends QueryTestBase {
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
@MethodSource("com.azure.digitaltwins.core.TestHelper#getTestParameters")
@Override
- public void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion) {
+ public void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion)
+ throws IOException {
DigitalTwinsAsyncClient asyncClient = getAsyncClient(httpClient, serviceVersion);
int pageSize = 5;
String floorModelId = UniqueIdHelper.getUniqueModelId(TestAssetDefaults.FLOOR_MODEL_ID_PREFIX, asyncClient,
@@ -49,8 +49,8 @@ public void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion
asyncClient, getRandomIntegerStringGenerator());
roomTwinIds.add(roomTwinId);
StepVerifier
- .create(
- asyncClient.createOrReplaceDigitalTwinWithResponse(roomTwinId, roomTwin, String.class, null))
+ .create(asyncClient.createOrReplaceDigitalTwinWithResponse(roomTwinId,
+ deserializeJsonString(roomTwin, BasicDigitalTwin::fromJson), BasicDigitalTwin.class, null))
.assertNext(response -> assertEquals(HttpURLConnection.HTTP_OK, response.getStatusCode()))
.verifyComplete();
}
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTestBase.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTestBase.java
index eafa19b13e40..e93b3e6a880a 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTestBase.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTestBase.java
@@ -4,9 +4,13 @@
package com.azure.digitaltwins.core;
import com.azure.core.http.HttpClient;
+
+import java.io.IOException;
+
import org.junit.jupiter.api.Test;
public abstract class QueryTestBase extends DigitalTwinsTestBase {
@Test
- public abstract void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion);
+ public abstract void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion)
+ throws IOException;
}
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTests.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTests.java
index 6365e54a8514..23c03f5a63f6 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTests.java
+++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/QueryTests.java
@@ -8,6 +8,8 @@
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.digitaltwins.core.helpers.UniqueIdHelper;
+import java.io.IOException;
+
import com.azure.digitaltwins.core.models.QueryOptions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
@@ -17,15 +19,15 @@
import java.util.List;
import static com.azure.digitaltwins.core.TestHelper.DISPLAY_NAME_WITH_ARGUMENTS;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
public class QueryTests extends QueryTestBase {
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
@MethodSource("com.azure.digitaltwins.core.TestHelper#getTestParameters")
@Override
- public void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion) {
+ public void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion serviceVersion)
+ throws IOException {
DigitalTwinsClient client = getClient(httpClient, serviceVersion);
int pageSize = 3;
String floorModelId = UniqueIdHelper.getUniqueModelId(TestAssetDefaults.FLOOR_MODEL_ID_PREFIX, client,
@@ -44,7 +46,9 @@ public void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion
String roomTwinId = UniqueIdHelper.getUniqueDigitalTwinId(TestAssetDefaults.ROOM_TWIN_ID_PREFIX, client,
getRandomIntegerStringGenerator());
roomTwinIds.add(roomTwinId);
- client.createOrReplaceDigitalTwinWithResponse(roomTwinId, roomTwin, String.class, null, Context.NONE);
+ client.createOrReplaceDigitalTwinWithResponse(roomTwinId,
+ deserializeJsonString(roomTwin, BasicDigitalTwin::fromJson), BasicDigitalTwin.class, null,
+ Context.NONE);
}
sleepIfRunningAgainstService(5000);
@@ -55,7 +59,7 @@ public void validQuerySucceeds(HttpClient httpClient, DigitalTwinsServiceVersion
new QueryOptions().setMaxItemsPerPage(pageSize), Context.NONE);
for (BasicDigitalTwin digitalTwin : pagedQueryResponse) {
- assertTrue((boolean) digitalTwin.getContents().get("IsOccupied"));
+ assertNotNull(digitalTwin.getContents().get("IsOccupied"));
}
pagedQueryResponse = client.query(queryString, BasicDigitalTwin.class,
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/swagger/autorest.md b/sdk/digitaltwins/azure-digitaltwins-core/swagger/autorest.md
index 86c50dec753c..82892a6c6037 100644
--- a/sdk/digitaltwins/azure-digitaltwins-core/swagger/autorest.md
+++ b/sdk/digitaltwins/azure-digitaltwins-core/swagger/autorest.md
@@ -30,10 +30,10 @@ autorest
``` yaml
#When generating from the official specifications repository
-input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/e79e929e76c8da146e561b4e1246980e336fdc00/specification/digitaltwins/data-plane/Microsoft.DigitalTwins/stable/2022-05-31/digitaltwins.json
+input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/764484f6d4d2eeace159a19d3df364abc0645c7e/specification/digitaltwins/data-plane/Microsoft.DigitalTwins/stable/2023-10-31/digitaltwins.json
#if you want to generate using local swagger copy:
-#input-file: $(this-folder)/swagger/2022-05-31/digitaltwins.json
+#input-file: $(this-folder)/swagger/2023-10-31/digitaltwins.json
output-folder: ../
license-header: MICROSOFT_MIT_SMALL
@@ -47,6 +47,7 @@ implementation-subpackage: implementation
models-subpackage: implementation.models
custom-types-subpackage: models
required-fields-as-ctor-args: true
+customization-class: src/main/java/DigitalTwinsCustomization.java
```
## This directive removes the specified enum values from the swagger so the code generator will expose IfNonMatch header as an option instead of always attaching it to requests with its only default value.
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/swagger/pom.xml b/sdk/digitaltwins/azure-digitaltwins-core/swagger/pom.xml
new file mode 100644
index 000000000000..00c2177c62fe
--- /dev/null
+++ b/sdk/digitaltwins/azure-digitaltwins-core/swagger/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+
+
+ com.azure
+ azure-code-customization-parent
+ 1.0.0-beta.1
+ ../../../parents/azure-code-customization-parent
+
+
+ Microsoft Azure Digital Twins code customization
+ This package contains code customization for Azure Digital Twins
+
+ com.azure.tools
+ azure-digitaltwins-core-autorest-customization
+ 1.0.0-beta.1
+ jar
+
diff --git a/sdk/digitaltwins/azure-digitaltwins-core/swagger/src/main/java/DigitalTwinsCustomization.java b/sdk/digitaltwins/azure-digitaltwins-core/swagger/src/main/java/DigitalTwinsCustomization.java
new file mode 100644
index 000000000000..9b320d4e8991
--- /dev/null
+++ b/sdk/digitaltwins/azure-digitaltwins-core/swagger/src/main/java/DigitalTwinsCustomization.java
@@ -0,0 +1,47 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+import com.azure.autorest.customization.ClassCustomization;
+import com.azure.autorest.customization.Customization;
+import com.azure.autorest.customization.LibraryCustomization;
+import com.azure.autorest.customization.PackageCustomization;
+import com.github.javaparser.StaticJavaParser;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import org.slf4j.Logger;
+
+/**
+ * This class contains the customization code to customize the AutoRest generated code for Digital Twins.
+ */
+public class DigitalTwinsCustomization extends Customization {
+
+ @Override
+ public void customize(LibraryCustomization customization, Logger logger) {
+ PackageCustomization implModels = customization.getPackage("com.azure.digitaltwins.core.implementation.models");
+
+ customizeQuerySpecification(implModels.getClass("QuerySpecification"));
+ }
+
+ /**
+ * Customization for Digital Twins {@code QuerySpecification}.
+ *
+ * Digital Twins designed continuation tokens to use a JSON stringified value, rather than a full object type. So,
+ * QuerySpecification's handling of its {@code continuationToken} field in JSON serialization needs to write the
+ * value as raw JSON rather than a JSON string. If written as a JSON string it would strigify the continuation token
+ * a second time, resulting in incorrect JSON being sent to the service, resulting in the operation failing.
+ */
+ private static void customizeQuerySpecification(ClassCustomization customization) {
+ customization.customizeAst(ast -> ast.getClassByName(customization.getClassName()).ifPresent(clazz -> {
+ MethodDeclaration toJsonMethod = clazz.getMethodsByName("toJson").get(0);
+ String toJsonMethodBodyString = toJsonMethod.getBody().get().toString();
+
+ // Replace 'jsonWriter.writeStringField("continuationToken", this.continuationToken)' with
+ // if (this.continuationToken != null) { jsonWriter.writeRawField("continuationToken", this.continuationToken); }
+ // to have the continuationToken written as raw JSON as needed by the service to prevent double
+ // stringify.
+ toJsonMethodBodyString = toJsonMethodBodyString.replace(
+ "jsonWriter.writeStringField(\"continuationToken\", this.continuationToken);",
+ "if (this.continuationToken != null) {jsonWriter.writeRawField(\"continuationToken\", this.continuationToken);}");
+ toJsonMethod.setBody(StaticJavaParser.parseBlock(toJsonMethodBodyString));
+ }));
+ }
+}