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");
+            }
+        };
+    }
+}

Reply via email to