JOHNZON-325 make sure json patch as a consistent behavior
Signed-off-by: Jean-Louis Monteiro <jlmonteiro@tomitribe.com>
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchImpl.java
index 5d43376..642a625 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPatchImpl.java
@@ -29,6 +29,7 @@
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonPatch;
+import javax.json.JsonPointer;
import javax.json.JsonStructure;
import javax.json.JsonValue;
import javax.json.spi.JsonProvider;
@@ -64,25 +65,25 @@
switch (patch.operation) {
case ADD:
- patched = patch.path.add(patched, patch.value);
+ patched = patch.pathPointer.add(patched, patch.value);
break;
case REMOVE:
- patched = patch.path.remove(patched);
+ patched = patch.pathPointer.remove(patched);
break;
case REPLACE:
// first remove the existing element and then add the new value
- patched = patch.path.add(patch.path.remove(patched), patch.value);
+ patched = patch.pathPointer.add(patch.pathPointer.remove(patched), patch.value);
break;
case MOVE:
- JsonValue valueToMove = patch.from.getValue(patched);
- patched = patch.path.add(patch.from.remove(patched), valueToMove);
+ JsonValue valueToMove = patch.fromPointer.getValue(patched);
+ patched = patch.pathPointer.add(patch.fromPointer.remove(patched), valueToMove);
break;
case COPY:
- JsonValue toCopy = patch.from.getValue(patched);
- patched = patch.path.add(patched, toCopy);
+ JsonValue toCopy = patch.fromPointer.getValue(patched);
+ patched = patch.pathPointer.add(patched, toCopy);
break;
case TEST:
- JsonValue toTest = patch.path.getValue(patched);
+ JsonValue toTest = patch.pathPointer.getValue(patched);
if (!toTest.equals(patch.value)) {
throw new JsonException("JsonPatch.Operation.TEST fails! Values are not equal");
}
@@ -147,8 +148,10 @@
static class PatchValue {
private final JsonProvider provider;
private final JsonPatch.Operation operation;
- private final JsonPointerImpl path;
- private final JsonPointerImpl from;
+ private String path;
+ private String from;
+ private final JsonPointer pathPointer;
+ private final JsonPointer fromPointer;
private final JsonValue value;
private volatile String str;
@@ -162,13 +165,15 @@
final JsonValue value) {
this.provider = provider;
this.operation = operation;
- this.path = new JsonPointerImpl(provider, path);
+ this.path = path;
+ this.from = from;
+ this.pathPointer = provider.createPointer(path);
// ignore from if we do not need it
if (operation == JsonPatch.Operation.MOVE || operation == JsonPatch.Operation.COPY) {
- this.from = new JsonPointerImpl(provider, from);
+ this.fromPointer = provider.createPointer(from);
} else {
- this.from = null;
+ this.fromPointer = null;
}
this.value = value;
@@ -220,7 +225,8 @@
if (str == null) {
synchronized (this) {
if (str == null) {
- str = "{op: " + operation + ", path: " + path + ", from: " + from + ", value: " + value + '}';
+ str = "{op: " + operation + ", path: " +
+ pathPointer + ", from: " + fromPointer + ", value: " + value + '}';
}
}
}
@@ -233,10 +239,10 @@
if (json == null) {
JsonObjectBuilder builder = provider.createObjectBuilder()
.add("op", operation.name().toLowerCase())
- .add("path", path.getJsonPointer());
+ .add("path", path);
- if (from != null) {
- builder.add("from", from.getJsonPointer());
+ if (fromPointer != null) {
+ builder.add("from", from);
}
if (value != null) {