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 2020/10/03 10:08:51 UTC
[camel] 04/04: CAMEL-15627: Optimize to eager initialize language
for expressions.
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
commit afb88db7a7be37f5873322985ef0ceb18c562403
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Oct 3 12:08:13 2020 +0200
CAMEL-15627: Optimize to eager initialize language for expressions.
---
.../apache/camel/catalog/languages/xtokenize.json | 2 +-
.../org/apache/camel/catalog/models/xtokenize.json | 2 +-
.../camel/support/builder/ExpressionBuilder.java | 51 ++++++++++++++++------
3 files changed, 40 insertions(+), 15 deletions(-)
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json
index 0656bf5..150f302 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json
@@ -17,7 +17,7 @@
},
"properties": {
"headerName": { "kind": "attribute", "displayName": "Header Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
- "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its child content t - extracting the text content of the specified element" },
+ "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "t", "u", "w" ], "deprecated": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its child content t - extracting the text cont [...]
"group": { "kind": "attribute", "displayName": "Group", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "description": "To group N parts together" },
"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/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json
index 70f4785..8afa8ce 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json
@@ -13,7 +13,7 @@
},
"properties": {
"headerName": { "kind": "attribute", "displayName": "Header Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
- "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its child content t - extracting the text content of the specified element" },
+ "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "t", "u", "w" ], "deprecated": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its child content t - extracting the text cont [...]
"group": { "kind": "attribute", "displayName": "Group", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "description": "To group N parts together" },
"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-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 0209ddf..3b4d33e 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
@@ -547,8 +547,8 @@ public class ExpressionBuilder {
public static Expression systemPropertyExpression(final String propertyName,
final String defaultValue) {
Expression exprName = simpleExpression(propertyName);
- Expression exprDeflt = simpleExpression(defaultValue);
- return systemPropertyExpression(exprName, exprDeflt);
+ Expression exprDefault = simpleExpression(defaultValue);
+ return systemPropertyExpression(exprName, exprDefault);
}
/**
@@ -601,8 +601,8 @@ public class ExpressionBuilder {
public static Expression systemEnvironmentExpression(final String propertyName,
final String defaultValue) {
Expression exprName = simpleExpression(propertyName);
- Expression expDeflt = simpleExpression(defaultValue);
- return systemEnvironmentExpression(exprName, expDeflt);
+ Expression expDefault = simpleExpression(defaultValue);
+ return systemEnvironmentExpression(exprName, expDefault);
}
/**
@@ -673,7 +673,7 @@ public class ExpressionBuilder {
*
* @param languageName the language name
* @param language the language
- * @param expression the expression or predicate
+ * @param expression the expression or predicate
* @return an expression object which will evaluate the expression/predicate using the given language
*/
public static Expression languageExpression(final String languageName, final Language language, final String expression) {
@@ -1459,7 +1459,7 @@ public class ExpressionBuilder {
if (description != null) {
return description;
} else {
- return "concat" + expressions;
+ return "concat(" + expressions + ")";
}
}
};
@@ -1503,8 +1503,7 @@ public class ExpressionBuilder {
public static Expression routeIdExpression() {
return new ExpressionAdapter() {
public Object evaluate(Exchange exchange) {
- String answer = ExchangeHelper.getRouteId(exchange);
- return answer;
+ return ExchangeHelper.getRouteId(exchange);
}
@Override
@@ -1517,15 +1516,23 @@ public class ExpressionBuilder {
public static Expression simpleExpression(final String expression) {
if (LanguageSupport.hasSimpleFunction(expression)) {
return new ExpressionAdapter() {
+ private Language language;
+
public Object evaluate(Exchange exchange) {
- // resolve language using context to have a clear separation of packages
// must call evaluate to return the nested language evaluate when evaluating
// stacked expressions
- Language language = exchange.getContext().resolveLanguage("simple");
+ init(exchange.getContext());
return language.createExpression(expression).evaluate(exchange, Object.class);
}
@Override
+ public void init(CamelContext context) {
+ if (this.language == null) {
+ this.language = context.resolveLanguage("simple");
+ }
+ }
+
+ @Override
public String toString() {
return "simple(" + expression + ")";
}
@@ -1537,17 +1544,25 @@ public class ExpressionBuilder {
public static Expression beanExpression(final String expression) {
return new ExpressionAdapter() {
+ private Language language;
+
public Object evaluate(Exchange exchange) {
// bean is able to evaluate method name if it contains nested functions
// so we should not eager evaluate expression as a string
- // resolve language using context to have a clear separation of packages
// must call evaluate to return the nested language evaluate when evaluating
// stacked expressions
- Language language = exchange.getContext().resolveLanguage("bean");
+ init(exchange.getContext());
return language.createExpression(expression).evaluate(exchange, Object.class);
}
@Override
+ public void init(CamelContext context) {
+ if (this.language == null) {
+ this.language = context.resolveLanguage("bean");
+ }
+ }
+
+ @Override
public String toString() {
return "bean(" + expression + ")";
}
@@ -1556,14 +1571,23 @@ public class ExpressionBuilder {
public static Expression beanExpression(final Object bean, final String method) {
return new ExpressionAdapter() {
+ private Language language;
+
public Object evaluate(Exchange exchange) {
- Language language = exchange.getContext().resolveLanguage("bean");
Map<String, Object> properties = new HashMap<>(2);
properties.put("bean", bean);
properties.put("method", method);
+ init(exchange.getContext());
return language.createExpression(null, properties).evaluate(exchange, Object.class);
}
+ @Override
+ public void init(CamelContext context) {
+ if (this.language == null) {
+ this.language = context.resolveLanguage("bean");
+ }
+ }
+
public String toString() {
return "bean(" + bean + ", " + method + ")";
}
@@ -1635,6 +1659,7 @@ public class ExpressionBuilder {
StringHelper.notEmpty(path, "path");
return new ExpressionAdapter() {
private Language language;
+
public Object evaluate(Exchange exchange) {
Map<String, Object> map = new HashMap<>(4);
map.put("mode", mode);