Skip to content

Commit 54355c8

Browse files
authored
Merge pull request #114 from microsoftgraph/vidadhee/AdditionalDataManagerTest
Unit test to verify multi-level additional data setter
2 parents a8edc68 + d6881da commit 54355c8

File tree

3 files changed

+86
-46
lines changed

3 files changed

+86
-46
lines changed

src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -118,59 +118,73 @@ public <T> T deserializeObject(final String inputString, final Class<T> clazz, M
118118
* @param serializedObject the parent object whose children will be iterated to set additional data
119119
* @param rawJson the raw json
120120
*/
121-
@SuppressWarnings("unchecked")
122-
private void setChildAdditionalData(IJsonBackedObject serializedObject, JsonObject rawJson) {
121+
private void setChildAdditionalData(final IJsonBackedObject serializedObject, final JsonObject rawJson) {
123122
// Use reflection to iterate through fields for eligible Graph children
124-
for (java.lang.reflect.Field field : serializedObject.getClass().getFields()) {
125-
try {
126-
Object fieldObject = field.get(serializedObject);
127-
128-
// If the object is a HashMap, iterate through its children
129-
if (fieldObject instanceof HashMap) {
130-
HashMap<String, Object> serializableChildren = (HashMap<String, Object>) fieldObject;
131-
Iterator<Entry<String, Object>> it = serializableChildren.entrySet().iterator();
123+
if(rawJson != null) {
124+
for (java.lang.reflect.Field field : serializedObject.getClass().getFields()) {
125+
try {
126+
if(field != null) {
127+
final Object fieldObject = field.get(serializedObject);
128+
if (fieldObject instanceof HashMap) {
129+
// If the object is a HashMap, iterate through its children
130+
@SuppressWarnings("unchecked")
131+
final HashMap<String, Object> serializableChildren = (HashMap<String, Object>) fieldObject;
132+
final Iterator<Entry<String, Object>> it = serializableChildren.entrySet().iterator();
132133

133-
while (it.hasNext()) {
134-
Map.Entry<String, Object> pair = (Map.Entry<String, Object>)it.next();
135-
Object child = pair.getValue();
134+
while (it.hasNext()) {
135+
final Map.Entry<String, Object> pair = (Map.Entry<String, Object>)it.next();
136+
final Object child = pair.getValue();
136137

137-
// If the item is a valid Graph object, set its additional data
138-
if (child instanceof IJsonBackedObject) {
139-
AdditionalDataManager childAdditionalDataManager = ((IJsonBackedObject) child).additionalDataManager();
140-
if(rawJson != null && field != null && rawJson.get(field.getName()) != null && rawJson.get(field.getName()).isJsonObject()
141-
&& rawJson.get(field.getName()).getAsJsonObject().get(pair.getKey()).isJsonObject()) {
142-
childAdditionalDataManager.setAdditionalData(rawJson.get(field.getName()).getAsJsonObject().get(pair.getKey()).getAsJsonObject());
143-
setChildAdditionalData((IJsonBackedObject) child,rawJson.get(field.getName()).getAsJsonObject().get(pair.getKey()).getAsJsonObject());
138+
// If the item is a valid Graph object, set its additional data
139+
if (child instanceof IJsonBackedObject) {
140+
final AdditionalDataManager childAdditionalDataManager = ((IJsonBackedObject) child).additionalDataManager();
141+
final JsonElement fieldElement = rawJson.get(field.getName());
142+
if(fieldElement != null && fieldElement.isJsonObject()
143+
&& fieldElement.getAsJsonObject().get(pair.getKey()) != null
144+
&& fieldElement.getAsJsonObject().get(pair.getKey()).isJsonObject()) {
145+
childAdditionalDataManager.setAdditionalData(fieldElement.getAsJsonObject().get(pair.getKey()).getAsJsonObject());
146+
setChildAdditionalData((IJsonBackedObject) child,fieldElement.getAsJsonObject().get(pair.getKey()).getAsJsonObject());
147+
}
148+
}
144149
}
145150
}
146-
}
147-
}
148-
// If the object is a list of Graph objects, iterate through elements
149-
else if (fieldObject instanceof List && rawJson != null) {
150-
final JsonElement collectionJson = rawJson.get(field.getName());
151-
final List<?> fieldObjectList = (List<?>) fieldObject;
152-
if (collectionJson.isJsonArray() && ((JsonArray)collectionJson).size() == fieldObjectList.size()) {
153-
final JsonArray rawJsonArray = (JsonArray) collectionJson;
154-
for (int i = 0; i < fieldObjectList.size(); i++) {
155-
final Object element = fieldObjectList.get(i);
156-
if (element instanceof IJsonBackedObject) {
157-
final JsonElement elementRawJson = rawJsonArray.get(i);
158-
setChildAdditionalData((IJsonBackedObject) element, elementRawJson.getAsJsonObject());
151+
// If the object is a list of Graph objects, iterate through elements
152+
else if (fieldObject instanceof List) {
153+
final JsonElement collectionJson = rawJson.get(field.getName());
154+
final List<?> fieldObjectList = (List<?>) fieldObject;
155+
if (collectionJson != null && collectionJson.isJsonArray()) {
156+
final JsonArray rawJsonArray = (JsonArray) collectionJson;
157+
final Integer fieldObjectListSize = fieldObjectList.size();
158+
final Integer rawJsonArraySize = rawJsonArray.size();
159+
for (int i = 0; i < fieldObjectListSize && i < rawJsonArraySize; i++) {
160+
final Object element = fieldObjectList.get(i);
161+
if (element instanceof IJsonBackedObject) {
162+
final JsonElement elementRawJson = rawJsonArray.get(i);
163+
if(elementRawJson != null) {
164+
setChildAdditionalData((IJsonBackedObject) element, elementRawJson.getAsJsonObject());
165+
}
166+
}
167+
}
168+
if (rawJsonArraySize != fieldObjectListSize)
169+
logger.logDebug("rawJsonArray has a size of " + rawJsonArraySize + " and fieldObjectList of " + fieldObjectListSize);
170+
}
171+
}
172+
// If the object is a valid Graph object, set its additional data
173+
else if (fieldObject instanceof IJsonBackedObject) {
174+
final IJsonBackedObject serializedChild = (IJsonBackedObject) fieldObject;
175+
final AdditionalDataManager childAdditionalDataManager = serializedChild.additionalDataManager();
176+
final JsonElement fieldElement = rawJson.get(field.getName());
177+
if(fieldElement != null && fieldElement.isJsonObject()) {
178+
childAdditionalDataManager.setAdditionalData(fieldElement.getAsJsonObject());
179+
setChildAdditionalData((IJsonBackedObject) fieldObject,fieldElement.getAsJsonObject());
159180
}
160181
}
161182
}
183+
} catch (IllegalArgumentException | IllegalAccessException e) {
184+
//Not throwing the IllegalArgumentException as the Serialized Object would still be usable even if the additional data is not set.
185+
logger.logError("Unable to set child fields of " + serializedObject.getClass().getSimpleName(), e);
186+
logger.logDebug(rawJson.getAsString());
162187
}
163-
// If the object is a valid Graph object, set its additional data
164-
else if (fieldObject != null && fieldObject instanceof IJsonBackedObject) {
165-
IJsonBackedObject serializedChild = (IJsonBackedObject) fieldObject;
166-
AdditionalDataManager childAdditionalDataManager = serializedChild.additionalDataManager();
167-
if(rawJson != null && field != null && rawJson.get(field.getName()) != null && rawJson.get(field.getName()).isJsonObject()) {
168-
childAdditionalDataManager.setAdditionalData(rawJson.get(field.getName()).getAsJsonObject());
169-
setChildAdditionalData((IJsonBackedObject) fieldObject,rawJson.get(field.getName()).getAsJsonObject());
170-
}
171-
}
172-
} catch (IllegalArgumentException | IllegalAccessException e) {
173-
logger.logError("Unable to access child fields of " + serializedObject.getClass().getSimpleName(), e);
174188
}
175189
}
176190
}

src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.microsoft.graph.serializer;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertFalse;
45
import static org.junit.Assert.assertNotNull;
56
import static org.junit.Assert.assertNull;
67
import static org.junit.Assert.assertTrue;
@@ -63,7 +64,20 @@ public void testChildAdditionalData() {
6364
assertEquals("{\"manager\":{\"id\":\"1\",\"additionalData\":\"additionalValue\"},\"id\":\"2\"}", serializedObject);
6465
}
6566

66-
@Test
67+
@Test
68+
public void testSkipTransientData() {
69+
Entity entity = new Entity();
70+
entity.id = "1";
71+
72+
entity.additionalDataManager().put("@odata.type", new JsonPrimitive("entity"));
73+
entity.additionalDataManager().put("@odata.nextLink", new JsonPrimitive("1"));
74+
75+
String serializedObject = serializer.serializeObject(entity);
76+
77+
assertEquals("{\"id\":\"1\",\"@odata.nextLink\":\"1\",\"@odata.type\":\"entity\"}", serializedObject);
78+
}
79+
80+
@Test
6781
public void testPropsAdditionalDataOnNonIJSONObjects() {
6882
final DriveItemUploadableProperties upProps = new DriveItemUploadableProperties();
6983
upProps.name = "vacation.gif";
@@ -125,4 +139,15 @@ public void testChildAdditionalDataDeserialization() {
125139

126140
assertEquals("\"[email protected]\"",email.toString());
127141
}
142+
143+
@Test
144+
public void testHashMapProperties() {
145+
final String source = "{\"description\": \"Task details properties:\nchecklist:Sub items\nreferences:Related links\",\"previewType\": \"automatic\",\"references\": {\"https%3A//developer%2Emicrosoft%2Ecom/en-us/graph/graph-explorer\": {\"@odata.type\": \"#microsoft.graph.plannerExternalReference\",\"alias\": \"Graph Explorer\",\"type\": \"Other\",\"previewPriority\": \"0009005706180391122\",\"lastModifiedBy\": {\"user\": {\"id\": \"fbab97d0-4932-4511-b675-204639209557\"}},\"lastModifiedDateTime\": \"2017-04-24T22:52:29.814Z\"}},\"checklist\": {\"d280ed1a-9f6b-4f9c-a962-fb4d00dc50ff\": {\"@odata.type\": \"#microsoft.graph.plannerChecklistItem\",\"isChecked\": false,\"title\": \"Try reading task details\",\"orderHint\": \"8587094707721254251P]\",\"lastModifiedBy\": {\"user\": {\"id\": \"e396de0e-4812-4fcb-9f9e-0358744df343\", \"customProp\": \"somestring\"}},\"lastModifiedDateTime\": \"2017-04-14T02:16:14.866Z\"}},\"id\": \"gcrYAaAkgU2EQUvpkNNXLGQAGTtu\"}";
146+
final PlannerTaskDetails taskDetails = serializer.deserializeObject(source, PlannerTaskDetails.class);
147+
assertNotNull(taskDetails);
148+
assertNotNull(taskDetails.checklist);
149+
assertFalse(taskDetails.checklist.isEmpty());
150+
assertTrue(taskDetails.checklist.get("d280ed1a-9f6b-4f9c-a962-fb4d00dc50ff").title.equals("Try reading task details"));
151+
assertTrue(taskDetails.checklist.get("d280ed1a-9f6b-4f9c-a962-fb4d00dc50ff").lastModifiedBy.user.additionalDataManager().get("customProp").getAsString().equals("somestring"));
152+
}
128153
}

src/test/java/com/microsoft/graph/serializer/MockSerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public MockSerializer(final Object deserializeReturn, final String serializeRetu
5050
}
5151

5252
@Override
53+
@SuppressWarnings("unchecked")
5354
public <T> T deserializeObject(final String inputString, final Class<T> clazz) {
5455
//noinspection unchecked
5556
return (T) mDeserializeReturn;
@@ -61,8 +62,8 @@ public <T> String serializeObject(final T serializableObject) {
6162
}
6263

6364
@Override
65+
@SuppressWarnings("unchecked")
6466
public <T> T deserializeObject(String inputString, Class<T> clazz, Map<String, List<String>> responseHeaders) {
65-
// TODO Auto-generated method stub
6667
return (T) mDeserializeReturn;
6768
}
6869
}

0 commit comments

Comments
 (0)