@@ -118,59 +118,73 @@ public <T> T deserializeObject(final String inputString, final Class<T> clazz, M
118118 * @param serializedObject the parent object whose children will be iterated to set additional data
119119 * @param rawJson the raw json
120120 */
121- @ SuppressWarnings ("unchecked" )
122- private void setChildAdditionalData (IJsonBackedObject serializedObject , JsonObject rawJson ) {
121+ private void setChildAdditionalData (final IJsonBackedObject serializedObject , final JsonObject rawJson ) {
123122 // Use reflection to iterate through fields for eligible Graph children
124- for (java .lang .reflect .Field field : serializedObject .getClass ().getFields ()) {
125- try {
126- Object fieldObject = field .get (serializedObject );
127-
128- // If the object is a HashMap, iterate through its children
129- if (fieldObject instanceof HashMap ) {
130- HashMap <String , Object > serializableChildren = (HashMap <String , Object >) fieldObject ;
131- Iterator <Entry <String , Object >> it = serializableChildren .entrySet ().iterator ();
123+ if (rawJson != null ) {
124+ for (java .lang .reflect .Field field : serializedObject .getClass ().getFields ()) {
125+ try {
126+ if (field != null ) {
127+ final Object fieldObject = field .get (serializedObject );
128+ if (fieldObject instanceof HashMap ) {
129+ // If the object is a HashMap, iterate through its children
130+ @ SuppressWarnings ("unchecked" )
131+ final HashMap <String , Object > serializableChildren = (HashMap <String , Object >) fieldObject ;
132+ final Iterator <Entry <String , Object >> it = serializableChildren .entrySet ().iterator ();
132133
133- while (it .hasNext ()) {
134- Map .Entry <String , Object > pair = (Map .Entry <String , Object >)it .next ();
135- Object child = pair .getValue ();
134+ while (it .hasNext ()) {
135+ final Map .Entry <String , Object > pair = (Map .Entry <String , Object >)it .next ();
136+ final Object child = pair .getValue ();
136137
137- // If the item is a valid Graph object, set its additional data
138- if (child instanceof IJsonBackedObject ) {
139- AdditionalDataManager childAdditionalDataManager = ((IJsonBackedObject ) child ).additionalDataManager ();
140- if (rawJson != null && field != null && rawJson .get (field .getName ()) != null && rawJson .get (field .getName ()).isJsonObject ()
141- && rawJson .get (field .getName ()).getAsJsonObject ().get (pair .getKey ()).isJsonObject ()) {
142- childAdditionalDataManager .setAdditionalData (rawJson .get (field .getName ()).getAsJsonObject ().get (pair .getKey ()).getAsJsonObject ());
143- setChildAdditionalData ((IJsonBackedObject ) child ,rawJson .get (field .getName ()).getAsJsonObject ().get (pair .getKey ()).getAsJsonObject ());
138+ // If the item is a valid Graph object, set its additional data
139+ if (child instanceof IJsonBackedObject ) {
140+ final AdditionalDataManager childAdditionalDataManager = ((IJsonBackedObject ) child ).additionalDataManager ();
141+ final JsonElement fieldElement = rawJson .get (field .getName ());
142+ if (fieldElement != null && fieldElement .isJsonObject ()
143+ && fieldElement .getAsJsonObject ().get (pair .getKey ()) != null
144+ && fieldElement .getAsJsonObject ().get (pair .getKey ()).isJsonObject ()) {
145+ childAdditionalDataManager .setAdditionalData (fieldElement .getAsJsonObject ().get (pair .getKey ()).getAsJsonObject ());
146+ setChildAdditionalData ((IJsonBackedObject ) child ,fieldElement .getAsJsonObject ().get (pair .getKey ()).getAsJsonObject ());
147+ }
148+ }
144149 }
145150 }
146- }
147- }
148- // If the object is a list of Graph objects, iterate through elements
149- else if (fieldObject instanceof List && rawJson != null ) {
150- final JsonElement collectionJson = rawJson .get (field .getName ());
151- final List <?> fieldObjectList = (List <?>) fieldObject ;
152- if (collectionJson .isJsonArray () && ((JsonArray )collectionJson ).size () == fieldObjectList .size ()) {
153- final JsonArray rawJsonArray = (JsonArray ) collectionJson ;
154- for (int i = 0 ; i < fieldObjectList .size (); i ++) {
155- final Object element = fieldObjectList .get (i );
156- if (element instanceof IJsonBackedObject ) {
157- final JsonElement elementRawJson = rawJsonArray .get (i );
158- setChildAdditionalData ((IJsonBackedObject ) element , elementRawJson .getAsJsonObject ());
151+ // If the object is a list of Graph objects, iterate through elements
152+ else if (fieldObject instanceof List ) {
153+ final JsonElement collectionJson = rawJson .get (field .getName ());
154+ final List <?> fieldObjectList = (List <?>) fieldObject ;
155+ if (collectionJson != null && collectionJson .isJsonArray ()) {
156+ final JsonArray rawJsonArray = (JsonArray ) collectionJson ;
157+ final Integer fieldObjectListSize = fieldObjectList .size ();
158+ final Integer rawJsonArraySize = rawJsonArray .size ();
159+ for (int i = 0 ; i < fieldObjectListSize && i < rawJsonArraySize ; i ++) {
160+ final Object element = fieldObjectList .get (i );
161+ if (element instanceof IJsonBackedObject ) {
162+ final JsonElement elementRawJson = rawJsonArray .get (i );
163+ if (elementRawJson != null ) {
164+ setChildAdditionalData ((IJsonBackedObject ) element , elementRawJson .getAsJsonObject ());
165+ }
166+ }
167+ }
168+ if (rawJsonArraySize != fieldObjectListSize )
169+ logger .logDebug ("rawJsonArray has a size of " + rawJsonArraySize + " and fieldObjectList of " + fieldObjectListSize );
170+ }
171+ }
172+ // If the object is a valid Graph object, set its additional data
173+ else if (fieldObject instanceof IJsonBackedObject ) {
174+ final IJsonBackedObject serializedChild = (IJsonBackedObject ) fieldObject ;
175+ final AdditionalDataManager childAdditionalDataManager = serializedChild .additionalDataManager ();
176+ final JsonElement fieldElement = rawJson .get (field .getName ());
177+ if (fieldElement != null && fieldElement .isJsonObject ()) {
178+ childAdditionalDataManager .setAdditionalData (fieldElement .getAsJsonObject ());
179+ setChildAdditionalData ((IJsonBackedObject ) fieldObject ,fieldElement .getAsJsonObject ());
159180 }
160181 }
161182 }
183+ } catch (IllegalArgumentException | IllegalAccessException e ) {
184+ //Not throwing the IllegalArgumentException as the Serialized Object would still be usable even if the additional data is not set.
185+ logger .logError ("Unable to set child fields of " + serializedObject .getClass ().getSimpleName (), e );
186+ logger .logDebug (rawJson .getAsString ());
162187 }
163- // If the object is a valid Graph object, set its additional data
164- else if (fieldObject != null && fieldObject instanceof IJsonBackedObject ) {
165- IJsonBackedObject serializedChild = (IJsonBackedObject ) fieldObject ;
166- AdditionalDataManager childAdditionalDataManager = serializedChild .additionalDataManager ();
167- if (rawJson != null && field != null && rawJson .get (field .getName ()) != null && rawJson .get (field .getName ()).isJsonObject ()) {
168- childAdditionalDataManager .setAdditionalData (rawJson .get (field .getName ()).getAsJsonObject ());
169- setChildAdditionalData ((IJsonBackedObject ) fieldObject ,rawJson .get (field .getName ()).getAsJsonObject ());
170- }
171- }
172- } catch (IllegalArgumentException | IllegalAccessException e ) {
173- logger .logError ("Unable to access child fields of " + serializedObject .getClass ().getSimpleName (), e );
174188 }
175189 }
176190 }
0 commit comments