@@ -223,65 +223,29 @@ 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 )
240+ private void getChildAdditionalData (final Object serializableObject , final JsonElement outJson ) {
241+ if (outJson == null || serializableObject == null || ! outJson . isJsonObject () )
279242 return ;
243+ final JsonObject outJsonObject = outJson .getAsJsonObject ();
280244 // Use reflection to iterate through fields for eligible Graph children
281245 for (java .lang .reflect .Field field : serializableObject .getClass ().getFields ()) {
282246 try {
283247 final Object fieldObject = field .get (serializableObject );
284- final JsonElement fieldJsonElement = outJson .get (field .getName ());
248+ final JsonElement fieldJsonElement = outJsonObject .get (field .getName ());
285249 if (fieldObject == null || fieldJsonElement == null )
286250 continue ;
287251
@@ -296,7 +260,7 @@ private void getChildAdditionalData(final IJsonBackedObject serializableObject,
296260 final Object child = pair .getValue ();
297261 final JsonElement childJsonElement = fieldJsonObject .get (pair .getKey ().toString ());
298262 // If the item is a valid Graph object, add its additional data
299- addAdditionalDataFromJsonElementToJson (child , childJsonElement );
263+ getChildAdditionalData (child , childJsonElement );
300264 }
301265 }
302266 // If the object is a list of Graph objects, iterate through elements
@@ -306,11 +270,13 @@ else if (fieldObject instanceof List && fieldJsonElement.isJsonArray()) {
306270 for (int index = 0 ; index < fieldObjectList .size (); index ++) {
307271 final Object item = fieldObjectList .get (index );
308272 final JsonElement itemJsonElement = fieldArrayValue .get (index );
309- addAdditionalDataFromJsonElementToJson (item , itemJsonElement );
273+ getChildAdditionalData (item , itemJsonElement );
310274 }
311- }
312- // If the object is a valid Graph object, add its additional data
313- addAdditionalDataFromJsonElementToJson (fieldObject , fieldJsonElement );
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+ addAdditionalDataFromJsonElementToJson (fieldObject , fieldJsonObject );
279+ }
314280 } catch (IllegalArgumentException | IllegalAccessException e ) {
315281 logger .logError ("Unable to access child fields of " + serializableObject .getClass ().getSimpleName (), e );
316282 }
@@ -321,11 +287,10 @@ else if (fieldObject instanceof List && fieldJsonElement.isJsonArray()) {
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 addAdditionalDataFromJsonElementToJson (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