@@ -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