diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/SubResource.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/SubResource.java index 5e73c158412b..f1bb6c775512 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/SubResource.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/SubResource.java @@ -3,10 +3,17 @@ package com.azure.core.management; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; + +import java.io.IOException; + /** * The SubResource model. */ -public class SubResource { +public class SubResource implements JsonSerializable { /** * Resource Id. */ @@ -37,4 +44,35 @@ public SubResource withId(String id) { this.id = id; return this; } + + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + return jsonWriter.writeStartObject().writeStringField("id", id).writeEndObject(); + } + + /** + * Reads a JSON stream into a {@link SubResource}. + * + * @param jsonReader The {@link JsonReader} being read. + * @return The {@link SubResource} that the JSON stream represented, may return null. + * @throws IOException If a {@link SubResource} fails to be read from the {@code jsonReader}. + */ + public static SubResource fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + SubResource subResource = new SubResource(); + + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + + if ("id".equals(fieldName)) { + subResource.id = reader.getString(); + } else { + reader.skipChildren(); + } + } + + return subResource; + }); + } } diff --git a/sdk/core/azure-core-management/src/test/java/com/azure/core/management/ResourceTests.java b/sdk/core/azure-core-management/src/test/java/com/azure/core/management/ResourceTests.java index 2235c58b5fcd..0cf0e543213a 100644 --- a/sdk/core/azure-core-management/src/test/java/com/azure/core/management/ResourceTests.java +++ b/sdk/core/azure-core-management/src/test/java/com/azure/core/management/ResourceTests.java @@ -6,6 +6,7 @@ import com.azure.core.management.implementation.ProxyResourceAccessHelper; import com.azure.json.JsonProviders; import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import com.azure.json.ReadValueCallback; @@ -14,6 +15,10 @@ import org.junit.jupiter.api.Test; import java.io.IOException; +import java.io.StringWriter; +import java.util.Collections; +import java.util.List; +import java.util.UUID; public class ResourceTests { @@ -127,6 +132,102 @@ public static ResourceWithSystemData fromJson(JsonReader jsonReader) throws IOEx } } + private static class SubResourceResource extends SubResource { + private SubResource subResource; + private List subResourceList; + private SubResourceResource subResourceResource; + private List subResourceResourceList; + + public SubResource subResource() { + return subResource; + } + + public SubResourceResource withSubResource(SubResource subResource) { + this.subResource = subResource; + return this; + } + + public List subResourceList() { + return subResourceList; + } + + public SubResourceResource withSubResourceList(List subResourceList) { + this.subResourceList = subResourceList; + return this; + } + + public SubResourceResource subResourceResource() { + return subResourceResource; + } + + public SubResourceResource withSubResourceResource(SubResourceResource subResourceResource) { + this.subResourceResource = subResourceResource; + return this; + } + + public List subResourceResourceList() { + return subResourceResourceList; + } + + public SubResourceResource withSubResourceResourceList(List subResourceResourceList) { + this.subResourceResourceList = subResourceResourceList; + return this; + } + + @Override + public SubResourceResource withId(String id) { + super.withId(id); + return this; + } + + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + return jsonWriter.writeStartObject() + .writeStringField("id", id()) + .writeJsonField("subResource", this.subResource) + .writeArrayField("subResourceList", this.subResourceList, JsonWriter::writeJson) + .writeJsonField("subResourceResource", this.subResourceResource) + .writeArrayField("subResourceResourceList", this.subResourceResourceList, JsonWriter::writeJson) + .writeEndObject(); + } + + /** + * Reads a JSON stream into a {@link SubResourceResource}. + * + * @param jsonReader The {@link JsonReader} being read. + * @return The {@link SubResourceResource} that the JSON stream represented, may return null. + * @throws IOException If a {@link SubResourceResource} fails to be read from the {@code jsonReader}. + */ + public static SubResourceResource fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + SubResourceResource subResource = new SubResourceResource(); + + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + + if ("id".equals(fieldName)) { + subResource.withId(reader.getString()); + } else if ("subResource".equals(fieldName)) { + subResource.withSubResource(reader.readObject(reader1 -> SubResource.fromJson(reader1))); + } else if ("subResourceList".equals(fieldName)) { + subResource.withSubResourceList(reader.readArray(reader1 -> SubResource.fromJson(reader1))); + } else if ("subResourceResource".equals(fieldName)) { + subResource.withSubResourceResource( + reader.readObject(reader1 -> SubResourceResource.fromJson(reader1))); + } else if ("subResourceResourceList".equals(fieldName)) { + subResource.withSubResourceResourceList( + reader.readArray(reader1 -> SubResourceResource.fromJson(reader1))); + } else { + reader.skipChildren(); + } + } + + return subResource; + }); + } + } + @Test public void testSerialization() throws IOException { String cosmosAccountJson @@ -190,6 +291,33 @@ public void testSerialization() throws IOException { Assertions.assertEquals("Microsoft.KeyVault/vaults", vaultResource.type()); Assertions.assertEquals(0, vaultResource.tags().size()); Assertions.assertNull(vaultResource.systemData()); + + // test SubResource + SubResourceResource subResourceResourceRoot = new SubResourceResource(); + SubResource subResource = new SubResource().withId(UUID.randomUUID().toString()); + SubResourceResource subResourceResourceNest = new SubResourceResource().withId(UUID.randomUUID().toString()); + subResourceResourceRoot.withSubResource(subResource) + .withSubResourceList(Collections.singletonList(subResource)) + .withSubResourceResource(subResourceResourceNest) + .withSubResourceResourceList(Collections.singletonList(subResourceResourceNest)); + + String json = serializeToString(subResourceResourceRoot); + SubResourceResource subResourceResourceRootDeserialized = deserialize(json, SubResourceResource::fromJson); + Assertions.assertEquals(subResource.id(), subResourceResourceRootDeserialized.subResource().id()); + Assertions.assertEquals(subResource.id(), + subResourceResourceRootDeserialized.subResourceList().iterator().next().id()); + Assertions.assertEquals(subResourceResourceNest.id(), + subResourceResourceRootDeserialized.subResourceResource().id()); + Assertions.assertEquals(subResourceResourceNest.id(), + subResourceResourceRootDeserialized.subResourceResourceList().iterator().next().id()); + } + + private static > String serializeToString(T serializable) throws IOException { + StringWriter writer = new StringWriter(); + JsonWriter jsonWriter = JsonProviders.createWriter(writer); + serializable.toJson(jsonWriter); + jsonWriter.flush(); + return writer.toString(); } private static T deserialize(String json, ReadValueCallback reader) throws IOException {