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:47 UTC

[camel] branch master updated (6ddde26 -> afb88db)

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

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


    from 6ddde26  Avoid explicit initialization of AtomicBoolean with its default value (#4354)
     new 7f28e56  CAMEL-15606: Optimize simple language and expression builder a bit
     new 61a0ec8  CAMEL-15605: Languages should be singleton for better performance.
     new 91ddabd  CAMEL-15627: Optimize to eager initialize language for expressions.
     new afb88db  CAMEL-15627: Optimize to eager initialize language for expressions.

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/camel/catalog/languages/xtokenize.json  |  2 +-
 .../org/apache/camel/catalog/models/xtokenize.json |  2 +-
 .../apache/camel/language/bean/BeanLanguage.java   |  6 +-
 .../apache/camel/jsonpath/JsonPathLanguage.java    |  9 +--
 .../camel/language/xquery/XQueryLanguage.java      |  7 +-
 .../apache/camel/language/spel/SpelLanguage.java   |  7 +-
 .../apache/camel/language/xpath/XPathLanguage.java |  7 +-
 .../main/java/org/apache/camel/spi/Language.java   | 28 ++++---
 .../org/apache/camel/model/language/xtokenize.json |  2 +-
 .../model/language/XMLTokenizerExpression.java     |  3 +-
 .../language/JsonPathExpressionReifier.java        |  9 +--
 .../language/MethodCallExpressionReifier.java      |  6 +-
 .../language/TokenizerExpressionReifier.java       |  4 +-
 .../language/XMLTokenizerExpressionReifier.java    |  6 +-
 .../reifier/language/XPathExpressionReifier.java   |  9 +--
 .../reifier/language/XQueryExpressionReifier.java  |  9 +--
 .../camel/language/constant/ConstantLanguage.java  | 12 +++
 .../camel/language/header/HeaderLanguage.java      | 12 +++
 .../property/ExchangePropertyLanguage.java         | 12 +++
 .../org/apache/camel/language/ref/RefLanguage.java | 12 +++
 .../camel/language/simple/SimpleLanguage.java      | 10 +++
 .../camel/language/tokenizer/TokenizeLanguage.java |  8 +-
 .../impl/DefaultCamelContextResolverTest.java      | 10 +++
 .../camel/impl/LanguageCamelContextAwareTest.java  | 12 +++
 .../apache/camel/language/LanguageServiceTest.java | 12 +++
 .../camel/support/builder/ExpressionBuilder.java   | 93 ++++++++++++++--------
 .../camel/language/xtokenizer/xtokenize.json       |  2 +-
 .../xtokenizer/XMLTokenExpressionIterator.java     | 40 +---------
 .../language/xtokenizer/XMLTokenizeLanguage.java   | 29 ++++---
 29 files changed, 234 insertions(+), 146 deletions(-)


[camel] 04/04: CAMEL-15627: Optimize to eager initialize language for expressions.

Posted by da...@apache.org.
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);


[camel] 02/04: CAMEL-15605: Languages should be singleton for better performance.

Posted by da...@apache.org.
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 61a0ec8e85fa10afc59cf1d525a06e3042835740
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Oct 3 09:51:56 2020 +0200

    CAMEL-15605: Languages should be singleton for better performance.
---
 .../apache/camel/language/bean/BeanLanguage.java   |  6 ++--
 .../apache/camel/jsonpath/JsonPathLanguage.java    |  9 +++--
 .../camel/language/xquery/XQueryLanguage.java      |  7 ++--
 .../apache/camel/language/spel/SpelLanguage.java   | 19 +++++++++-
 .../apache/camel/language/xpath/XPathLanguage.java |  7 ++--
 .../main/java/org/apache/camel/spi/Language.java   | 28 +++++++--------
 .../org/apache/camel/model/language/xtokenize.json |  2 +-
 .../model/language/XMLTokenizerExpression.java     |  3 +-
 .../language/JsonPathExpressionReifier.java        |  9 +++--
 .../language/MethodCallExpressionReifier.java      |  6 ++--
 .../language/TokenizerExpressionReifier.java       |  4 +--
 .../language/XMLTokenizerExpressionReifier.java    |  6 ++--
 .../reifier/language/XPathExpressionReifier.java   |  9 +++--
 .../reifier/language/XQueryExpressionReifier.java  |  9 +++--
 .../camel/language/constant/ConstantLanguage.java  | 12 +++++++
 .../camel/language/header/HeaderLanguage.java      | 12 +++++++
 .../property/ExchangePropertyLanguage.java         | 12 +++++++
 .../org/apache/camel/language/ref/RefLanguage.java | 12 +++++++
 .../camel/language/simple/SimpleLanguage.java      | 10 ++++++
 .../camel/language/tokenizer/TokenizeLanguage.java |  8 ++---
 .../impl/DefaultCamelContextResolverTest.java      | 10 ++++++
 .../camel/impl/LanguageCamelContextAwareTest.java  | 12 +++++++
 .../apache/camel/language/LanguageServiceTest.java | 12 +++++++
 .../camel/support/builder/ExpressionBuilder.java   | 15 +++-----
 .../camel/language/xtokenizer/xtokenize.json       |  2 +-
 .../xtokenizer/XMLTokenExpressionIterator.java     | 40 ++--------------------
 .../language/xtokenizer/XMLTokenizeLanguage.java   | 29 ++++++++++------
 27 files changed, 189 insertions(+), 121 deletions(-)

diff --git a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
index d59e676d..a80bfa9 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
@@ -84,12 +84,12 @@ public class BeanLanguage extends LanguageSupport {
     }
 
     @Override
-    public Predicate createPredicate(Map<String, Object> properties) {
-        return ExpressionToPredicateAdapter.toPredicate(createExpression(properties));
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return ExpressionToPredicateAdapter.toPredicate(createExpression(expression, properties));
     }
 
     @Override
-    public Expression createExpression(Map<String, Object> properties) {
+    public Expression createExpression(String expression, Map<String, Object> properties) {
         Object bean = properties.get("bean");
         Class<?> beanType = (Class<?>) properties.get("beanType");
         String ref = (String) properties.get("ref");
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
index 58d8f52..82d2f8f 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
@@ -116,16 +116,15 @@ public class JsonPathLanguage extends LanguageSupport {
     }
 
     @Override
-    public Predicate createPredicate(Map<String, Object> properties) {
-        JsonPathExpression json = (JsonPathExpression) createExpression(properties);
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        JsonPathExpression json = (JsonPathExpression) createExpression(expression, properties);
         json.setPredicate(true);
         return json;
     }
 
     @Override
-    public Expression createExpression(Map<String, Object> properties) {
-        String exp = (String) properties.get("expression");
-        JsonPathExpression answer = new JsonPathExpression(exp);
+    public Expression createExpression(String expression, Map<String, Object> properties) {
+        JsonPathExpression answer = new JsonPathExpression(expression);
         answer.setResultType(property(Class.class, properties, "resultType", resultType));
         answer.setSuppressExceptions(property(boolean.class, properties, "suppressExceptions", suppressExceptions));
         answer.setAllowEasyPredicate(property(boolean.class, properties, "allowEasyPredicate", allowEasyPredicate));
diff --git a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java
index 520f7b3..8b9b017 100644
--- a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java
+++ b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java
@@ -65,13 +65,12 @@ public class XQueryLanguage extends LanguageSupport {
     }
 
     @Override
-    public Predicate createPredicate(Map<String, Object> properties) {
-        return (Predicate) createExpression(properties);
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return (Predicate) createExpression(expression, properties);
     }
 
     @Override
-    public Expression createExpression(Map<String, Object> properties) {
-        String expression = (String) properties.get("expression");
+    public Expression createExpression(String expression, Map<String, Object> properties) {
         expression = loadResource(expression);
 
         Class<?> clazz = property(Class.class, properties, "resultType", null);
diff --git a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
index 6899d2d..30f29b42 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.language.spel;
 
+import java.util.Map;
+
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.Service;
@@ -49,7 +51,17 @@ public class SpelLanguage extends LanguageSupport implements Service {
     }
 
     @Override
-    public void start() {
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return createPredicate(expression);
+    }
+
+    @Override
+    public Expression createExpression(String expression, Map<String, Object> properties) {
+        return createExpression(expression);
+    }
+
+    @Override
+    public void init() {
         ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
 
         if (getCamelContext() instanceof SpringCamelContext) {
@@ -61,6 +73,11 @@ public class SpelLanguage extends LanguageSupport implements Service {
     }
 
     @Override
+    public void start() {
+        // noop
+    }
+
+    @Override
     public void stop() {
         // noop
     }
diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
index 6339f1c..315a9bf 100644
--- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
+++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
@@ -60,13 +60,12 @@ public class XPathLanguage extends LanguageSupport {
     }
 
     @Override
-    public Predicate createPredicate(Map<String, Object> properties) {
-        return (Predicate) createExpression(properties);
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return (Predicate) createExpression(expression, properties);
     }
 
     @Override
-    public Expression createExpression(Map<String, Object> properties) {
-        String expression = (String) properties.get("expression");
+    public Expression createExpression(String expression, Map<String, Object> properties) {
         expression = loadResource(expression);
 
         Class<?> clazz = property(Class.class, properties, "documentType", null);
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/Language.java b/core/camel-api/src/main/java/org/apache/camel/spi/Language.java
index b046242..191ef86 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/Language.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/Language.java
@@ -27,15 +27,15 @@ import org.apache.camel.Predicate;
 public interface Language {
 
     /**
-     * Creates a predicate based on the given string input
+     * Creates a predicate based on <b>only</b> the given string input
      *
-     * @param  expression the expression
+     * @param  expression the expression as a string input
      * @return            the created predicate
      */
     Predicate createPredicate(String expression);
 
     /**
-     * Creates an expression based on the given string input
+     * Creates an expression based on <b>only</b> the given string input
      *
      * @param  expression the expression as a string input
      * @return            the created expression
@@ -43,28 +43,26 @@ public interface Language {
     Expression createExpression(String expression);
 
     /**
-     * Creates an expression based on the given inputs properties
-     *
+     * Creates an expression based on the input with properties
+     * <p>
      * This is used for languages that have been configured with custom properties most noticeable for
      * xpath/xquery/tokenizer languages that have several options.
      *
-     * @param  properties arguments
+     * @param  expression the expression
+     * @param  properties configuration properties
      * @return            the created predicate
      */
-    default Predicate createPredicate(Map<String, Object> properties) {
-        return null;
-    }
+    Predicate createPredicate(String expression, Map<String, Object> properties);
 
     /**
-     * Creates an expression based on the given inputs properties
-     *
+     * Creates an expression based on the input with properties
+     * <p>
      * This is used for languages that have been configured with custom properties most noticeable for
      * xpath/xquery/tokenizer languages that have several options.
      *
-     * @param  properties arguments
+     * @param  expression the expression
+     * @param  properties configuration properties
      * @return            the created expression
      */
-    default Expression createExpression(Map<String, Object> properties) {
-        return null;
-    }
+    Expression createExpression(String expression, Map<String, Object> properties);
 }
diff --git a/core/camel-core-engine/src/generated/resources/org/apache/camel/model/language/xtokenize.json b/core/camel-core-engine/src/generated/resources/org/apache/camel/model/language/xtokenize.json
index 70f4785..8afa8ce 100644
--- a/core/camel-core-engine/src/generated/resources/org/apache/camel/model/language/xtokenize.json
+++ b/core/camel-core-engine/src/generated/resources/org/apache/camel/model/language/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-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
index 1a763db..abfb28d 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
@@ -25,8 +25,6 @@ import org.apache.camel.spi.Metadata;
 
 /**
  * Tokenize XML payloads using the specified path expression.
- *
- * @see org.apache.camel.language.xtokenizer.XMLTokenizeLanguage
  */
 @Metadata(firstVersion = "2.14.0", label = "language,core,xml", title = "XML Tokenize")
 @XmlRootElement(name = "xtokenize")
@@ -35,6 +33,7 @@ public class XMLTokenizerExpression extends NamespaceAwareExpression {
     @XmlAttribute
     private String headerName;
     @XmlAttribute
+    @Metadata(enums = "i,w,u,t")
     private String mode;
     @XmlAttribute
     @Metadata(javaType = "java.lang.Integer")
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
index 3b5dbf8..36d796c 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
@@ -45,9 +45,8 @@ public class JsonPathExpressionReifier extends ExpressionReifier<JsonPathExpress
         }
     }
 
-    private Map<String, Object> createProperties(String exp) {
-        Map<String, Object> properties = new HashMap<>(8);
-        properties.put("expression", parseString(exp));
+    private Map<String, Object> createProperties() {
+        Map<String, Object> properties = new HashMap<>(7);
         properties.put("resultType", definition.getResultType());
         properties.put("suppressExceptions", parseBoolean(definition.getSuppressExceptions()));
         properties.put("allowSimple", parseBoolean(definition.getAllowSimple()));
@@ -60,12 +59,12 @@ public class JsonPathExpressionReifier extends ExpressionReifier<JsonPathExpress
 
     @Override
     protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(createProperties(exp));
+        return language.createExpression(exp, createProperties());
     }
 
     @Override
     protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(createProperties(exp));
+        return language.createPredicate(exp, createProperties());
     }
 
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
index 66e6ea5..27fb200 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
@@ -56,13 +56,11 @@ public class MethodCallExpressionReifier extends ExpressionReifier<MethodCallExp
 
     @Override
     protected Expression createExpression(Language language, String exp) {
-        // method call does not use the string exp so its not in use
-        return language.createExpression(createProperties());
+        return language.createExpression(exp, createProperties());
     }
 
     @Override
     protected Predicate createPredicate(Language language, String exp) {
-        // method call does not use the string exp so its not in use
-        return language.createPredicate(createProperties());
+        return language.createPredicate(exp, createProperties());
     }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
index 7cdaf26..7b80a50 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
@@ -62,12 +62,12 @@ public class TokenizerExpressionReifier extends ExpressionReifier<TokenizerExpre
 
     @Override
     protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(createProperties());
+        return language.createExpression(exp, createProperties());
     }
 
     @Override
     protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(createProperties());
+        return language.createPredicate(exp, createProperties());
     }
 
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
index 71f4d59..ff4ee04 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
@@ -42,12 +42,12 @@ public class XMLTokenizerExpressionReifier extends ExpressionReifier<XMLTokenize
 
     @Override
     protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(createProperties());
+        return language.createExpression(exp, createProperties());
     }
 
     @Override
     protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(createProperties());
+        return language.createPredicate(exp, createProperties());
     }
 
     @Override
@@ -72,7 +72,7 @@ public class XMLTokenizerExpressionReifier extends ExpressionReifier<XMLTokenize
         properties.put("headerName", parseString(definition.getHeaderName()));
         properties.put("mode", parseString(definition.getMode()));
         properties.put("group", parseInt(definition.getGroup()));
-        properties.put("path", parseString(definition.getExpression()));
+        properties.put("namespaces", definition.getNamespaces());
         return properties;
     }
 
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
index 70e0085..6292a83 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
@@ -40,12 +40,12 @@ public class XPathExpressionReifier extends ExpressionReifier<XPathExpression> {
 
     @Override
     protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(createProperties(exp));
+        return language.createExpression(exp, createProperties());
     }
 
     @Override
     protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(createProperties(exp));
+        return language.createPredicate(exp, createProperties());
     }
 
     @Override
@@ -65,9 +65,8 @@ public class XPathExpressionReifier extends ExpressionReifier<XPathExpression> {
         }
     }
 
-    protected Map<String, Object> createProperties(String expression) {
-        Map<String, Object> properties = new HashMap<>(10);
-        properties.put("expression", parseString(expression));
+    protected Map<String, Object> createProperties() {
+        Map<String, Object> properties = new HashMap<>(9);
         properties.put("documentType", definition.getDocumentType());
         // resultType can either point to a QName or it can be a regular class that influence the qname
         // so we need this special logic to set resultQName and resultType accordingly
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
index ea4e97a..c4a75eb 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
@@ -36,12 +36,12 @@ public class XQueryExpressionReifier extends ExpressionReifier<XQueryExpression>
 
     @Override
     protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(createProperties(exp));
+        return language.createExpression(exp, createProperties());
     }
 
     @Override
     protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(createProperties(exp));
+        return language.createPredicate(exp, createProperties());
     }
 
     @Override
@@ -61,9 +61,8 @@ public class XQueryExpressionReifier extends ExpressionReifier<XQueryExpression>
         }
     }
 
-    protected Map<String, Object> createProperties(String expression) {
-        Map<String, Object> properties = new HashMap<>(3);
-        properties.put("expression", parseString(expression));
+    protected Map<String, Object> createProperties() {
+        Map<String, Object> properties = new HashMap<>(2);
         properties.put("resultType", definition.getResultType());
         properties.put("headerName", parseString(definition.getHeaderName()));
         return properties;
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/constant/ConstantLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/constant/ConstantLanguage.java
index ef67763..520f25b 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/constant/ConstantLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/constant/ConstantLanguage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.language.constant;
 
+import java.util.Map;
+
 import org.apache.camel.Expression;
 import org.apache.camel.IsSingleton;
 import org.apache.camel.Predicate;
@@ -44,6 +46,16 @@ public class ConstantLanguage implements Language, IsSingleton {
     }
 
     @Override
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return createPredicate(expression);
+    }
+
+    @Override
+    public Expression createExpression(String expression, Map<String, Object> properties) {
+        return createExpression(expression);
+    }
+
+    @Override
     public boolean isSingleton() {
         return true;
     }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/header/HeaderLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/header/HeaderLanguage.java
index eba8e0c..ed3c2e3 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/header/HeaderLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/header/HeaderLanguage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.language.header;
 
+import java.util.Map;
+
 import org.apache.camel.Expression;
 import org.apache.camel.IsSingleton;
 import org.apache.camel.Predicate;
@@ -44,6 +46,16 @@ public class HeaderLanguage implements Language, IsSingleton {
     }
 
     @Override
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return createPredicate(expression);
+    }
+
+    @Override
+    public Expression createExpression(String expression, Map<String, Object> properties) {
+        return createExpression(expression);
+    }
+
+    @Override
     public boolean isSingleton() {
         return true;
     }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/property/ExchangePropertyLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/property/ExchangePropertyLanguage.java
index d2bc194..bf9997d 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/property/ExchangePropertyLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/property/ExchangePropertyLanguage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.language.property;
 
+import java.util.Map;
+
 import org.apache.camel.Expression;
 import org.apache.camel.IsSingleton;
 import org.apache.camel.Predicate;
@@ -44,6 +46,16 @@ public class ExchangePropertyLanguage implements Language, IsSingleton {
     }
 
     @Override
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return createPredicate(expression);
+    }
+
+    @Override
+    public Expression createExpression(String expression, Map<String, Object> properties) {
+        return createExpression(expression);
+    }
+
+    @Override
     public boolean isSingleton() {
         return true;
     }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
index 6102ee1..64c307f 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.language.ref;
 
+import java.util.Map;
+
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.IsSingleton;
@@ -73,6 +75,16 @@ public class RefLanguage implements Language, IsSingleton {
     }
 
     @Override
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return createPredicate(expression);
+    }
+
+    @Override
+    public Expression createExpression(String expression, Map<String, Object> properties) {
+        return createExpression(expression);
+    }
+
+    @Override
     public boolean isSingleton() {
         return true;
     }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
index 6c0415f..284db42 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
@@ -139,6 +139,16 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
         return answer;
     }
 
+    @Override
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return createPredicate(expression);
+    }
+
+    @Override
+    public Expression createExpression(String expression, Map<String, Object> properties) {
+        return createExpression(expression);
+    }
+
     /**
      * Creates a new {@link Expression}.
      * <p/>
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java
index 7021f3b..210a107 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java
@@ -153,12 +153,12 @@ public class TokenizeLanguage extends LanguageSupport {
     }
 
     @Override
-    public Predicate createPredicate(Map<String, Object> properties) {
-        return ExpressionToPredicateAdapter.toPredicate(createExpression(properties));
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return ExpressionToPredicateAdapter.toPredicate(createExpression(expression, properties));
     }
 
     @Override
-    public Expression createExpression(Map<String, Object> properties) {
+    public Expression createExpression(String expression, Map<String, Object> properties) {
         TokenizeLanguage answer = new TokenizeLanguage();
         answer.setInheritNamespaceTagName(
                 property(String.class, properties, "inheritNamespaceTagName", inheritNamespaceTagName));
@@ -171,7 +171,7 @@ public class TokenizeLanguage extends LanguageSupport {
         answer.setGroup(property(String.class, properties, "group", group));
         answer.setGroupDelimiter(property(String.class, properties, "groupDelimiter", groupDelimiter));
         answer.setSkipFirst(property(boolean.class, properties, "skipFirst", skipFirst));
-        return answer.createExpression();
+        return answer.createExpression(expression);
     }
 
     public String getToken() {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java
index 725f852..724b0df 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java
@@ -218,6 +218,16 @@ public class DefaultCamelContextResolverTest {
             throw new UnsupportedOperationException("Should not be called");
         }
 
+        @Override
+        public Predicate createPredicate(String expression, Map<String, Object> properties) {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        @Override
+        public Expression createExpression(String expression, Map<String, Object> properties) {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
         public boolean isFallback() {
             return fallback;
         }
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/LanguageCamelContextAwareTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/LanguageCamelContextAwareTest.java
index 9ac3f21..9af5bed 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/LanguageCamelContextAwareTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/LanguageCamelContextAwareTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.impl;
 
+import java.util.Map;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.ContextTestSupport;
@@ -74,5 +76,15 @@ public class LanguageCamelContextAwareTest extends ContextTestSupport {
             return null;
         }
 
+        @Override
+        public Predicate createPredicate(String expression, Map<String, Object> properties) {
+            return null;
+        }
+
+        @Override
+        public Expression createExpression(String expression, Map<String, Object> properties) {
+            return null;
+        }
+
     }
 }
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java b/core/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java
index fe5d3d0..f307498 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.language;
 
+import java.util.Map;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Expression;
 import org.apache.camel.IsSingleton;
@@ -76,6 +78,16 @@ public class LanguageServiceTest extends ContextTestSupport {
             return ExpressionBuilder.constantExpression(expression);
         }
 
+        @Override
+        public Predicate createPredicate(String expression, Map<String, Object> properties) {
+            return createPredicate(expression);
+        }
+
+        @Override
+        public Expression createExpression(String expression, Map<String, Object> properties) {
+            return createExpression(expression);
+        }
+
         public String getState() {
             return state;
         }
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 e3ba768..f07384a 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
@@ -1561,7 +1561,7 @@ public class ExpressionBuilder {
                 Map<String, Object> properties = new HashMap<>(2);
                 properties.put("bean", bean);
                 properties.put("method", method);
-                return language.createExpression(properties).evaluate(exchange, Object.class);
+                return language.createExpression(null, properties).evaluate(exchange, Object.class);
             }
 
             public String toString() {
@@ -1637,21 +1637,16 @@ public class ExpressionBuilder {
             public Object evaluate(Exchange exchange) {
                 // TODO: resolve language early
                 Language language = exchange.getContext().resolveLanguage("xtokenize");
-                Map<String, Object> map = new HashMap<>(5);
+                Map<String, Object> map = new HashMap<>(4);
+                map.put("mode", mode);
+                map.put("group", group);
                 if (headerName != null) {
                     map.put("headerName", headerName);
                 }
-                if (mode != 'i') {
-                    map.put("mode", mode);
-                }
-                if (group > 1) {
-                    map.put("group", group);
-                }
                 if (namespaces != null) {
                     map.put("namespaces", namespaces);
                 }
-                map.put("path", path);
-                return language.createExpression(map).evaluate(exchange, Object.class);
+                return language.createExpression(path, map).evaluate(exchange, Object.class);
             }
 
             @Override
diff --git a/core/camel-xml-jaxp/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json b/core/camel-xml-jaxp/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json
index 0656bf5..150f302 100644
--- a/core/camel-xml-jaxp/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json
+++ b/core/camel-xml-jaxp/src/generated/resources/org/apache/camel/language/xtokenizer/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/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
index 4e65e71..1212cee 100644
--- a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
+++ b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
@@ -39,15 +39,12 @@ import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.converter.jaxp.StaxConverter;
-import org.apache.camel.spi.GeneratedPropertyConfigurer;
 import org.apache.camel.spi.NamespaceAware;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.ExpressionAdapter;
-import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
@@ -57,7 +54,7 @@ import org.slf4j.LoggerFactory;
 /**
  * An {@link org.apache.camel.language.xtokenizer.XMLTokenizeLanguage} based iterator.
  */
-public class XMLTokenExpressionIterator extends ExpressionAdapter implements NamespaceAware, GeneratedPropertyConfigurer {
+public class XMLTokenExpressionIterator extends ExpressionAdapter implements NamespaceAware {
     protected final String path;
     protected char mode;
     protected int group;
@@ -73,28 +70,7 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam
         this.headerName = headerName;
         this.path = path;
         this.mode = mode;
-        this.group = group > 1 ? group : 1;
-    }
-
-    @Override
-    public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) {
-        if (target != this) {
-            throw new IllegalStateException("Can only configure our own instance !");
-        }
-        switch (ignoreCase ? name.toLowerCase() : name) {
-            case "headername":
-            case "headerName":
-                setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value));
-                return true;
-            case "mode":
-                setMode(PropertyConfigurerSupport.property(camelContext, String.class, value));
-                return true;
-            case "group":
-                setGroup(PropertyConfigurerSupport.property(camelContext, Integer.class, value));
-                return true;
-            default:
-                return false;
-        }
+        this.group = Math.max(group, 1);
     }
 
     @Override
@@ -173,17 +149,7 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam
                 reader = new InputStreamReader(in, charset);
             }
             return createIterator(reader);
-        } catch (InvalidPayloadException e) {
-            exchange.setException(e);
-            // must close input stream
-            IOHelper.close(reader);
-            return null;
-        } catch (XMLStreamException e) {
-            exchange.setException(e);
-            // must close input stream
-            IOHelper.close(reader);
-            return null;
-        } catch (UnsupportedEncodingException e) {
+        } catch (InvalidPayloadException | XMLStreamException | UnsupportedEncodingException e) {
             exchange.setException(e);
             // must close input stream
             IOHelper.close(reader);
diff --git a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java
index ed0f8f9..da9569e 100644
--- a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java
+++ b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java
@@ -31,9 +31,10 @@ import org.apache.camel.util.ObjectHelper;
  * <p/>
  * This xmltokenizer language can operate in the following modes:
  * <ul>
- * <li>inject - injecting the contextual namespace bindings into the extracted token</li>
- * <li>wrap - wrapping the extracted token in its ancestor context</li>
- * <li>unwrap - unwrapping the extracted token to its child content</li>
+ * <li>i - injecting the contextual namespace bindings into the extracted token (default)</li>
+ * <li>w - wrapping the extracted token in its ancestor context</li>
+ * <li>u - unwrapping the extracted token to its child content</li>
+ * <li>t - extracting the text content of the specified element</li>
  * </ul>
  */
 @Language("xtokenize")
@@ -90,19 +91,27 @@ public class XMLTokenizeLanguage extends LanguageSupport {
     }
 
     @Override
-    public Predicate createPredicate(Map<String, Object> properties) {
-        return ExpressionToPredicateAdapter.toPredicate(createExpression(properties));
+    public Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return ExpressionToPredicateAdapter.toPredicate(createExpression(expression, properties));
     }
 
     @Override
-    public Expression createExpression(Map<String, Object> properties) {
+    public Expression createExpression(String expression, Map<String, Object> properties) {
         XMLTokenizeLanguage answer = new XMLTokenizeLanguage();
         answer.setHeaderName(property(String.class, properties, "headerName", headerName));
-        if (properties.get("mode") != null) {
-            answer.setMode(property(char.class, properties, "mode", 'i'));
+        answer.setMode(property(Character.class, properties, "mode", "i"));
+        answer.setGroup(property(Integer.class, properties, "group", group));
+        Object obj = properties.get("namespaces");
+        if (obj instanceof Namespaces) {
+            answer.setNamespaces((Namespaces) obj);
+        } else if (obj instanceof Map) {
+            Namespaces ns = new Namespaces();
+            ((Map<String, String>) obj).forEach(ns::add);
+            answer.setNamespaces(ns);
+        } else {
+            throw new IllegalArgumentException("Namespaces is not instance of java.util.Map or " + Namespaces.class.getName());
         }
-        answer.setGroup(property(int.class, properties, "group", group));
-        String path = property(String.class, properties, "path", null);
+        String path = expression != null ? expression : this.path;
         return answer.createExpression(path);
     }
 


[camel] 03/04: CAMEL-15627: Optimize to eager initialize language for expressions.

Posted by da...@apache.org.
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 91ddabd9fe0b010124f4439a4fa6019cd7f6a529
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Oct 3 10:25:45 2020 +0200

    CAMEL-15627: Optimize to eager initialize language for expressions.
---
 .../java/org/apache/camel/language/spel/SpelLanguage.java    | 12 ------------
 .../src/main/java/org/apache/camel/spi/Language.java         |  8 ++++++--
 .../org/apache/camel/support/builder/ExpressionBuilder.java  | 10 ++++++++--
 3 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
index 30f29b42..1f6f550 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.language.spel;
 
-import java.util.Map;
-
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.Service;
@@ -51,16 +49,6 @@ public class SpelLanguage extends LanguageSupport implements Service {
     }
 
     @Override
-    public Predicate createPredicate(String expression, Map<String, Object> properties) {
-        return createPredicate(expression);
-    }
-
-    @Override
-    public Expression createExpression(String expression, Map<String, Object> properties) {
-        return createExpression(expression);
-    }
-
-    @Override
     public void init() {
         ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
 
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/Language.java b/core/camel-api/src/main/java/org/apache/camel/spi/Language.java
index 191ef86..a79a71d 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/Language.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/Language.java
@@ -52,7 +52,9 @@ public interface Language {
      * @param  properties configuration properties
      * @return            the created predicate
      */
-    Predicate createPredicate(String expression, Map<String, Object> properties);
+    default Predicate createPredicate(String expression, Map<String, Object> properties) {
+        return createPredicate(expression);
+    }
 
     /**
      * Creates an expression based on the input with properties
@@ -64,5 +66,7 @@ public interface Language {
      * @param  properties configuration properties
      * @return            the created expression
      */
-    Expression createExpression(String expression, Map<String, Object> properties);
+    default Expression createExpression(String expression, Map<String, Object> properties) {
+        return createExpression(expression);
+    }
 }
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 f07384a..0209ddf 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
@@ -1634,9 +1634,8 @@ public class ExpressionBuilder {
     public static Expression tokenizeXMLAwareExpression(String headerName, String path, char mode, int group, Namespaces namespaces) {
         StringHelper.notEmpty(path, "path");
         return new ExpressionAdapter() {
+            private Language language;
             public Object evaluate(Exchange exchange) {
-                // TODO: resolve language early
-                Language language = exchange.getContext().resolveLanguage("xtokenize");
                 Map<String, Object> map = new HashMap<>(4);
                 map.put("mode", mode);
                 map.put("group", group);
@@ -1650,6 +1649,13 @@ public class ExpressionBuilder {
             }
 
             @Override
+            public void init(CamelContext context) {
+                if (this.language == null) {
+                    this.language = context.resolveLanguage("xtokenize");
+                }
+            }
+
+            @Override
             public String toString() {
                 return "xtokenize(" + path + ")";
             }


[camel] 01/04: CAMEL-15606: Optimize simple language and expression builder a bit

Posted by da...@apache.org.
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 7f28e5670b8d9d8ccae40776d79e227e2e364d0e
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Oct 2 19:07:55 2020 +0200

    CAMEL-15606: Optimize simple language and expression builder a bit
---
 .../camel/support/builder/ExpressionBuilder.java   | 29 ++++++++++------------
 1 file changed, 13 insertions(+), 16 deletions(-)

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 7c2997e..e3ba768 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
@@ -32,7 +32,6 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
-import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.Message;
 import org.apache.camel.NoSuchLanguageException;
@@ -300,7 +299,11 @@ public class ExpressionBuilder {
      * @return an expression object which will return the bean
      */
     public static Expression refExpression(final String ref) {
-        return refExpression(simpleExpression(ref));
+        if (LanguageSupport.hasSimpleFunction(ref)) {
+            return refExpression(simpleExpression(ref));
+        } else {
+            return refExpression(constantExpression(ref));
+        }
     }
 
     /**
@@ -1632,21 +1635,23 @@ public class ExpressionBuilder {
         StringHelper.notEmpty(path, "path");
         return new ExpressionAdapter() {
             public Object evaluate(Exchange exchange) {
+                // TODO: resolve language early
                 Language language = exchange.getContext().resolveLanguage("xtokenize");
+                Map<String, Object> map = new HashMap<>(5);
                 if (headerName != null) {
-                    setProperty(exchange.getContext(), language, "headerName", headerName);
+                    map.put("headerName", headerName);
                 }
                 if (mode != 'i') {
-                    setProperty(exchange.getContext(), language, "mode", mode);
+                    map.put("mode", mode);
                 }
                 if (group > 1) {
-                    setProperty(exchange.getContext(), language, "group", group);
+                    map.put("group", group);
                 }
                 if (namespaces != null) {
-                    setProperty(exchange.getContext(), language, "namespaces", namespaces);
+                    map.put("namespaces", namespaces);
                 }
-                setProperty(exchange.getContext(), language, "path", path);
-                return language.createExpression((String)null).evaluate(exchange, Object.class);
+                map.put("path", path);
+                return language.createExpression(map).evaluate(exchange, Object.class);
             }
 
             @Override
@@ -1677,12 +1682,4 @@ public class ExpressionBuilder {
         };
     }
 
-    protected static void setProperty(CamelContext camelContext, Object bean, String name, Object value) {
-        try {
-            camelContext.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(camelContext, bean, name, value);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("Failed to set property " + name + " on " + bean + ". Reason: " + e, e);
-        }
-    }
-
 }