Repository: johnzon Updated Branches: refs/heads/master 3c28e3501 -> b59498070
JOHNZON-172 fixed applying patch to wrong empty value Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/b5949807 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/b5949807 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/b5949807 Branch: refs/heads/master Commit: b594980702cb9ce0f7814ebee1e1bf603775c9ae Parents: 3c28e35 Author: Reinhard Sandtner <[email protected]> Authored: Tue May 22 11:51:41 2018 +0200 Committer: Reinhard Sandtner <[email protected]> Committed: Tue May 22 11:51:41 2018 +0200 ---------------------------------------------------------------------- .../apache/johnzon/core/JsonPointerImpl.java | 14 ++++++----- .../org/apache/johnzon/core/JsonPatchTest.java | 26 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/b5949807/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java index b674ad9..50c19f7 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java @@ -358,7 +358,7 @@ public class JsonPointerImpl implements JsonPointer { JsonObject jsonObject = (JsonObject) jsonValue; JsonObjectBuilder objectBuilder = Json.createObjectBuilder(); - if (jsonObject.isEmpty()) { + if (jsonObject.isEmpty() && isPositionToAdd(currentPath)) { objectBuilder.add(lastReferenceToken, newValue); } else { for (Map.Entry<String, JsonValue> entry : jsonObject.entrySet()) { @@ -367,8 +367,7 @@ public class JsonPointerImpl implements JsonPointer { objectBuilder.add(entry.getKey(), addInternal(entry.getValue(), newValue, currentPath)); currentPath.remove(entry.getKey()); - if (currentPath.size() == referenceTokens.size() - 1 && - currentPath.get(currentPath.size() - 1).equals(referenceTokens.get(referenceTokens.size() - 2))) { + if (isPositionToAdd(currentPath)) { objectBuilder.add(lastReferenceToken, newValue); } } @@ -379,9 +378,7 @@ public class JsonPointerImpl implements JsonPointer { JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); int arrayIndex = -1; - if (currentPath.size() == referenceTokens.size() - 1 && - currentPath.get(currentPath.size() - 1).equals(referenceTokens.get(referenceTokens.size() - 2))) { - + if (isPositionToAdd(currentPath)) { arrayIndex = getArrayIndex(lastReferenceToken, jsonArray, true); } @@ -404,6 +401,11 @@ public class JsonPointerImpl implements JsonPointer { return jsonValue; } + private boolean isPositionToAdd(List<String> currentPath) { + return currentPath.size() == referenceTokens.size() - 1 && + currentPath.get(currentPath.size() - 1).equals(referenceTokens.get(referenceTokens.size() - 2)); + } + private JsonValue remove(JsonValue jsonValue, int currentPosition, int referencePosition) { if (jsonValue instanceof JsonObject) { JsonObject jsonObject = (JsonObject) jsonValue; http://git-wip-us.apache.org/repos/asf/johnzon/blob/b5949807/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java index 6c96329..59696e8 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java @@ -27,6 +27,7 @@ import javax.json.JsonArrayBuilder; import javax.json.JsonException; import javax.json.JsonObject; import javax.json.JsonPatch; +import javax.json.JsonPatchBuilder; import javax.json.JsonStructure; import javax.json.JsonValue; import java.io.StringReader; @@ -59,6 +60,31 @@ public class JsonPatchTest { assertEquals("{\"foo\":\"bar\",\"baz\":\"qux\"}", toJsonString(patched)); } + /** + * {@linkplain} https://issues.apache.org/jira/browse/JOHNZON-172 + */ + @Test + public void testAddToRootContainingEmptyJsonObject() { + JsonObject object = Json.createObjectBuilder() + .add("request", Json.createObjectBuilder() + .add("test", JsonValue.EMPTY_JSON_OBJECT)) + .build(); + + JsonPatchImpl patch = new JsonPatchImpl(new JsonPatchImpl.PatchValue(JsonPatch.Operation.ADD, + "/name", + null, + new JsonStringImpl("aName"))); + + JsonObject patched = patch.apply(object); + assertNotNull(patched); + + JsonObject requestJson = patched.getJsonObject("request"); + assertNotNull(requestJson); + assertEquals(JsonValue.EMPTY_JSON_OBJECT, requestJson.getJsonObject("test")); + + assertEquals("aName", patched.getString("name")); + } + @Test public void testAddArrayElementWithIndex() {
