@@ -100,13 +100,59 @@ public <T> T deserializeObject(final String inputString, final Class<T> clazz, M
100100 }
101101
102102 jsonBackedObject .additionalDataManager ().setAdditionalData (rawObject );
103+ setChildAdditionalData (jsonBackedObject ,rawObject );
103104 return jo ;
104105 } else {
105106 logger .logDebug ("Deserializing a non-IJsonBackedObject type " + clazz .getSimpleName ());
106107 return jsonObject ;
107108 }
108109 }
109110
111+ /**
112+ * Recursively sets additional data for each child object
113+ *
114+ * @param serializedObject the parent object whose children will be iterated to set additional data
115+ * @param rawJson the raw json
116+ */
117+ @ SuppressWarnings ("unchecked" )
118+ private void setChildAdditionalData (IJsonBackedObject serializedObject , JsonObject rawJson ) {
119+ // Use reflection to iterate through fields for eligible Graph children
120+ for (java .lang .reflect .Field field : serializedObject .getClass ().getFields ()) {
121+ try {
122+ Object fieldObject = field .get (serializedObject );
123+
124+ // If the object is a HashMap, iterate through its children
125+ if (fieldObject instanceof HashMap ) {
126+ @ SuppressWarnings ("unchecked" )
127+ HashMap <String , Object > serializableChildren = (HashMap <String , Object >) fieldObject ;
128+ Iterator <Entry <String , Object >> it = serializableChildren .entrySet ().iterator ();
129+
130+ while (it .hasNext ()) {
131+ Map .Entry <String , Object > pair = (Map .Entry <String , Object >)it .next ();
132+ Object child = pair .getValue ();
133+
134+ // If the item is a valid Graph object, set its additional data
135+ if (child instanceof IJsonBackedObject ) {
136+ AdditionalDataManager childAdditionalDataManager = ((IJsonBackedObject ) child ).additionalDataManager ();
137+ childAdditionalDataManager .setAdditionalData (rawJson .get (field .getName ()).getAsJsonObject ());
138+ setChildAdditionalData ((IJsonBackedObject ) child ,rawJson .get (field .getName ()).getAsJsonObject ());
139+ }
140+ }
141+ }
142+ // If the object is a valid Graph object, set its additional data
143+ else if (fieldObject != null && fieldObject instanceof IJsonBackedObject ) {
144+ IJsonBackedObject serializedChild = (IJsonBackedObject ) fieldObject ;
145+ AdditionalDataManager childAdditionalDataManager = serializedChild .additionalDataManager ();
146+
147+ childAdditionalDataManager .setAdditionalData (rawJson .get (field .getName ()).getAsJsonObject ());
148+ setChildAdditionalData ((IJsonBackedObject ) fieldObject ,rawJson .get (field .getName ()).getAsJsonObject ());
149+ }
150+ } catch (IllegalArgumentException | IllegalAccessException e ) {
151+ logger .logError ("Unable to access child fields of " + serializedObject .getClass ().getSimpleName (), e );
152+ }
153+ }
154+ }
155+
110156 /**
111157 * Serializes an object into a string
112158 *
0 commit comments