From 1ec9bbbca36559f8b2e8f63443ec48b1cba5fb7d Mon Sep 17 00:00:00 2001 From: Ryan Lopopolo Date: Mon, 3 Mar 2014 18:23:12 -0800 Subject: [PATCH] Ensure JsonNodes are ContainerNodes in AddOperation --- .../github/fge/jsonpatch/AddOperation.java | 10 +++++++--- .../fge/jsonpatch/AddOperationTest.java | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/fge/jsonpatch/AddOperation.java b/src/main/java/com/github/fge/jsonpatch/AddOperation.java index 7e49393d..31e526dc 100644 --- a/src/main/java/com/github/fge/jsonpatch/AddOperation.java +++ b/src/main/java/com/github/fge/jsonpatch/AddOperation.java @@ -91,9 +91,13 @@ public JsonNode apply(final JsonNode node) if (parentNode.isMissingNode()) throw new JsonPatchException(BUNDLE.getMessage( "jsonPatch.noSuchParent")); - return parentNode.isArray() - ? addToArray(path, node) - : addToObject(path, node); + if (parentNode.isArray()) + return addToArray(path, node); + else if (parentNode.isObject()) + return addToObject(path, node); + else + throw new JsonPatchException(BUNDLE.getMessage( + "jsonPatch.noSuchPath")); } private JsonNode addToArray(final JsonPointer path, final JsonNode node) diff --git a/src/test/java/com/github/fge/jsonpatch/AddOperationTest.java b/src/test/java/com/github/fge/jsonpatch/AddOperationTest.java index 06949d9c..1d1ac7b3 100644 --- a/src/test/java/com/github/fge/jsonpatch/AddOperationTest.java +++ b/src/test/java/com/github/fge/jsonpatch/AddOperationTest.java @@ -18,6 +18,13 @@ package com.github.fge.jsonpatch; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.node.TextNode; +import com.github.fge.jackson.JacksonUtils; +import com.github.fge.jackson.jsonpointer.JsonPointer; +import com.github.fge.jackson.jsonpointer.JsonPointerException; +import org.testng.annotations.Test; + import java.io.IOException; public final class AddOperationTest @@ -28,4 +35,16 @@ public AddOperationTest() { super("add"); } + + @Test(expectedExceptions = JsonPatchException.class, expectedExceptionsMessageRegExp = "no such path in target JSON document") + public void addingToANonContainerNodeThrowsException() + throws JsonPatchException, JsonPointerException + { + final ObjectNode node = JacksonUtils.nodeFactory().objectNode(); + final TextNode textNode = JacksonUtils.nodeFactory().textNode("bar"); + node.put("foo", textNode); + final JsonPointer p = new JsonPointer("/foo/f"); + final JsonPatchOperation op = new AddOperation(p, JacksonUtils.nodeFactory().nullNode()); + op.apply(node); + } }