Skip to content

Commit b343dcd

Browse files
committed
- adds support for derived types in collection deserialization
1 parent 9a904f4 commit b343dcd

File tree

3 files changed

+35
-10
lines changed

3 files changed

+35
-10
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,15 @@ public static <T1, T2 extends IRequestBuilder> BaseCollectionPage<T1, T2> deseri
110110
/** eg: com.microsoft.graph.requests.extensions.AttachmentCollectionPage */
111111
final String collectionPageClassCanonicalName = typeOfT.getTypeName();
112112
/** eg: com.microsoft.graph.models.extensions.Attachment */
113-
final String entityClassCanonicalName = collectionPageClassCanonicalName
113+
final String baseEntityClassCanonicalName = collectionPageClassCanonicalName
114114
.substring(0, collectionPageClassCanonicalName.length() - pageLength - collectionLength)
115115
.replace("requests", "models");
116116
try {
117-
final Class<?> entityClass = Class.forName(entityClassCanonicalName);
117+
final Class<?> baseEntityClass = Class.forName(baseEntityClassCanonicalName);
118118
for (JsonObject sourceObject : sourceArray) {
119+
Class<?> entityClass = serializer.getDerivedClass(sourceObject, baseEntityClass);
120+
if(entityClass == null)
121+
entityClass = baseEntityClass;
119122
final T1 targetObject = (T1)serializer.deserializeObject(sourceObject.toString(), entityClass);
120123
((IJsonBackedObject)targetObject).setRawObject(serializer, sourceObject);
121124
list.add(targetObject);

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -313,14 +313,18 @@ private void addAdditionalDataToJson(AdditionalDataManager additionalDataManager
313313
* @param parentClass the parent class the derived class should inherit from
314314
* @return the derived class if found, or null if not applicable
315315
*/
316-
private Class<?> getDerivedClass(JsonObject jsonObject, Class<?> parentClass) {
317-
//Identify the odata.type information if provided
318-
if (jsonObject.get("@odata.type") != null) {
319-
String odataType = jsonObject.get("@odata.type").getAsString();
320-
String derivedType = odataType.substring(odataType.lastIndexOf('.') + 1); //Remove microsoft.graph prefix
321-
derivedType = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, derivedType);
322-
derivedType = "com.microsoft.graph.models.extensions." + derivedType; //Add full package path
323-
316+
private final static String ODATA_TYPE_KEY = "@odata.type";
317+
public Class<?> getDerivedClass(JsonObject jsonObject, Class<?> parentClass) {
318+
//Identify the odata.type information if provided
319+
if (jsonObject.get(ODATA_TYPE_KEY) != null) {
320+
/** #microsoft.graph.user or #microsoft.graph.callrecords.callrecord */
321+
final String odataType = jsonObject.get(ODATA_TYPE_KEY).getAsString();
322+
final Integer lastDotIndex = odataType.lastIndexOf(".");
323+
final String derivedType = (odataType.substring(0, lastDotIndex) +
324+
".models.extensions." +
325+
CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL,
326+
odataType.substring(lastDotIndex + 1)))
327+
.replace("#", "com.");
324328
try {
325329
Class<?> derivedClass = Class.forName(derivedType);
326330
//Check that the derived class inherits from the given parent class

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.nio.charset.StandardCharsets;
88
import java.util.ArrayList;
99
import java.util.Arrays;
10+
import java.util.List;
1011

1112
import org.junit.Before;
1213
import org.junit.Test;
@@ -19,11 +20,15 @@
1920
import com.microsoft.graph.models.extensions.Attendee;
2021
import com.microsoft.graph.models.extensions.Contact;
2122
import com.microsoft.graph.models.extensions.DateTimeTimeZone;
23+
import com.microsoft.graph.models.extensions.DirectoryObject;
2224
import com.microsoft.graph.models.extensions.DriveItem;
2325
import com.microsoft.graph.models.extensions.EmailAddress;
2426
import com.microsoft.graph.models.extensions.Event;
2527
import com.microsoft.graph.models.extensions.FileAttachment;
28+
import com.microsoft.graph.models.extensions.Group;
2629
import com.microsoft.graph.models.extensions.ItemAttachment;
30+
import com.microsoft.graph.models.extensions.ServicePrincipal;
31+
import com.microsoft.graph.models.extensions.User;
2732
import com.microsoft.graph.requests.extensions.AttachmentCollectionPage;
2833
import com.microsoft.graph.requests.extensions.AttachmentCollectionResponse;
2934

@@ -83,6 +88,19 @@ public void testEntityWithCollectionOnDefaultDeserializer() throws Exception {
8388
assertTrue(driveItem.thumbnails.getCurrentPage().size() > 0);
8489
}
8590

91+
@Test
92+
public void testEntityWithCollectionOfMultipleTypes() throws Exception {
93+
final String jsonString = "{\"@odata.context\": \"https://graph.microsoft.com/v1.0/$metadata#groups/$entity\",\"id\": \"01b4b70e-2ea6-432f-a3d7-eefd826c2a8e\",\"deletedDateTime\": null,\"classification\": null,\"createdDateTime\": \"2019-11-23T15:48:33Z\",\"creationOptions\": [],\"description\": \"wovinewovinewvoinwev\",\"displayName\": \"Toronto Basketball Raptors\",\"expirationDateTime\": null,\"groupTypes\": [\"Unified\"],\"isAssignableToRole\": null,\"mail\": \"[email protected]\",\"mailEnabled\": true,\"mailNickname\": \"TBR\",\"membershipRule\": null,\"membershipRuleProcessingState\": null,\"onPremisesDomainName\": null,\"onPremisesLastSyncDateTime\": null,\"onPremisesNetBiosName\": null,\"onPremisesSamAccountName\": null,\"onPremisesSecurityIdentifier\": null,\"onPremisesSyncEnabled\": null,\"preferredDataLocation\": null,\"preferredLanguage\": null,\"proxyAddresses\": [\"SPO:SPO_c0b1d860-d3d3-444c-98ee-c34365caa414@SPO_bd4c6c31-c49c-4ab6-a0aa-742e07c20232\",\"SMTP:[email protected]\"],\"renewedDateTime\": \"2019-11-23T15:48:33Z\",\"resourceBehaviorOptions\": [],\"resourceProvisioningOptions\": [\"Team\"],\"securityEnabled\": false,\"securityIdentifier\": \"S-1-12-1-28620558-1127165606-4260288419-2385144962\",\"theme\": null,\"visibility\": \"Private\",\"onPremisesProvisioningErrors\": [],\"members\": [{\"@odata.type\": \"#microsoft.graph.user\",\"id\": \"c2e8df37-c6a7-4d88-89b1-feb4f1fda7c5\",\"businessPhones\": [\"4388888888\"],\"displayName\": \"Vincent Biret\",\"givenName\": \"Vincent\",\"jobTitle\": null,\"mail\": \"[email protected]\",\"mobilePhone\": \"+1 4388888888\",\"officeLocation\": \"Quebec\",\"preferredLanguage\": \"en-US\",\"surname\": \"Biret\",\"userPrincipalName\": \"[email protected]\"},{\"@odata.type\": \"#microsoft.graph.servicePrincipal\",\"id\": \"004ea702-a572-4f1b-8bb0-74598985e0c0\",\"deletedDateTime\": null,\"accountEnabled\": true,\"alternativeNames\": [],\"appDisplayName\": \"OCPS Checkin Service\",\"appDescription\": null,\"appId\": \"23c898c1-f7e8-41da-9501-f16571f8d097\",\"applicationTemplateId\": null,\"appOwnerOrganizationId\": \"f8cdef31-a31e-4b4a-93e4-5f571e91255a\",\"appRoleAssignmentRequired\": false,\"createdDateTime\": \"2018-11-13T02:28:32Z\",\"description\": null,\"displayName\": \"OCPS Checkin Service\",\"homepage\": null,\"loginUrl\": null,\"logoutUrl\": null,\"notes\": null,\"notificationEmailAddresses\": [],\"preferredSingleSignOnMode\": null,\"preferredTokenSigningKeyThumbprint\": null,\"replyUrls\": [\"https://ocps.manage.microsoft.com\"],\"resourceSpecificApplicationPermissions\": [],\"samlSingleSignOnSettings\": null,\"servicePrincipalNames\": [\"23c898c1-f7e8-41da-9501-f16571f8d097\",\"https://ocps.manage.microsoft.com\"],\"servicePrincipalType\": \"Application\",\"tags\": [],\"tokenEncryptionKeyId\": null,\"verifiedPublisher\": {\"displayName\": null,\"verifiedPublisherId\": null,\"addedDateTime\": null},\"addIns\": [],\"appRoles\": [],\"info\": {\"logoUrl\": null,\"marketingUrl\": null,\"privacyStatementUrl\": null,\"supportUrl\": null,\"termsOfServiceUrl\": null},\"keyCredentials\": [],\"oauth2PermissionScopes\": [],\"passwordCredentials\": []}]}";
94+
final DefaultSerializer defaultSerializer = new DefaultSerializer(logger);
95+
final Group group = defaultSerializer.deserializeObject(jsonString, Group.class);
96+
assertNotNull(group);
97+
assertNotNull(group.members);
98+
final List<DirectoryObject> page = group.members.getCurrentPage();
99+
assertTrue(page.size() == 2);
100+
assertTrue(page.get(0) instanceof User);
101+
assertTrue(page.get(1) instanceof ServicePrincipal);
102+
}
103+
86104
private FileAttachment getFileAttachment() throws Exception{
87105
FileAttachment fileAttachment = new FileAttachment();
88106
fileAttachment.name = "document.pdf";

0 commit comments

Comments
 (0)