@@ -223,109 +223,74 @@ else if (fieldObject instanceof IJsonBackedObject) {
223223 public <T > String serializeObject (@ Nonnull final T serializableObject ) {
224224 Objects .requireNonNull (serializableObject , "parameter serializableObject cannot be null" );
225225 logger .logDebug ("Serializing type " + serializableObject .getClass ().getSimpleName ());
226- JsonElement outJsonTree = gson .toJsonTree (serializableObject );
227-
228- if (serializableObject instanceof IJsonBackedObject ) {
229- outJsonTree = getDataFromAdditionalDataManager (outJsonTree , serializableObject );
230- } else if (outJsonTree .isJsonObject ()) {
231- final Field [] fields = serializableObject .getClass ().getDeclaredFields ();
232- JsonObject outJson = outJsonTree .getAsJsonObject ();
233- for (Field field : fields ) {
234- if (outJson .has (field .getName ())) {
235- final Type [] interfaces = field .getType ().getGenericInterfaces ();
236- for (Type interfaceType : interfaces ) {
237- if (interfaceType == IJsonBackedObject .class && outJson .get (field .getName ()).isJsonObject ()) {
238- try {
239- final JsonElement outdatedValue = outJson .remove (field .getName ());
240- outJson .add (field .getName (), getDataFromAdditionalDataManager (outdatedValue .getAsJsonObject (), field .get (serializableObject )));
241- } catch (IllegalAccessException ex ) {
242- logger .logDebug ("Couldn't access prop" + field .getName ());
243- }
244- break ;
245- }
246- }
247- }
248- }
249- }
250-
251- return outJsonTree .toString ();
252- }
253- private <T > JsonElement getDataFromAdditionalDataManager (JsonElement outJsonTree , final T serializableObject ) {
254- final IJsonBackedObject serializableJsonObject = (IJsonBackedObject ) serializableObject ;
255- final AdditionalDataManager additionalData = serializableJsonObject .additionalDataManager ();
256-
257- // If the item is a valid Graph object, add its additional data
258- if (outJsonTree .isJsonObject ()) {
259- final JsonObject outJson = outJsonTree .getAsJsonObject ();
260-
261- addAdditionalDataFromManagerToJson (additionalData , outJson );
262- getChildAdditionalData (serializableJsonObject , outJson );
263-
264- return outJson ;
265- } else {
266- return outJsonTree ;
226+ final JsonElement outJsonTree = gson .toJsonTree (serializableObject );
227+ if (outJsonTree != null ) {
228+ getChildAdditionalData (serializableObject , outJsonTree );
229+ return outJsonTree .toString ();
267230 }
231+ return "" ;
268232 }
269-
270233 /**
271234 * Recursively populates additional data for each child object
272235 *
273236 * @param serializableObject the child to get additional data for
274237 * @param outJson the serialized output JSON to add to
275238 */
276239 @ SuppressWarnings ("unchecked" )
277- private void getChildAdditionalData (final IJsonBackedObject serializableObject , final JsonObject outJson ) {
278- if (outJson == null )
279- return ;
280- // Use reflection to iterate through fields for eligible Graph children
281- for (java .lang .reflect .Field field : serializableObject .getClass ().getFields ()) {
282- try {
283- final Object fieldObject = field .get (serializableObject );
284- final JsonElement fieldJsonElement = outJson .get (field .getName ());
285- if (fieldObject == null || fieldJsonElement == null )
286- continue ;
287-
288- // If the object is a HashMap, iterate through its children
289- if (fieldObject instanceof Map && fieldJsonElement .isJsonObject ()) {
290- final Map <String , Object > serializableChildren = (Map <String , Object >) fieldObject ;
291- final Iterator <Entry <String , Object >> it = serializableChildren .entrySet ().iterator ();
292- final JsonObject fieldJsonObject = fieldJsonElement .getAsJsonObject ();
293-
294- while (it .hasNext ()) {
295- final Map .Entry <String , Object > pair = (Map .Entry <String , Object >)it .next ();
296- final Object child = pair .getValue ();
297- final JsonElement childJsonElement = fieldJsonObject .get (pair .getKey ().toString ());
298- // If the item is a valid Graph object, add its additional data
299- addAdditionalDataFromJsonElementToJson (child , childJsonElement );
300- }
301- }
302- // If the object is a list of Graph objects, iterate through elements
303- else if (fieldObject instanceof List && fieldJsonElement .isJsonArray ()) {
304- final JsonArray fieldArrayValue = fieldJsonElement .getAsJsonArray ();
305- final List <?> fieldObjectList = (List <?>) fieldObject ;
306- for (int index = 0 ; index < fieldObjectList .size (); index ++) {
307- final Object item = fieldObjectList .get (index );
308- final JsonElement itemJsonElement = fieldArrayValue .get (index );
309- addAdditionalDataFromJsonElementToJson (item , itemJsonElement );
310- }
311- }
312- // If the object is a valid Graph object, add its additional data
313- addAdditionalDataFromJsonElementToJson (fieldObject , fieldJsonElement );
314- } catch (IllegalArgumentException | IllegalAccessException e ) {
315- logger .logError ("Unable to access child fields of " + serializableObject .getClass ().getSimpleName (), e );
316- }
317- }
318- }
240+ private void getChildAdditionalData (final Object serializableObject , final JsonElement outJson ) {
241+ if (outJson == null || serializableObject == null || !outJson .isJsonObject ())
242+ return ;
243+ final JsonObject outJsonObject = outJson .getAsJsonObject ();
244+ // Use reflection to iterate through fields for eligible Graph children
245+ for (java .lang .reflect .Field field : serializableObject .getClass ().getFields ()) {
246+ try {
247+ final Object fieldObject = field .get (serializableObject );
248+ final JsonElement fieldJsonElement = outJsonObject .get (field .getName ());
249+ if (fieldObject == null || fieldJsonElement == null )
250+ continue ;
251+
252+ // If the object is a HashMap, iterate through its children
253+ if (fieldObject instanceof Map && fieldJsonElement .isJsonObject ()) {
254+ final Map <String , Object > serializableChildren = (Map <String , Object >) fieldObject ;
255+ final Iterator <Entry <String , Object >> it = serializableChildren .entrySet ().iterator ();
256+ final JsonObject fieldJsonObject = fieldJsonElement .getAsJsonObject ();
257+
258+ while (it .hasNext ()) {
259+ final Map .Entry <String , Object > pair = (Map .Entry <String , Object >)it .next ();
260+ final Object child = pair .getValue ();
261+ final JsonElement childJsonElement = fieldJsonObject .get (pair .getKey ().toString ());
262+ // If the item is a valid Graph object, add its additional data
263+ getChildAdditionalData (child , childJsonElement );
264+ }
265+ }
266+ // If the object is a list of Graph objects, iterate through elements
267+ else if (fieldObject instanceof List && fieldJsonElement .isJsonArray ()) {
268+ final JsonArray fieldArrayValue = fieldJsonElement .getAsJsonArray ();
269+ final List <?> fieldObjectList = (List <?>) fieldObject ;
270+ for (int index = 0 ; index < fieldObjectList .size (); index ++) {
271+ final Object item = fieldObjectList .get (index );
272+ final JsonElement itemJsonElement = fieldArrayValue .get (index );
273+ getChildAdditionalData (item , itemJsonElement );
274+ }
275+ } else if (fieldJsonElement .isJsonObject ()) {
276+ // If the object is a valid Graph object, add its additional data
277+ final JsonObject fieldJsonObject = fieldJsonElement .getAsJsonObject ();
278+ addAdditionalDataFromJsonObjectToJson (fieldObject , fieldJsonObject );
279+ }
280+ } catch (IllegalArgumentException | IllegalAccessException e ) {
281+ logger .logError ("Unable to access child fields of " + serializableObject .getClass ().getSimpleName (), e );
282+ }
283+ }
284+ }
319285
320286 /**
321287 * Add each non-transient additional data property to the given JSON node
322288 *
323289 * @param item the object containing additional data
324- * @param itemJsonElement the JSON node to add the additional data properties to
290+ * @param itemJsonObject the JSON node to add the additional data properties to
325291 */
326- private void addAdditionalDataFromJsonElementToJson (final Object item , final JsonElement itemJsonElement ) {
327- if (item instanceof IJsonBackedObject && itemJsonElement .isJsonObject ()) {
328- final JsonObject itemJsonObject = itemJsonElement .getAsJsonObject ();
292+ private void addAdditionalDataFromJsonObjectToJson (final Object item , final JsonObject itemJsonObject ) {
293+ if (item instanceof IJsonBackedObject && itemJsonObject != null ) {
329294 final IJsonBackedObject serializableItem = (IJsonBackedObject ) item ;
330295 final AdditionalDataManager itemAdditionalData = serializableItem .additionalDataManager ();
331296 addAdditionalDataFromManagerToJson (itemAdditionalData , itemJsonObject );
0 commit comments