You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/08/16 08:13:58 UTC

[camel] branch main updated: CAMEL-16865 Adapt code to go up a level if required even if no matches have been found (#5955)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new a45cdf8  CAMEL-16865 Adapt code to go up a level if required even if no matches have been found (#5955)
a45cdf8 is described below

commit a45cdf8ca9140f64ef282f6ebe66d720295c84b4
Author: Ruben Gerits <ru...@gmail.com>
AuthorDate: Mon Aug 16 10:13:21 2021 +0200

    CAMEL-16865 Adapt code to go up a level if required even if no matches have been found (#5955)
    
    Co-authored-by: ruben.gerits <ru...@aviobook.aero>
---
 .../xtokenizer/XMLTokenExpressionIterator.java     |  8 ++--
 .../xtokenizer/XMLTokenExpressionIteratorTest.java | 43 +++++++++++++++++++++-
 2 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
index 0a22f0f..e77cbde 100644
--- a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
+++ b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
@@ -542,11 +542,11 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam
                                     popSegment();
                                 }
                             }
+                        }
 
-                            if (ancestor() == null && !isTop()
-                                    || ancestor() != null && ancestor().matches(endname)) {
-                                up();
-                            }
+                        if (ancestor() == null && !isTop()
+                                || ancestor() != null && ancestor().matches(endname)) {
+                            up();
                         }
                         break;
                     case XMLStreamConstants.END_DOCUMENT:
diff --git a/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java b/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java
index d1ae99d..86f4868 100644
--- a/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java
+++ b/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java
@@ -81,6 +81,33 @@ public class XMLTokenExpressionIteratorTest {
                                                          + "</grandparent>"
                                                          + "</g:greatgrandparent>").getBytes();
 
+    // mixing different namespaces within a tag
+    private static final byte[] TEST_BODY_MIXED_CHILDREN = ("<?xml version='1.0' encoding='UTF-8'?>"
+                                                            + "<greatgrandparent xmlns='urn:g' xmlns:c='urn:c' xmlns:x='urn:x'>"
+                                                            + "<grandparent>"
+                                                            + "<x:uncle>bob</x:uncle>"
+                                                            + "<x:aunt>emma</x:aunt>"
+                                                            + "</grandparent>"
+                                                            + "<grandparent>"
+                                                            + "<c:parent some_attr='1'>"
+                                                            + "<c:child some_attr='a' anotherAttr='a'></c:child>"
+                                                            + "<c:child some_attr='b' anotherAttr='b' />"
+                                                            + "</c:parent>"
+                                                            + "<c:parent some_attr='2'>"
+                                                            + "<c:child some_attr='c' anotherAttr='c'></c:child>"
+                                                            + "<c:child some_attr='d' anotherAttr='d' />"
+                                                            + "</c:parent>"
+                                                            + "</grandparent>"
+                                                            + "<grandparent>"
+                                                            + "<x:uncle>ben</x:uncle>"
+                                                            + "<x:aunt>jenna</x:aunt>"
+                                                            + "<c:parent some_attr='3'>"
+                                                            + "<c:child some_attr='e' anotherAttr='e'></c:child>"
+                                                            + "<c:child some_attr='f' anotherAttr='f' />"
+                                                            + "</c:parent>"
+                                                            + "</grandparent>"
+                                                            + "</greatgrandparent>").getBytes();
+
     private static final String RESULTS_CW1 = "<?xml version='1.0' encoding='UTF-8'?>"
                                               + "<g:greatgrandparent xmlns:g='urn:g'><grandparent><uncle/><aunt>emma</aunt>"
                                               + "<c:parent some_attr='1' xmlns:c='urn:c' xmlns:d=\"urn:d\">"
@@ -267,13 +294,20 @@ public class XMLTokenExpressionIteratorTest {
             "ben"
     };
 
+    private static final String[] RESULTS_AUNT_AND_UNCLE = {
+            "<x:uncle xmlns=\"urn:g\" xmlns:x=\"urn:x\" xmlns:c=\"urn:c\">bob</x:uncle>",
+            "<x:aunt xmlns=\"urn:g\" xmlns:x=\"urn:x\" xmlns:c=\"urn:c\">emma</x:aunt>",
+            "<x:uncle xmlns=\"urn:g\" xmlns:x=\"urn:x\" xmlns:c=\"urn:c\">ben</x:uncle>",
+            "<x:aunt xmlns=\"urn:g\" xmlns:x=\"urn:x\" xmlns:c=\"urn:c\">jenna</x:aunt>"
+    };
+
     private static final String[] RESULTS_NULL = {
     };
 
     private Map<String, String> nsmap;
 
     @BeforeEach
-    public void setUp() throws Exception {
+    public void setUp() {
         nsmap = new HashMap<>();
         nsmap.put("G", "urn:g");
         nsmap.put("C", "urn:c");
@@ -432,6 +466,13 @@ public class XMLTokenExpressionIteratorTest {
                 't', new ByteArrayInputStream(TEST_BODY), RESULTS_GRANDPARENT_TEXT);
     }
 
+    @Test
+    public void testExtractAuntAndUncleByNamespace() throws Exception {
+        nsmap.put("X", "urn:x");
+        invokeAndVerify("//G:grandparent/X:*",
+                'i', new ByteArrayInputStream(TEST_BODY_MIXED_CHILDREN), RESULTS_AUNT_AND_UNCLE);
+    }
+
     private void invokeAndVerify(String path, char mode, InputStream in, String[] expected) throws Exception {
         XMLTokenExpressionIterator xtei = new XMLTokenExpressionIterator(path, mode);
         xtei.setNamespaces(nsmap);