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() {
 

Reply via email to