Skip to content

Commit 209cf1f

Browse files
authored
Merge pull request #451 from microsoftgraph/bugfix/upload-additional-props
- fixes a bug where additional properties for upload sessions would not be send to the service
2 parents dd7778c + c917635 commit 209cf1f

File tree

2 files changed

+51
-12
lines changed

2 files changed

+51
-12
lines changed

src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
import com.google.gson.JsonElement;
3030
import com.google.gson.JsonObject;
3131
import com.microsoft.graph.logger.ILogger;
32+
33+
import java.lang.reflect.Field;
34+
import java.lang.reflect.Type;
3235
import java.util.HashMap;
3336
import java.util.Iterator;
3437
import java.util.List;
@@ -185,23 +188,46 @@ public <T> String serializeObject(final T serializableObject) {
185188
JsonElement outJsonTree = gson.toJsonTree(serializableObject);
186189

187190
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+
}
200209
}
201210
}
202211

203212
return outJsonTree.toString();
204213
}
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+
}
205231

206232
/**
207233
* Recursively populates additional data for each child object

src/test/java/com/microsoft/graph/serializer/AdditionalDataTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import com.google.gson.JsonPrimitive;
1414
import com.microsoft.graph.logger.DefaultLogger;
1515
import com.microsoft.graph.models.extensions.Drive;
16+
import com.microsoft.graph.models.extensions.DriveItemCreateUploadSessionBody;
17+
import com.microsoft.graph.models.extensions.DriveItemUploadableProperties;
1618
import com.microsoft.graph.models.extensions.Entity;
1719
import com.microsoft.graph.models.extensions.PlannerAssignment;
1820
import com.microsoft.graph.models.extensions.PlannerAssignments;
@@ -55,6 +57,17 @@ public void testChildAdditionalData() {
5557

5658
assertEquals("{\"manager\":{\"id\":\"1\",\"additionalData\":\"additionalValue\"},\"id\":\"2\"}", serializedObject);
5759
}
60+
61+
@Test
62+
public void testPropsAdditionalDataOnNonIJSONObjects() {
63+
final DriveItemUploadableProperties upProps = new DriveItemUploadableProperties();
64+
upProps.name = "vacation.gif";
65+
upProps.additionalDataManager().put("@microsoft.graph.conflictBehavior", new JsonPrimitive("rename"));
66+
final DriveItemCreateUploadSessionBody body = new DriveItemCreateUploadSessionBody();
67+
body.item = upProps;
68+
String serializedObject = serializer.serializeObject(body);
69+
assertEquals("{\"item\":{\"name\":\"vacation.gif\"},\"@microsoft.graph.conflictBehavior\":\"rename\"}", serializedObject);
70+
}
5871

5972
@Test
6073
public void testHashMapChildAnnotationData() {

0 commit comments

Comments
 (0)