This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new e92b84b CAMEL-13597: Tokenizer with grouping can now specify which delimiter to use instead of the token itself. e92b84b is described below commit e92b84bf1ed14c6373eafd330ef97032583d4de6 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu May 30 21:49:12 2019 +0200 CAMEL-13597: Tokenizer with grouping can now specify which delimiter to use instead of the token itself. --- .../camel/language/tokenizer/TokenizeLanguage.java | 12 +++++- .../org/apache/camel/builder/ExpressionClause.java | 13 ++++++ .../camel/builder/ExpressionClauseSupport.java | 16 +++++++ .../camel/model/language/TokenizerExpression.java | 15 +++++++ core/camel-core/src/main/schema/tokenize.json | 1 + .../processor/SplitTokenizerRegexpGroupTest.java | 50 ++++++++++++++++++++++ 6 files changed, 106 insertions(+), 1 deletion(-) diff --git a/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java b/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java index 2e3899d..72934d7 100644 --- a/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java +++ b/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java @@ -48,6 +48,7 @@ public class TokenizeLanguage implements Language, IsSingleton { private boolean xml; private boolean includeTokens; private String group; + private String groupDelimiter; private boolean skipFirst; public static Expression tokenize(String token) { @@ -133,7 +134,8 @@ public class TokenizeLanguage implements Language, IsSingleton { if (isXml()) { answer = ExpressionBuilder.groupXmlIteratorExpression(answer, group); } else { - answer = ExpressionBuilder.groupIteratorExpression(answer, token, group, skipFirst); + String delim = groupDelimiter != null ? groupDelimiter : token; + answer = ExpressionBuilder.groupIteratorExpression(answer, delim, group, skipFirst); } } @@ -211,6 +213,14 @@ public class TokenizeLanguage implements Language, IsSingleton { this.group = group; } + public String getGroupDelimiter() { + return groupDelimiter; + } + + public void setGroupDelimiter(String groupDelimiter) { + this.groupDelimiter = groupDelimiter; + } + public boolean isSkipFirst() { return skipFirst; } diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java index 5f49dfe..538a32d 100644 --- a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java +++ b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java @@ -668,6 +668,19 @@ public class ExpressionClause<T> implements Expression, Predicate { * Evaluates a token expression on the message body * * @param token the token + * @param regex whether the token is a regular expression or not + * @param group to group by the given number + * @param skipFirst whether to skip the first element + * @return the builder to continue processing the DSL + */ + public T tokenize(String token, boolean regex, int group, String groupDelimiter, boolean skipFirst) { + return delegate.tokenize(token, null, regex, "" + group, groupDelimiter, skipFirst); + } + + /** + * Evaluates a token expression on the message body + * + * @param token the token * @param group to group by the given number * @return the builder to continue processing the DSL */ diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java index a077cec..58a9bd0 100644 --- a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java +++ b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java @@ -690,11 +690,27 @@ public class ExpressionClauseSupport<T> { * @return the builder to continue processing the DSL */ public T tokenize(String token, String headerName, boolean regex, String group, boolean skipFirst) { + return tokenize(token, headerName, regex, group, null, skipFirst); + } + + /** + * Evaluates a token expression on the given header + * + * @param token the token + * @param headerName name of header to tokenize + * @param regex whether the token is a regular expression or not + * @param group to group by number of parts + * @param groupDelimiter delimiter to use when grouping + * @param skipFirst whether to skip the very first element + * @return the builder to continue processing the DSL + */ + public T tokenize(String token, String headerName, boolean regex, String group, String groupDelimiter, boolean skipFirst) { TokenizerExpression expression = new TokenizerExpression(); expression.setToken(token); expression.setHeaderName(headerName); expression.setRegex(regex); expression.setGroup(group); + expression.setGroupDelimiter(groupDelimiter); expression.setSkipFirst(skipFirst); setExpressionType(expression); return result; diff --git a/core/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java b/core/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java index 85be58c..583bdbb 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/language/TokenizerExpression.java @@ -54,6 +54,8 @@ public class TokenizerExpression extends ExpressionDefinition { @XmlAttribute private String group; @XmlAttribute + private String groupDelimiter; + @XmlAttribute private Boolean skipFirst; public TokenizerExpression() { @@ -161,6 +163,17 @@ public class TokenizerExpression extends ExpressionDefinition { this.group = group; } + public String getGroupDelimiter() { + return groupDelimiter; + } + + /** + * Sets the delimiter to use when grouping. If this has not been set then token will be used as the delimiter. + */ + public void setGroupDelimiter(String groupDelimiter) { + this.groupDelimiter = groupDelimiter; + } + public Boolean getSkipFirst() { return skipFirst; } @@ -184,6 +197,7 @@ public class TokenizerExpression extends ExpressionDefinition { language.setEndToken(endToken); language.setInheritNamespaceTagName(inheritNamespaceTagName); language.setHeaderName(headerName); + language.setGroupDelimiter(groupDelimiter); if (regex != null) { language.setRegex(regex); } @@ -196,6 +210,7 @@ public class TokenizerExpression extends ExpressionDefinition { if (group != null && !"0".equals(group)) { language.setGroup(group); } + if (skipFirst != null) { language.setSkipFirst(skipFirst); } diff --git a/core/camel-core/src/main/schema/tokenize.json b/core/camel-core/src/main/schema/tokenize.json index daddb35..814e500 100644 --- a/core/camel-core/src/main/schema/tokenize.json +++ b/core/camel-core/src/main/schema/tokenize.json @@ -20,6 +20,7 @@ "xml": { "kind": "attribute", "displayName": "Xml", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the input is XML messages. This option must be set to true if working with XML payloads." }, "includeTokens": { "kind": "attribute", "displayName": "Include Tokens", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether to include the tokens in the parts when using pairs The default value is false" }, "group": { "kind": "attribute", "displayName": "Group", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "To group N parts together, for example to split big files into chunks of 1000 lines. You can use simple language as the group to support dynamic group sizes." }, + "groupDelimiter": { "kind": "attribute", "displayName": "Group Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Sets the delimiter to use when grouping. If this has not been set then token will be used as the delimiter." }, "skipFirst": { "kind": "attribute", "displayName": "Skip First", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "To skip the very first element" }, "trim": { "kind": "attribute", "displayName": "Trim", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" }, "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Sets the id of this node" } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerRegexpGroupTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerRegexpGroupTest.java new file mode 100644 index 0000000..1401169 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerRegexpGroupTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.processor; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +/** + * + */ +public class SplitTokenizerRegexpGroupTest extends ContextTestSupport { + + @Test + public void testSplitTokenizer() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:line"); + mock.expectedBodiesReceived("Claus\nJames", "Willem\nJon", "Andrea"); + + template.sendBody("direct:start", "Header\nClaus\r\nJames\nWillem\r\nJon\nAndrea"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .split().tokenize("\r\n|\n", true, 2, "\n", true) + .log("${body}").to("mock:line"); + } + }; + } +}