From 75594e9c1986472ea890a048245cc04fb660a3bc Mon Sep 17 00:00:00 2001 From: "tiago.martins" Date: Mon, 24 May 2021 18:53:33 +0100 Subject: [PATCH] Add value to move and copy operations --- src/main/java/com/flipkart/zjsonpatch/Diff.java | 8 ++++++++ src/main/java/com/flipkart/zjsonpatch/JsonDiff.java | 7 ++++--- .../java/com/flipkart/zjsonpatch/MoveOperationTest.java | 8 ++++++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/flipkart/zjsonpatch/Diff.java b/src/main/java/com/flipkart/zjsonpatch/Diff.java index 2a6351d..2017947 100644 --- a/src/main/java/com/flipkart/zjsonpatch/Diff.java +++ b/src/main/java/com/flipkart/zjsonpatch/Diff.java @@ -43,6 +43,14 @@ class Diff { this.value = null; this.srcValue = null; } + + Diff(Operation operation, JsonPointer fromPath, JsonPointer toPath, JsonNode value) { + this.operation = operation; + this.path = fromPath; + this.toPath = toPath; + this.value = value; + this.srcValue = null; + } Diff(Operation operation, JsonPointer path, JsonNode srcValue, JsonNode value) { this.operation = operation; diff --git a/src/main/java/com/flipkart/zjsonpatch/JsonDiff.java b/src/main/java/com/flipkart/zjsonpatch/JsonDiff.java index effc963..e6db102 100644 --- a/src/main/java/com/flipkart/zjsonpatch/JsonDiff.java +++ b/src/main/java/com/flipkart/zjsonpatch/JsonDiff.java @@ -93,7 +93,7 @@ private void introduceCopyOperation(JsonNode source, JsonNode target) { diffs.add(i, new Diff(Operation.TEST, matchingValuePath, diff.getValue())); i++; } - diffs.set(i, new Diff(Operation.COPY, matchingValuePath, diff.getPath())); + diffs.set(i, new Diff(Operation.COPY, matchingValuePath, diff.getPath(), diff.getValue())); } } } @@ -209,12 +209,12 @@ private void introduceMoveOperation() { if (Operation.REMOVE == diff1.getOperation() && Operation.ADD == diff2.getOperation()) { JsonPointer relativePath = computeRelativePath(diff2.getPath(), i + 1, j - 1, diffs); - moveDiff = new Diff(Operation.MOVE, diff1.getPath(), relativePath); + moveDiff = new Diff(Operation.MOVE, diff1.getPath(), relativePath, diff2.getValue()); } else if (Operation.ADD == diff1.getOperation() && Operation.REMOVE == diff2.getOperation()) { JsonPointer relativePath = computeRelativePath(diff2.getPath(), i, j - 1, diffs); // diff1's add should also be considered - moveDiff = new Diff(Operation.MOVE, relativePath, diff1.getPath()); + moveDiff = new Diff(Operation.MOVE, relativePath, diff1.getPath(), diff1.getValue()); } if (moveDiff != null) { diffs.remove(j); @@ -322,6 +322,7 @@ private static ObjectNode getJsonNode(JsonNodeFactory FACTORY, Diff diff, EnumSe switch (diff.getOperation()) { case MOVE: case COPY: + jsonNode.set(Constants.VALUE, diff.getValue()); jsonNode.put(Constants.FROM, diff.getPath().toString()); // required {from} only in case of Move Operation jsonNode.put(Constants.PATH, diff.getToPath().toString()); // destination Path break; diff --git a/src/test/java/com/flipkart/zjsonpatch/MoveOperationTest.java b/src/test/java/com/flipkart/zjsonpatch/MoveOperationTest.java index 48548f1..7b41ad5 100644 --- a/src/test/java/com/flipkart/zjsonpatch/MoveOperationTest.java +++ b/src/test/java/com/flipkart/zjsonpatch/MoveOperationTest.java @@ -43,7 +43,9 @@ public static Collection data() throws IOException { public void testMoveValueGeneratedHasNoValue() throws IOException { JsonNode jsonNode1 = MAPPER.readTree("{ \"foo\": { \"bar\": \"baz\", \"waldo\": \"fred\" }, \"qux\": { \"corge\": \"grault\" } }"); JsonNode jsonNode2 = MAPPER.readTree("{ \"foo\": { \"bar\": \"baz\" }, \"qux\": { \"corge\": \"grault\", \"thud\": \"fred\" } }"); - JsonNode patch = MAPPER.readTree("[{\"op\":\"move\",\"from\":\"/foo/waldo\",\"path\":\"/qux/thud\"}]"); + JsonNode patch = MAPPER.readTree( + "[{\"op\":\"move\",\"value\":\"fred\",\"from\":\"/foo/waldo\",\"path\":\"/qux/thud\"}]" + ); JsonNode diff = JsonDiff.asJson(jsonNode1, jsonNode2); @@ -54,7 +56,9 @@ public void testMoveValueGeneratedHasNoValue() throws IOException { public void testMoveArrayGeneratedHasNoValue() throws IOException { JsonNode jsonNode1 = MAPPER.readTree("{ \"foo\": [ \"all\", \"grass\", \"cows\", \"eat\" ] }"); JsonNode jsonNode2 = MAPPER.readTree("{ \"foo\": [ \"all\", \"cows\", \"eat\", \"grass\" ] }"); - JsonNode patch = MAPPER.readTree("[{\"op\":\"move\",\"from\":\"/foo/1\",\"path\":\"/foo/3\"}]"); + JsonNode patch = MAPPER.readTree( + "[{\"op\":\"move\",\"value\":\"grass\",\"from\":\"/foo/1\",\"path\":\"/foo/3\"}]" + ); JsonNode diff = JsonDiff.asJson(jsonNode1, jsonNode2);