Skip to content

Commit 057ec3c

Browse files
committed
Update test cases for JsonAttributeCOnverter
1 parent bcbe7c2 commit 057ec3c

File tree

7 files changed

+339
-54
lines changed

7 files changed

+339
-54
lines changed

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/converter/ChainConverterProvider.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Arrays;
2020
import java.util.Collections;
2121
import java.util.List;
22+
import java.util.Objects;
2223
import software.amazon.awssdk.annotations.SdkInternalApi;
2324
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter;
2425
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverterProvider;
@@ -67,4 +68,22 @@ public <T> AttributeConverter<T> converterFor(EnhancedType<T> enhancedType) {
6768
.map(p -> p.converterFor(enhancedType))
6869
.findFirst().orElse(null);
6970
}
71+
72+
@Override
73+
public boolean equals(Object o) {
74+
if (this == o) {
75+
return true;
76+
}
77+
if (o == null || getClass() != o.getClass()) {
78+
return false;
79+
}
80+
ChainConverterProvider that = (ChainConverterProvider) o;
81+
return Objects.equals(providerChain, that.providerChain);
82+
}
83+
84+
@Override
85+
public int hashCode() {
86+
return providerChain != null ? providerChain.hashCode() : 0;
87+
}
88+
7089
}

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/converter/attribute/JsonItemAttributeConverter.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ private Visitor() {
8383

8484
@Override
8585
public JsonNode convertMap(Map<String, AttributeValue> value) {
86+
if (value == null) {
87+
return null;
88+
}
8689
Map<String, JsonNode> jsonNodeMap = new LinkedHashMap<>();
8790
value.entrySet().forEach(
8891
k -> {
@@ -94,49 +97,72 @@ public JsonNode convertMap(Map<String, AttributeValue> value) {
9497

9598
@Override
9699
public JsonNode convertString(String value) {
100+
if (value == null) {
101+
return null;
102+
}
97103
return new StringJsonNode(value);
98104
}
99105

100106
@Override
101107
public JsonNode convertNumber(String value) {
108+
if (value == null) {
109+
return null;
110+
}
102111
return new NumberJsonNode(value);
103112
}
104113

105114
@Override
106115
public JsonNode convertBytes(SdkBytes value) {
116+
if (value == null) {
117+
return null;
118+
}
107119
return new StringJsonNode(value.asUtf8String());
108120
}
109121

110122
@Override
111123
public JsonNode convertBoolean(Boolean value) {
124+
if (value == null) {
125+
return null;
126+
}
112127
return new BooleanJsonNode(value);
113128
}
114129

115130
@Override
116131
public JsonNode convertSetOfStrings(List<String> value) {
132+
if (value == null) {
133+
return null;
134+
}
117135
return new ArrayJsonNode(value.stream().map(s -> new StringJsonNode(s)).collect(Collectors.toList()));
118136
}
119137

120138
@Override
121139
public JsonNode convertSetOfNumbers(List<String> value) {
140+
if (value == null) {
141+
return null;
142+
}
122143
return new ArrayJsonNode(value.stream().map(s -> new NumberJsonNode(s)).collect(Collectors.toList()));
123144
}
124145

125146
@Override
126147
public JsonNode convertSetOfBytes(List<SdkBytes> value) {
148+
if (value == null) {
149+
return null;
150+
}
127151
return new ArrayJsonNode(value.stream().map(sdkByte ->
128152
new StringJsonNode(sdkByte.asUtf8String())
129-
).collect(Collectors.toList()));
153+
).collect(Collectors.toList()));
130154
}
131155

132156
@Override
133157
public JsonNode convertListOfAttributeValues(List<AttributeValue> value) {
158+
if (value == null) {
159+
return null;
160+
}
134161
return new ArrayJsonNode(value.stream().map(
135162
attributeValue -> {
136163
EnhancedAttributeValue enhancedAttributeValue = EnhancedAttributeValue.fromAttributeValue(attributeValue);
137164
return enhancedAttributeValue.isNull() ? NullJsonNode.instance() : enhancedAttributeValue.convert(VISITOR);
138165
}).collect(Collectors.toList()));
139-
140166
}
141167
}
142168
}

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/converter/attribute/JsonNodeToAttributeValueMapConverter.java

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,16 @@
2727
@SdkInternalApi
2828
public class JsonNodeToAttributeValueMapConverter implements JsonNodeVisitor<AttributeValue> {
2929

30-
private JsonNodeToAttributeValueMapConverter(){
31-
}
30+
private static final JsonNodeToAttributeValueMapConverter INSTANCE = new JsonNodeToAttributeValueMapConverter();
3231

33-
private static JsonNodeToAttributeValueMapConverter INSTANCE = new JsonNodeToAttributeValueMapConverter();
32+
private JsonNodeToAttributeValueMapConverter() {
33+
}
3434

35-
public static JsonNodeToAttributeValueMapConverter instance(){
35+
public static JsonNodeToAttributeValueMapConverter instance() {
3636
return INSTANCE;
3737
}
3838

3939

40-
4140
@Override
4241
public AttributeValue visitNull() {
4342
return AttributeValue.builder().build();
@@ -62,20 +61,17 @@ public AttributeValue visitString(String string) {
6261
public AttributeValue visitArray(List<JsonNode> array) {
6362
return AttributeValue.builder().l(array.stream()
6463
.map(node -> node.visit(this))
65-
.collect(Collectors.toList())).build();
64+
.collect(Collectors.toList()))
65+
.build();
6666
}
6767

6868
@Override
6969
public AttributeValue visitObject(Map<String, JsonNode> object) {
70-
return AttributeValue.builder().m(object.entrySet()
71-
.stream()
72-
.collect(
73-
Collectors.toMap(
74-
entry -> entry.getKey(),
75-
entry -> entry.getValue().visit(this),
76-
(left, right) -> left,
77-
LinkedHashMap::new)))
78-
.build();
70+
return AttributeValue.builder().m(object.entrySet().stream()
71+
.collect(Collectors.toMap(
72+
entry -> entry.getKey(),
73+
entry -> entry.getValue().visit(this),
74+
(left, right) -> left, LinkedHashMap::new))).build();
7975
}
8076

8177
@Override

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/document/DefaultEnhancedDocument.java

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.LinkedHashMap;
2929
import java.util.List;
3030
import java.util.Map;
31+
import java.util.Objects;
3132
import java.util.Set;
3233
import java.util.stream.Collectors;
3334
import software.amazon.awssdk.annotations.Immutable;
@@ -56,28 +57,28 @@
5657
@SdkInternalApi
5758
public class DefaultEnhancedDocument implements EnhancedDocument {
5859

60+
private static final DefaultAttributeConverterProvider DEFAULT_PROVIDER = DefaultAttributeConverterProvider.create();
61+
62+
private static final JsonItemAttributeConverter JSON_ITEM_ATTRIBUTE_CONVERTER = JsonItemAttributeConverter.create();
63+
5964
private final Map<String, AttributeValue> attributeValueMap;
6065

6166
private final ChainConverterProvider attributeConverterProviders;
6267

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) {
6769
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);
7471
}
7572

7673
public DefaultEnhancedDocument(DefaultBuilder builder) {
7774
attributeValueMap = Collections.unmodifiableMap(builder.getAttributeValueMap());
7875
attributeConverterProviders = ChainConverterProvider.create(builder.attributeConverterProviders);
7976
}
8077

78+
public static DefaultEnhancedDocument fromAttributeValueMap(Map<String, AttributeValue> attributeValueMap) {
79+
return new DefaultEnhancedDocument(attributeValueMap);
80+
}
81+
8182
public static DefaultBuilder builder() {
8283
return new DefaultBuilder();
8384

@@ -253,7 +254,7 @@ public EnhancedDocument getMapAsDocument(String attributeName) {
253254
+ " attribute as map since its of type "
254255
+ attributeValue.type());
255256
}
256-
return new DefaultEnhancedDocument(attributeValue.m(), this.attributeConverterProviders);
257+
return new DefaultEnhancedDocument(attributeValue.m());
257258
}
258259

259260
@Override
@@ -262,7 +263,7 @@ public String getJson(String attributeName) {
262263
if (attributeValueMap.get(attributeName) == null) {
263264
return null;
264265
}
265-
JsonNode jsonNode = jsonConverter.transformTo(attributeValueMap.get(attributeName));
266+
JsonNode jsonNode = JSON_ITEM_ATTRIBUTE_CONVERTER.transformTo(attributeValueMap.get(attributeName));
266267
Document document = jsonNode.visit(new DocumentUnmarshaller());
267268
return document.toString();
268269
}
@@ -311,7 +312,7 @@ public Object get(String attributeName) {
311312
@Override
312313
public EnhancedType<?> getTypeOf(String attributeName) {
313314
Object attributeValue = get(attributeName);
314-
return EnhancedType.of(attributeValue.getClass());
315+
return attributeValue != null ? EnhancedType.of(attributeValue.getClass()) : null;
315316
}
316317

317318
@Override
@@ -338,14 +339,14 @@ public String toJsonPretty() {
338339
public static class DefaultBuilder implements EnhancedDocument.Builder {
339340

340341
Map<String, AttributeValue> attributeValueMap = new LinkedHashMap<>();
341-
ChainConverterProvider converterProvider = ChainConverterProvider.create(DefaultAttributeConverterProvider.create());
342-
List<AttributeConverterProvider> attributeConverterProviders;
342+
343+
List<AttributeConverterProvider> attributeConverterProviders = new ArrayList<>();
343344

344345
public DefaultBuilder(DefaultEnhancedDocument enhancedDocument) {
345-
attributeValueMap = attributeValueMap != null ? new LinkedHashMap<>(enhancedDocument.attributeValueMap)
346-
: new LinkedHashMap<>();
346+
attributeValueMap.putAll(enhancedDocument.getAttributeValueMap());
347347
attributeConverterProviders = enhancedDocument.attributeConverterProviders != null ?
348348
enhancedDocument.attributeConverterProviders.chainedProviders() : null;
349+
349350
}
350351

351352
public DefaultBuilder() {
@@ -357,11 +358,18 @@ public Map<String, AttributeValue> getAttributeValueMap() {
357358

358359
@Override
359360
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));
362363
return this;
363364
}
364365

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+
365373
@Override
366374
public Builder addString(String attributeName, String value) {
367375
attributeValueMap.put(attributeName, AttributeValue.fromS(value));
@@ -413,13 +421,13 @@ public Builder addSdkBytesSet(String attributeName, Set<SdkBytes> values) {
413421

414422
@Override
415423
public Builder addList(String attributeName, List<?> value) {
416-
attributeValueMap.put(attributeName, convert(value, converterProvider));
424+
attributeValueMap.put(attributeName, convert(value, providerFromBuildAndAppendDefault()));
417425
return this;
418426
}
419427

420428
@Override
421429
public Builder addMap(String attributeName, Map<String, ?> value) {
422-
attributeValueMap.put(attributeName, convert(value, converterProvider));
430+
attributeValueMap.put(attributeName, convert(value, providerFromBuildAndAppendDefault()));
423431
return this;
424432
}
425433

@@ -479,7 +487,7 @@ public Builder json(String json) {
479487
if (jsonNode == null) {
480488
throw new IllegalArgumentException("Could not parse argument json " + json);
481489
}
482-
AttributeValue attributeValue = jsonConverter.transformFrom(jsonNode);
490+
AttributeValue attributeValue = JSON_ITEM_ATTRIBUTE_CONVERTER.transformFrom(jsonNode);
483491
this.attributeValueMap = attributeValue.m();
484492
return this;
485493
}
@@ -489,4 +497,25 @@ public EnhancedDocument build() {
489497
return new DefaultEnhancedDocument(this);
490498
}
491499
}
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

Comments
 (0)