48
48
import software .amazon .awssdk .services .dynamodb .model .AttributeValue ;
49
49
50
50
/**
51
- * Default implementation of {@link EnhancedDocument}. This class is used by SDK to create Enhanced Documents. The class
52
- * internally saves attributeValueMap which is saved to ddb as it is. The aattribute values are retrieved
53
- * by converting attributeValue from attributeValueMap at the time of get.
51
+ * Default implementation of {@link EnhancedDocument}. This class is used by SDK to create Enhanced Documents.
52
+ * Internally saves attributes in an attributeValueMap which can be written to DynamoDB without further conversion.
53
+ * The attribute values are retrieve by converting attributeValue from attributeValueMap at the time of get.
54
54
*/
55
55
@ Immutable
56
56
@ SdkInternalApi
@@ -60,12 +60,19 @@ public class DefaultEnhancedDocument implements EnhancedDocument {
60
60
61
61
private final ChainConverterProvider attributeConverterProviders ;
62
62
63
- public DefaultEnhancedDocument (Map <String , AttributeValue > attributeValueMap ,
63
+ private static final JsonItemAttributeConverter jsonConverter = JsonItemAttributeConverter .create ();
64
+
65
+ private DefaultEnhancedDocument (Map <String , AttributeValue > attributeValueMap ,
64
66
ChainConverterProvider attributeConverterProviders ) {
65
67
this .attributeValueMap = attributeValueMap ;
66
68
this .attributeConverterProviders = attributeConverterProviders ;
67
69
}
68
70
71
+ public static DefaultEnhancedDocument fromAttributeValueMapAndConverters (Map <String , AttributeValue > attributeValueMap ,
72
+ ChainConverterProvider attributeConverterProviders ) {
73
+ return new DefaultEnhancedDocument (attributeValueMap , attributeConverterProviders );
74
+ }
75
+
69
76
public DefaultEnhancedDocument (DefaultBuilder builder ) {
70
77
attributeValueMap = Collections .unmodifiableMap (builder .getAttributeValueMap ());
71
78
attributeConverterProviders = ChainConverterProvider .create (builder .attributeConverterProviders );
@@ -87,7 +94,7 @@ public Map<String, AttributeValue> getAttributeValueMap() {
87
94
88
95
@ Override
89
96
public boolean isNull (String attributeName ) {
90
- return isPresent (attributeName ) && attributeValueMap .get (attributeName ). nul ( );
97
+ return isPresent (attributeName ) && NULL_ATTRIBUTE_VALUE . equals ( attributeValueMap .get (attributeName ));
91
98
}
92
99
93
100
@ Override
@@ -119,10 +126,13 @@ public String getString(String attributeName) {
119
126
@ Override
120
127
public SdkNumber getSdkNumber (String attributeName ) {
121
128
AttributeValue attributeValue = attributeValueMap .get (attributeName );
122
- return attributeValue != null
123
- ? SdkNumber .fromString (
124
- attributeConverterProviders .converterFor (EnhancedType .of (String .class )).transformTo (attributeValue ))
125
- : null ;
129
+
130
+ if (attributeValue == null ) {
131
+ return null ;
132
+ }
133
+ String stringValue = attributeConverterProviders .converterFor (EnhancedType .of (String .class ))
134
+ .transformTo (attributeValue );
135
+ return SdkNumber .fromString (stringValue );
126
136
}
127
137
128
138
@ Override
@@ -233,14 +243,15 @@ public Map<String, Object> getRawMap(String attributeName) {
233
243
234
244
@ Override
235
245
public EnhancedDocument getMapAsDocument (String attributeName ) {
236
-
237
246
AttributeValue attributeValue = attributeValueMap .get (attributeName );
238
247
if (attributeValue == null ) {
239
248
return null ;
240
249
}
241
250
if (!attributeValue .hasM ()) {
242
- throw new RuntimeException ("Cannot get " + attributeName + " attribute as map since its of type "
243
- + attributeValue .type ());
251
+ throw new RuntimeException ("Cannot get "
252
+ + attributeName
253
+ + " attribute as map since its of type "
254
+ + attributeValue .type ());
244
255
}
245
256
return new DefaultEnhancedDocument (attributeValue .m (), this .attributeConverterProviders );
246
257
}
@@ -251,8 +262,7 @@ public String getJson(String attributeName) {
251
262
if (attributeValueMap .get (attributeName ) == null ) {
252
263
return null ;
253
264
}
254
- JsonItemAttributeConverter jsonItemAttributeConverter = JsonItemAttributeConverter .create ();
255
- JsonNode jsonNode = jsonItemAttributeConverter .transformTo (attributeValueMap .get (attributeName ));
265
+ JsonNode jsonNode = jsonConverter .transformTo (attributeValueMap .get (attributeName ));
256
266
Document document = jsonNode .visit (new DocumentUnmarshaller ());
257
267
return document .toString ();
258
268
}
@@ -327,13 +337,13 @@ public String toJsonPretty() {
327
337
328
338
public static class DefaultBuilder implements EnhancedDocument .Builder {
329
339
330
-
331
340
Map <String , AttributeValue > attributeValueMap = new LinkedHashMap <>();
332
341
ChainConverterProvider converterProvider = ChainConverterProvider .create (DefaultAttributeConverterProvider .create ());
333
342
List <AttributeConverterProvider > attributeConverterProviders ;
334
343
335
344
public DefaultBuilder (DefaultEnhancedDocument enhancedDocument ) {
336
- attributeValueMap = enhancedDocument .attributeValueMap ;
345
+ attributeValueMap = attributeValueMap != null ? new LinkedHashMap <>(enhancedDocument .attributeValueMap )
346
+ : new LinkedHashMap <>();
337
347
attributeConverterProviders = enhancedDocument .attributeConverterProviders != null ?
338
348
enhancedDocument .attributeConverterProviders .chainedProviders () : null ;
339
349
}
@@ -390,10 +400,7 @@ public Builder addStringSet(String attributeName, Set<String> values) {
390
400
391
401
@ Override
392
402
public Builder addNumberSet (String attributeName , Set <Number > values ) {
393
-
394
-
395
403
List <String > collect = values .stream ().map (value -> value .toString ()).collect (Collectors .toList ());
396
-
397
404
attributeValueMap .put (attributeName , AttributeValue .fromNs (collect ));
398
405
return this ;
399
406
}
@@ -442,7 +449,6 @@ public Builder addEnhancedDocument(String attributeName, EnhancedDocument enhanc
442
449
443
450
@ Override
444
451
public Builder addAttributeConverterProvider (AttributeConverterProvider attributeConverterProvider ) {
445
-
446
452
if (attributeConverterProviders == null ) {
447
453
attributeConverterProviders = new ArrayList <>();
448
454
}
@@ -452,7 +458,6 @@ public Builder addAttributeConverterProvider(AttributeConverterProvider attribut
452
458
453
459
@ Override
454
460
public Builder attributeConverterProviders (List <AttributeConverterProvider > attributeConverterProviders ) {
455
-
456
461
this .attributeConverterProviders = attributeConverterProviders != null ? new ArrayList <>(attributeConverterProviders )
457
462
: null ;
458
463
return null ;
@@ -461,10 +466,8 @@ public Builder attributeConverterProviders(List<AttributeConverterProvider> attr
461
466
// TODO : Will add test for attributeConverterProvider in future revision on next PR.
462
467
@ Override
463
468
public Builder attributeConverterProviders (AttributeConverterProvider ... attributeConverterProvider ) {
464
-
465
469
this .attributeConverterProviders = attributeConverterProvider != null
466
470
? Arrays .asList (attributeConverterProvider )
467
-
468
471
: null ;
469
472
return this ;
470
473
}
@@ -476,9 +479,7 @@ public Builder json(String json) {
476
479
if (jsonNode == null ) {
477
480
throw new IllegalArgumentException ("Could not parse argument json " + json );
478
481
}
479
-
480
- JsonItemAttributeConverter jsonItemAttributeConverter = JsonItemAttributeConverter .create ();
481
- AttributeValue attributeValue = jsonItemAttributeConverter .transformFrom (jsonNode );
482
+ AttributeValue attributeValue = jsonConverter .transformFrom (jsonNode );
482
483
this .attributeValueMap = attributeValue .m ();
483
484
return this ;
484
485
}
0 commit comments