You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rs...@apache.org on 2017/03/07 19:39:10 UTC
[1/2] johnzon git commit: JOHNZON-103 added tests for REPLACE
Repository: johnzon
Updated Branches:
refs/heads/master 86f3193c1 -> e2905f9ec
JOHNZON-103 added tests for REPLACE
Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/bcd4533a
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/bcd4533a
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/bcd4533a
Branch: refs/heads/master
Commit: bcd4533aa6901155845ccdd915ea9928dd917717
Parents: 86f3193
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Tue Mar 7 19:41:55 2017 +0100
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Tue Mar 7 19:41:55 2017 +0100
----------------------------------------------------------------------
.../apache/johnzon/core/JsonPatchDiffTest.java | 72 ++++++++++++++++++++
1 file changed, 72 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/johnzon/blob/bcd4533a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
index 67b2458..a85c1cf 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
@@ -189,6 +189,78 @@ public class JsonPatchDiffTest {
assertEquals(0, patch.toJsonArray().size());
}
+ @Test
+ public void testDiffReplaceObject() {
+
+ JsonObject source = Json.createObjectBuilder()
+ .add("a", "value")
+ .build();
+
+ JsonObject target = Json.createObjectBuilder()
+ .add("a", "replaced")
+ .build();
+
+ JsonPatch patch = Json.createDiff(source, target);
+ assertNotNull(patch);
+
+ JsonArray operations = patch.toJsonArray();
+ assertEquals(1, operations.size());
+
+ containsOperation(operations, JsonPatch.Operation.REPLACE, "/a", Json.createValue("replaced"));
+ }
+
+ @Test
+ public void testDiffReplaceFromNestedObject() {
+
+ JsonObject source = Json.createObjectBuilder()
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "value"))
+ .build();
+
+ JsonObject target = Json.createObjectBuilder()
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "replaced"))
+ .build();
+
+ JsonPatch patch = Json.createDiff(source, target);
+ assertNotNull(patch);
+
+ JsonArray operations = patch.toJsonArray();
+ assertEquals(1, operations.size());
+
+ containsOperation(operations, JsonPatch.Operation.REPLACE, "/a/aa", Json.createValue("replaced"));
+ }
+
+ //X TODO add move support -> see https://issues.apache.org/jira/browse/JOHNZON-105
+ @Test
+ @Ignore
+ public void testDiffMoveValue() {
+
+ JsonObject source = Json.createObjectBuilder()
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "valueToMove"))
+ .add("b", JsonValue.EMPTY_JSON_OBJECT)
+ .build();
+
+ JsonObject target = Json.createObjectBuilder()
+ .add("a", JsonValue.EMPTY_JSON_OBJECT)
+ .add("b", Json.createObjectBuilder()
+ .add("aa", "valueToMove"))
+ .build();
+
+ JsonPatch patch = Json.createDiff(source, target);
+ assertNotNull(patch);
+
+ JsonArray operations = patch.toJsonArray();
+ assertEquals(1, operations.size());
+
+ JsonObject operation = operations.getJsonObject(0);
+ assertEquals(JsonPatch.Operation.MOVE.operationName(), operation.getString("op"));
+ assertEquals("/a/aa", operation.getString("from"));
+ assertEquals("/b/aa", operation.getString("to"));
+ }
+
+
//X TODO arrays...
//X TODO test add/remove JsonArray
[2/2] johnzon git commit: JOHNZON-103 implemented JsonPatchDiff for
JsonArray
Posted by rs...@apache.org.
JOHNZON-103 implemented JsonPatchDiff for JsonArray
still more tests needed
Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/e2905f9e
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/e2905f9e
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/e2905f9e
Branch: refs/heads/master
Commit: e2905f9ec8313627ccd5bb6896511b57fe7aa2c5
Parents: bcd4533
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Tue Mar 7 20:38:28 2017 +0100
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Tue Mar 7 20:38:28 2017 +0100
----------------------------------------------------------------------
.../org/apache/johnzon/core/JsonPatchDiff.java | 59 ++++--
.../apache/johnzon/core/JsonPatchDiffTest.java | 200 +++++++++++++------
2 files changed, 182 insertions(+), 77 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/johnzon/blob/e2905f9e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
index a326f94..bab7bd1 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchDiff.java
@@ -42,40 +42,54 @@ class JsonPatchDiff {
JsonPatch calculateDiff() {
JsonPatchBuilder patchBuilder = new JsonPatchBuilderImpl();
- diff(patchBuilder, "/", source, target);
+ diff(patchBuilder, "", source, target);
return patchBuilder.build();
}
- private void diff(JsonPatchBuilder patchBuilder, String basePath, JsonStructure source, JsonStructure target) {
+ private void diff(JsonPatchBuilder patchBuilder, String basePath, JsonValue source, JsonValue target) {
+
if (isJsonObject(source) && isJsonObject(target)) {
- // handle JsonObjects
- diffJsonObjects(patchBuilder, basePath, (JsonObject) source, (JsonObject) target);
-
- } else if (source instanceof JsonArray && target instanceof JsonArray) {
- // handle JsonArray
- //X TODO
- throw new UnsupportedOperationException("not yet implemented.");
- } else {
- throw new UnsupportedOperationException("not yet implemented.");
+ diffJsonObjects(patchBuilder, basePath + "/", (JsonObject) source, (JsonObject) target);
+ } else if (isJsonArray(source) && isJsonArray(target)) {
+ diffJsonArray(patchBuilder, basePath + "/", (JsonArray) source, (JsonArray) target);
+ } else if (!source.equals(target)){
+ patchBuilder.replace(basePath, target);
}
}
+ private void diffJsonArray(JsonPatchBuilder patchBuilder, String basePath, JsonArray source, JsonArray target) {
+
+ for (int i = 0; i < source.size(); i++) {
+
+ JsonValue sourceValue = source.get(i);
+
+ if (target.size() <= i) {
+ patchBuilder.remove(basePath + i);
+ continue;
+ }
+
+ diff(patchBuilder, basePath + i, sourceValue, target.get(i));
+ }
+
+ if (target.size() > source.size()) {
+
+ for (int i = target.size() - source.size(); i < target.size(); i++) {
+ patchBuilder.add(basePath + i, target.get(i));
+ }
+ }
+
+ }
+
private void diffJsonObjects(JsonPatchBuilder patchBuilder, String basePath, JsonObject source, JsonObject target) {
Set<Map.Entry<String, JsonValue>> sourceEntries = source.entrySet();
for (Map.Entry<String, JsonValue> sourceEntry : sourceEntries) {
+
String attributeName = sourceEntry.getKey();
+
if (target.containsKey(attributeName)) {
- JsonValue targetValue = target.get(attributeName);
-
- if (isJsonObject(targetValue) && isJsonObject(targetValue)) {
- diffJsonObjects(patchBuilder, basePath + JsonPointerUtil.encode(attributeName) + "/",
- (JsonObject) sourceEntry.getValue(), (JsonObject) targetValue);
- } else if (!sourceEntry.getValue().equals(targetValue)) {
- // replace the original value
- patchBuilder.replace(basePath + JsonPointerUtil.encode(attributeName), targetValue);
- }
+ diff(patchBuilder, basePath + JsonPointerUtil.encode(attributeName), sourceEntry.getValue(), target.get(attributeName));
} else {
// the value got removed
patchBuilder.remove(basePath + JsonPointerUtil.encode(attributeName));
@@ -95,4 +109,9 @@ class JsonPatchDiff {
private static boolean isJsonObject(JsonValue jsonValue) {
return jsonValue instanceof JsonObject;
}
+
+ private static boolean isJsonArray(JsonValue targetValue) {
+ return targetValue instanceof JsonArray;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/johnzon/blob/e2905f9e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
index a85c1cf..51bada2 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchDiffTest.java
@@ -44,7 +44,7 @@ public class JsonPatchDiffTest {
// this results in 1 diff operations:
// adding "b"
JsonPatch jsonPatch = Json.createDiff(Json.createReader(new StringReader(jsonA)).readObject(),
- Json.createReader(new StringReader(jsonB)).readObject());
+ Json.createReader(new StringReader(jsonB)).readObject());
assertNotNull(jsonPatch);
JsonArray patchOperations = jsonPatch.toJsonArray();
assertNotNull(patchOperations);
@@ -56,10 +56,10 @@ public class JsonPatchDiffTest {
public void testAddDiffNewObject() {
JsonObject target = Json.createObjectBuilder()
- .add("a", Json.createObjectBuilder()
- .add("aa", "value")
- .add("ab", "another"))
- .build();
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "value")
+ .add("ab", "another"))
+ .build();
JsonPatch patch = Json.createDiff(JsonValue.EMPTY_JSON_OBJECT, target);
assertNotNull(patch);
@@ -78,10 +78,10 @@ public class JsonPatchDiffTest {
public void testAddDiffNewObjectWithEscaping() {
JsonObject target = Json.createObjectBuilder()
- .add("a~/", Json.createObjectBuilder()
- .add("esc/aped", "value")
- .add("tilde", "another"))
- .build();
+ .add("a~/", Json.createObjectBuilder()
+ .add("esc/aped", "value")
+ .add("tilde", "another"))
+ .build();
JsonPatch patch = Json.createDiff(JsonValue.EMPTY_JSON_OBJECT, target);
assertNotNull(patch);
@@ -100,15 +100,15 @@ public class JsonPatchDiffTest {
public void testAddDiffInNestedObject() {
JsonObject source = Json.createObjectBuilder()
- .add("a", Json.createObjectBuilder()
- .add("aa", "value"))
- .build();
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "value"))
+ .build();
JsonObject target = Json.createObjectBuilder()
- .add("a", Json.createObjectBuilder()
- .add("aa", "value")
- .add("bb", "another value"))
- .build();
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "value")
+ .add("bb", "another value"))
+ .build();
JsonPatch patch = Json.createDiff(source, target);
assertNotNull(patch);
@@ -123,8 +123,8 @@ public class JsonPatchDiffTest {
public void testRemoveDiffObject() {
JsonObject source = Json.createObjectBuilder()
- .add("a", "value")
- .build();
+ .add("a", "value")
+ .build();
JsonPatch patch = Json.createDiff(source, JsonValue.EMPTY_JSON_OBJECT);
assertNotNull(patch);
@@ -139,11 +139,11 @@ public class JsonPatchDiffTest {
public void testRemoveDiffNestedObject() {
JsonObject source = Json.createObjectBuilder()
- .add("a", "value")
- .add("nested", Json.createObjectBuilder()
- .add("1", 1)
- .add("2", 2))
- .build();
+ .add("a", "value")
+ .add("nested", Json.createObjectBuilder()
+ .add("1", 1)
+ .add("2", 2))
+ .build();
{
JsonPatch patch = Json.createDiff(source, JsonValue.EMPTY_JSON_OBJECT);
@@ -158,10 +158,10 @@ public class JsonPatchDiffTest {
{
JsonObject target = Json.createObjectBuilder()
- .add("a", "value")
- .add("nested", Json.createObjectBuilder()
- .add("1", 1))
- .build();
+ .add("a", "value")
+ .add("nested", Json.createObjectBuilder()
+ .add("1", 1))
+ .build();
JsonPatch patch = Json.createDiff(source, target);
assertNotNull(patch);
@@ -177,12 +177,12 @@ public class JsonPatchDiffTest {
public void testDiffEqualObjects() {
JsonObject source = Json.createObjectBuilder()
- .add("a", "value")
- .build();
+ .add("a", "value")
+ .build();
JsonObject target = Json.createObjectBuilder()
- .add("a", "value")
- .build();
+ .add("a", "value")
+ .build();
JsonPatch patch = Json.createDiff(source, target);
assertNotNull(patch);
@@ -193,12 +193,12 @@ public class JsonPatchDiffTest {
public void testDiffReplaceObject() {
JsonObject source = Json.createObjectBuilder()
- .add("a", "value")
- .build();
+ .add("a", "value")
+ .build();
JsonObject target = Json.createObjectBuilder()
- .add("a", "replaced")
- .build();
+ .add("a", "replaced")
+ .build();
JsonPatch patch = Json.createDiff(source, target);
assertNotNull(patch);
@@ -213,14 +213,14 @@ public class JsonPatchDiffTest {
public void testDiffReplaceFromNestedObject() {
JsonObject source = Json.createObjectBuilder()
- .add("a", Json.createObjectBuilder()
- .add("aa", "value"))
- .build();
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "value"))
+ .build();
JsonObject target = Json.createObjectBuilder()
- .add("a", Json.createObjectBuilder()
- .add("aa", "replaced"))
- .build();
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "replaced"))
+ .build();
JsonPatch patch = Json.createDiff(source, target);
assertNotNull(patch);
@@ -237,16 +237,16 @@ public class JsonPatchDiffTest {
public void testDiffMoveValue() {
JsonObject source = Json.createObjectBuilder()
- .add("a", Json.createObjectBuilder()
- .add("aa", "valueToMove"))
- .add("b", JsonValue.EMPTY_JSON_OBJECT)
- .build();
+ .add("a", Json.createObjectBuilder()
+ .add("aa", "valueToMove"))
+ .add("b", JsonValue.EMPTY_JSON_OBJECT)
+ .build();
JsonObject target = Json.createObjectBuilder()
- .add("a", JsonValue.EMPTY_JSON_OBJECT)
- .add("b", Json.createObjectBuilder()
- .add("aa", "valueToMove"))
- .build();
+ .add("a", JsonValue.EMPTY_JSON_OBJECT)
+ .add("b", Json.createObjectBuilder()
+ .add("aa", "valueToMove"))
+ .build();
JsonPatch patch = Json.createDiff(source, target);
assertNotNull(patch);
@@ -261,16 +261,101 @@ public class JsonPatchDiffTest {
}
+ @Test
+ public void testAddValueToArray() {
+
+ JsonArray source = Json.createArrayBuilder()
+ .add("first")
+ .build();
+
+ JsonArray target = Json.createArrayBuilder()
+ .add("first")
+ .add("second")
+ .build();
+
+ JsonPatch patch = Json.createDiff(source, target);
+ assertNotNull(patch);
+
+ JsonArray operations = patch.toJsonArray();
+ assertEquals(1, operations.size());
+
+ containsOperation(operations, JsonPatch.Operation.ADD, "/1", Json.createValue("second"));
+ }
+
+ @Test
+ public void testAddObjectToArray() {
+
+ JsonArray source = Json.createArrayBuilder()
+ .add(Json.createObjectBuilder()
+ .add("a", "a"))
+ .build();
+
+ JsonArray target = Json.createArrayBuilder()
+ .add(Json.createObjectBuilder()
+ .add("a", "a"))
+ .add(Json.createObjectBuilder()
+ .add("a", "b"))
+ .build();
+
+
+ JsonPatch patch = Json.createDiff(source, target);
+ assertNotNull(patch);
+
+ JsonArray operations = patch.toJsonArray();
+ assertEquals(1, operations.size());
+
+ containsOperation(operations, JsonPatch.Operation.ADD, "/1", Json.createObjectBuilder()
+ .add("a", "b")
+ .build());
+ }
+
+ @Test
+ public void testRemoveValueFromArray() {
+
+ JsonArray source = Json.createArrayBuilder()
+ .add("a")
+ .add("b")
+ .build();
+
+ JsonArray target = Json.createArrayBuilder()
+ .add("b")
+ .build();
+
+ JsonPatch patch = Json.createDiff(source, target);
+ assertNotNull(patch);
+
+ JsonArray operations = patch.toJsonArray();
+ assertEquals(2, operations.size());
+
+ containsOperation(operations, JsonPatch.Operation.REPLACE, "/0", Json.createValue("b"));
+ containsOperation(operations, JsonPatch.Operation.REMOVE, "/1");
+ }
+
+ @Test
+ public void testRemoveObjectFromArray() {
+
+ JsonArray source = Json.createArrayBuilder()
+ .add(Json.createObjectBuilder()
+ .add("a", "a")
+ .add("b", "b"))
+ .build();
+
+ JsonPatch patch = Json.createDiff(source, JsonValue.EMPTY_JSON_ARRAY);
+ assertNotNull(patch);
- //X TODO arrays...
- //X TODO test add/remove JsonArray
- //X TODO test add object to JsonArray
- //X TODO test remove object to JsonArray
+ JsonArray operations = patch.toJsonArray();
+ assertEquals(1, operations.size());
+
+ containsOperation(operations, JsonPatch.Operation.REMOVE, "/0");
+ }
+ //X TODO replaceValueInArray
+ //X TODO replaceObjectInArray
+ //X TODO Object in Array
+ //X TODO Array in Object
@Test
- @Ignore //X TODO reinhard take over ;)
public void testComplexDiff() {
// {"a":"xa","b":2,"c":{"d":"xd"},"e":[1,2,3]}
String jsonA = "{\"a\":\"xa\",\"b\":2,\"c\":{\"d\":\"xd\"},\"e\":[1,2,3]}";
@@ -278,16 +363,17 @@ public class JsonPatchDiffTest {
// {"a":"xa","c":{"d":"xd", "d2":"xd2"},"e":[1,3],"f":"xe"}
String jsonB = "{\"a\":\"xa\",\"c\":{\"d\":\"xd\", \"d2\":\"xd2\"},\"e\":[1,3],\"f\":\"xe\"}";
- // this results in 4 diff operations:
- // removing b, adding d2, removing 2 from e, adding f
+ // this results in 5 diff operations:
+ // removing b, adding d2, replacing 2 with 3 from e, removing 3 from 3, adding f
JsonPatch jsonPatch = Json.createDiff(Json.createReader(new StringReader(jsonA)).readObject(),
Json.createReader(new StringReader(jsonB)).readObject());
assertNotNull(jsonPatch);
JsonArray patchOperations = jsonPatch.toJsonArray();
assertNotNull(patchOperations);
- assertEquals(4, patchOperations.size());
+ assertEquals(5, patchOperations.size());
containsOperation(patchOperations, JsonPatch.Operation.REMOVE, "/b");
containsOperation(patchOperations, JsonPatch.Operation.ADD, "/c/d2", Json.createValue("xd2"));
+ containsOperation(patchOperations, JsonPatch.Operation.REPLACE, "/e/1", Json.createValue(3));
containsOperation(patchOperations, JsonPatch.Operation.REMOVE, "/e/2");
containsOperation(patchOperations, JsonPatch.Operation.ADD, "/f", Json.createValue("xe"));
}