Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.CaseFormat;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.microsoft.graph.logger.ILogger;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

Expand Down Expand Up @@ -123,7 +124,6 @@ private void setChildAdditionalData(IJsonBackedObject serializedObject, JsonObje

// If the object is a HashMap, iterate through its children
if (fieldObject instanceof HashMap) {
@SuppressWarnings("unchecked")
HashMap<String, Object> serializableChildren = (HashMap<String, Object>) fieldObject;
Iterator<Entry<String, Object>> it = serializableChildren.entrySet().iterator();

Expand All @@ -142,6 +142,21 @@ private void setChildAdditionalData(IJsonBackedObject serializedObject, JsonObje
}
}
}
// If the object is a list of Graph objects, iterate through elements
else if (fieldObject instanceof List && rawJson != null) {
final JsonElement collectionJson = rawJson.get(field.getName());
final List<?> fieldObjectList = (List<?>) fieldObject;
if (collectionJson.isJsonArray() && ((JsonArray)collectionJson).size() == fieldObjectList.size()) {
final JsonArray rawJsonArray = (JsonArray) collectionJson;
for (int i = 0; i < fieldObjectList.size(); i++) {
final Object element = fieldObjectList.get(i);
if (element instanceof IJsonBackedObject) {
final JsonElement elementRawJson = rawJsonArray.get(i);
setChildAdditionalData((IJsonBackedObject) element, elementRawJson.getAsJsonObject());
}
}
}
}
// If the object is a valid Graph object, set its additional data
else if (fieldObject != null && fieldObject instanceof IJsonBackedObject) {
IJsonBackedObject serializedChild = (IJsonBackedObject) fieldObject;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.junit.Test;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.annotations.Expose;
Expand All @@ -15,9 +13,11 @@
import com.microsoft.graph.models.extensions.DateOnly;
import com.microsoft.graph.models.extensions.Drive;
import com.microsoft.graph.models.extensions.FileAttachment;
import com.microsoft.graph.models.extensions.User;
import com.microsoft.graph.models.extensions.RecurrenceRange;
import com.microsoft.graph.models.extensions.User;
import com.microsoft.graph.models.generated.RecurrenceRangeType;
import com.microsoft.graph.requests.extensions.DriveItemDeltaCollectionResponse;
import org.junit.Test;

public class DefaultSerializerTests {

Expand All @@ -26,7 +26,7 @@ public class DefaultSerializerTests {
*
* @throws Exception If there is an exception during the test
*/
@Test
@Test
public void testDriveDeserialization() throws Exception {
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#drives/$entity\",\"id\":\"8bf6ae90006c4a4c\",\"driveType\":\"personal\",\"owner\":{\"user\":{\"displayName\":\"Peter\",\"id\":\"8bf6ae90006c4a4c\"}},\"quota\":{\"deleted\":1485718314,\"remaining\":983887466461,\"state\":\"normal\",\"total\":1142461300736,\"used\":158573834275}}";
Expand All @@ -38,6 +38,43 @@ public void testDriveDeserialization() throws Exception {

}

/**
* Make sure that deserializing a DriveItems also deserializes child additionalData
*
* @throws Exception If there is an exception during the test
*/
@Test
public void testDriveItemChildAdditionalDataDeserialization() throws Exception {
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
String source = "{\n"
+ " \"@odata.context\": \"https://graph.microsoft.com/v1.0/$metadata#users('02008492-3fec-4ce4-bb54-980ad856856f')/drive/root/children\",\n"
+ " \"value\": [\n"
+ " {\n"
+ " \"createdBy\": {\n"
+ " \"user\": {\n"
+ " \"email\": \"the@email.com\",\n"
+ " \"id\": \"02008492-3fec-4ce4-bb54-980ad856856f\",\n"
+ " \"displayName\": \"John Doe\"\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " ]\n"
+ "}";

DriveItemDeltaCollectionResponse result = serializer
.deserializeObject(source, DriveItemDeltaCollectionResponse.class);
assertNotNull(result);
assertNotNull(result.value);
assertEquals(1, result.value.size());
assertNotNull(result.value.get(0));
assertNotNull(result.value.get(0).createdBy);
assertNotNull(result.value.get(0).createdBy.user);
assertNotNull(result.value.get(0).createdBy.user.additionalDataManager());
assertNotNull(result.value.get(0).createdBy.user.additionalDataManager().get("email"));
assertEquals("the@email.com",
result.value.get(0).createdBy.user.additionalDataManager().get("email").getAsString());
}

@Test
public void testRecurrenceRangeDeserialization() throws Exception {
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
Expand Down