Repository: johnzon
Updated Branches:
  refs/heads/master e6d79e356 -> f41430773


Fix issues related to JsonPointer remove operation


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/cb6004d9
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/cb6004d9
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/cb6004d9

Branch: refs/heads/master
Commit: cb6004d907d67780b6b91f44c8fc1128648cd3da
Parents: e6d79e3
Author: Ravisankar Challa <[email protected]>
Authored: Fri Jul 27 06:18:54 2018 +1000
Committer: Ravisankar Challa <[email protected]>
Committed: Fri Jul 27 06:19:28 2018 +1000

----------------------------------------------------------------------
 .../apache/johnzon/core/JsonPointerImpl.java    | 19 +++++++-----
 .../apache/johnzon/core/JsonPointerTest.java    | 32 ++++++++++++++++++++
 2 files changed, 43 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/cb6004d9/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 b0ac822..f9aab6f 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
@@ -283,7 +283,7 @@ public class JsonPointerImpl implements JsonPointer {
     public JsonObject remove(JsonObject target) {
         validateRemove(target);
 
-        return (JsonObject) remove(target, 1, referenceTokens.size() - 1);
+        return (JsonObject) remove(target, 1, referenceTokens.size() - 1, 
referenceTokens);
     }
 
     /**
@@ -299,7 +299,7 @@ public class JsonPointerImpl implements JsonPointer {
     public JsonArray remove(JsonArray target) {
         validateRemove(target);
 
-        return (JsonArray) remove(target, 1, referenceTokens.size() - 1);
+        return (JsonArray) remove(target, 1, referenceTokens.size() - 1, 
referenceTokens);
     }
 
     String getJsonPointer() {
@@ -409,7 +409,7 @@ public class JsonPointerImpl implements JsonPointer {
                 currentPath.get(currentPath.size() - 
1).equals(referenceTokens.get(referenceTokens.size() - 2));
     }
 
-    private JsonValue remove(JsonValue jsonValue, int currentPosition, int 
referencePosition) {
+    private JsonValue remove(JsonValue jsonValue, int currentPosition, int 
referencePosition, List<String> referenceTokens) {
         if (jsonValue instanceof JsonObject) {
             JsonObject jsonObject = (JsonObject) jsonValue;
             JsonObjectBuilder objectBuilder = provider.createObjectBuilder();
@@ -419,7 +419,7 @@ public class JsonPointerImpl implements JsonPointer {
                         && lastReferenceToken.equals(entry.getKey())) {
                     continue;
                 }
-                objectBuilder.add(entry.getKey(), remove(entry.getValue(), 
currentPosition + 1, referencePosition));
+                objectBuilder.add(entry.getKey(), remove(entry.getValue(), 
currentPosition + 1, referencePosition, referenceTokens));
             }
             return objectBuilder.build();
         } else if (jsonValue instanceof JsonArray) {
@@ -427,16 +427,19 @@ public class JsonPointerImpl implements JsonPointer {
             JsonArrayBuilder arrayBuilder = provider.createArrayBuilder();
 
             int arrayIndex = -1;
-            if (currentPosition == referencePosition) {
-                arrayIndex = getArrayIndex(lastReferenceToken, jsonArray, 
false);
+            if (referenceTokens.size() > currentPosition && 
referenceTokens.get(currentPosition).matches("\\d+")) {
+                arrayIndex = 
getArrayIndex(referenceTokens.get(currentPosition), jsonArray, false);
             }
 
             int jsonArraySize = jsonArray.size();
             for (int i = 0; i < jsonArraySize; i++) {
                 if (i == arrayIndex) {
-                    continue;
+                    if (currentPosition != referencePosition) {
+                        arrayBuilder.add(remove(jsonArray.get(i), 
currentPosition + 1, referencePosition, referenceTokens));
+                    }
+                } else {
+                    arrayBuilder.add(jsonArray.get(i));
                 }
-                arrayBuilder.add(remove(jsonArray.get(i), currentPosition + 1, 
referencePosition));
             }
             return arrayBuilder.build();
         }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/cb6004d9/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java 
b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java
index 616b8bb..a5841a4 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java
@@ -476,6 +476,38 @@ public class JsonPointerTest {
         assertEquals("{\"foo\":\"bar\"}", result.toString()); // {"foo":"bar"}
     }
 
+    @Test
+    public void testRemoveFieldMemberWithObjectAndArray() {
+        JsonPointerImpl jsonPointer = new 
JsonPointerImpl(JsonProvider.provider(), "/test/status");
+        JsonStructure target = Json.createObjectBuilder()
+                .add("test", Json.createObjectBuilder().add("status", "200"))
+                .add("array", Json.createArrayBuilder().build()).build(); // 
{"test":{"status":"200"},"array":[]}
+
+        JsonStructure result = jsonPointer.remove(target);
+        assertEquals("{\"test\":{},\"array\":[]}", result.toString()); // 
{"foo":"bar"}
+    }
+
+    @Test
+    public void testRemoveFieldMemberWithNestedArray() {
+        JsonStructure target = Json.createObjectBuilder()
+                .add("test", Json.createArrayBuilder().add(
+                        Json.createObjectBuilder().add("OK", "200")).add(
+                        Json.createObjectBuilder().add("REDIREDT", 
+                             Json.createArrayBuilder().add(
+                                  Json.createObjectBuilder().add("CREATED", 
"201"))
+                                      .add(Json.createObjectBuilder()
+                                      .add("UNAUTH", "201") .add("ACCEPTED", 
"202")))))
+                                      .build();
+        // 
{"test":[{"OK":"200"},{"REDIREDT":[{"CREATED":"201"},{"UNAUTH":"401","ACCEPTED":"202"}]}]}
+        JsonPointerImpl jsonPointer = new 
JsonPointerImpl(JsonProvider.provider(), "/test/1/REDIREDT/1/UNAUTH");
+        JsonStructure result = jsonPointer.remove(target);
+        
assertEquals("{\"test\":[{\"OK\":\"200\"},{\"REDIREDT\":[{\"CREATED\":\"201\"}"
+                   + ",{\"ACCEPTED\":\"202\"}]}]}", result.toString());
+        jsonPointer = new JsonPointerImpl(JsonProvider.provider(), 
"/test/1/REDIREDT/1");
+        result = jsonPointer.remove(target);
+        
assertEquals("{\"test\":[{\"OK\":\"200\"},{\"REDIREDT\":[{\"CREATED\":\"201\"}]}]}",
 result.toString());
+    }
+
     @Test(expected = NullPointerException.class)
     public void testReplaceJsonObjectWithTargetNull() {
         JsonPointerImpl jsonPointer = new 
JsonPointerImpl(JsonProvider.provider(), "/");

Reply via email to