Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/main/java/io/lettuce/core/json/DefaultJsonParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,32 +64,32 @@ public JsonValue createJsonValue(String value) {

@Override
public JsonObject createJsonObject() {
return new DelegateJsonObject();
return new DelegateJsonObject(objectMapper);
}

@Override
public JsonArray createJsonArray() {
return new DelegateJsonArray();
return new DelegateJsonArray(objectMapper);
}

@Override
public JsonValue fromObject(Object object) {
try {
JsonNode root = objectMapper.valueToTree(object);
return DelegateJsonValue.wrap(root);
return DelegateJsonValue.wrap(root, objectMapper);
} catch (IllegalArgumentException e) {
throw new RedisJsonException("Failed to process the provided object as JSON", e);
}
}

private JsonValue parse(String value) {
if (value == null) {
return DelegateJsonValue.wrap(NullNode.getInstance());
return DelegateJsonValue.wrap(NullNode.getInstance(), objectMapper);
}

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

private JsonValue parse(ByteBuffer byteBuffer) {
if (byteBuffer == null) {
return DelegateJsonValue.wrap(NullNode.getInstance());
return DelegateJsonValue.wrap(NullNode.getInstance(), objectMapper);
}

try {
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
JsonNode root = objectMapper.readTree(bytes);
return DelegateJsonValue.wrap(root);
return DelegateJsonValue.wrap(root, objectMapper);
} catch (IOException e) {
throw new RedisJsonException("Failed to process the provided value as JSON", e);
}
Expand Down
18 changes: 10 additions & 8 deletions src/main/java/io/lettuce/core/json/DelegateJsonArray.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package io.lettuce.core.json;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import io.lettuce.core.internal.LettuceAssert;
Expand All @@ -20,15 +21,16 @@
* Implementation of the {@link DelegateJsonArray} that delegates most of its' functionality to the Jackson {@link ArrayNode}.
*
* @author Tihomir Mateev
* @author Steffen Kreutz
*/
class DelegateJsonArray extends DelegateJsonValue implements JsonArray {

DelegateJsonArray() {
super(new ArrayNode(JsonNodeFactory.instance));
DelegateJsonArray(ObjectMapper objectMapper) {
super(new ArrayNode(JsonNodeFactory.instance), objectMapper);
}

DelegateJsonArray(JsonNode node) {
super(node);
DelegateJsonArray(JsonNode node, ObjectMapper objectMapper) {
super(node, objectMapper);
}

@Override
Expand Down Expand Up @@ -57,7 +59,7 @@ public List<JsonValue> asList() {
List<JsonValue> result = new ArrayList<>();

for (JsonNode jsonNode : node) {
result.add(new DelegateJsonValue(jsonNode));
result.add(new DelegateJsonValue(jsonNode, objectMapper));
}

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

return jsonNode == null ? null : wrap(jsonNode);
return jsonNode == null ? null : wrap(jsonNode, objectMapper);
}

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

return wrap(jsonNode);
return wrap(jsonNode, objectMapper);
}

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

return wrap(replaced);
return wrap(replaced, objectMapper);
}

@Override
Expand Down
13 changes: 7 additions & 6 deletions src/main/java/io/lettuce/core/json/DelegateJsonObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package io.lettuce.core.json;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;

Expand All @@ -19,12 +20,12 @@
*/
class DelegateJsonObject extends DelegateJsonValue implements JsonObject {

DelegateJsonObject() {
super(new ObjectNode(JsonNodeFactory.instance));
DelegateJsonObject(ObjectMapper objectMapper) {
super(new ObjectNode(JsonNodeFactory.instance), objectMapper);
}

DelegateJsonObject(JsonNode node) {
super(node);
DelegateJsonObject(JsonNode node, ObjectMapper objectMapper) {
super(node, objectMapper);
}

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

return value == null ? null : wrap(value);
return value == null ? null : wrap(value, objectMapper);
}

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

return value == null ? null : wrap(value);
return value == null ? null : wrap(value, objectMapper);
}

@Override
Expand Down
17 changes: 10 additions & 7 deletions src/main/java/io/lettuce/core/json/DelegateJsonValue.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,17 @@
* Implementation of the {@link JsonValue} that delegates most of its functionality to the Jackson {@link JsonNode}.
*
* @author Tihomir Mateev
* @author Steffen Kreutz
*/
class DelegateJsonValue implements JsonValue {

protected JsonNode node;

DelegateJsonValue(JsonNode node) {
protected final ObjectMapper objectMapper;

DelegateJsonValue(JsonNode node, ObjectMapper objectMapper) {
this.node = node;
this.objectMapper = objectMapper;
}

@Override
Expand Down Expand Up @@ -102,24 +106,23 @@ protected JsonNode getNode() {

@Override
public <T> T toObject(Class<T> type) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.treeToValue(node, type);
return objectMapper.treeToValue(node, type);
} catch (IllegalArgumentException | JsonProcessingException e) {
throw new RedisJsonException("Unable to map the provided JsonValue to " + type.getName(), e);
}
}

static JsonValue wrap(JsonNode root) {
static JsonValue wrap(JsonNode root, ObjectMapper objectMapper) {
LettuceAssert.notNull(root, "Root must not be null");

if (root.isObject()) {
return new DelegateJsonObject(root);
return new DelegateJsonObject(root, objectMapper);
} else if (root.isArray()) {
return new DelegateJsonArray(root);
return new DelegateJsonArray(root, objectMapper);
}

return new DelegateJsonValue(root);
return new DelegateJsonValue(root, objectMapper);
}

}
58 changes: 36 additions & 22 deletions src/test/java/io/lettuce/core/json/DelegateJsonArrayUnitTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
* Unit tests for {@link DelegateJsonArray}.
*/
Expand All @@ -24,8 +26,9 @@ class DelegateJsonArrayUnitTests {

@Test
void add() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
.add(parser.createJsonValue("\"test3\""));

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

@Test
void addCornerCases() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(null).add(parser.createJsonValue("null")).add(parser.createJsonValue("\"test3\""));

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

@Test
void getCornerCases() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
.add(parser.createJsonValue("\"test3\""));

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

@Test
void addAll() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray array = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray array = new DelegateJsonArray(objectMapper);
array.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
.add(parser.createJsonValue("\"test3\""));

DelegateJsonArray underTest = new DelegateJsonArray();
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.addAll(array);
array.remove(1); // verify source array modifications not propagated

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

@Test
void asList() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));

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

@Test
void getFirst() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(parser.createJsonValue("\"test\"")).add(parser.createJsonValue("\"test2\""))
.add(parser.createJsonValue("\"test3\""));

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

@Test
void iterator() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));

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

@Test
void remove() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));

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

@Test
void replace() {
DefaultJsonParser parser = new DefaultJsonParser();
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DefaultJsonParser parser = new DefaultJsonParser(objectMapper);
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
underTest.add(parser.createJsonValue("1")).add(parser.createJsonValue("2")).add(parser.createJsonValue("3"));
underTest.replace(1, parser.createJsonValue("4"));

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

@Test
void isJsonArray() {
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
assertThat(underTest.isJsonArray()).isTrue();

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

@Test
void asJsonArray() {
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);
assertThat(underTest.asJsonArray()).isSameAs(underTest);
}

@Test
void asAnythingElse() {
DelegateJsonArray underTest = new DelegateJsonArray();
ObjectMapper objectMapper = new ObjectMapper();
DelegateJsonArray underTest = new DelegateJsonArray(objectMapper);

assertThat(underTest.asBoolean()).isNull();
assertThat(underTest.asJsonObject()).isNull();
Expand Down
Loading