Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/impl/src/main/java/org/glassfish/json/JsonMessages.java b/impl/src/main/java/org/glassfish/json/JsonMessages.java
index fd954ac..219b507 100644
--- a/impl/src/main/java/org/glassfish/json/JsonMessages.java
+++ b/impl/src/main/java/org/glassfish/json/JsonMessages.java
@@ -257,6 +257,10 @@
return localize("patch.member.missing", operation, member);
}
+ static String PATCH_OPERATION_MISSING() {
+ return localize("patch.operation.missing");
+ }
+
private static String localize(String key, Object ... args) {
try {
diff --git a/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java b/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java
index 8537477..1f9352d 100644
--- a/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java
+++ b/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java
@@ -150,7 +150,11 @@
JsonPointer pointer = getPointer(operation, "path");
JsonPointer from;
- switch (Operation.fromOperationName(operation.getString("op"))) {
+ JsonString op = operation.getJsonString("op");
+ if (op == null) {
+ throw new JsonException(JsonMessages.PATCH_OPERATION_MISSING());
+ }
+ switch (Operation.fromOperationName(op.getString())) {
case ADD:
return pointer.add(target, getValue(operation));
case REPLACE:
diff --git a/impl/src/main/resources/org/glassfish/json/messages.properties b/impl/src/main/resources/org/glassfish/json/messages.properties
index aa3ad16..bcc877f 100644
--- a/impl/src/main/resources/org/glassfish/json/messages.properties
+++ b/impl/src/main/resources/org/glassfish/json/messages.properties
@@ -87,3 +87,4 @@
patch.test.failed=The JSON Patch operation ''test'' failed for path ''{0}'' and value ''{1}''
patch.illegal.operation=Illegal value for the op member of the JSON Patch operation: ''{0}''
patch.member.missing=The JSON Patch operation ''{0}'' must contain a ''{1}'' member
+patch.operation.missing=The JSON Patch must contain ''op'' member
diff --git a/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java b/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java
index afe1e87..5ba3b92 100644
--- a/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java
+++ b/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java
@@ -20,6 +20,11 @@
import jakarta.json.JsonArray;
import jakarta.json.JsonException;
import jakarta.json.JsonPatch;
+import jakarta.json.JsonReader;
+import jakarta.json.JsonStructure;
+
+import java.io.StringReader;
+
import org.junit.Test;
/**
@@ -42,4 +47,33 @@
.build();
JsonArray result = patch.apply(array);
}
+
+ // https://github.com/eclipse-ee4j/jsonp/issues/181
+ @Test(expected = JsonException.class)
+ public void applyThrowsJsonException2() {
+ // JSON document to be patched
+ String targetDocument
+ = "{\n"
+ + " \"firstName\": \"John\",\n"
+ + " \"lastName\": \"Doe\"\n"
+ + "}";
+
+ // JSON Patch document
+ // Instead of "op", we have "op_", which is invalid
+ String patchDocument
+ = "[\n"
+ + " { \"op_\": \"replace\", \"path\": \"/firstName\", \"value\": \"Jane\" }\n"
+ + "]";
+
+ try (JsonReader objectReader = Json.createReader(new StringReader(targetDocument));
+ JsonReader arrayReader = Json.createReader(new StringReader(patchDocument))) {
+
+ JsonStructure target = objectReader.read();
+ JsonPatch patch = Json.createPatch(arrayReader.readArray());
+
+ // Applies the patch
+ // It will throw a NullPointerException with no message
+ JsonStructure patched = patch.apply(target);
+ }
+ }
}