|
1 | 1 |
|
2 | 2 | package com.commercetools.api.json; |
3 | 3 |
|
4 | | -import java.io.IOException; |
5 | | -import java.time.LocalDate; |
6 | | -import java.time.LocalTime; |
7 | | -import java.time.ZonedDateTime; |
8 | | -import java.util.List; |
9 | | -import java.util.regex.Pattern; |
10 | | - |
11 | | -import com.commercetools.api.models.common.LocalizedString; |
12 | | -import com.commercetools.api.models.common.Reference; |
13 | | -import com.commercetools.api.models.common.TypedMoney; |
14 | | -import com.commercetools.api.models.product.*; |
15 | | -import com.commercetools.api.models.product_type.AttributeLocalizedEnumValue; |
16 | | -import com.commercetools.api.models.product_type.AttributePlainEnumValue; |
17 | | -import com.fasterxml.jackson.core.JsonParser; |
18 | | -import com.fasterxml.jackson.core.type.TypeReference; |
19 | | -import com.fasterxml.jackson.databind.DeserializationContext; |
20 | | -import com.fasterxml.jackson.databind.JsonDeserializer; |
21 | | -import com.fasterxml.jackson.databind.JsonNode; |
22 | | -import com.fasterxml.jackson.databind.node.JsonNodeType; |
23 | | - |
24 | | -public class AtrributeDeserializer extends JsonDeserializer<AttributeImpl> { |
25 | | - |
26 | | - private static Pattern p = Pattern.compile("^[0-9]"); |
27 | | - private static Pattern dateTime = Pattern |
28 | | - .compile("^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([.][0-9]{1,6})?(Z|[+-][0-9]{2}:[0-9]{2})"); |
29 | | - private static Pattern date = Pattern.compile("^[0-9]{4}-[0-9]{2}-[0-9]{2}"); |
30 | | - private static Pattern time = Pattern.compile("^[0-9]{2}:[0-9]{2}:[0-9]{2}([.][0-9]{1,6})?"); |
31 | | - |
32 | | - private final boolean deserializeAsDate; |
33 | | - |
34 | | - private final boolean deserializeNumberAsDouble; |
35 | | - |
| 4 | +/** |
| 5 | + * @deprecated typo in the class name, use AttributeDeserializer instead |
| 6 | + */ |
| 7 | +@Deprecated |
| 8 | +public class AtrributeDeserializer extends AttributeDeserializer { |
36 | 9 | public AtrributeDeserializer(boolean deserializeAsDateString) { |
37 | | - this.deserializeAsDate = !deserializeAsDateString; |
38 | | - this.deserializeNumberAsDouble = false; |
| 10 | + super(deserializeAsDateString); |
39 | 11 | } |
40 | 12 |
|
41 | 13 | public AtrributeDeserializer(boolean deserializeAsDateString, boolean deserializeNumberAsDouble) { |
42 | | - this.deserializeAsDate = !deserializeAsDateString; |
43 | | - this.deserializeNumberAsDouble = deserializeNumberAsDouble; |
| 14 | + super(deserializeAsDateString, deserializeNumberAsDouble); |
44 | 15 | } |
45 | 16 |
|
46 | 17 | public AtrributeDeserializer() { |
47 | | - this.deserializeAsDate = true; |
48 | | - this.deserializeNumberAsDouble = false; |
49 | | - } |
50 | | - |
51 | | - @Override |
52 | | - public AttributeImpl deserialize(JsonParser p, DeserializationContext ctx) throws IOException { |
53 | | - |
54 | | - JsonNode node = p.readValueAsTree(); |
55 | | - JsonNode valueNode = node.get("value"); |
56 | | - |
57 | | - AttributeBuilder builder = Attribute.builder(); |
58 | | - builder.name(node.get("name").asText()); |
59 | | - |
60 | | - return (AttributeImpl) builder.value(p.getCodec().treeAsTokens(valueNode).readValueAs(typeRef(valueNode))) |
61 | | - .build(); |
62 | | - } |
63 | | - |
64 | | - private TypeReference<?> typeRef(JsonNode valueNode) { |
65 | | - JsonNodeType valueNodeType = valueNode.getNodeType(); |
66 | | - switch (valueNodeType) { |
67 | | - case BOOLEAN: |
68 | | - return new TypeReference<Boolean>() { |
69 | | - }; |
70 | | - case NUMBER: |
71 | | - if (!deserializeNumberAsDouble && (valueNode.isInt() || valueNode.isLong())) { |
72 | | - return new TypeReference<Long>() { |
73 | | - }; |
74 | | - } |
75 | | - return new TypeReference<Double>() { |
76 | | - }; |
77 | | - case STRING: |
78 | | - if (deserializeAsDate) { |
79 | | - String val = valueNode.asText(); |
80 | | - if (p.matcher(val).find()) { |
81 | | - if (dateTime.matcher(val).find()) { |
82 | | - return new TypeReference<ZonedDateTime>() { |
83 | | - }; |
84 | | - } |
85 | | - if (date.matcher(val).matches()) { |
86 | | - return new TypeReference<LocalDate>() { |
87 | | - }; |
88 | | - } |
89 | | - if (time.matcher(val).matches()) { |
90 | | - return new TypeReference<LocalTime>() { |
91 | | - }; |
92 | | - } |
93 | | - } |
94 | | - } |
95 | | - return new TypeReference<String>() { |
96 | | - }; |
97 | | - case OBJECT: |
98 | | - if (valueNode.has("key") && valueNode.has("label")) { |
99 | | - JsonNode label = valueNode.get("label"); |
100 | | - if (label.getNodeType() == JsonNodeType.OBJECT) { |
101 | | - return new TypeReference<AttributeLocalizedEnumValue>() { |
102 | | - }; |
103 | | - } |
104 | | - return new TypeReference<AttributePlainEnumValue>() { |
105 | | - }; |
106 | | - } |
107 | | - if (valueNode.has("currencyCode")) { |
108 | | - return new TypeReference<TypedMoney>() { |
109 | | - }; |
110 | | - } |
111 | | - if (valueNode.has("typeId")) { |
112 | | - return new TypeReference<Reference>() { |
113 | | - }; |
114 | | - } |
115 | | - if (valueNode.has("value")) { |
116 | | - return new TypeReference<Attribute>() { |
117 | | - }; |
118 | | - } |
119 | | - return new TypeReference<LocalizedString>() { |
120 | | - }; |
121 | | - case ARRAY: |
122 | | - JsonNode first = valueNode.get(0); |
123 | | - switch (elemType(first)) { |
124 | | - case STRING: |
125 | | - return new TypeReference<List<String>>() { |
126 | | - }; |
127 | | - case DATE: |
128 | | - return new TypeReference<List<LocalDate>>() { |
129 | | - }; |
130 | | - case DATETIME: |
131 | | - return new TypeReference<List<ZonedDateTime>>() { |
132 | | - }; |
133 | | - case TIME: |
134 | | - return new TypeReference<List<LocalTime>>() { |
135 | | - }; |
136 | | - case NUMBER: |
137 | | - return new TypeReference<List<Double>>() { |
138 | | - }; |
139 | | - case LONG: |
140 | | - return new TypeReference<List<Long>>() { |
141 | | - }; |
142 | | - case BOOLEAN: |
143 | | - return new TypeReference<List<Boolean>>() { |
144 | | - }; |
145 | | - case ENUM: |
146 | | - return new TypeReference<List<AttributePlainEnumValue>>() { |
147 | | - }; |
148 | | - case LOCALIZED_ENUM: |
149 | | - return new TypeReference<List<AttributeLocalizedEnumValue>>() { |
150 | | - }; |
151 | | - case LOCALIZED_STRING: |
152 | | - return new TypeReference<List<LocalizedString>>() { |
153 | | - }; |
154 | | - case MONEY: |
155 | | - return new TypeReference<List<TypedMoney>>() { |
156 | | - }; |
157 | | - case REFERENCE: |
158 | | - return new TypeReference<List<Reference>>() { |
159 | | - }; |
160 | | - case NESTED: |
161 | | - return new TypeReference<List<Attribute>>() { |
162 | | - }; |
163 | | - case SET_NESTED: |
164 | | - return new TypeReference<List<List<Attribute>>>() { |
165 | | - }; |
166 | | - default: |
167 | | - return new TypeReference<List<JsonNode>>() { |
168 | | - }; |
169 | | - } |
170 | | - default: |
171 | | - return new TypeReference<JsonNode>() { |
172 | | - }; |
173 | | - } |
174 | | - } |
175 | | - |
176 | | - private ElemType elemType(JsonNode valueNode) { |
177 | | - if (valueNode == null) { |
178 | | - return ElemType.JSON_NODE; |
179 | | - } |
180 | | - JsonNodeType valueNodeType = valueNode.getNodeType(); |
181 | | - switch (valueNodeType) { |
182 | | - case OBJECT: |
183 | | - if (valueNode.has("key") && valueNode.has("label")) { |
184 | | - JsonNode label = valueNode.get("label"); |
185 | | - if (label.getNodeType() == JsonNodeType.OBJECT) { |
186 | | - return ElemType.LOCALIZED_ENUM; |
187 | | - } |
188 | | - return ElemType.ENUM; |
189 | | - } |
190 | | - if (valueNode.has("currencyCode")) { |
191 | | - return ElemType.MONEY; |
192 | | - } |
193 | | - if (valueNode.has("typeId")) { |
194 | | - return ElemType.REFERENCE; |
195 | | - } |
196 | | - if (valueNode.has("value")) { |
197 | | - return ElemType.NESTED; |
198 | | - } |
199 | | - return ElemType.LOCALIZED_STRING; |
200 | | - case NUMBER: |
201 | | - if (!deserializeNumberAsDouble && (valueNode.isInt() || valueNode.isLong())) { |
202 | | - return ElemType.LONG; |
203 | | - } |
204 | | - return ElemType.NUMBER; |
205 | | - case STRING: |
206 | | - if (deserializeAsDate) { |
207 | | - String val = valueNode.asText(); |
208 | | - if (p.matcher(val).find()) { |
209 | | - if (dateTime.matcher(val).find()) { |
210 | | - return ElemType.DATETIME; |
211 | | - } |
212 | | - if (date.matcher(val).matches()) { |
213 | | - return ElemType.DATE; |
214 | | - } |
215 | | - if (time.matcher(val).matches()) { |
216 | | - return ElemType.TIME; |
217 | | - } |
218 | | - } |
219 | | - } |
220 | | - return ElemType.STRING; |
221 | | - case ARRAY: |
222 | | - return ElemType.SET_NESTED; |
223 | | - case BOOLEAN: |
224 | | - return ElemType.BOOLEAN; |
225 | | - default: |
226 | | - return ElemType.JSON_NODE; |
227 | | - } |
228 | | - } |
229 | | - |
230 | | - private enum ElemType { |
231 | | - STRING, |
232 | | - DATE, |
233 | | - DATETIME, |
234 | | - TIME, |
235 | | - NUMBER, |
236 | | - LONG, |
237 | | - BOOLEAN, |
238 | | - ENUM, |
239 | | - LOCALIZED_ENUM, |
240 | | - LOCALIZED_STRING, |
241 | | - REFERENCE, |
242 | | - MONEY, |
243 | | - JSON_NODE, |
244 | | - NESTED, |
245 | | - SET_NESTED |
| 18 | + super(); |
246 | 19 | } |
247 | 20 | } |
0 commit comments