11
22package com .commercetools .importapi .json ;
33
4+ import static com .fasterxml .jackson .databind .node .JsonNodeType .OBJECT ;
5+
46import java .io .IOException ;
5- import java .util .Map ;
7+ import java .util .* ;
68
9+ import com .commercetools .importapi .models .common .*;
710import com .commercetools .importapi .models .productvariants .*;
811import com .fasterxml .jackson .core .JsonParser ;
912import 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