1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.provisioning.api.serialization;
20
21 import com.fasterxml.jackson.core.JsonParser;
22 import com.fasterxml.jackson.databind.DeserializationContext;
23 import com.fasterxml.jackson.databind.JsonDeserializer;
24 import com.fasterxml.jackson.databind.JsonNode;
25 import com.fasterxml.jackson.databind.node.ObjectNode;
26 import java.io.IOException;
27 import java.util.Base64;
28 import java.util.Objects;
29 import org.identityconnectors.framework.common.objects.SyncToken;
30
31 class SyncTokenDeserializer extends JsonDeserializer<SyncToken> {
32
33 @Override
34 public SyncToken deserialize(final JsonParser jp, final DeserializationContext ctx)
35 throws IOException {
36
37 ObjectNode tree = jp.readValueAsTree();
38
39 Object value = tree.has("value")
40 ? tree.has("type")
41 ? deserialize(tree.get("value"), tree.get("type"))
42 : deserialize(tree.get("value"))
43 : null;
44
45 return new SyncToken(Objects.requireNonNull(value));
46 }
47
48 private Object deserialize(final JsonNode value, final JsonNode type) {
49 if (Boolean.class.getSimpleName().equals(type.asText())) {
50 return value.asBoolean();
51 }
52
53 if (Double.class.getSimpleName().equals(type.asText())) {
54 return value.asDouble();
55 }
56 if (Long.class.getSimpleName().equals(type.asText())) {
57 return value.asLong();
58 }
59 if (Integer.class.getSimpleName().equals(type.asText())) {
60 return value.asInt();
61 }
62
63 return value.asText();
64 }
65
66 private Object deserialize(final JsonNode value) {
67 if (value.isBoolean()) {
68 return value.asBoolean();
69 }
70
71 if (value.isDouble()) {
72 return value.asDouble();
73 }
74
75 if (value.isLong()) {
76 return value.asLong();
77 }
78
79 if (value.isInt()) {
80 return value.asInt();
81 }
82
83 try {
84 return Base64.getDecoder().decode(value.asText());
85 } catch (RuntimeException e) {
86 return value.asText();
87 }
88 }
89 }