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;