Skip to content

Commit 97c772b

Browse files
committed
- refactoring to reduce code duplication
- fixes a bug where additional data would be added to the wrong level for lists
1 parent df892dd commit 97c772b

File tree

1 file changed

+47
-67
lines changed

1 file changed

+47
-67
lines changed

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

Lines changed: 47 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -229,16 +229,15 @@ public <T> String serializeObject(final T serializableObject) {
229229
return outJsonTree.toString();
230230
}
231231
private <T> JsonElement getDataFromAdditionalDataManager(JsonElement outJsonTree, final T serializableObject) {
232-
IJsonBackedObject serializableJsonObject = (IJsonBackedObject) serializableObject;
232+
final IJsonBackedObject serializableJsonObject = (IJsonBackedObject) serializableObject;
233+
final AdditionalDataManager additionalData = serializableJsonObject.additionalDataManager();
233234

234-
AdditionalDataManager additionalData = serializableJsonObject.additionalDataManager();
235-
236235
// If the item is a valid Graph object, add its additional data
237236
if (outJsonTree.isJsonObject()) {
238-
JsonObject outJson = outJsonTree.getAsJsonObject();
237+
final JsonObject outJson = outJsonTree.getAsJsonObject();
239238

240-
addAdditionalDataToJson(additionalData, outJson);
241-
outJson = getChildAdditionalData(serializableJsonObject, outJson);
239+
addAdditionalDataFromManagerToJson(additionalData, outJson);
240+
getChildAdditionalData(serializableJsonObject, outJson);
242241

243242
return outJson;
244243
} else {
@@ -251,93 +250,74 @@ private <T> JsonElement getDataFromAdditionalDataManager(JsonElement outJsonTree
251250
*
252251
* @param serializableObject the child to get additional data for
253252
* @param outJson the serialized output JSON to add to
254-
* @return the serialized output JSON including the additional child data
255253
*/
256254
@SuppressWarnings("unchecked")
257-
private JsonObject getChildAdditionalData(IJsonBackedObject serializableObject, JsonObject outJson) {
255+
private void getChildAdditionalData(final IJsonBackedObject serializableObject, final JsonObject outJson) {
256+
if(outJson == null)
257+
return;
258258
// Use reflection to iterate through fields for eligible Graph children
259259
for (java.lang.reflect.Field field : serializableObject.getClass().getFields()) {
260260
try {
261-
Object fieldObject = field.get(serializableObject);
261+
final Object fieldObject = field.get(serializableObject);
262+
final JsonElement fieldJsonElement = outJson.get(field.getName());
263+
if(fieldObject == null || field == null || fieldJsonElement == null)
264+
continue;
262265

263266
// If the object is a HashMap, iterate through its children
264-
if (fieldObject instanceof HashMap) {
265-
HashMap<String, Object> serializableChildren = (HashMap<String, Object>) fieldObject;
266-
Iterator<Entry<String, Object>> it = serializableChildren.entrySet().iterator();
267+
if (fieldObject instanceof Map && fieldJsonElement.isJsonObject()) {
268+
final Map<String, Object> serializableChildren = (Map<String, Object>) fieldObject;
269+
final Iterator<Entry<String, Object>> it = serializableChildren.entrySet().iterator();
270+
final JsonObject fieldJsonObject = fieldJsonElement.getAsJsonObject();
267271

268272
while (it.hasNext()) {
269-
Map.Entry<String, Object> pair = (Map.Entry<String, Object>)it.next();
270-
Object child = pair.getValue();
271-
272-
// If the item is a valid Graph object, add its additional data
273-
if (child instanceof IJsonBackedObject) {
274-
AdditionalDataManager childAdditionalData = ((IJsonBackedObject) child).additionalDataManager();
275-
276-
addAdditionalDataToJson(
277-
childAdditionalData,
278-
outJson.getAsJsonObject(
279-
field.getName())
280-
.getAsJsonObject()
281-
.get(pair.getKey()
282-
.toString())
283-
.getAsJsonObject());
284-
285-
// Serialize its children
286-
outJson = getChildAdditionalData((IJsonBackedObject)child, outJson);
287-
}
273+
final Map.Entry<String, Object> pair = (Map.Entry<String, Object>)it.next();
274+
final Object child = pair.getValue();
275+
final JsonElement childJsonElement = fieldJsonObject.get(pair.getKey().toString());
276+
// If the item is a valid Graph object, add its additional data
277+
addAdditionalDataFromJsonElementToJson(child, childJsonElement);
288278
}
289279
}
290280
// If the object is a list of Graph objects, iterate through elements
291-
else if (fieldObject instanceof List) {
292-
if(outJson != null
293-
&& outJson.get(field.getName()) != null
294-
&& outJson.get(field.getName()).isJsonArray()) {
295-
final List<?> fieldObjectList = (List<?>) fieldObject;
296-
for (int index = 0; index < fieldObjectList.size(); index++) {
297-
Object element = fieldObjectList.get(index);
298-
JsonObject jsonElement = outJson
299-
.get(field.getName())
300-
.getAsJsonArray()
301-
.get(index)
302-
.getAsJsonObject();
303-
if (element instanceof IJsonBackedObject) {
304-
AdditionalDataManager elementAdditionalData = ((IJsonBackedObject) element)
305-
.additionalDataManager();
306-
addAdditionalDataToJson(
307-
elementAdditionalData,
308-
jsonElement
309-
);
310-
outJson = getChildAdditionalData((IJsonBackedObject) element, jsonElement);
311-
}
312-
}
281+
else if (fieldObject instanceof List && fieldJsonElement.isJsonArray()) {
282+
final JsonArray fieldArrayValue = fieldJsonElement.getAsJsonArray();
283+
final List<?> fieldObjectList = (List<?>) fieldObject;
284+
for (int index = 0; index < fieldObjectList.size(); index++) {
285+
final Object item = fieldObjectList.get(index);
286+
final JsonElement itemJsonElement = fieldArrayValue.get(index);
287+
addAdditionalDataFromJsonElementToJson(item, itemJsonElement);
313288
}
314289
}
315290
// If the object is a valid Graph object, add its additional data
316-
else if (fieldObject != null && fieldObject instanceof IJsonBackedObject) {
317-
IJsonBackedObject serializableChild = (IJsonBackedObject) fieldObject;
318-
AdditionalDataManager childAdditionalData = serializableChild.additionalDataManager();
319-
if(outJson != null && field != null && outJson.get(field.getName()) != null && outJson.get(field.getName()).isJsonObject()) {
320-
addAdditionalDataToJson(childAdditionalData, outJson.get(field.getName()).getAsJsonObject());
321-
}
322-
323-
// Serialize its children
324-
outJson = getChildAdditionalData(serializableChild, outJson);
325-
}
291+
addAdditionalDataFromJsonElementToJson(fieldObject, fieldJsonElement);
326292
} catch (IllegalArgumentException | IllegalAccessException e) {
327293
logger.logError("Unable to access child fields of " + serializableObject.getClass().getSimpleName(), e);
328294
}
329295
}
330-
331-
return outJson;
332296
}
333-
297+
298+
/**
299+
* Add each non-transient additional data property to the given JSON node
300+
*
301+
* @param item the object containing additional data
302+
* @param itemJsonElement the JSON node to add the additional data properties to
303+
*/
304+
private void addAdditionalDataFromJsonElementToJson (final Object item, final JsonElement itemJsonElement) {
305+
if (item instanceof IJsonBackedObject && itemJsonElement.isJsonObject()) {
306+
final JsonObject itemJsonObject = itemJsonElement.getAsJsonObject();
307+
final IJsonBackedObject serializableItem = (IJsonBackedObject) item;
308+
final AdditionalDataManager itemAdditionalData = serializableItem.additionalDataManager();
309+
addAdditionalDataFromManagerToJson(itemAdditionalData, itemJsonObject);
310+
getChildAdditionalData(serializableItem, itemJsonObject);
311+
}
312+
}
313+
334314
/**
335315
* Add each non-transient additional data property to the given JSON node
336316
*
337317
* @param additionalDataManager the additional data bag to iterate through
338318
* @param jsonNode the JSON node to add the additional data properties to
339319
*/
340-
private void addAdditionalDataToJson(AdditionalDataManager additionalDataManager, JsonObject jsonNode) {
320+
private void addAdditionalDataFromManagerToJson(AdditionalDataManager additionalDataManager, JsonObject jsonNode) {
341321
for (Map.Entry<String, JsonElement> entry : additionalDataManager.entrySet()) {
342322
if(!entry.getKey().equals(graphResponseHeadersKey)) {
343323
jsonNode.add(entry.getKey(), entry.getValue());

0 commit comments

Comments
 (0)