Skip to content

Commit 6f1b831

Browse files
committed
SUPPORT-28804 add custom deserializer for attrs in import api
1 parent a0eea2e commit 6f1b831

File tree

2 files changed

+699
-36
lines changed

2 files changed

+699
-36
lines changed
Lines changed: 135 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11

22
package com.commercetools.importapi.json;
33

4+
import static com.fasterxml.jackson.databind.node.JsonNodeType.OBJECT;
5+
46
import java.io.IOException;
5-
import java.util.Map;
7+
import java.util.*;
68

9+
import com.commercetools.importapi.models.common.*;
710
import com.commercetools.importapi.models.productvariants.*;
811
import com.fasterxml.jackson.core.JsonParser;
912
import com.fasterxml.jackson.databind.DeserializationContext;
@@ -20,61 +23,161 @@ public Attribute deserialize(JsonParser p, DeserializationContext ctxt) throws I
2023
JsonNode node = p.readValueAsTree();
2124
JsonNode valueNode = node.get("value");
2225

23-
JsonNodeType valueNodeType = node.getNodeType();
26+
JsonNodeType valueNodeType = valueNode.getNodeType();
2427
switch (valueNodeType) {
2528
case BOOLEAN:
2629
return BooleanAttributeBuilder.of()
2730
.name(node.get("name").asText())
28-
.value(valueNode.get("value").asBoolean())
31+
.value(valueNode.asBoolean())
2932
.build();
3033

3134
case NUMBER:
32-
return NumberAttributeBuilder.of()
33-
.name(node.get("name").asText())
34-
.value(valueNode.get("value").asDouble())
35-
.build();
35+
return NumberAttributeBuilder.of().name(node.get("name").asText()).value(valueNode.asDouble()).build();
3636
case STRING:
37-
return TextAttributeBuilder.of()
38-
.name(node.get("name").asText())
39-
.value(valueNode.get("value").asText())
40-
.build();
37+
return TextAttributeBuilder.of().name(node.get("name").asText()).value(valueNode.asText()).build();
4138
case OBJECT:
4239
if (valueNode.has("key") && valueNode.has("label")) {
4340
JsonNode label = valueNode.get("label");
44-
if (label.getNodeType() == JsonNodeType.OBJECT) {
41+
if (label.getNodeType() == OBJECT) {
4542
return LocalizableEnumAttributeBuilder.of()
4643
.name(node.get("name").asText())
47-
.value(valueNode.get("value").asText())
44+
.value(valueNode.get("key").textValue())
4845
.build();
4946
}
50-
;
5147
return EnumAttributeBuilder.of()
5248
.name(node.get("name").asText())
53-
.value(valueNode.get("label").asText())
49+
.value(valueNode.get("key").textValue())
50+
.build();
51+
}
52+
if (valueNode.has("currencyCode")) {
53+
return MoneyAttributeBuilder.of()
54+
.name(node.get("name").asText())
55+
.value(typedMoneyBuilder -> typedMoneyBuilder.centPrecisionBuilder()
56+
.currencyCode(valueNode.get("currencyCode").asText())
57+
.centAmount(valueNode.get("centAmount").asLong())
58+
.fractionDigits(valueNode.get("fractionDigits").asInt()))
59+
.build();
60+
}
61+
if (valueNode.has("typeId")) {
62+
return ReferenceAttributeBuilder.of()
63+
.name(node.get("name").asText())
64+
// this is not working because reference contains ID and KeyReference requires ID
65+
// .value((KeyReference) p.getCodec().treeAsTokens(valueNode).readValueAs(getTypeRef(valueNode.get("typeId").asText())))
66+
.value(new KeyReference() {
67+
@Override
68+
public String getKey() {
69+
return valueNode.get("id").asText();
70+
}
71+
72+
@Override
73+
public ReferenceType getTypeId() {
74+
return getReferenceType(valueNode.get("typeId").asText());
75+
}
76+
77+
@Override
78+
public void setKey(String key) {
79+
}
80+
})
5481
.build();
5582
}
56-
;
57-
// if (valueNode.has("currencyCode")) {
58-
// return new TypeReference<TypedMoney>() {
59-
// };
60-
// }
61-
// if (valueNode.has("typeId")) {
62-
// return new TypeReference<Reference>() {
63-
// };
64-
// }
65-
// if (valueNode.has("value")) {
66-
// return new TypeReference<Attribute>() {
67-
// };
68-
// }
69-
Map.Entry<String, JsonNode> nodeEntry = valueNode.fields().next();
7083
return LocalizableTextAttributeBuilder.of()
7184
.name(node.get("name").asText())
72-
.value(localizedStringBuilder -> localizedStringBuilder.addValue(nodeEntry.getKey(),
73-
nodeEntry.getValue().asText()))
85+
.value(localizedStringBuilder -> {
86+
valueNode.fields()
87+
.forEachRemaining(nodeEntry -> localizedStringBuilder.addValue(nodeEntry.getKey(),
88+
nodeEntry.getValue().asText()));
89+
return localizedStringBuilder;
90+
})
7491
.build();
92+
case ARRAY:
93+
JsonNode firstElement = valueNode.get(0);
94+
JsonNodeType firstElementNodeType = firstElement.getNodeType();
95+
switch (firstElementNodeType) {
96+
case STRING:
97+
List<String> stringValues = new ArrayList<>();
98+
valueNode.elements().forEachRemaining(element -> stringValues.add(element.asText()));
99+
return TextSetAttributeBuilder.of().name(node.get("name").asText()).value(stringValues).build();
100+
case NUMBER:
101+
List<Double> numberValues = new ArrayList<>();
102+
valueNode.elements().forEachRemaining(element -> numberValues.add(element.asDouble()));
103+
return NumberSetAttributeBuilder.of()
104+
.name(node.get("name").asText())
105+
.value(numberValues)
106+
.build();
107+
case BOOLEAN:
108+
List<Boolean> booleanValues = new ArrayList<>();
109+
valueNode.elements().forEachRemaining(element -> booleanValues.add(element.asBoolean()));
110+
return BooleanSetAttributeBuilder.of()
111+
.name(node.get("name").asText())
112+
.value(booleanValues)
113+
.build();
114+
case OBJECT:
115+
if (firstElement.has("key") && firstElement.has("label")) {
116+
List<String> keys = new ArrayList<>();
117+
valueNode.iterator()
118+
.forEachRemaining(jsonNode -> jsonNode.fields().forEachRemaining(nodeEntry -> {
119+
String key = nodeEntry.getKey();
120+
if (key.equals("key")) {
121+
keys.add(nodeEntry.getValue().asText());
122+
}
123+
}));
124+
JsonNode label = firstElement.get("label");
125+
if (label.getNodeType() == OBJECT) {
126+
return LocalizableEnumSetAttributeBuilder.of()
127+
.name(node.get("name").asText())
128+
.value(keys)
129+
.build();
130+
}
131+
return EnumSetAttributeBuilder.of().name(node.get("name").asText()).value(keys).build();
132+
}
133+
if (firstElement.has("typeId")) {
134+
List<KeyReference> keyReferences = new ArrayList<>();
135+
valueNode.iterator().forEachRemaining(nodeEntry -> {
136+
keyReferences.add(new KeyReference() {
137+
@Override
138+
public String getKey() {
139+
return nodeEntry.get("id").asText();
140+
}
141+
142+
@Override
143+
public ReferenceType getTypeId() {
144+
return getReferenceType(nodeEntry.get("typeId").asText());
145+
}
75146

147+
@Override
148+
public void setKey(String key) {
149+
}
150+
});
151+
});
152+
return ReferenceSetAttributeBuilder.of()
153+
.name(node.get("name").asText())
154+
.value(keyReferences)
155+
.build();
156+
}
157+
List<LocalizedString> values = new ArrayList<>();
158+
valueNode.iterator().forEachRemaining(jsonNode -> {
159+
LocalizedStringBuilder localizedStringBuilder = LocalizedStringBuilder.of();
160+
jsonNode.fields()
161+
.forEachRemaining(nodeEntry -> localizedStringBuilder.addValue(nodeEntry.getKey(),
162+
nodeEntry.getValue().asText()));
163+
values.add(localizedStringBuilder.build());
164+
});
165+
return LocalizableTextSetAttributeBuilder.of()
166+
.name(node.get("name").asText())
167+
.value(values)
168+
.build();
169+
}
76170
default:
77-
return new AttributeImpl();
171+
AttributeImpl attribute = new AttributeImpl();
172+
attribute.setName(node.get("name").asText());
173+
return attribute;
78174
}
79175
}
176+
177+
private ReferenceType getReferenceType(String typeId) {
178+
return Arrays.stream(ReferenceType.ReferenceTypeEnum.values())
179+
.filter(referenceTypeEnum -> referenceTypeEnum.getJsonName().equals(typeId))
180+
.findFirst()
181+
.orElse(null);
182+
}
80183
}

0 commit comments

Comments
 (0)