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);