Repository: camel
Updated Branches:
  refs/heads/master f5f719c53 -> 31e2df5e7


CAMEL-7660: tokenizer language now supports using simple language for 
tokens/xml tags so they can be dynamic.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/31e2df5e
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/31e2df5e
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/31e2df5e

Branch: refs/heads/master
Commit: 31e2df5e75937890a9445d12dc142c813bfc837b
Parents: f5f719c
Author: Claus Ibsen <davscl...@apache.org>
Authored: Fri May 6 10:53:39 2016 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri May 6 10:53:39 2016 +0200

----------------------------------------------------------------------
 .../apache/camel/builder/ExpressionBuilder.java | 19 ---------
 .../model/language/TokenizerExpression.java     |  7 +++-
 .../support/TokenPairExpressionIterator.java    | 16 ++++++--
 .../support/TokenXMLExpressionIterator.java     | 43 ++++++++++++++++----
 .../support/TokenXMLPairExpressionIterator.java | 35 +++++++++++-----
 .../apache/camel/language/TokenizerTest.java    | 29 +++++++++++++
 6 files changed, 107 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/31e2df5e/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java 
b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
index 2f0f296..0e30aa6 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
@@ -1345,35 +1345,16 @@ public final class ExpressionBuilder {
      */
     public static Expression tokenizeXMLExpression(String tagName, String 
inheritNamespaceTagName) {
         ObjectHelper.notEmpty(tagName, "tagName");
-
-        // must be XML tokens
-        if (!tagName.startsWith("<")) {
-            tagName = "<" + tagName;
-        }
-        if (!tagName.endsWith(">")) {
-            tagName = tagName + ">";
-        }
-
-        if (inheritNamespaceTagName != null) {
-            if (!inheritNamespaceTagName.startsWith("<")) {
-                inheritNamespaceTagName = "<" + inheritNamespaceTagName;
-            }
-            if (!inheritNamespaceTagName.endsWith(">")) {
-                inheritNamespaceTagName = inheritNamespaceTagName + ">";
-            }
-        }
         return new TokenXMLExpressionIterator(tagName, 
inheritNamespaceTagName);
     }
 
     public static Expression tokenizeXMLAwareExpression(String path, char 
mode) {
         ObjectHelper.notEmpty(path, "path");
-
         return new XMLTokenExpressionIterator(path, mode);
     }
     
     public static Expression tokenizeXMLAwareExpression(String path, char 
mode, int group) {
         ObjectHelper.notEmpty(path, "path");
-
         return new XMLTokenExpressionIterator(path, mode, group);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/31e2df5e/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
 
b/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
index 7c7f3d1..938c88d 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
@@ -69,7 +69,8 @@ public class TokenizerExpression extends ExpressionDefinition 
{
     }
 
     /**
-     * The (start) token to use as tokenizer, for example \n for a new line 
token
+     * The (start) token to use as tokenizer, for example \n for a new line 
token.
+     * You can use simple language as the token to support dynamic tokens.
      */
     public void setToken(String token) {
         this.token = token;
@@ -81,6 +82,7 @@ public class TokenizerExpression extends ExpressionDefinition 
{
 
     /**
      * The end token to use as tokenizer if using start/end token pairs.
+     * You can use simple language as the token to support dynamic tokens.
      */
     public void setEndToken(String endToken) {
         this.endToken = endToken;
@@ -115,7 +117,8 @@ public class TokenizerExpression extends 
ExpressionDefinition {
     }
 
     /**
-     * To inherit namepaces from a root/parent tag name when using XML
+     * To inherit namespaces from a root/parent tag name when using XML
+     * You can use simple language as the tag name to support dynamic names.
      */
     public void setInheritNamespaceTagName(String inheritNamespaceTagName) {
         this.inheritNamespaceTagName = inheritNamespaceTagName;

http://git-wip-us.apache.org/repos/asf/camel/blob/31e2df5e/camel-core/src/main/java/org/apache/camel/support/TokenPairExpressionIterator.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/support/TokenPairExpressionIterator.java
 
b/camel-core/src/main/java/org/apache/camel/support/TokenPairExpressionIterator.java
index b6b9133..39c9a10 100644
--- 
a/camel-core/src/main/java/org/apache/camel/support/TokenPairExpressionIterator.java
+++ 
b/camel-core/src/main/java/org/apache/camel/support/TokenPairExpressionIterator.java
@@ -24,6 +24,7 @@ import java.util.Scanner;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.language.simple.SimpleLanguage;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 
@@ -77,7 +78,7 @@ public class TokenPairExpressionIterator extends 
ExpressionAdapter {
             in = exchange.getIn().getMandatoryBody(InputStream.class);
             // we may read from a file, and want to support custom charset 
defined on the exchange
             String charset = IOHelper.getCharsetName(exchange);
-            return createIterator(in, charset);
+            return createIterator(exchange, in, charset);
         } catch (InvalidPayloadException e) {
             exchange.setException(e);
             // must close input stream
@@ -93,12 +94,21 @@ public class TokenPairExpressionIterator extends 
ExpressionAdapter {
     /**
      * Strategy to create the iterator
      *
+     * @param exchange the exchange
      * @param in input stream to iterate
      * @param charset charset
      * @return the iterator
      */
-    protected Iterator<?> createIterator(InputStream in, String charset) {
-        TokenPairIterator iterator = new TokenPairIterator(startToken, 
endToken, includeTokens, in, charset);
+    protected Iterator<?> createIterator(Exchange exchange, InputStream in, 
String charset) {
+        String start = startToken;
+        if (start != null && SimpleLanguage.hasSimpleFunction(start)) {
+            start = SimpleLanguage.expression(start).evaluate(exchange, 
String.class);
+        }
+        String end = endToken;
+        if (end != null && SimpleLanguage.hasSimpleFunction(end)) {
+            end = SimpleLanguage.expression(end).evaluate(exchange, 
String.class);
+        }
+        TokenPairIterator iterator = new TokenPairIterator(start, end, 
includeTokens, in, charset);
         iterator.init();
         return iterator;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/31e2df5e/camel-core/src/main/java/org/apache/camel/support/TokenXMLExpressionIterator.java
----------------------------------------------------------------------
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 497e63f..5f2298f 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
@@ -32,6 +32,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.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 
@@ -62,18 +63,44 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
         this.tagToken = tagToken;
         // namespace token is optional
         this.inheritNamespaceToken = inheritNamespaceToken;
+    }
+
+    protected Iterator<?> createIterator(Exchange exchange, InputStream in, 
String charset) {
+        String tag = tagToken;
+        if (SimpleLanguage.hasSimpleFunction(tag)) {
+            tag = SimpleLanguage.expression(tag).evaluate(exchange, 
String.class);
+        }
+        String inherit = inheritNamespaceToken;
+        if (inherit != null && SimpleLanguage.hasSimpleFunction(inherit)) {
+            inherit = SimpleLanguage.expression(inherit).evaluate(exchange, 
String.class);
+        }
 
         // must be XML tokens
-        if (!tagToken.startsWith("<") || !tagToken.endsWith(">")) {
-            throw new IllegalArgumentException("XML Tag token must be a valid 
XML tag, was: " + tagToken);
+        if (!tag.startsWith("<")) {
+            tag = "<" + tag;
         }
-        if (inheritNamespaceToken != null && 
(!inheritNamespaceToken.startsWith("<") || 
!inheritNamespaceToken.endsWith(">"))) {
-            throw new IllegalArgumentException("Namespace token must be a 
valid XML token, was: " + inheritNamespaceToken);
+        if (!tag.endsWith(">")) {
+            tag = tag + ">";
+        }
+
+        if (inherit != null) {
+            if (!inherit.startsWith("<")) {
+                inherit = "<" + inherit;
+            }
+            if (!inherit.endsWith(">")) {
+                inherit = inherit + ">";
+            }
+        }
+
+        // must be XML tokens
+        if (!tag.startsWith("<") || !tag.endsWith(">")) {
+            throw new IllegalArgumentException("XML Tag token must be a valid 
XML tag, was: " + tag);
+        }
+        if (inherit != null && (!inherit.startsWith("<") || 
!inherit.endsWith(">"))) {
+            throw new IllegalArgumentException("Namespace token must be a 
valid XML token, was: " + inherit);
         }
-    }
 
-    protected Iterator<?> createIterator(InputStream in, String charset) {
-        XMLTokenIterator iterator = new XMLTokenIterator(tagToken, 
inheritNamespaceToken, in, charset);
+        XMLTokenIterator iterator = new XMLTokenIterator(tag, inherit, in, 
charset);
         iterator.init();
         return iterator;
     }
@@ -105,7 +132,7 @@ public class TokenXMLExpressionIterator extends 
ExpressionAdapter {
             in = exchange.getIn().getMandatoryBody(InputStream.class);
             // we may read from a file, and want to support custom charset 
defined on the exchange
             String charset = IOHelper.getCharsetName(exchange);
-            return createIterator(in, charset);
+            return createIterator(exchange, in, charset);
         } catch (InvalidPayloadException e) {
             exchange.setException(e);
             // must close input stream

http://git-wip-us.apache.org/repos/asf/camel/blob/31e2df5e/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
 
b/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
index c5fbea4..7b41f51 100644
--- 
a/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
+++ 
b/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
@@ -24,6 +24,8 @@ import java.util.Scanner;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.camel.Exchange;
+import org.apache.camel.language.simple.SimpleLanguage;
 import org.apache.camel.util.ObjectHelper;
 
 /**
@@ -51,22 +53,35 @@ public class TokenXMLPairExpressionIterator extends 
TokenPairExpressionIterator
         super(startToken, endToken, true);
         // namespace token is optional
         this.inheritNamespaceToken = inheritNamespaceToken;
+    }
+
+    @Override
+    protected Iterator<?> createIterator(Exchange exchange, InputStream in, 
String charset) {
+        String start = startToken;
+        if (SimpleLanguage.hasSimpleFunction(start)) {
+            start = SimpleLanguage.expression(start).evaluate(exchange, 
String.class);
+        }
+        String end = endToken;
+        if (SimpleLanguage.hasSimpleFunction(end)) {
+            end = SimpleLanguage.expression(end).evaluate(exchange, 
String.class);
+        }
+        String inherit = inheritNamespaceToken;
+        if (inherit != null && SimpleLanguage.hasSimpleFunction(inherit)) {
+            inherit = SimpleLanguage.expression(inherit).evaluate(exchange, 
String.class);
+        }
 
         // must be XML tokens
-        if (!startToken.startsWith("<") || !startToken.endsWith(">")) {
-            throw new IllegalArgumentException("Start token must be a valid 
XML token, was: " + startToken);
+        if (!start.startsWith("<") || !start.endsWith(">")) {
+            throw new IllegalArgumentException("Start token must be a valid 
XML token, was: " + start);
         }
-        if (!endToken.startsWith("<") || !endToken.endsWith(">")) {
-            throw new IllegalArgumentException("End token must be a valid XML 
token, was: " + endToken);
+        if (!end.startsWith("<") || !end.endsWith(">")) {
+            throw new IllegalArgumentException("End token must be a valid XML 
token, was: " + end);
         }
-        if (inheritNamespaceToken != null && 
(!inheritNamespaceToken.startsWith("<") || 
!inheritNamespaceToken.endsWith(">"))) {
-            throw new IllegalArgumentException("Namespace token must be a 
valid XML token, was: " + inheritNamespaceToken);
+        if (inherit != null && (!inherit.startsWith("<") || 
!inherit.endsWith(">"))) {
+            throw new IllegalArgumentException("Namespace token must be a 
valid XML token, was: " + inherit);
         }
-    }
 
-    @Override
-    protected Iterator<?> createIterator(InputStream in, String charset) {
-        XMLTokenPairIterator iterator = new XMLTokenPairIterator(startToken, 
endToken, inheritNamespaceToken, in, charset);
+        XMLTokenPairIterator iterator = new XMLTokenPairIterator(start, end, 
inherit, in, charset);
         iterator.init();
         return iterator;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/31e2df5e/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java 
b/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java
index 414b926..22a1777 100644
--- a/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java
+++ b/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java
@@ -123,6 +123,20 @@ public class TokenizerTest extends ExchangeTestSupport {
         assertEquals("Claus", names.get(1));
     }
 
+    public void testTokenizePairSimple() throws Exception {
+        Expression exp = TokenizeLanguage.tokenizePair("${header.foo}", 
"${header.bar}", false);
+
+        exchange.getIn().setHeader("foo", "[START]");
+        exchange.getIn().setHeader("bar", "[END]");
+        
exchange.getIn().setBody("2011-11-11\n[START]James[END]\n[START]Claus[END]\n2 
records");
+
+        List<?> names = exp.evaluate(exchange, List.class);
+        assertEquals(2, names.size());
+
+        assertEquals("James", names.get(0));
+        assertEquals("Claus", names.get(1));
+    }
+
     public void testTokenizePairIncludeTokens() throws Exception {
         Expression exp = TokenizeLanguage.tokenizePair("[START]", "[END]", 
true);
 
@@ -149,6 +163,21 @@ public class TokenizerTest extends ExchangeTestSupport {
         assertEquals("<person>Hadrian</person>", names.get(3));
     }
 
+    public void testTokenizeXMLPairSimple() throws Exception {
+        Expression exp = TokenizeLanguage.tokenizeXML("${header.foo}", null);
+
+        exchange.getIn().setHeader("foo", "<person>");
+        
exchange.getIn().setBody("<persons><person>James</person><person>Claus</person><person>Jonathan</person><person>Hadrian</person></persons>");
+
+        List<?> names = exp.evaluate(exchange, List.class);
+        assertEquals(4, names.size());
+
+        assertEquals("<person>James</person>", names.get(0));
+        assertEquals("<person>Claus</person>", names.get(1));
+        assertEquals("<person>Jonathan</person>", names.get(2));
+        assertEquals("<person>Hadrian</person>", names.get(3));
+    }
+
     public void testTokenizeXMLPairNoXMLTag() throws Exception {
         Expression exp = TokenizeLanguage.tokenizeXML("person",  null);
 

Reply via email to