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 <claus.ib...@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);