Skip to content

Commit f3ca542

Browse files
committed
- adds a serializer to handle actions & functions with primitive return types
1 parent 0b995b0 commit f3ca542

File tree

3 files changed

+195
-0
lines changed

3 files changed

+195
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.microsoft.graph.serializer;
2+
3+
import java.lang.reflect.Type;
4+
import java.math.BigDecimal;
5+
import java.util.UUID;
6+
7+
import com.google.gson.JsonElement;
8+
import com.google.gson.JsonParseException;
9+
import com.microsoft.graph.logger.ILogger;
10+
11+
public class EdmNativeTypeSerializer {
12+
public static <T> T deserialize(final JsonElement json, final Class<T> type, final ILogger logger) throws JsonParseException {
13+
if (json == null || !(type instanceof Class)) {
14+
return null;
15+
} else if(json.isJsonPrimitive()) {
16+
return getPrimitiveValue(json, type);
17+
} else if(json.isJsonObject()) {
18+
final JsonElement element = json.getAsJsonObject().get("@odata.null");
19+
if(element != null && element.isJsonPrimitive()) {
20+
return getPrimitiveValue(element, type);
21+
} else {
22+
return null;
23+
}
24+
}
25+
return null;
26+
}
27+
@SuppressWarnings("unchecked")
28+
private static <T> T getPrimitiveValue(final JsonElement json, final Class<T> type) {
29+
if(type == Boolean.class) {
30+
return (T) Boolean.valueOf(json.getAsBoolean());
31+
} else if(type == String.class) {
32+
return (T)json.getAsString();
33+
} else if(type == Integer.class) {
34+
return (T) Integer.valueOf(json.getAsInt());
35+
} else if(type == UUID.class) {
36+
return (T) UUID.fromString(json.getAsString());
37+
} else if(type == Long.class) {
38+
return (T) Long.valueOf(json.getAsLong());
39+
} else if (type == Float.class) {
40+
return (T) Float.valueOf(json.getAsFloat());
41+
} else if (type == BigDecimal.class) {
42+
return (T) json.getAsBigDecimal();
43+
} else {
44+
return null;
45+
}
46+
}
47+
}

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@
3737

3838
import com.microsoft.graph.models.extensions.TimeOfDay;
3939
import java.lang.reflect.Type;
40+
import java.math.BigDecimal;
4041
import java.text.ParseException;
4142
import java.util.Calendar;
4243
import java.util.EnumSet;
4344
import java.util.GregorianCalendar;
45+
import java.util.UUID;
4446

4547
import javax.xml.datatype.DatatypeFactory;
4648
import javax.xml.datatype.Duration;
@@ -244,8 +246,78 @@ public TimeOfDay deserialize(final JsonElement json,
244246
}
245247
};
246248

249+
final JsonDeserializer<Boolean> booleanJsonDeserializer = new JsonDeserializer<Boolean>() {
250+
@Override
251+
public Boolean deserialize(final JsonElement json,
252+
final Type typeOfT,
253+
final JsonDeserializationContext context) throws JsonParseException {
254+
return EdmNativeTypeSerializer.deserialize(json, Boolean.class, logger);
255+
}
256+
};
257+
258+
final JsonDeserializer<String> stringJsonDeserializer = new JsonDeserializer<String>() {
259+
@Override
260+
public String deserialize(final JsonElement json,
261+
final Type typeOfT,
262+
final JsonDeserializationContext context) throws JsonParseException {
263+
return EdmNativeTypeSerializer.deserialize(json, String.class, logger);
264+
}
265+
};
266+
267+
final JsonDeserializer<BigDecimal> bigDecimalJsonDeserializer = new JsonDeserializer<BigDecimal>() {
268+
@Override
269+
public BigDecimal deserialize(final JsonElement json,
270+
final Type typeOfT,
271+
final JsonDeserializationContext context) throws JsonParseException {
272+
return EdmNativeTypeSerializer.deserialize(json, BigDecimal.class, logger);
273+
}
274+
};
275+
276+
final JsonDeserializer<Integer> integerJsonDeserializer = new JsonDeserializer<Integer>() {
277+
@Override
278+
public Integer deserialize(final JsonElement json,
279+
final Type typeOfT,
280+
final JsonDeserializationContext context) throws JsonParseException {
281+
return EdmNativeTypeSerializer.deserialize(json, Integer.class, logger);
282+
}
283+
};
284+
285+
final JsonDeserializer<Long> longJsonDeserializer = new JsonDeserializer<Long>() {
286+
@Override
287+
public Long deserialize(final JsonElement json,
288+
final Type typeOfT,
289+
final JsonDeserializationContext context) throws JsonParseException {
290+
return EdmNativeTypeSerializer.deserialize(json, Long.class, logger);
291+
}
292+
};
293+
294+
final JsonDeserializer<UUID> uuidJsonDeserializer = new JsonDeserializer<UUID>() {
295+
@Override
296+
public UUID deserialize(final JsonElement json,
297+
final Type typeOfT,
298+
final JsonDeserializationContext context) throws JsonParseException {
299+
return EdmNativeTypeSerializer.deserialize(json, UUID.class, logger);
300+
}
301+
};
302+
303+
final JsonDeserializer<Float> floatJsonDeserializer = new JsonDeserializer<Float>() {
304+
@Override
305+
public Float deserialize(final JsonElement json,
306+
final Type typeOfT,
307+
final JsonDeserializationContext context) throws JsonParseException {
308+
return EdmNativeTypeSerializer.deserialize(json, Float.class, logger);
309+
}
310+
};
311+
247312
return new GsonBuilder()
248313
.excludeFieldsWithoutExposeAnnotation()
314+
.registerTypeAdapter(Boolean.class, booleanJsonDeserializer)
315+
.registerTypeAdapter(String.class, stringJsonDeserializer)
316+
.registerTypeAdapter(Float.class, floatJsonDeserializer)
317+
.registerTypeAdapter(Integer.class, integerJsonDeserializer)
318+
.registerTypeAdapter(BigDecimal.class, bigDecimalJsonDeserializer)
319+
.registerTypeAdapter(UUID.class, uuidJsonDeserializer)
320+
.registerTypeAdapter(Long.class, longJsonDeserializer)
249321
.registerTypeAdapter(Calendar.class, calendarJsonSerializer)
250322
.registerTypeAdapter(Calendar.class, calendarJsonDeserializer)
251323
.registerTypeAdapter(GregorianCalendar.class, calendarJsonSerializer)
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.microsoft.graph.serializer;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.math.BigDecimal;
6+
import java.util.UUID;
7+
8+
import com.microsoft.graph.logger.DefaultLogger;
9+
10+
import org.junit.Test;
11+
12+
public class EdmNativeTypeSerializerTests {
13+
@Test
14+
public void testBoolean() throws Exception {
15+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
16+
17+
final String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#Edm.Null\",\"@odata.null\":true}";
18+
final Boolean result = serializer.deserializeObject(source, Boolean.class);
19+
20+
assertEquals(Boolean.valueOf(true), result);
21+
}
22+
@Test
23+
public void testInteger() throws Exception {
24+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
25+
26+
final String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#Edm.Null\",\"@odata.null\":12}";
27+
final Integer result = serializer.deserializeObject(source, Integer.class);
28+
29+
assertEquals(Integer.valueOf(12), result);
30+
}
31+
@Test
32+
public void testString() throws Exception {
33+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
34+
35+
final String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#Edm.Null\",\"@odata.null\":\"toto\"}";
36+
final String result = serializer.deserializeObject(source, String.class);
37+
38+
assertEquals("toto", result);
39+
}
40+
@Test
41+
public void testFloat() throws Exception {
42+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
43+
44+
final String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#Edm.Null\",\"@odata.null\":12.5}";
45+
final Float result = serializer.deserializeObject(source, Float.class);
46+
47+
assertEquals(Float.valueOf("12.5"), result);
48+
}
49+
@Test
50+
public void testLong() throws Exception {
51+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
52+
53+
final String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#Edm.Null\",\"@odata.null\":12}";
54+
final Long result = serializer.deserializeObject(source, Long.class);
55+
56+
assertEquals(Long.valueOf(12), result);
57+
}
58+
@Test
59+
public void testBigDecimal() throws Exception {
60+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
61+
62+
final String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#Edm.Null\",\"@odata.null\":12}";
63+
final BigDecimal result = serializer.deserializeObject(source, BigDecimal.class);
64+
65+
assertEquals(BigDecimal.valueOf(12), result);
66+
}
67+
@Test
68+
public void testUUID() throws Exception {
69+
final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());
70+
71+
final String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#Edm.Null\",\"@odata.null\":\"0E6558C3-9640-4385-860A-2A894AC5C246\"}";
72+
final UUID result = serializer.deserializeObject(source, UUID.class);
73+
74+
assertEquals(UUID.fromString("0E6558C3-9640-4385-860A-2A894AC5C246"), result);
75+
}
76+
}

0 commit comments

Comments
 (0)