You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/02/08 13:52:39 UTC

(camel) 03/09: CAMEL-20378: Languages should be thread-safe and be configured only via properties array, all in the same way.

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

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

commit 389f0d669452cb0b940c4d9e76b280b0730cbc09
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Feb 8 13:07:09 2024 +0100

    CAMEL-20378: Languages should be thread-safe and be configured only via properties array, all in the same way.
---
 .../org/apache/camel/builder/ExpressionClause.java  |  4 ++--
 .../camel/builder/ExpressionClauseSupport.java      | 19 +++++++++++++++++++
 .../SingleInputTypedExpressionDefinition.java       | 14 ++++++--------
 .../XPathHeaderNameResultTypeAndNamespaceTest.java  |  3 ++-
 .../camel/builder/xml/XPathHeaderNameTest.java      | 13 +++++++------
 .../BeanWithXPathInjectionUsingHeaderValueTest.java |  3 ++-
 .../org/apache/camel/language/TokenizerTest.java    | 10 +++++-----
 .../processor/SplitTokenizerRegexpGroupTest.java    |  3 ++-
 .../camel/support/builder/ExpressionBuilder.java    | 21 ++++++++++-----------
 9 files changed, 55 insertions(+), 35 deletions(-)

diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java
index e83e22de18c..a80e93349c2 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java
@@ -665,7 +665,7 @@ public class ExpressionClause<T> implements Expression, Predicate {
      * @return           the builder to continue processing the DSL
      */
     public T tokenize(String token, boolean regex, boolean skipFirst) {
-        return delegate.tokenize(token, regex, 1, skipFirst);
+        return delegate.tokenize(token, regex, null, skipFirst);
     }
 
     /**
@@ -715,7 +715,7 @@ public class ExpressionClause<T> implements Expression, Predicate {
      * @return           the builder to continue processing the DSL
      */
     public T tokenize(String token, boolean regex, String group, boolean skipFirst) {
-        return delegate.tokenize(token, regex, Integer.parseInt(group), skipFirst);
+        return delegate.tokenize(token, regex, group, skipFirst);
     }
 
     /**
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
index 1aa881d2500..25a476e9e02 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
@@ -863,6 +863,25 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
         return result;
     }
 
+    /**
+     * 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 very first element
+     * @return           the builder to continue processing the DSL
+     */
+    public T tokenize(String token, boolean regex, String group, boolean skipFirst) {
+        TokenizerExpression expression = new TokenizerExpression();
+        expression.setToken(token);
+        expression.setSkipFirst(Boolean.toString(skipFirst));
+        expression.setGroup(group);
+        expression.setSkipFirst(Boolean.toString(skipFirst));
+        expression(expression);
+        return result;
+    }
+
     /**
      * Evaluates a token pair expression on the message body
      *
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputTypedExpressionDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputTypedExpressionDefinition.java
index 7a357cd0b9f..46ab6e998f5 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputTypedExpressionDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputTypedExpressionDefinition.java
@@ -50,10 +50,9 @@ public abstract class SingleInputTypedExpressionDefinition extends TypedExpressi
     }
 
     /**
-     * Source to use, instead of message body.
-     * You can prefix with variable:, header:, or property: to specify kind of source.
-     * Otherwise, the source is assumed to be a variable.
-     * Use empty or null to use default source, which is the message body.
+     * Source to use, instead of message body. You can prefix with variable:, header:, or property: to specify kind of
+     * source. Otherwise, the source is assumed to be a variable. Use empty or null to use default source, which is the
+     * message body.
      */
     public void setSource(String source) {
         this.source = source;
@@ -71,10 +70,9 @@ public abstract class SingleInputTypedExpressionDefinition extends TypedExpressi
         private String source;
 
         /**
-         * Source to use, instead of message body.
-         * You can prefix with variable:, header:, or property: to specify kind of source.
-         * Otherwise, the source is assumed to be a variable.
-         * Use empty or null to use default source, which is the message body.
+         * Source to use, instead of message body. You can prefix with variable:, header:, or property: to specify kind
+         * of source. Otherwise, the source is assumed to be a variable. Use empty or null to use default source, which
+         * is the message body.
          */
         public T source(String source) {
             this.source = source;
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameResultTypeAndNamespaceTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameResultTypeAndNamespaceTest.java
index db7ef92540c..c7167043a6a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameResultTypeAndNamespaceTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameResultTypeAndNamespaceTest.java
@@ -44,7 +44,8 @@ public class XPathHeaderNameResultTypeAndNamespaceTest extends ContextTestSuppor
         return new RouteBuilder() {
             public void configure() throws Exception {
                 Namespaces ns = new Namespaces("c", "http://acme.com/cheese");
-                var xpath = expression().xpath().expression("/c:number = 55").namespaces(ns).resultType(Integer.class).source("header:cheeseDetails").end();
+                var xpath = expression().xpath().expression("/c:number = 55").namespaces(ns).resultType(Integer.class)
+                        .source("header:cheeseDetails").end();
 
                 from("direct:in").choice().when(xpath).to("mock:55")
                         .otherwise().to("mock:other").end();
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameTest.java
index 2baac9faff9..52ea50d872c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathHeaderNameTest.java
@@ -67,16 +67,17 @@ public class XPathHeaderNameTest extends ContextTestSupport {
         return new RouteBuilder() {
             public void configure() throws Exception {
 
-                var premium = expression().xpath().expression("/invoice/@orderType = 'premium'").source("header:invoiceDetails").end();
-                var standard = expression().xpath().expression("/invoice/@orderType = 'standard'").source("header:invoiceDetails").end();
+                var premium = expression().xpath().expression("/invoice/@orderType = 'premium'").source("header:invoiceDetails")
+                        .end();
+                var standard = expression().xpath().expression("/invoice/@orderType = 'standard'")
+                        .source("header:invoiceDetails").end();
 
                 from("direct:in").choice().when(premium)
-                            .to("mock:premium")
+                        .to("mock:premium")
                         .when(standard)
-                            .to("mock:standard")
+                        .to("mock:standard")
                         .otherwise()
-                            .to("mock:unknown").
-                        end();
+                        .to("mock:unknown").end();
             }
         };
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/bean/BeanWithXPathInjectionUsingHeaderValueTest.java b/core/camel-core/src/test/java/org/apache/camel/component/bean/BeanWithXPathInjectionUsingHeaderValueTest.java
index 89f17ee9f2f..b2c131c2fce 100644
--- a/core/camel-core/src/test/java/org/apache/camel/component/bean/BeanWithXPathInjectionUsingHeaderValueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/component/bean/BeanWithXPathInjectionUsingHeaderValueTest.java
@@ -64,7 +64,8 @@ public class BeanWithXPathInjectionUsingHeaderValueTest extends ContextTestSuppo
         public void handler(
                 @XPath("//response/text()") String response,
                 @XPath(source = "header:invoiceDetails", value = "//invoice/person/name/text()") String userName,
-                @XPath(source = "header:invoiceDetails", value = "//invoice/person/date", resultType = String.class) String date) {
+                @XPath(source = "header:invoiceDetails", value = "//invoice/person/date",
+                       resultType = String.class) String date) {
             this.response = response;
             this.userName = userName;
             this.date = date;
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java b/core/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java
index bf48e643372..67864abf2f1 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/TokenizerTest.java
@@ -36,27 +36,27 @@ public class TokenizerTest extends ExchangeTestSupport {
     Expression tokenize(String token, boolean regex) {
         TokenizeLanguage language = new TokenizeLanguage();
         language.setCamelContext(context);
-        return language.createExpression(null, new Object[] { null, null, null, null, token, null, null, null, regex });
+        return language.createExpression(null, new Object[] { null, null, token, null, null, null, regex });
     }
 
     Expression tokenize(String headerName, String token) {
         TokenizeLanguage language = new TokenizeLanguage();
         language.setCamelContext(context);
-        return language.createExpression(null, new Object[] { null, null, headerName, null, token });
+        return language.createExpression(null, new Object[] { null, "header:" + headerName, token });
     }
 
     Expression tokenizePair(String startToken, String endToken, boolean includeTokens) {
         TokenizeLanguage language = new TokenizeLanguage();
         language.setCamelContext(context);
         return language.createExpression(null,
-                new Object[] { null, null, null, null, startToken, endToken, null, null, null, null, includeTokens });
+                new Object[] { null, null, startToken, endToken, null, null, null, null, includeTokens });
     }
 
     Expression tokenizeXML(String tagName, String inheritNamespaceTagName) {
         TokenizeLanguage language = new TokenizeLanguage();
         language.setCamelContext(context);
         return language.createExpression(null,
-                new Object[] { null, null, null, null, tagName, null, inheritNamespaceTagName, null, null, true });
+                new Object[] { null, null, tagName, null, inheritNamespaceTagName, null, null, true });
     }
 
     @Override
@@ -135,7 +135,7 @@ public class TokenizerTest extends ExchangeTestSupport {
     public void testTokenizeManualConfiguration() throws Exception {
         TokenizeLanguage lan = new TokenizeLanguage();
         lan.setCamelContext(context);
-        Expression exp = lan.createExpression(null, new Object[] { null, null, "names", null, "," });
+        Expression exp = lan.createExpression(null, new Object[] { null, "header:names", "," });
         exp.init(context);
 
         List<?> names = exp.evaluate(exchange, List.class);
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
index ce52495f2b7..d1a50ef48ca 100644
--- 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
@@ -41,7 +41,8 @@ public class SplitTokenizerRegexpGroupTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                var token = expression().tokenize().token("\r\n|\n").regex(true).group(2).skipFirst(true).end();
+                var token = expression().tokenize().token("\r\n|\n").regex(true).group(2).groupDelimiter("\n").skipFirst(true)
+                        .end();
                 from("direct:start").split(token).to("mock:line");
             }
         };
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
index 023fbcd537f..cb13906c8c9 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
@@ -1047,13 +1047,13 @@ public class ExpressionBuilder {
      * Returns an expression for evaluating the expression/predicate using the given language
      *
      * @param  expression the expression or predicate
-     * @param  source     Source to use, instead of message body.
-     *                    You can prefix with variable:, header:, or property: to specify kind of source.
-     *                    Otherwise, the source is assumed to be a variable.
-     *                    Use empty or null to use default source, which is the message body.
+     * @param  source     Source to use, instead of message body. You can prefix with variable:, header:, or property:
+     *                    to specify kind of source. Otherwise, the source is assumed to be a variable. Use empty or
+     *                    null to use default source, which is the message body.
      * @return            an expression object which will evaluate the expression/predicate using the given language
      */
-    public static Expression singleInputLanguageExpression(final String language, final String expression, final String source) {
+    public static Expression singleInputLanguageExpression(
+            final String language, final String expression, final String source) {
         return new ExpressionAdapter() {
             private Expression expr;
             private Predicate pred;
@@ -1284,13 +1284,12 @@ public class ExpressionBuilder {
     /**
      * Creates a source {@link Expression} for languages that can accept input from other sources than the message body.
      *
-     * @param  source Source to use, instead of message body.
-     *                You can prefix with variable:, header:, or property: to specify kind of source.
-     *                Otherwise, the source is assumed to be a variable.
-     *                Use empty or null to use default source, which is the message body.
+     * @param  source Source to use, instead of message body. You can prefix with variable:, header:, or property: to
+     *                specify kind of source. Otherwise, the source is assumed to be a variable. Use empty or null to
+     *                use default source, which is the message body.
      * @return        a variable expression if {@code variableName} is not empty, a header expression if
-     *                {@code headerName} is not empty, otherwise a property expression if {@code propertyName} is
-     *                not empty or finally a body expression.
+     *                {@code headerName} is not empty, otherwise a property expression if {@code propertyName} is not
+     *                empty or finally a body expression.
      */
     public static Expression singleInputExpression(String source) {
         final Expression exp;