|
1 | 1 | package software.amazon.awssdk.enhanced.dynamodb.internal.document; |
2 | 2 |
|
3 | | -import java.nio.charset.StandardCharsets; |
| 3 | +import java.io.IOException; |
| 4 | +import java.io.StringWriter; |
| 5 | +import java.io.UncheckedIOException; |
4 | 6 | import java.util.Map; |
5 | 7 | import software.amazon.awssdk.annotations.SdkInternalApi; |
6 | 8 | import software.amazon.awssdk.core.SdkBytes; |
7 | | -import software.amazon.awssdk.protocols.json.SdkJsonGenerator; |
8 | 9 | import software.amazon.awssdk.services.dynamodb.model.AttributeValue; |
9 | 10 | import software.amazon.awssdk.thirdparty.jackson.core.JsonFactory; |
| 11 | +import software.amazon.awssdk.thirdparty.jackson.core.JsonGenerator; |
10 | 12 |
|
11 | 13 | @SdkInternalApi |
12 | 14 | public final class StrategyJsonSerializer { |
13 | 15 |
|
14 | | - private enum JsonSerializationStrategy { |
15 | | - NULL { |
16 | | - @Override |
17 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
18 | | - generator.writeNull(); |
19 | | - } |
20 | | - }, |
21 | | - STRING { |
22 | | - @Override |
23 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
24 | | - generator.writeValue(av.s()); |
25 | | - } |
26 | | - }, |
27 | | - NUMBER { |
28 | | - @Override |
29 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
30 | | - generator.writeNumber(av.n()); |
31 | | - } |
32 | | - }, |
33 | | - BOOLEAN { |
34 | | - @Override |
35 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
36 | | - generator.writeValue(av.bool()); |
37 | | - } |
38 | | - }, |
39 | | - BYTES { |
40 | | - @Override |
41 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
42 | | - generator.writeValue(av.b().asByteBuffer()); |
43 | | - } |
44 | | - }, |
45 | | - LIST { |
46 | | - @Override |
47 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
48 | | - generator.writeStartArray(); |
49 | | - for (AttributeValue item : av.l()) { |
50 | | - serializeAttributeValue(generator, item); |
51 | | - } |
52 | | - generator.writeEndArray(); |
53 | | - } |
54 | | - }, |
55 | | - MAP { |
56 | | - @Override |
57 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
58 | | - generator.writeStartObject(); |
59 | | - for (Map.Entry<String, AttributeValue> entry : av.m().entrySet()) { |
60 | | - generator.writeFieldName(entry.getKey()); |
61 | | - serializeAttributeValue(generator, entry.getValue()); |
62 | | - } |
63 | | - generator.writeEndObject(); |
64 | | - } |
65 | | - }, |
66 | | - STRING_SET { |
67 | | - @Override |
68 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
69 | | - generator.writeStartArray(); |
70 | | - for (String s : av.ss()) { |
71 | | - generator.writeValue(s); |
72 | | - } |
73 | | - generator.writeEndArray(); |
74 | | - } |
75 | | - }, |
76 | | - NUMBER_SET { |
77 | | - @Override |
78 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
79 | | - generator.writeStartArray(); |
80 | | - for (String n : av.ns()) { |
81 | | - generator.writeNumber(n); |
82 | | - } |
83 | | - generator.writeEndArray(); |
84 | | - } |
85 | | - }, |
86 | | - BYTES_SET { |
87 | | - @Override |
88 | | - public void serialize(SdkJsonGenerator generator, AttributeValue av) { |
89 | | - generator.writeStartArray(); |
90 | | - for (SdkBytes b : av.bs()) { |
91 | | - generator.writeValue(b.asByteBuffer()); |
92 | | - } |
93 | | - generator.writeEndArray(); |
| 16 | + private StrategyJsonSerializer() { |
| 17 | + } |
| 18 | + |
| 19 | + 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()); |
94 | 26 | } |
95 | | - }; |
| 27 | + generator.writeEndObject(); |
| 28 | + } catch (IOException e) { |
| 29 | + throw new UncheckedIOException(e); |
| 30 | + } |
| 31 | + return writer.toString(); |
| 32 | + } |
96 | 33 |
|
97 | | - public abstract void serialize(SdkJsonGenerator generator, AttributeValue av); |
| 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 | + } |
98 | 58 | } |
99 | 59 |
|
100 | | - public static String serializeAttributeValueMap(Map<String, AttributeValue> map) { |
101 | | - SdkJsonGenerator jsonGen = new SdkJsonGenerator(new JsonFactory(), "application/json"); |
| 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(); |
| 66 | + } |
102 | 67 |
|
103 | | - jsonGen.writeStartObject(); |
104 | | - map.forEach((key, value) -> { |
105 | | - jsonGen.writeFieldName(key); |
106 | | - serializeAttributeValue(jsonGen, value); |
107 | | - }); |
108 | | - jsonGen.writeEndObject(); |
| 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 | + } |
109 | 76 |
|
110 | | - return new String(jsonGen.getBytes(), StandardCharsets.UTF_8); |
| 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(); |
111 | 83 | } |
112 | 84 |
|
113 | | - public static void serializeAttributeValue(SdkJsonGenerator generator, AttributeValue av) { |
114 | | - JsonSerializationStrategy strategy = getStrategy(av); |
115 | | - strategy.serialize(generator, av); |
| 85 | + private static void serializeNumberSet(JsonGenerator generator, AttributeValue av) throws IOException { |
| 86 | + generator.writeStartArray(); |
| 87 | + for (String n : av.ns()) { |
| 88 | + generator.writeNumber(n); |
| 89 | + } |
| 90 | + generator.writeEndArray(); |
116 | 91 | } |
117 | 92 |
|
118 | | - private static JsonSerializationStrategy getStrategy(AttributeValue av) { |
119 | | - if (av.nul() != null && av.nul()) return JsonSerializationStrategy.NULL; |
120 | | - if (av.s() != null) return JsonSerializationStrategy.STRING; |
121 | | - if (av.n() != null) return JsonSerializationStrategy.NUMBER; |
122 | | - if (av.bool() != null) return JsonSerializationStrategy.BOOLEAN; |
123 | | - if (av.b() != null) return JsonSerializationStrategy.BYTES; |
124 | | - if (av.hasL()) return JsonSerializationStrategy.LIST; |
125 | | - if (av.hasM()) return JsonSerializationStrategy.MAP; |
126 | | - if (av.hasSs()) return JsonSerializationStrategy.STRING_SET; |
127 | | - if (av.hasNs()) return JsonSerializationStrategy.NUMBER_SET; |
128 | | - if (av.hasBs()) return JsonSerializationStrategy.BYTES_SET; |
129 | | - throw new IllegalStateException("Unknown AttributeValue type: " + av); |
| 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(); |
130 | 99 | } |
131 | 100 | } |
0 commit comments