Skip to content

Commit c0c396a

Browse files
committed
Refactor implementation
1 parent 920608c commit c0c396a

File tree

1 file changed

+91
-78
lines changed

1 file changed

+91
-78
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,113 @@
11
package software.amazon.awssdk.enhanced.dynamodb.internal.document;
22

3-
import java.io.IOException;
4-
import java.io.StringWriter;
5-
import java.io.UncheckedIOException;
3+
import java.nio.charset.StandardCharsets;
64
import java.util.Map;
75
import software.amazon.awssdk.annotations.SdkInternalApi;
86
import software.amazon.awssdk.core.SdkBytes;
9-
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
7+
import software.amazon.awssdk.protocols.json.SdkJsonGenerator;
108
import software.amazon.awssdk.thirdparty.jackson.core.JsonFactory;
11-
import software.amazon.awssdk.thirdparty.jackson.core.JsonGenerator;
9+
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
1210

1311
@SdkInternalApi
1412
public final class StrategyJsonSerializer {
1513

16-
private StrategyJsonSerializer() {
14+
private enum JsonSerializationStrategy {
15+
NULL,
16+
STRING,
17+
NUMBER,
18+
BOOLEAN,
19+
BYTES,
20+
LIST,
21+
MAP,
22+
STRING_SET,
23+
NUMBER_SET,
24+
BYTES_SET
1725
}
1826

1927
public static String serializeAttributeValueMap(Map<String, AttributeValue> map) {
20-
StringWriter writer = new StringWriter();
21-
try (JsonGenerator generator = new JsonFactory().createGenerator(writer)) {
22-
generator.writeStartObject();
23-
for (Map.Entry<String, AttributeValue> entry : map.entrySet()) {
24-
generator.writeFieldName(entry.getKey());
25-
serializeAttributeValue(generator, entry.getValue());
26-
}
27-
generator.writeEndObject();
28-
} catch (IOException e) {
29-
throw new UncheckedIOException(e);
30-
}
31-
return writer.toString();
32-
}
28+
SdkJsonGenerator jsonGen = new SdkJsonGenerator(new JsonFactory(), "application/json");
3329

34-
private static void serializeAttributeValue(JsonGenerator generator, AttributeValue av) throws IOException {
35-
if (av.nul() != null && av.nul()) {
36-
generator.writeNull();
37-
} else if (av.s() != null) {
38-
generator.writeString(av.s());
39-
} else if (av.n() != null) {
40-
generator.writeNumber(av.n());
41-
} else if (av.bool() != null) {
42-
generator.writeBoolean(av.bool());
43-
} else if (av.b() != null) {
44-
generator.writeBinary(av.b().asByteArray());
45-
} else if (av.hasL()) {
46-
serializeList(generator, av);
47-
} else if (av.hasM()) {
48-
serializeMap(generator, av);
49-
} else if (av.hasSs()) {
50-
serializeStringSet(generator, av);
51-
} else if (av.hasNs()) {
52-
serializeNumberSet(generator, av);
53-
} else if (av.hasBs()) {
54-
serializeBytesSet(generator, av);
55-
} else {
56-
throw new IllegalStateException("Unknown AttributeValue type: " + av);
57-
}
58-
}
30+
jsonGen.writeStartObject();
31+
map.forEach((key, value) -> {
32+
jsonGen.writeFieldName(key);
33+
serializeAttributeValue(jsonGen, value);
34+
});
35+
jsonGen.writeEndObject();
5936

60-
private static void serializeList(JsonGenerator generator, AttributeValue av) throws IOException {
61-
generator.writeStartArray();
62-
for (AttributeValue item : av.l()) {
63-
serializeAttributeValue(generator, item);
64-
}
65-
generator.writeEndArray();
37+
return new String(jsonGen.getBytes(), StandardCharsets.UTF_8);
6638
}
6739

68-
private static void serializeMap(JsonGenerator generator, AttributeValue av) throws IOException {
69-
generator.writeStartObject();
70-
for (Map.Entry<String, AttributeValue> entry : av.m().entrySet()) {
71-
generator.writeFieldName(entry.getKey());
72-
serializeAttributeValue(generator, entry.getValue());
73-
}
74-
generator.writeEndObject();
75-
}
76-
77-
private static void serializeStringSet(JsonGenerator generator, AttributeValue av) throws IOException {
78-
generator.writeStartArray();
79-
for (String s : av.ss()) {
80-
generator.writeString(s);
81-
}
82-
generator.writeEndArray();
83-
}
40+
public static void serializeAttributeValue(SdkJsonGenerator generator, AttributeValue av) {
41+
JsonSerializationStrategy strategy = getStrategy(av);
8442

85-
private static void serializeNumberSet(JsonGenerator generator, AttributeValue av) throws IOException {
86-
generator.writeStartArray();
87-
for (String n : av.ns()) {
88-
generator.writeNumber(n);
43+
switch (strategy) {
44+
case NULL:
45+
generator.writeNull();
46+
break;
47+
case STRING:
48+
generator.writeValue(av.s());
49+
break;
50+
case NUMBER:
51+
generator.writeNumber(av.n());
52+
break;
53+
case BOOLEAN:
54+
generator.writeValue(av.bool());
55+
break;
56+
case BYTES:
57+
generator.writeValue(av.b().asByteBuffer());
58+
break;
59+
case LIST:
60+
generator.writeStartArray();
61+
for (AttributeValue item : av.l()) {
62+
serializeAttributeValue(generator, item);
63+
}
64+
generator.writeEndArray();
65+
break;
66+
case MAP:
67+
generator.writeStartObject();
68+
for (Map.Entry<String, AttributeValue> entry : av.m().entrySet()) {
69+
generator.writeFieldName(entry.getKey());
70+
serializeAttributeValue(generator, entry.getValue());
71+
}
72+
generator.writeEndObject();
73+
break;
74+
case STRING_SET:
75+
generator.writeStartArray();
76+
for (String s : av.ss()) {
77+
generator.writeValue(s);
78+
}
79+
generator.writeEndArray();
80+
break;
81+
case NUMBER_SET:
82+
generator.writeStartArray();
83+
for (String n : av.ns()) {
84+
generator.writeNumber(n);
85+
}
86+
generator.writeEndArray();
87+
break;
88+
case BYTES_SET:
89+
generator.writeStartArray();
90+
for (SdkBytes b : av.bs()) {
91+
generator.writeValue(b.asByteBuffer());
92+
}
93+
generator.writeEndArray();
94+
break;
95+
default:
96+
throw new IllegalStateException("Unsupported strategy: " + strategy);
8997
}
90-
generator.writeEndArray();
9198
}
9299

93-
private static void serializeBytesSet(JsonGenerator generator, AttributeValue av) throws IOException {
94-
generator.writeStartArray();
95-
for (SdkBytes b : av.bs()) {
96-
generator.writeBinary(b.asByteArray());
97-
}
98-
generator.writeEndArray();
100+
private static JsonSerializationStrategy getStrategy(AttributeValue av) {
101+
if (av.nul() != null && av.nul()) return JsonSerializationStrategy.NULL;
102+
if (av.s() != null) return JsonSerializationStrategy.STRING;
103+
if (av.n() != null) return JsonSerializationStrategy.NUMBER;
104+
if (av.bool() != null) return JsonSerializationStrategy.BOOLEAN;
105+
if (av.b() != null) return JsonSerializationStrategy.BYTES;
106+
if (av.hasL()) return JsonSerializationStrategy.LIST;
107+
if (av.hasM()) return JsonSerializationStrategy.MAP;
108+
if (av.hasSs()) return JsonSerializationStrategy.STRING_SET;
109+
if (av.hasNs()) return JsonSerializationStrategy.NUMBER_SET;
110+
if (av.hasBs()) return JsonSerializationStrategy.BYTES_SET;
111+
throw new IllegalStateException("Unknown AttributeValue type: " + av);
99112
}
100-
}
113+
}

0 commit comments

Comments
 (0)