@@ -36,59 +36,7 @@ public Attribute deserialize(JsonParser p, DeserializationContext ctxt) throws I
3636 case STRING :
3737 return TextAttributeBuilder .of ().name (node .get ("name" ).asText ()).value (valueNode .asText ()).build ();
3838 case OBJECT :
39- if (valueNode .has ("key" ) && valueNode .has ("label" )) {
40- JsonNode label = valueNode .get ("label" );
41- if (label .getNodeType () == OBJECT ) {
42- return LocalizableEnumAttributeBuilder .of ()
43- .name (node .get ("name" ).asText ())
44- .value (valueNode .get ("key" ).textValue ())
45- .build ();
46- }
47- return EnumAttributeBuilder .of ()
48- .name (node .get ("name" ).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- })
81- .build ();
82- }
83- return LocalizableTextAttributeBuilder .of ()
84- .name (node .get ("name" ).asText ())
85- .value (localizedStringBuilder -> {
86- valueNode .fields ()
87- .forEachRemaining (nodeEntry -> localizedStringBuilder .addValue (nodeEntry .getKey (),
88- nodeEntry .getValue ().asText ()));
89- return localizedStringBuilder ;
90- })
91- .build ();
39+ return createAttributeFromObject (node );
9240 case ARRAY :
9341 JsonNode firstElement = valueNode .get (0 );
9442 JsonNodeType firstElementNodeType = firstElement .getNodeType ();
@@ -112,72 +60,7 @@ public void setKey(String key) {
11260 .value (booleanValues )
11361 .build ();
11462 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- }
146-
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- if (firstElement .has ("currencyCode" )) {
158- List <TypedMoney > values = new ArrayList <>();
159- valueNode .iterator ().forEachRemaining (nodeEntry -> {
160- values .add (MoneyBuilder .of ()
161- .currencyCode (nodeEntry .get ("currencyCode" ).asText ())
162- .centAmount (nodeEntry .get ("centAmount" ).asLong ())
163- .fractionDigits (nodeEntry .get ("fractionDigits" ).asInt ())
164- .build ());
165- });
166- return MoneySetAttributeBuilder .of ().name (node .get ("name" ).asText ()).value (values ).build ();
167- }
168-
169- List <LocalizedString > values = new ArrayList <>();
170- valueNode .iterator ().forEachRemaining (jsonNode -> {
171- LocalizedStringBuilder localizedStringBuilder = LocalizedStringBuilder .of ();
172- jsonNode .fields ()
173- .forEachRemaining (nodeEntry -> localizedStringBuilder .addValue (nodeEntry .getKey (),
174- nodeEntry .getValue ().asText ()));
175- values .add (localizedStringBuilder .build ());
176- });
177- return LocalizableTextSetAttributeBuilder .of ()
178- .name (node .get ("name" ).asText ())
179- .value (values )
180- .build ();
63+ return createSetAttributeFromObject (node );
18164 }
18265 default :
18366 AttributeImpl attribute = new AttributeImpl ();
@@ -192,4 +75,122 @@ private ReferenceType getReferenceType(String typeId) {
19275 .findFirst ()
19376 .orElse (null );
19477 }
78+
79+ private Attribute createAttributeFromObject (JsonNode node ) {
80+ JsonNode valueNode = node .get ("value" );
81+ if (valueNode .has ("key" ) && valueNode .has ("label" )) {
82+ JsonNode label = valueNode .get ("label" );
83+ if (label .getNodeType () == OBJECT ) {
84+ return LocalizableEnumAttributeBuilder .of ()
85+ .name (node .get ("name" ).asText ())
86+ .value (valueNode .get ("key" ).textValue ())
87+ .build ();
88+ }
89+ return EnumAttributeBuilder .of ()
90+ .name (node .get ("name" ).asText ())
91+ .value (valueNode .get ("key" ).textValue ())
92+ .build ();
93+ }
94+ if (valueNode .has ("currencyCode" )) {
95+ return MoneyAttributeBuilder .of ()
96+ .name (node .get ("name" ).asText ())
97+ .value (typedMoneyBuilder -> typedMoneyBuilder .centPrecisionBuilder ()
98+ .currencyCode (valueNode .get ("currencyCode" ).asText ())
99+ .centAmount (valueNode .get ("centAmount" ).asLong ())
100+ .fractionDigits (valueNode .get ("fractionDigits" ).asInt ()))
101+ .build ();
102+ }
103+ if (valueNode .has ("typeId" )) {
104+ return ReferenceAttributeBuilder .of ()
105+ .name (node .get ("name" ).asText ())
106+ // this is not working because reference contains ID and KeyReference requires ID
107+ // .value((KeyReference) p.getCodec().treeAsTokens(valueNode).readValueAs(getTypeRef(valueNode.get("typeId").asText())))
108+ .value (createKeyReference (valueNode ))
109+ .build ();
110+ }
111+ return LocalizableTextAttributeBuilder .of ()
112+ .name (node .get ("name" ).asText ())
113+ .value (localizedStringBuilder -> {
114+ valueNode .fields ()
115+ .forEachRemaining (nodeEntry -> localizedStringBuilder .addValue (nodeEntry .getKey (),
116+ nodeEntry .getValue ().asText ()));
117+ return localizedStringBuilder ;
118+ })
119+ .build ();
120+ }
121+
122+ private Attribute createSetAttributeFromObject (JsonNode node ) {
123+ JsonNode valueNode = node .get ("value" );
124+ JsonNode firstElement = valueNode .get (0 );
125+ if (firstElement .has ("key" ) && firstElement .has ("label" )) {
126+ List <String > keys = new ArrayList <>();
127+ valueNode .iterator ()
128+ .forEachRemaining (jsonNode -> jsonNode .fields ().forEachRemaining (nodeEntry -> {
129+ String key = nodeEntry .getKey ();
130+ if (key .equals ("key" )) {
131+ keys .add (nodeEntry .getValue ().asText ());
132+ }
133+ }));
134+ JsonNode label = firstElement .get ("label" );
135+ if (label .getNodeType () == OBJECT ) {
136+ return LocalizableEnumSetAttributeBuilder .of ()
137+ .name (node .get ("name" ).asText ())
138+ .value (keys )
139+ .build ();
140+ }
141+ return EnumSetAttributeBuilder .of ().name (node .get ("name" ).asText ()).value (keys ).build ();
142+ }
143+ if (firstElement .has ("typeId" )) {
144+ List <KeyReference > keyReferences = new ArrayList <>();
145+ valueNode .iterator ().forEachRemaining (nodeEntry -> {
146+ keyReferences .add (createKeyReference (nodeEntry ));
147+ });
148+ return ReferenceSetAttributeBuilder .of ()
149+ .name (node .get ("name" ).asText ())
150+ .value (keyReferences )
151+ .build ();
152+ }
153+ if (firstElement .has ("currencyCode" )) {
154+ List <TypedMoney > values = new ArrayList <>();
155+ valueNode .iterator ().forEachRemaining (nodeEntry -> {
156+ values .add (MoneyBuilder .of ()
157+ .currencyCode (nodeEntry .get ("currencyCode" ).asText ())
158+ .centAmount (nodeEntry .get ("centAmount" ).asLong ())
159+ .fractionDigits (nodeEntry .get ("fractionDigits" ).asInt ())
160+ .build ());
161+ });
162+ return MoneySetAttributeBuilder .of ().name (node .get ("name" ).asText ()).value (values ).build ();
163+ }
164+
165+ List <LocalizedString > values = new ArrayList <>();
166+ valueNode .iterator ().forEachRemaining (jsonNode -> {
167+ LocalizedStringBuilder localizedStringBuilder = LocalizedStringBuilder .of ();
168+ jsonNode .fields ()
169+ .forEachRemaining (nodeEntry -> localizedStringBuilder .addValue (nodeEntry .getKey (),
170+ nodeEntry .getValue ().asText ()));
171+ values .add (localizedStringBuilder .build ());
172+ });
173+ return LocalizableTextSetAttributeBuilder .of ()
174+ .name (node .get ("name" ).asText ())
175+ .value (values )
176+ .build ();
177+ }
178+
179+ private KeyReference createKeyReference (JsonNode node ) {
180+ return new KeyReference () {
181+ @ Override
182+ public String getKey () {
183+ return node .get ("id" ).asText ();
184+ }
185+
186+ @ Override
187+ public ReferenceType getTypeId () {
188+ return getReferenceType (node .get ("typeId" ).asText ());
189+ }
190+
191+ @ Override
192+ public void setKey (String key ) {
193+ }
194+ };
195+ }
195196}
0 commit comments