From ff29056b8b33f6348014eb7eca264aa392a350dc Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Wed, 29 Nov 2023 01:03:43 +0900 Subject: [PATCH 1/4] Fix works in 2.15 --- .../databind/node/MissingValues4229Test.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java diff --git a/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java b/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java new file mode 100644 index 0000000000..96331c569a --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java @@ -0,0 +1,64 @@ +package com.fasterxml.jackson.databind.node; + + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class MissingValues4229Test { + private static final String jsonString = + "{\n" + + " \"target\": \"target1\"," // Found in <= 2.15.3 and 2.16.0\n + + " \"object1\": {\n" + + " \"target\": \"target2\"" // Found in <= 2.15.3, but not in 2.16.0\n + + " },\n" + + " \"object2\": {\n" + + " \"target\": {" // Found in <= 2.15.3, but not in 2.16.0 + + " \"target\": \"ignoredAsParentIsTarget\"" + // Expect not to be found (as sub-tree search ends when parent is found)\n + + " }\n" + + " }\n" + + " }"; + + private JsonNode rootNode; + + @BeforeEach + public void init() throws JsonProcessingException { + ObjectMapper objectMapper = + new ObjectMapper().configure(JsonParser.Feature.ALLOW_COMMENTS, true); + rootNode = objectMapper.readTree(jsonString); + } + + @Test + public void testFindValues() { + List foundNodes = rootNode.findValues("target"); + + List expectedNodePaths = new ArrayList<>(); + expectedNodePaths.add("/target"); + expectedNodePaths.add("/object1/target"); + expectedNodePaths.add("/object2/target"); + + List expectedNodes = expectedNodePaths.stream().map(rootNode::at).collect(Collectors.toList()); + + Assertions.assertEquals(expectedNodes, foundNodes); + } + + @Test + public void testFindParents() { + List foundNodes = rootNode.findParents("target"); + + List expectedNodes = new ArrayList<>(); + expectedNodes.add(rootNode.at("")); + expectedNodes.add(rootNode.at("/object1")); + expectedNodes.add(rootNode.at("/object2")); + + Assertions.assertEquals(expectedNodes, foundNodes); + } +} From 4a056ad0de71c704d3b4cbab25bbced9144d0456 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Wed, 29 Nov 2023 01:54:46 +0900 Subject: [PATCH 2/4] Revert part of #4008 --- .../jackson/databind/node/ObjectNode.java | 59 +++++++-------- .../databind/node/MissingValues4229Test.java | 72 +++++++++---------- 2 files changed, 61 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java b/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java index 62690877de..c2fa6408a7 100644 --- a/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java +++ b/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java @@ -382,18 +382,15 @@ public JsonNode findValue(String propertyName) @Override public List findValues(String propertyName, List foundSoFar) { - JsonNode jsonNode = _children.get(propertyName); - if (jsonNode != null) { - if (foundSoFar == null) { - foundSoFar = new ArrayList<>(); + for (Map.Entry entry : _children.entrySet()) { + if (propertyName.equals(entry.getKey())) { + if (foundSoFar == null) { + foundSoFar = new ArrayList(); + } + foundSoFar.add(entry.getValue()); + } else { // only add children if parent not added + foundSoFar = entry.getValue().findValues(propertyName, foundSoFar); } - foundSoFar.add(jsonNode); - return foundSoFar; - } - - // only add children if parent not added - for (JsonNode child : _children.values()) { - foundSoFar = child.findValues(propertyName, foundSoFar); } return foundSoFar; } @@ -401,18 +398,16 @@ public List findValues(String propertyName, List foundSoFar) @Override public List findValuesAsText(String propertyName, List foundSoFar) { - JsonNode jsonNode = _children.get(propertyName); - if (jsonNode != null) { - if (foundSoFar == null) { - foundSoFar = new ArrayList<>(); + for (Map.Entry entry : _children.entrySet()) { + if (propertyName.equals(entry.getKey())) { + if (foundSoFar == null) { + foundSoFar = new ArrayList(); + } + foundSoFar.add(entry.getValue().asText()); + } else { // only add children if parent not added + foundSoFar = entry.getValue().findValuesAsText(propertyName, + foundSoFar); } - foundSoFar.add(jsonNode.asText()); - return foundSoFar; - } - - // only add children if parent not added - for (JsonNode child : _children.values()) { - foundSoFar = child.findValuesAsText(propertyName, foundSoFar); } return foundSoFar; } @@ -436,18 +431,16 @@ public ObjectNode findParent(String propertyName) @Override public List findParents(String propertyName, List foundSoFar) { - JsonNode jsonNode = _children.get(propertyName); - if (jsonNode != null) { - if (foundSoFar == null) { - foundSoFar = new ArrayList<>(); + for (Map.Entry entry : _children.entrySet()) { + if (propertyName.equals(entry.getKey())) { + if (foundSoFar == null) { + foundSoFar = new ArrayList(); + } + foundSoFar.add(this); + } else { // only add children if parent not added + foundSoFar = entry.getValue() + .findParents(propertyName, foundSoFar); } - foundSoFar.add(this); - return foundSoFar; - } - - // only add children if parent not added - for (JsonNode child : _children.values()) { - foundSoFar = child.findParents(propertyName, foundSoFar); } return foundSoFar; } diff --git a/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java b/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java index 96331c569a..f9802cf6b1 100644 --- a/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java @@ -1,64 +1,62 @@ package com.fasterxml.jackson.databind.node; - +import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder; +import static com.fasterxml.jackson.databind.BaseTest.a2q; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class MissingValues4229Test { - private static final String jsonString = - "{\n" - + " \"target\": \"target1\"," // Found in <= 2.15.3 and 2.16.0\n - + " \"object1\": {\n" - + " \"target\": \"target2\"" // Found in <= 2.15.3, but not in 2.16.0\n - + " },\n" - + " \"object2\": {\n" - + " \"target\": {" // Found in <= 2.15.3, but not in 2.16.0 - + " \"target\": \"ignoredAsParentIsTarget\"" - // Expect not to be found (as sub-tree search ends when parent is found)\n - + " }\n" - + " }\n" - + " }"; - - private JsonNode rootNode; - - @BeforeEach - public void init() throws JsonProcessingException { - ObjectMapper objectMapper = - new ObjectMapper().configure(JsonParser.Feature.ALLOW_COMMENTS, true); - rootNode = objectMapper.readTree(jsonString); - } +// [databind#4229] JsonNode findValues and findParents missing expected values +public class MissingValues4229Test +{ + + private final String JSON = a2q("{" + + " 'target': 'target1'," // Found in <= 2.15.3 and 2.16.0 + + " 'object1': {" + + " 'target': 'target2' " // Found in <= 2.15.3, but not in 2.16.0 + + " }," + + " 'object2': {" + + " 'target': { " // Found in <= 2.15.3, but not in 2.16.0 + + " 'target': 'ignoredAsParentIsTarget'" // Expect not to be found (as sub-tree search ends when parent is found) + + " }" + + " }" + + "}"); + + private final ObjectMapper objectMapper = jsonMapperBuilder() + .configure(JsonParser.Feature.ALLOW_COMMENTS, true) + .build(); @Test - public void testFindValues() { - List foundNodes = rootNode.findValues("target"); + public void testFindValues() throws Exception + { + JsonNode rootNode = objectMapper.readTree(JSON); - List expectedNodePaths = new ArrayList<>(); - expectedNodePaths.add("/target"); - expectedNodePaths.add("/object1/target"); - expectedNodePaths.add("/object2/target"); + List expectedNodes = new ArrayList<>(); + expectedNodes.add(rootNode.at("/target")); + expectedNodes.add(rootNode.at("/object1/target")); + expectedNodes.add(rootNode.at("/object2/target")); - List expectedNodes = expectedNodePaths.stream().map(rootNode::at).collect(Collectors.toList()); + List actualNodes = rootNode.findValues("target"); - Assertions.assertEquals(expectedNodes, foundNodes); + Assertions.assertEquals(expectedNodes, actualNodes); } @Test - public void testFindParents() { - List foundNodes = rootNode.findParents("target"); + public void testFindParents() throws Exception + { + JsonNode rootNode = objectMapper.readTree(JSON); List expectedNodes = new ArrayList<>(); expectedNodes.add(rootNode.at("")); expectedNodes.add(rootNode.at("/object1")); expectedNodes.add(rootNode.at("/object2")); + List foundNodes = rootNode.findParents("target"); + Assertions.assertEquals(expectedNodes, foundNodes); } } From 98ae6a2ae74927f5b967836483edb47f95d4b297 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Wed, 29 Nov 2023 02:02:19 +0900 Subject: [PATCH 3/4] Add update note --- release-notes/VERSION-2.x | 3 +++ 1 file changed, 3 insertions(+) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index f377855960..0e0b4c7e54 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -13,6 +13,9 @@ Project: jackson-databind #4216: Primitive array deserializer cannot being captured by `DeserializerModifier` (reported by @SakuraKoi) (fix contributed by Joo-Hyuk K) +#4229 JsonNode findValues and findParents missing expected values in 2.16.0 + (reported by @gcookemoto) + (fix contributed by Joo-Hyuk K) 2.16.0 (15-Nov-2023) From c3035c0f4dc79ec5a907aaf84f2e00a8b6283080 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Wed, 29 Nov 2023 02:30:19 +0900 Subject: [PATCH 4/4] Reorder imports --- .../jackson/databind/node/MissingValues4229Test.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java b/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java index f9802cf6b1..3b06d08230 100644 --- a/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/node/MissingValues4229Test.java @@ -1,15 +1,17 @@ package com.fasterxml.jackson.databind.node; -import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder; -import static com.fasterxml.jackson.databind.BaseTest.a2q; +import java.util.ArrayList; +import java.util.List; + import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.ArrayList; -import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder; +import static com.fasterxml.jackson.databind.BaseTest.a2q; + // [databind#4229] JsonNode findValues and findParents missing expected values public class MissingValues4229Test {