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);