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

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


The following commit(s) were added to refs/heads/camel-2.x by this push:
     new db2d9f4  CAMEL-13795: Fixing the issue of already declared namespaces 
within the child (#3070)
db2d9f4 is described below

commit db2d9f4361adedb216c8c8bba208aabd570115eb
Author: Christian Pieczewski <[email protected]>
AuthorDate: Wed Jul 31 14:29:49 2019 +0200

    CAMEL-13795: Fixing the issue of already declared namespaces within the 
child (#3070)
    
    * CAMEL-13795: Fixing inheritNamespaceToken if child already contains it
    
    * CAMEL-13795: Fixing possible nullpointer
    
    * CAMEL-13795: code cleanup
---
 .../camel/support/TokenXMLExpressionIterator.java  | 44 +++++++++++++++++++---
 ...enXMLPairNamespaceSplitChildNamespaceTest.java} | 28 ++++++++------
 .../language/TokenXMLPairNamespaceSplitTest.java   |  3 +-
 3 files changed, 58 insertions(+), 17 deletions(-)

diff --git 
a/camel-core/src/main/java/org/apache/camel/support/TokenXMLExpressionIterator.java
 
b/camel-core/src/main/java/org/apache/camel/support/TokenXMLExpressionIterator.java
index 3c8877b..6e5bb39 100644
--- 
a/camel-core/src/main/java/org/apache/camel/support/TokenXMLExpressionIterator.java
+++ 
b/camel-core/src/main/java/org/apache/camel/support/TokenXMLExpressionIterator.java
@@ -33,6 +33,7 @@ import java.util.regex.Pattern;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.language.simple.SimpleLanguage;
+import org.apache.camel.util.CollectionStringBuffer;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
@@ -55,6 +56,7 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
     private static final String SCAN_BLOCK_TOKEN_REGEX_TEMPLATE = 
"<{0}(\\s+[^>]*)?/>|<{0}(\\s+[^>]*)?>(?:(?!(</{0}\\s*>)).)*</{0}\\s*>";
     private static final String SCAN_PARENT_TOKEN_REGEX_TEMPLATE = 
"<{0}(\\s+[^>]*\\s*)?>";
     private static final String OPTION_WRAP_TOKEN = "<*>";
+    private static final String NAMESPACE_SEPERATOR = " ";
 
     protected final String tagToken;
     protected final String inheritNamespaceToken;
@@ -160,7 +162,7 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
         private final String inheritNamespaceToken;
         private final boolean wrapToken;
         private Pattern inheritNamespaceTokenPattern;
-        private String rootTokenNamespaces;
+        private String[] rootTokenNamespaces;
         private String wrapHead;
         private String wrapTail;
 
@@ -201,7 +203,7 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
         String getNext(boolean first) {
             // initialize inherited namespaces on first
             if (first && inheritNamespaceToken != null && !wrapToken) {
-                rootTokenNamespaces =  
getNamespacesFromNamespaceToken(scanner.findWithinHorizon(inheritNamespaceTokenPattern,
 0));
+                rootTokenNamespaces = 
getNamespacesFromNamespaceTokenSplitter(scanner.findWithinHorizon(inheritNamespaceTokenPattern,
 0));
             }
 
             String next = scanner.findWithinHorizon(tagTokenPattern, 0);
@@ -216,7 +218,6 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
 
             // build answer accordingly to whether namespaces should be 
inherited or not
             if (inheritNamespaceToken != null && rootTokenNamespaces != null) {
-                // REVISIT should skip the prefixes that are declared within 
the child itself.
                 String head = StringHelper.before(next, ">");
                 boolean empty = false;
                 if (head.endsWith("/")) {
@@ -227,8 +228,8 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
                 // append root namespaces to local start token
                 // grab the text
                 String tail = StringHelper.after(next, ">");
-                // build result with inherited namespaces
-                next = 
sb.append(head).append(rootTokenNamespaces).append(empty ? "/>" : 
">").append(tail).toString();
+                // build result with inherited namespaces and skip the 
prefixes that are declared within the child itself.
+                next = 
sb.append(head).append(getMissingInherritNamespaces(head)).append(empty ? "/>" 
: ">").append(tail).toString();
             } else if (wrapToken) {
                 // wrap the token
                 StringBuilder sb = new StringBuilder();
@@ -237,6 +238,39 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
             
             return next;
         }
+        
+        private String getMissingInherritNamespaces(final String text) {
+            final StringBuilder sb = new StringBuilder();
+            if (text != null) {
+                boolean first = true;
+                final String[] containedNamespaces = 
getNamespacesFromNamespaceTokenSplitter(text);
+                for (final String rn : rootTokenNamespaces) {
+                    boolean nsExists = false;
+                    for (final String cn : containedNamespaces) {
+                        if (rn.equals(cn)) {
+                            nsExists = true;
+                            // already existing namespace in child were found 
we need a separator, so we set first = false
+                            if (first) {
+                                first = false;
+                            }
+                            break;
+                        }
+                    }
+                    if (!nsExists) {
+                        sb.append(first ? rn : NAMESPACE_SEPERATOR + rn);
+                        if (first) {
+                            first = false;
+                        }
+                    }
+                }
+            }
+            return sb.toString();
+        }
+
+        private String[] getNamespacesFromNamespaceTokenSplitter(final String 
text) {
+            final String namespaces = getNamespacesFromNamespaceToken(text);
+            return namespaces == null ? new String[0] : 
namespaces.split(NAMESPACE_SEPERATOR);
+        }
 
         private String getNamespacesFromNamespaceToken(String text) {
             if (text == null) {
diff --git 
a/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitTest.java
 
b/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitChildNamespaceTest.java
similarity index 73%
copy from 
camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitTest.java
copy to 
camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitChildNamespaceTest.java
index 4b731ca..30d5bd0 100644
--- 
a/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitChildNamespaceTest.java
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 package org.apache.camel.language;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
@@ -25,7 +26,7 @@ import org.junit.Test;
 /**
  *
  */
-public class TokenXMLPairNamespaceSplitTest extends ContextTestSupport {
+public class TokenXMLPairNamespaceSplitChildNamespaceTest extends 
ContextTestSupport {
 
     @Override
     @Before
@@ -38,10 +39,11 @@ public class TokenXMLPairNamespaceSplitTest extends 
ContextTestSupport {
     @Test
     public void testTokenXMLPair() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:split");
-        mock.expectedMessageCount(3);
-        mock.message(0).body().isEqualTo("<order id=\"1\" 
xmlns=\"http:acme.com\">Camel in Action</order>");
-        mock.message(1).body().isEqualTo("<order id=\"2\" 
xmlns=\"http:acme.com\">ActiveMQ in Action</order>");
-        mock.message(2).body().isEqualTo("<order id=\"3\" 
xmlns=\"http:acme.com\">DSL in Action</order>");
+        mock.expectedMessageCount(4);
+        mock.message(0).body().isEqualTo("<order id=\"1\" 
xmlns=\"http:acme.com\" xmlns:foo=\"http:foo.com\">Camel in Action</order>");
+        mock.message(1).body().isEqualTo("<order id=\"2\" 
xmlns=\"http:acme.com\" xmlns:foo=\"http:foo.com\">ActiveMQ in Action</order>");
+        mock.message(2).body().isEqualTo("<order id=\"3\" 
xmlns=\"http:acme.com\" xmlns:foo=\"http:foo.com\">DSL in Action</order>");
+        mock.message(3).body().isEqualTo("<order id=\"4\" 
xmlns:foo=\"http:foo.com\" xmlns=\"http:acme.com\">DSL in Action</order>");
 
         String body = createBody();
         template.sendBodyAndHeader("file:target/pair", body, 
Exchange.FILE_NAME, "orders.xml");
@@ -53,9 +55,10 @@ public class TokenXMLPairNamespaceSplitTest extends 
ContextTestSupport {
     public void testTokenXMLPair2() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:split");
         mock.expectedMessageCount(3);
-        mock.message(0).body().isEqualTo("<order id=\"1\" 
xmlns=\"http:acme.com\">Camel in Action</order>");
-        mock.message(1).body().isEqualTo("<order id=\"2\" 
xmlns=\"http:acme.com\">ActiveMQ in Action</order>");
-        mock.message(2).body().isEqualTo("<order id=\"3\" 
xmlns=\"http:acme.com\">DSL in Action</order>");
+        mock.message(0).body().isEqualTo("<order id=\"1\" 
xmlns=\"http:acme.com\" xmlns:foo=\"http:foo.com\">Camel in Action</order>");
+        mock.message(1).body().isEqualTo("<order id=\"2\" 
xmlns=\"http:acme.com\" xmlns:foo=\"http:foo.com\">ActiveMQ in Action</order>");
+        mock.message(2).body().isEqualTo("<order id=\"3\" 
xmlns=\"http:acme.com\" xmlns:foo=\"http:foo.com\">DSL in Action</order>");
+        mock.message(3).body().isEqualTo("<order id=\"4\" 
xmlns:foo=\"http:foo.com\" xmlns=\"http:acme.com\">DSL in Action</order>");
 
         String body = createBody();
         template.sendBodyAndHeader("file:target/pair2", body, 
Exchange.FILE_NAME, "orders.xml");
@@ -65,10 +68,13 @@ public class TokenXMLPairNamespaceSplitTest extends 
ContextTestSupport {
 
     protected String createBody() {
         StringBuilder sb = new StringBuilder("<?xml version=\"1.0\"?>\n");
-        sb.append("<orders xmlns=\"http:acme.com\">\n");
-        sb.append("  <order id=\"1\">Camel in Action</order>\n");
-        sb.append("  <order id=\"2\">ActiveMQ in Action</order>\n");
+        sb.append("<orders xmlns=\"http:acme.com\"\n");
+        sb.append("        xmlns:foo=\"http:foo.com\">\n");
+        sb.append("  <order id=\"1\" xmlns=\"http:acme.com\">Camel in 
Action</order>\n");
+        sb.append("  <order id=\"2\"");
+        sb.append(" xmlns=\"http:acme.com\">ActiveMQ in Action</order>\n");
         sb.append("  <order id=\"3\">DSL in Action</order>\n");
+        sb.append("  <order id=\"4\" xmlns:foo=\"http:foo.com\">DSL in 
Action</order>\n");
         sb.append("</orders>");
         return sb.toString();
     }
diff --git 
a/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitTest.java
 
b/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitTest.java
index 4b731ca..80c0ef1 100644
--- 
a/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/language/TokenXMLPairNamespaceSplitTest.java
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 package org.apache.camel.language;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
@@ -66,7 +67,7 @@ public class TokenXMLPairNamespaceSplitTest extends 
ContextTestSupport {
     protected String createBody() {
         StringBuilder sb = new StringBuilder("<?xml version=\"1.0\"?>\n");
         sb.append("<orders xmlns=\"http:acme.com\">\n");
-        sb.append("  <order id=\"1\">Camel in Action</order>\n");
+        sb.append("  <order id=\"1\" xmlns=\"http:acme.com\">Camel in 
Action</order>\n");
         sb.append("  <order id=\"2\">ActiveMQ in Action</order>\n");
         sb.append("  <order id=\"3\">DSL in Action</order>\n");
         sb.append("</orders>");

Reply via email to