|
29 | 29 | import com.google.gson.JsonElement; |
30 | 30 | import com.google.gson.JsonObject; |
31 | 31 | import com.microsoft.graph.logger.ILogger; |
| 32 | + |
| 33 | +import java.lang.reflect.Field; |
| 34 | +import java.lang.reflect.Type; |
32 | 35 | import java.util.HashMap; |
33 | 36 | import java.util.Iterator; |
34 | 37 | import java.util.List; |
@@ -185,23 +188,46 @@ public <T> String serializeObject(final T serializableObject) { |
185 | 188 | JsonElement outJsonTree = gson.toJsonTree(serializableObject); |
186 | 189 |
|
187 | 190 | if (serializableObject instanceof IJsonBackedObject) { |
188 | | - IJsonBackedObject serializableJsonObject = (IJsonBackedObject) serializableObject; |
189 | | - |
190 | | - AdditionalDataManager additionalData = serializableJsonObject.additionalDataManager(); |
191 | | - |
192 | | - // If the item is a valid Graph object, add its additional data |
193 | | - if (outJsonTree.isJsonObject()) { |
194 | | - JsonObject outJson = outJsonTree.getAsJsonObject(); |
195 | | - |
196 | | - addAdditionalDataToJson(additionalData, outJson); |
197 | | - outJson = getChildAdditionalData(serializableJsonObject, outJson); |
198 | | - |
199 | | - outJsonTree = outJson; |
| 191 | + outJsonTree = getDataFromAdditionalDataManager(outJsonTree, serializableObject); |
| 192 | + } else if (outJsonTree.isJsonObject()) { |
| 193 | + final Field[] fields = serializableObject.getClass().getDeclaredFields(); |
| 194 | + JsonObject outJson = outJsonTree.getAsJsonObject(); |
| 195 | + for(Field field : fields) { |
| 196 | + if(outJson.has(field.getName())) { |
| 197 | + final Type[] interfaces = field.getType().getGenericInterfaces(); |
| 198 | + for(Type interfaceType : interfaces) { |
| 199 | + if(interfaceType == IJsonBackedObject.class) { |
| 200 | + try { |
| 201 | + outJsonTree = getDataFromAdditionalDataManager(outJsonTree, field.get(serializableObject)); |
| 202 | + } catch (IllegalAccessException ex ) { |
| 203 | + logger.logDebug("Couldn't access prop" + field.getName()); |
| 204 | + } |
| 205 | + break; |
| 206 | + } |
| 207 | + } |
| 208 | + } |
200 | 209 | } |
201 | 210 | } |
202 | 211 |
|
203 | 212 | return outJsonTree.toString(); |
204 | 213 | } |
| 214 | + private <T> JsonElement getDataFromAdditionalDataManager(JsonElement outJsonTree, final T serializableObject) { |
| 215 | + IJsonBackedObject serializableJsonObject = (IJsonBackedObject) serializableObject; |
| 216 | + |
| 217 | + AdditionalDataManager additionalData = serializableJsonObject.additionalDataManager(); |
| 218 | + |
| 219 | + // If the item is a valid Graph object, add its additional data |
| 220 | + if (outJsonTree.isJsonObject()) { |
| 221 | + JsonObject outJson = outJsonTree.getAsJsonObject(); |
| 222 | + |
| 223 | + addAdditionalDataToJson(additionalData, outJson); |
| 224 | + outJson = getChildAdditionalData(serializableJsonObject, outJson); |
| 225 | + |
| 226 | + return outJson; |
| 227 | + } else { |
| 228 | + return outJsonTree; |
| 229 | + } |
| 230 | + } |
205 | 231 |
|
206 | 232 | /** |
207 | 233 | * Recursively populates additional data for each child object |
|
0 commit comments