Skip to content

Commit 92fd4e5

Browse files
brushmatetishun
authored andcommitted
Refactor JsonValue to Object mapping #3412 (#3413)
We now pass the ObjectMapper defined on the DefaultJsonParser to JsonValue and its subclasses. This ObjectMapper is used to map raw JSON nodes to specialized object instances. Benefits: 1. We avoid creating new ObjectMapper instances over and over again. 2. We are able to configure the ObjectMapper. Closes #3412.
1 parent 9328af1 commit 92fd4e5

File tree

6 files changed

+84
-57
lines changed

6 files changed

+84
-57
lines changed

src/main/java/io/lettuce/core/json/DefaultJsonParser.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,32 +64,32 @@ public JsonValue createJsonValue(String value) {
6464

6565
@Override
6666
public JsonObject createJsonObject() {
67-
return new DelegateJsonObject();
67+
return new DelegateJsonObject(objectMapper);
6868
}
6969

7070
@Override
7171
public JsonArray createJsonArray() {
72-
return new DelegateJsonArray();
72+
return new DelegateJsonArray(objectMapper);
7373
}
7474

7575
@Override
7676
public JsonValue fromObject(Object object) {
7777
try {
7878
JsonNode root = objectMapper.valueToTree(object);
79-
return DelegateJsonValue.wrap(root);
79+
return DelegateJsonValue.wrap(root, objectMapper);
8080
} catch (IllegalArgumentException e) {
8181
throw new RedisJsonException("Failed to process the provided object as JSON", e);
8282
}
8383
}
8484

8585
private JsonValue parse(String value) {
8686
if (value == null) {
87-
return DelegateJsonValue.wrap(NullNode.getInstance());
87+
return DelegateJsonValue.wrap(NullNode.getInstance(), objectMapper);
8888
}
8989

9090
try {
9191
JsonNode root = objectMapper.readTree(value);
92-
return DelegateJsonValue.wrap(root);
92+
return DelegateJsonValue.wrap(root, objectMapper);
9393
} catch (JsonProcessingException e) {
9494
throw new RedisJsonException(
9595
"Failed to process the provided value as JSON: " + String.format("%.50s", value) + "...", e);
@@ -98,14 +98,14 @@ private JsonValue parse(String value) {
9898

9999
private JsonValue parse(ByteBuffer byteBuffer) {
100100
if (byteBuffer == null) {
101-
return DelegateJsonValue.wrap(NullNode.getInstance());
101+
return DelegateJsonValue.wrap(NullNode.getInstance(), objectMapper);
102102
}
103103

104104
try {
105105
byte[] bytes = new byte[byteBuffer.remaining()];
106106
byteBuffer.get(bytes);
107107
JsonNode root = objectMapper.readTree(bytes);
108-
return DelegateJsonValue.wrap(root);
108+
return DelegateJsonValue.wrap(root, objectMapper);
109109
} catch (IOException e) {
110110
throw new RedisJsonException("Failed to process the provided value as JSON", e);
111111
}

src/main/java/io/lettuce/core/json/DelegateJsonArray.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package io.lettuce.core.json;
99

1010
import com.fasterxml.jackson.databind.JsonNode;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
1112
import com.fasterxml.jackson.databind.node.ArrayNode;
1213
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
1314
import io.lettuce.core.internal.LettuceAssert;
@@ -20,15 +21,16 @@
2021
* Implementation of the {@link DelegateJsonArray} that delegates most of its' functionality to the Jackson {@link ArrayNode}.
2122
*
2223
* @author Tihomir Mateev
24+
* @author Steffen Kreutz
2325
*/
2426
class DelegateJsonArray extends DelegateJsonValue implements JsonArray {
2527

26-
DelegateJsonArray() {
27-
super(new ArrayNode(JsonNodeFactory.instance));
28+
DelegateJsonArray(ObjectMapper objectMapper) {
29+
super(new ArrayNode(JsonNodeFactory.instance), objectMapper);
2830
}
2931

30-
DelegateJsonArray(JsonNode node) {
31-
super(node);
32+
DelegateJsonArray(JsonNode node, ObjectMapper objectMapper) {
33+
super(node, objectMapper);
3234
}
3335

3436
@Override
@@ -57,7 +59,7 @@ public List<JsonValue> asList() {
5759
List<JsonValue> result = new ArrayList<>();
5860

5961
for (JsonNode jsonNode : node) {
60-
result.add(new DelegateJsonValue(jsonNode));
62+
result.add(new DelegateJsonValue(jsonNode, objectMapper));
6163
}
6264

6365
return result;
@@ -67,7 +69,7 @@ public List<JsonValue> asList() {
6769
public JsonValue get(int index) {
6870
JsonNode jsonNode = node.get(index);
6971

70-
return jsonNode == null ? null : wrap(jsonNode);
72+
return jsonNode == null ? null : wrap(jsonNode, objectMapper);
7173
}
7274

7375
@Override
@@ -84,15 +86,15 @@ public Iterator<JsonValue> iterator() {
8486
public JsonValue remove(int index) {
8587
JsonNode jsonNode = ((ArrayNode) node).remove(index);
8688

87-
return wrap(jsonNode);
89+
return wrap(jsonNode, objectMapper);
8890
}
8991

9092
@Override
9193
public JsonValue replace(int index, JsonValue newElement) {
9294
JsonNode replaceWith = ((DelegateJsonValue) newElement).getNode();
9395
JsonNode replaced = ((ArrayNode) node).set(index, replaceWith);
9496

95-
return wrap(replaced);
97+
return wrap(replaced, objectMapper);
9698
}
9799

98100
@Override

src/main/java/io/lettuce/core/json/DelegateJsonObject.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package io.lettuce.core.json;
99

1010
import com.fasterxml.jackson.databind.JsonNode;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
1112
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
1213
import com.fasterxml.jackson.databind.node.ObjectNode;
1314

@@ -19,12 +20,12 @@
1920
*/
2021
class DelegateJsonObject extends DelegateJsonValue implements JsonObject {
2122

22-
DelegateJsonObject() {
23-
super(new ObjectNode(JsonNodeFactory.instance));
23+
DelegateJsonObject(ObjectMapper objectMapper) {
24+
super(new ObjectNode(JsonNodeFactory.instance), objectMapper);
2425
}
2526

26-
DelegateJsonObject(JsonNode node) {
27-
super(node);
27+
DelegateJsonObject(JsonNode node, ObjectMapper objectMapper) {
28+
super(node, objectMapper);
2829
}
2930

3031
@Override
@@ -39,14 +40,14 @@ public JsonObject put(String key, JsonValue element) {
3940
public JsonValue get(String key) {
4041
JsonNode value = node.get(key);
4142

42-
return value == null ? null : wrap(value);
43+
return value == null ? null : wrap(value, objectMapper);
4344
}
4445

4546
@Override
4647
public JsonValue remove(String key) {
4748
JsonNode value = ((ObjectNode) node).remove(key);
4849

49-
return value == null ? null : wrap(value);
50+
return value == null ? null : wrap(value, objectMapper);
5051
}
5152

5253
@Override

src/main/java/io/lettuce/core/json/DelegateJsonValue.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@
1818
* Implementation of the {@link JsonValue} that delegates most of its functionality to the Jackson {@link JsonNode}.
1919
*
2020
* @author Tihomir Mateev
21+
* @author Steffen Kreutz
2122
*/
2223
class DelegateJsonValue implements JsonValue {
2324

2425
protected JsonNode node;
2526

26-
DelegateJsonValue(JsonNode node) {
27+
protected final ObjectMapper objectMapper;
28+
29+
DelegateJsonValue(JsonNode node, ObjectMapper objectMapper) {
2730
this.node = node;
31+
this.objectMapper = objectMapper;
2832
}
2933

3034
@Override
@@ -102,24 +106,23 @@ protected JsonNode getNode() {
102106

103107
@Override
104108
public <T> T toObject(Class<T> type) {
105-
ObjectMapper mapper = new ObjectMapper();
106109
try {
107-
return mapper.treeToValue(node, type);
110+
return objectMapper.treeToValue(node, type);
108111
} catch (IllegalArgumentException | JsonProcessingException e) {
109112
throw new RedisJsonException("Unable to map the provided JsonValue to " + type.getName(), e);
110113
}
111114
}
112115

113-
static JsonValue wrap(JsonNode root) {
116+
static JsonValue wrap(JsonNode root, ObjectMapper objectMapper) {
114117
LettuceAssert.notNull(root, "Root must not be null");
115118

116119
if (root.isObject()) {
117-
return new DelegateJsonObject(root);
120+
return new DelegateJsonObject(root, objectMapper);
118121
} else if (root.isArray()) {
119-
return new DelegateJsonArray(root);
122+
return new DelegateJsonArray(root, objectMapper);
120123
}
121124

122-
return new DelegateJsonValue(root);
125+
return new DelegateJsonValue(root, objectMapper);
123126
}
124127

125128
}

src/test/java/io/lettuce/core/json/DelegateJsonArrayUnitTests.java

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import static org.assertj.core.api.Assertions.assertThat;
1717
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1818

19+
import com.fasterxml.jackson.databind.ObjectMapper;
20+
1921
/**
2022
* Unit tests for {@link DelegateJsonArray}.
2123
*/
@@ -24,8 +26,9 @@ class DelegateJsonArrayUnitTests {
2426

2527
@Test
2628
void add() {
27-
DefaultJsonParser parser = new DefaultJsonParser();
28-
DelegateJsonArray underTest = new DelegateJsonArray();
29+
ObjectMapper objectMapper = new ObjectMapper();
30+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
31+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
2932
underTest.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
3033
.add(parser.createJsonValue("\"test3\""));
3134

@@ -40,8 +43,9 @@ void add() {
4043

4144
@Test
4245
void addCornerCases() {
43-
DefaultJsonParser parser = new DefaultJsonParser();
44-
DelegateJsonArray underTest = new DelegateJsonArray();
46+
ObjectMapper objectMapper = new ObjectMapper();
47+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
48+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
4549
underTest.add(null).add(parser.createJsonValue("null")).add(parser.createJsonValue("\"test3\""));
4650

4751
assertThatThrownBy(() -> underTest.addAll(null)).isInstanceOf(IllegalArgumentException.class);
@@ -55,8 +59,9 @@ void addCornerCases() {
5559

5660
@Test
5761
void getCornerCases() {
58-
DefaultJsonParser parser = new DefaultJsonParser();
59-
DelegateJsonArray underTest = new DelegateJsonArray();
62+
ObjectMapper objectMapper = new ObjectMapper();
63+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
64+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
6065
underTest.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
6166
.add(parser.createJsonValue("\"test3\""));
6267

@@ -66,12 +71,13 @@ void getCornerCases() {
6671

6772
@Test
6873
void addAll() {
69-
DefaultJsonParser parser = new DefaultJsonParser();
70-
DelegateJsonArray array = new DelegateJsonArray();
74+
ObjectMapper objectMapper = new ObjectMapper();
75+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
76+
DelegateJsonArray array = new DelegateJsonArray(objectMapper);
7177
array.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
7278
.add(parser.createJsonValue("\"test3\""));
7379

74-
DelegateJsonArray underTest = new DelegateJsonArray();
80+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
7581
underTest.addAll(array);
7682
array.remove(1); // verify source array modifications not propagated
7783

@@ -86,8 +92,9 @@ void addAll() {
8692

8793
@Test
8894
void asList() {
89-
DefaultJsonParser parser = new DefaultJsonParser();
90-
DelegateJsonArray underTest = new DelegateJsonArray();
95+
ObjectMapper objectMapper = new ObjectMapper();
96+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
97+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
9198
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));
9299

93100
assertThat(underTest.size()).isEqualTo(3);
@@ -98,8 +105,9 @@ void asList() {
98105

99106
@Test
100107
void getFirst() {
101-
DefaultJsonParser parser = new DefaultJsonParser();
102-
DelegateJsonArray underTest = new DelegateJsonArray();
108+
ObjectMapper objectMapper = new ObjectMapper();
109+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
110+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
103111
underTest.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
104112
.add(parser.createJsonValue("\"test3\""));
105113

@@ -110,8 +118,9 @@ void getFirst() {
110118

111119
@Test
112120
void iterator() {
113-
DefaultJsonParser parser = new DefaultJsonParser();
114-
DelegateJsonArray underTest = new DelegateJsonArray();
121+
ObjectMapper objectMapper = new ObjectMapper();
122+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
123+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
115124
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));
116125

117126
Iterator<JsonValue> iterator = underTest.iterator();
@@ -123,8 +132,9 @@ void iterator() {
123132

124133
@Test
125134
void remove() {
126-
DefaultJsonParser parser = new DefaultJsonParser();
127-
DelegateJsonArray underTest = new DelegateJsonArray();
135+
ObjectMapper objectMapper = new ObjectMapper();
136+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
137+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
128138
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));
129139

130140
assertThat(underTest.remove(1).asNumber()).isEqualTo(2);
@@ -135,8 +145,9 @@ void remove() {
135145

136146
@Test
137147
void replace() {
138-
DefaultJsonParser parser = new DefaultJsonParser();
139-
DelegateJsonArray underTest = new DelegateJsonArray();
148+
ObjectMapper objectMapper = new ObjectMapper();
149+
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
150+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
140151
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));
141152
underTest.replace(1, parser.createJsonValue("4"));
142153

@@ -148,7 +159,8 @@ void replace() {
148159

149160
@Test
150161
void isJsonArray() {
151-
DelegateJsonArray underTest = new DelegateJsonArray();
162+
ObjectMapper objectMapper = new ObjectMapper();
163+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
152164
assertThat(underTest.isJsonArray()).isTrue();
153165

154166
assertThat(underTest.isJsonObject()).isFalse();
@@ -159,13 +171,15 @@ void isJsonArray() {
159171

160172
@Test
161173
void asJsonArray() {
162-
DelegateJsonArray underTest = new DelegateJsonArray();
174+
ObjectMapper objectMapper = new ObjectMapper();
175+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
163176
assertThat(underTest.asJsonArray()).isSameAs(underTest);
164177
}
165178

166179
@Test
167180
void asAnythingElse() {
168-
DelegateJsonArray underTest = new DelegateJsonArray();
181+
ObjectMapper objectMapper = new ObjectMapper();
182+
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
169183

170184
assertThat(underTest.asBoolean()).isNull();
171185
assertThat(underTest.asJsonObject()).isNull();

0 commit comments

Comments
 (0)