28
28
import java .util .LinkedHashMap ;
29
29
import java .util .List ;
30
30
import java .util .Map ;
31
+ import java .util .Objects ;
31
32
import java .util .Set ;
32
33
import java .util .stream .Collectors ;
33
34
import software .amazon .awssdk .annotations .Immutable ;
56
57
@ SdkInternalApi
57
58
public class DefaultEnhancedDocument implements EnhancedDocument {
58
59
60
+ private static final DefaultAttributeConverterProvider DEFAULT_PROVIDER = DefaultAttributeConverterProvider .create ();
61
+
62
+ private static final JsonItemAttributeConverter JSON_ITEM_ATTRIBUTE_CONVERTER = JsonItemAttributeConverter .create ();
63
+
59
64
private final Map <String , AttributeValue > attributeValueMap ;
60
65
61
66
private final ChainConverterProvider attributeConverterProviders ;
62
67
63
- private static final JsonItemAttributeConverter jsonConverter = JsonItemAttributeConverter .create ();
64
-
65
- private DefaultEnhancedDocument (Map <String , AttributeValue > attributeValueMap ,
66
- ChainConverterProvider attributeConverterProviders ) {
68
+ private DefaultEnhancedDocument (Map <String , AttributeValue > attributeValueMap ) {
67
69
this .attributeValueMap = attributeValueMap ;
68
- this .attributeConverterProviders = attributeConverterProviders ;
69
- }
70
-
71
- public static DefaultEnhancedDocument fromAttributeValueMapAndConverters (Map <String , AttributeValue > attributeValueMap ,
72
- ChainConverterProvider attributeConverterProviders ) {
73
- return new DefaultEnhancedDocument (attributeValueMap , attributeConverterProviders );
70
+ this .attributeConverterProviders = ChainConverterProvider .create (DEFAULT_PROVIDER );
74
71
}
75
72
76
73
public DefaultEnhancedDocument (DefaultBuilder builder ) {
77
74
attributeValueMap = Collections .unmodifiableMap (builder .getAttributeValueMap ());
78
75
attributeConverterProviders = ChainConverterProvider .create (builder .attributeConverterProviders );
79
76
}
80
77
78
+ public static DefaultEnhancedDocument fromAttributeValueMap (Map <String , AttributeValue > attributeValueMap ) {
79
+ return new DefaultEnhancedDocument (attributeValueMap );
80
+ }
81
+
81
82
public static DefaultBuilder builder () {
82
83
return new DefaultBuilder ();
83
84
@@ -253,7 +254,7 @@ public EnhancedDocument getMapAsDocument(String attributeName) {
253
254
+ " attribute as map since its of type "
254
255
+ attributeValue .type ());
255
256
}
256
- return new DefaultEnhancedDocument (attributeValue .m (), this . attributeConverterProviders );
257
+ return new DefaultEnhancedDocument (attributeValue .m ());
257
258
}
258
259
259
260
@ Override
@@ -262,7 +263,7 @@ public String getJson(String attributeName) {
262
263
if (attributeValueMap .get (attributeName ) == null ) {
263
264
return null ;
264
265
}
265
- JsonNode jsonNode = jsonConverter .transformTo (attributeValueMap .get (attributeName ));
266
+ JsonNode jsonNode = JSON_ITEM_ATTRIBUTE_CONVERTER .transformTo (attributeValueMap .get (attributeName ));
266
267
Document document = jsonNode .visit (new DocumentUnmarshaller ());
267
268
return document .toString ();
268
269
}
@@ -311,7 +312,7 @@ public Object get(String attributeName) {
311
312
@ Override
312
313
public EnhancedType <?> getTypeOf (String attributeName ) {
313
314
Object attributeValue = get (attributeName );
314
- return EnhancedType .of (attributeValue .getClass ());
315
+ return attributeValue != null ? EnhancedType .of (attributeValue .getClass ()) : null ;
315
316
}
316
317
317
318
@ Override
@@ -338,14 +339,14 @@ public String toJsonPretty() {
338
339
public static class DefaultBuilder implements EnhancedDocument .Builder {
339
340
340
341
Map <String , AttributeValue > attributeValueMap = new LinkedHashMap <>();
341
- ChainConverterProvider converterProvider = ChainConverterProvider . create ( DefaultAttributeConverterProvider . create ());
342
- List <AttributeConverterProvider > attributeConverterProviders ;
342
+
343
+ List <AttributeConverterProvider > attributeConverterProviders = new ArrayList <>() ;
343
344
344
345
public DefaultBuilder (DefaultEnhancedDocument enhancedDocument ) {
345
- attributeValueMap = attributeValueMap != null ? new LinkedHashMap <>(enhancedDocument .attributeValueMap )
346
- : new LinkedHashMap <>();
346
+ attributeValueMap .putAll (enhancedDocument .getAttributeValueMap ());
347
347
attributeConverterProviders = enhancedDocument .attributeConverterProviders != null ?
348
348
enhancedDocument .attributeConverterProviders .chainedProviders () : null ;
349
+
349
350
}
350
351
351
352
public DefaultBuilder () {
@@ -357,11 +358,18 @@ public Map<String, AttributeValue> getAttributeValueMap() {
357
358
358
359
@ Override
359
360
public Builder add (String attributeName , Object value ) {
360
-
361
- attributeValueMap .put (attributeName , convert (value , converterProvider ));
361
+ ChainConverterProvider attributeConverterProvider = providerFromBuildAndAppendDefault ();
362
+ attributeValueMap .put (attributeName , convert (value , attributeConverterProvider ));
362
363
return this ;
363
364
}
364
365
366
+ private ChainConverterProvider providerFromBuildAndAppendDefault () {
367
+ List <AttributeConverterProvider > converterProviders = new ArrayList <>(attributeConverterProviders );
368
+ converterProviders .add (DEFAULT_PROVIDER );
369
+ ChainConverterProvider attributeConverterProvider = ChainConverterProvider .create (converterProviders );
370
+ return attributeConverterProvider ;
371
+ }
372
+
365
373
@ Override
366
374
public Builder addString (String attributeName , String value ) {
367
375
attributeValueMap .put (attributeName , AttributeValue .fromS (value ));
@@ -413,13 +421,13 @@ public Builder addSdkBytesSet(String attributeName, Set<SdkBytes> values) {
413
421
414
422
@ Override
415
423
public Builder addList (String attributeName , List <?> value ) {
416
- attributeValueMap .put (attributeName , convert (value , converterProvider ));
424
+ attributeValueMap .put (attributeName , convert (value , providerFromBuildAndAppendDefault () ));
417
425
return this ;
418
426
}
419
427
420
428
@ Override
421
429
public Builder addMap (String attributeName , Map <String , ?> value ) {
422
- attributeValueMap .put (attributeName , convert (value , converterProvider ));
430
+ attributeValueMap .put (attributeName , convert (value , providerFromBuildAndAppendDefault () ));
423
431
return this ;
424
432
}
425
433
@@ -479,7 +487,7 @@ public Builder json(String json) {
479
487
if (jsonNode == null ) {
480
488
throw new IllegalArgumentException ("Could not parse argument json " + json );
481
489
}
482
- AttributeValue attributeValue = jsonConverter .transformFrom (jsonNode );
490
+ AttributeValue attributeValue = JSON_ITEM_ATTRIBUTE_CONVERTER .transformFrom (jsonNode );
483
491
this .attributeValueMap = attributeValue .m ();
484
492
return this ;
485
493
}
@@ -489,4 +497,25 @@ public EnhancedDocument build() {
489
497
return new DefaultEnhancedDocument (this );
490
498
}
491
499
}
492
- }
500
+
501
+ @ Override
502
+ public boolean equals (Object o ) {
503
+ if (this == o ) {
504
+ return true ;
505
+ }
506
+ if (o == null || getClass () != o .getClass ()) {
507
+ return false ;
508
+ }
509
+ DefaultEnhancedDocument that = (DefaultEnhancedDocument ) o ;
510
+
511
+ return Objects .equals (attributeValueMap , that .attributeValueMap ) && Objects .equals (attributeConverterProviders ,
512
+ that .attributeConverterProviders );
513
+ }
514
+
515
+ @ Override
516
+ public int hashCode () {
517
+ int result = attributeValueMap != null ? attributeValueMap .hashCode () : 0 ;
518
+ result = 31 * result + (attributeConverterProviders != null ? attributeConverterProviders .hashCode () : 0 );
519
+ return result ;
520
+ }
521
+ }
0 commit comments