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