Skip to content

Commit c0a1eea

Browse files
authored
Merge pull request #588 from microsoftgraph/bugfix/enum-names
- fixes a bug where enum set properties would not be serialized properly
2 parents 664aa57 + 7f57641 commit c0a1eea

File tree

3 files changed

+64
-28
lines changed

3 files changed

+64
-28
lines changed

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
package com.microsoft.graph.serializer;
2323

2424
import com.google.gson.Gson;
25+
import com.google.gson.GsonBuilder;
2526
import com.google.gson.JsonPrimitive;
27+
import com.microsoft.graph.logger.ILogger;
2628

2729
import java.lang.reflect.Type;
2830
import java.util.EnumSet;
@@ -36,39 +38,43 @@
3638
*/
3739
public class EnumSetSerializer {
3840

41+
private final Gson gson;
3942
/**
4043
* Not available for instantiation
4144
*/
42-
private EnumSetSerializer() {
45+
public EnumSetSerializer(final ILogger logger) {
46+
gson = new GsonBuilder().registerTypeAdapterFactory(new FallbackTypeAdapterFactory(logger)).create();
4347
}
4448

4549
/**
4650
* Deserializes a comma-delimited string of enum values
47-
*
51+
*
4852
* @param type the type
4953
* @param jsonStrToDeserialize the string to deserialize
5054
* @return EnumSet of values
5155
*/
52-
public static EnumSet<?> deserialize(Type type, String jsonStrToDeserialize) {
53-
Gson gson = new Gson();
54-
String arrayString = "[" + jsonStrToDeserialize + "]";
56+
public EnumSet<?> deserialize(Type type, String jsonStrToDeserialize) {
57+
final String arrayString = "[" + jsonStrToDeserialize + "]";
5558
return jsonStrToDeserialize == null ? null : (EnumSet<?>) gson.fromJson(arrayString, type);
5659
}
5760

5861
/**
5962
* Serializes an EnumSet into a comma-delimited string
60-
*
63+
*
6164
* @param src the source EnumSet
6265
* @return a comma-delimited string of enum values
6366
*/
64-
public static JsonPrimitive serialize(EnumSet<?> src) {
65-
String serializedString = "";
67+
public JsonPrimitive serialize(EnumSet<?> src) {
68+
final StringBuilder serializedStringBuilder = new StringBuilder();
6669

67-
Iterator<?> i = src.iterator();
70+
final Iterator<?> i = src.iterator();
6871
while (i.hasNext()) {
69-
serializedString += i.next().toString() + ",";
72+
final String jsonValue = gson.toJson(i.next());
73+
serializedStringBuilder.append(jsonValue.substring(1, jsonValue.length() -1));
74+
if(i.hasNext()) {
75+
serializedStringBuilder.append(",");
76+
}
7077
}
71-
serializedString = serializedString.substring(0, serializedString.length()-1);
72-
return new JsonPrimitive(serializedString);
78+
return new JsonPrimitive(serializedStringBuilder.toString());
7379
}
7480
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
final class GsonFactory {
5252

5353
private static String PARSING_MESSAGE = "Parsing issue on ";
54-
54+
5555
/**
5656
* Default constructor
5757
*/
@@ -163,6 +163,7 @@ public DateOnly deserialize(final JsonElement json,
163163
}
164164
}
165165
};
166+
final EnumSetSerializer eSetSerializer = new EnumSetSerializer(logger);
166167

167168
final JsonSerializer<EnumSet<?>> enumSetJsonSerializer = new JsonSerializer<EnumSet<?>>() {
168169
@Override
@@ -173,7 +174,7 @@ public JsonElement serialize(final EnumSet<?> src,
173174
return null;
174175
}
175176

176-
return EnumSetSerializer.serialize(src);
177+
return eSetSerializer.serialize(src);
177178
}
178179
};
179180

@@ -186,7 +187,7 @@ public EnumSet<?> deserialize(final JsonElement json,
186187
return null;
187188
}
188189

189-
return EnumSetSerializer.deserialize(typeOfT, json.getAsString());
190+
return eSetSerializer.deserialize(typeOfT, json.getAsString());
190191
}
191192
};
192193

@@ -211,7 +212,7 @@ public Duration deserialize(final JsonElement json,
211212
}
212213
}
213214
};
214-
215+
215216
final JsonSerializer<BaseCollectionPage<?,?>> collectionPageSerializer = new JsonSerializer<BaseCollectionPage<?,?>>() {
216217
@Override
217218
public JsonElement serialize(final BaseCollectionPage<?,?> src,
@@ -229,7 +230,7 @@ public BaseCollectionPage<?,?> deserialize(final JsonElement json,
229230
return CollectionPageSerializer.deserialize(json, typeOfT, logger);
230231
}
231232
};
232-
233+
233234
final JsonDeserializer<TimeOfDay> timeOfDayJsonDeserializer = new JsonDeserializer<TimeOfDay>() {
234235
@Override
235236
public TimeOfDay deserialize(final JsonElement json,

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

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
import static org.junit.Assert.assertNotNull;
55
import static org.junit.Assert.assertTrue;
66

7+
import java.io.IOException;
8+
import java.util.ArrayList;
9+
import java.util.EnumSet;
10+
711
import com.google.gson.JsonElement;
812
import com.google.gson.JsonObject;
913
import com.google.gson.annotations.Expose;
1014
import com.google.gson.annotations.SerializedName;
1115
import com.microsoft.graph.callrecords.models.extensions.MediaStream;
16+
import com.microsoft.graph.functional.TestBase;
17+
import com.microsoft.graph.http.HttpMethod;
1218
import com.microsoft.graph.http.MockConnection;
1319
import com.microsoft.graph.logger.DefaultLogger;
1420
import com.microsoft.graph.models.extensions.Attachment;
@@ -17,11 +23,18 @@
1723
import com.microsoft.graph.models.extensions.FileAttachment;
1824
import com.microsoft.graph.models.extensions.RecurrenceRange;
1925
import com.microsoft.graph.models.extensions.User;
26+
import com.microsoft.graph.models.extensions.UserGetMailTipsBody;
27+
import com.microsoft.graph.models.generated.MailTipsType;
2028
import com.microsoft.graph.models.generated.RecurrenceRangeType;
2129
import com.microsoft.graph.requests.extensions.DriveItemDeltaCollectionResponse;
2230
import com.microsoft.graph.models.extensions.UploadSession;
31+
32+
import org.junit.Assert;
2333
import org.junit.Test;
2434

35+
import okhttp3.Request;
36+
import okio.Buffer;
37+
2538
public class DefaultSerializerTests {
2639

2740
/**
@@ -111,19 +124,19 @@ public void testRecurrenceRangeSerialization() throws Exception {
111124
assertNotNull(jsonOut);
112125
assertEquals(expected, jsonOut);
113126
}
114-
127+
115128
@Test
116129
public void testResponseHeaders() throws Exception {
117130
MockConnection connection = new MockConnection(null);
118131
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
119132
User user = serializer.deserializeObject("{\"id\":\"1\"}", User.class, connection.getResponseHeaders());
120-
133+
121134
JsonElement responseHeaders = user.additionalDataManager().get("graphResponseHeaders");
122135
assertNotNull(responseHeaders);
123-
136+
124137
JsonElement responseHeader = responseHeaders.getAsJsonObject().get("header1");
125138
assertNotNull(responseHeader);
126-
139+
127140
assertEquals("value1", responseHeader.getAsJsonArray().get(0).getAsString());
128141
}
129142

@@ -132,25 +145,25 @@ public void testDeserializeDerivedType() throws Exception {
132145
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
133146
final String source = "{\"@odata.context\": \"/attachments/$entity\",\"@odata.type\": \"#microsoft.graph.fileAttachment\",\"id\": \"AAMkAGQ0MjBmNWVkLTYxZjUtNDRmYi05Y2NiLTBlYjIwNzJjNmM1NgBGAAAAAAC6ff7latYeQqu_gLrhSAIhBwCF7iGjpaOmRqVwbZc-xXzwAAAAAAEMAACF7iGjpaOmRqVwbZc-xXzwAABQStA0AAABEgAQAFbGmeisbjtLnQdp7kC_9Fk=\",\"lastModifiedDateTime\": \"2018-01-23T21:50:22Z\",\"name\": \"Test Book.xlsx\",\"contentType\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\"size\": 8457,\"isInline\": false,\"contentId\": null,\"contentLocation\": null,\"contentBytes\": \"bytedata\"}";
134147
final Attachment result = serializer.deserializeObject(source, Attachment.class);
135-
148+
136149
assert(result instanceof FileAttachment);
137-
150+
138151
final FileAttachment fileAttachment = (FileAttachment) result;
139152
assertNotNull(fileAttachment.contentBytes);
140153
final JsonObject o = fileAttachment.getRawObject();
141154
assertNotNull(o);
142155
assertEquals("#microsoft.graph.fileAttachment", o. get("@odata.type").getAsString());
143156
}
144-
157+
145158
@Test
146159
public void testSerializerCanSerializeVoidWithoutEmittingWarning() {
147160
// Unfortunately does not assert for existence of Java 9 illegal access warnings
148-
// which seem to written to the console without use of System.err/System.out (so cannot be captured AFAIK).
161+
// which seem to written to the console without use of System.err/System.out (so cannot be captured AFAIK).
149162
// @davidmoten
150163
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
151164
HasVoidMember t = new HasVoidMember();
152165
String json = serializer.serializeObject(t);
153-
// this line will emit a warning from Java 9 about illegal access to the constructor of Void
166+
// this line will emit a warning from Java 9 about illegal access to the constructor of Void
154167
// if gson TypeAdapterFactory is not handling Void properly
155168
HasVoidMember t2 = serializer.deserializeObject(json, HasVoidMember.class);
156169
assertEquals(t.x, t2.x);
@@ -173,12 +186,28 @@ public void testDurationDeserialization() {
173186
assertNotNull(result);
174187
assertNotNull(result.maxRoundTripTime);
175188
}
176-
189+
@Test
190+
public void testEnumActionParameterDeserialization() throws IOException {
191+
final ArrayList<String> users = new ArrayList<String>();
192+
users.add("[email protected]");
193+
final EnumSet<MailTipsType> mailtips = EnumSet.of(MailTipsType.MAILBOX_FULL_STATUS, MailTipsType.MAX_MESSAGE_SIZE);
194+
final UserGetMailTipsBody body = new UserGetMailTipsBody();
195+
body.emailAddresses = users;
196+
body.mailTipsOptions = mailtips;
197+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
198+
final String serialized = serializer.serializeObject(body);
199+
Assert.assertTrue("result contains camelCasedValues", serialized.contains("mailboxFullStatus"));
200+
201+
final UserGetMailTipsBody deserialized = serializer.deserializeObject(serialized, UserGetMailTipsBody.class);
202+
203+
Assert.assertEquals(2, deserialized.mailTipsOptions.size());
204+
}
205+
177206
public static final class HasVoidMember {
178207
@SerializedName("x")
179208
@Expose
180209
int x = 1;
181-
210+
182211
@SerializedName("y")
183212
@Expose
184213
Void y;

0 commit comments

Comments
 (0)