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

Reply via email to