From 700451b3d06ea43848d413645d8106566dac4575 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 4 Sep 2020 11:43:27 -0400 Subject: [PATCH 1/2] - fixes a bug where additional properties for upload sessions would not be send to the service --- .../graph/serializer/DefaultSerializer.java | 50 ++++++++++++++----- .../graph/serializer/AdditionalDataTests.java | 21 ++++++++ 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java index 7e93e795c06..822ed586b4d 100644 --- a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java +++ b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java @@ -29,6 +29,9 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.microsoft.graph.logger.ILogger; + +import java.lang.reflect.Field; +import java.lang.reflect.Type; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -185,23 +188,46 @@ public String serializeObject(final T serializableObject) { JsonElement outJsonTree = gson.toJsonTree(serializableObject); if (serializableObject instanceof IJsonBackedObject) { - IJsonBackedObject serializableJsonObject = (IJsonBackedObject) serializableObject; - - AdditionalDataManager additionalData = serializableJsonObject.additionalDataManager(); - - // If the item is a valid Graph object, add its additional data - if (outJsonTree.isJsonObject()) { - JsonObject outJson = outJsonTree.getAsJsonObject(); - - addAdditionalDataToJson(additionalData, outJson); - outJson = getChildAdditionalData(serializableJsonObject, outJson); - - outJsonTree = outJson; + outJsonTree = getDataFromAdditionalDataManager(outJsonTree, serializableObject); + } else if (outJsonTree.isJsonObject()) { + final Field[] fields = serializableObject.getClass().getDeclaredFields(); + JsonObject outJson = outJsonTree.getAsJsonObject(); + for(Field field : fields) { + if(outJson.has(field.getName())) { + final Type[] interfaces = field.getType().getGenericInterfaces(); + for(Type interfaceType : interfaces) { + if(interfaceType == IJsonBackedObject.class) { + try { + outJsonTree = getDataFromAdditionalDataManager(outJsonTree, field.get(serializableObject)); + } catch (IllegalAccessException ex ) { + logger.logDebug("Couldn't access prop" + field.getName()); + } + break; + } + } + } } } return outJsonTree.toString(); } + private JsonElement getDataFromAdditionalDataManager(JsonElement outJsonTree, final T serializableObject) { + IJsonBackedObject serializableJsonObject = (IJsonBackedObject) serializableObject; + + AdditionalDataManager additionalData = serializableJsonObject.additionalDataManager(); + + // If the item is a valid Graph object, add its additional data + if (outJsonTree.isJsonObject()) { + JsonObject outJson = outJsonTree.getAsJsonObject(); + + addAdditionalDataToJson(additionalData, outJson); + outJson = getChildAdditionalData(serializableJsonObject, outJson); + + return outJson; + } else { + return outJsonTree; + } + } /** * Recursively populates additional data for each child object diff --git a/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java b/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java index 6bdce918f07..345eaa5d7b0 100644 --- a/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java +++ b/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java @@ -11,14 +11,24 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; +import com.microsoft.graph.authentication.IAuthenticationProvider; +import com.microsoft.graph.authentication.MockAuthenticationProvider; +import com.microsoft.graph.core.DefaultClientConfig; import com.microsoft.graph.logger.DefaultLogger; import com.microsoft.graph.models.extensions.Drive; +import com.microsoft.graph.models.extensions.DriveItemCreateUploadSessionBody; +import com.microsoft.graph.models.extensions.DriveItemUploadableProperties; import com.microsoft.graph.models.extensions.Entity; +import com.microsoft.graph.models.extensions.IGraphServiceClient; import com.microsoft.graph.models.extensions.PlannerAssignment; import com.microsoft.graph.models.extensions.PlannerAssignments; import com.microsoft.graph.models.extensions.PlannerTask; import com.microsoft.graph.models.extensions.PlannerTaskDetails; +import com.microsoft.graph.models.extensions.UploadSession; import com.microsoft.graph.models.extensions.User; +import com.microsoft.graph.requests.extensions.GraphServiceClient; +import com.microsoft.graph.requests.extensions.IDriveItemCreateUploadSessionRequest; +import com.microsoft.graph.requests.extensions.IDriveItemCreateUploadSessionRequestBuilder; public class AdditionalDataTests { public DefaultSerializer serializer; @@ -55,6 +65,17 @@ public void testChildAdditionalData() { assertEquals("{\"manager\":{\"id\":\"1\",\"additionalData\":\"additionalValue\"},\"id\":\"2\"}", serializedObject); } + + @Test + public void testPropsAdditionalDataOnNonIJSONObjects() { + final DriveItemUploadableProperties upProps = new DriveItemUploadableProperties(); + upProps.name = "vacation.gif"; + upProps.additionalDataManager().put("@microsoft.graph.conflictBehavior", new JsonPrimitive("rename")); + final DriveItemCreateUploadSessionBody body = new DriveItemCreateUploadSessionBody(); + body.item = upProps; + String serializedObject = serializer.serializeObject(body); + assertEquals("{\"item\":{\"name\":\"vacation.gif\"},\"@microsoft.graph.conflictBehavior\":\"rename\"}", serializedObject); + } @Test public void testHashMapChildAnnotationData() { From c917635bf90ba94d79f1647e604a21641f5773aa Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 4 Sep 2020 11:47:04 -0400 Subject: [PATCH 2/2] - removes unused imports, replaces deprecated API --- .../graph/serializer/AdditionalDataTests.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java b/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java index 345eaa5d7b0..3a068d3971b 100644 --- a/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java +++ b/src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java @@ -11,24 +11,16 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; -import com.microsoft.graph.authentication.IAuthenticationProvider; -import com.microsoft.graph.authentication.MockAuthenticationProvider; -import com.microsoft.graph.core.DefaultClientConfig; import com.microsoft.graph.logger.DefaultLogger; import com.microsoft.graph.models.extensions.Drive; import com.microsoft.graph.models.extensions.DriveItemCreateUploadSessionBody; import com.microsoft.graph.models.extensions.DriveItemUploadableProperties; import com.microsoft.graph.models.extensions.Entity; -import com.microsoft.graph.models.extensions.IGraphServiceClient; import com.microsoft.graph.models.extensions.PlannerAssignment; import com.microsoft.graph.models.extensions.PlannerAssignments; import com.microsoft.graph.models.extensions.PlannerTask; import com.microsoft.graph.models.extensions.PlannerTaskDetails; -import com.microsoft.graph.models.extensions.UploadSession; import com.microsoft.graph.models.extensions.User; -import com.microsoft.graph.requests.extensions.GraphServiceClient; -import com.microsoft.graph.requests.extensions.IDriveItemCreateUploadSessionRequest; -import com.microsoft.graph.requests.extensions.IDriveItemCreateUploadSessionRequestBuilder; public class AdditionalDataTests { public DefaultSerializer serializer; @@ -114,8 +106,7 @@ public void testHashMapChildAdditionalData() { String serialized = serializer.serializeObject(deserializedObject); - JsonParser parser = new JsonParser(); - JsonObject jsonObject = parser.parse(serialized).getAsJsonObject(); + JsonObject jsonObject = JsonParser.parseString(serialized).getAsJsonObject(); assertNotNull(jsonObject.get("checklist").getAsJsonObject().get("1234")); assertNull(jsonObject.get("checklist").getAsJsonObject().get("1234").getAsJsonObject().get("1234")); assertNull(jsonObject.get("checklist").getAsJsonObject().get("1234").getAsJsonObject().get("66442"));