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); + } + } }