This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 351013beb2cd500708db9c65db26daf67bd6b043 Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Mon Feb 10 20:19:50 2020 +0100 Introduce reifiers for expressions --- .../model/ExpressionSubElementDefinition.java | 48 +---- .../apache/camel/model/RouteDefinitionHelper.java | 17 +- .../camel/model/language/ExpressionDefinition.java | 162 +++-------------- .../camel/model/language/JsonPathExpression.java | 62 ------- .../camel/model/language/MethodCallExpression.java | 48 ----- .../model/language/NamespaceAwareExpression.java | 18 -- .../camel/model/language/SimpleExpression.java | 31 ---- .../camel/model/language/TokenizerExpression.java | 43 ----- .../model/language/XMLTokenizerExpression.java | 31 +--- .../camel/model/language/XPathExpression.java | 112 ++---------- .../camel/model/language/XQueryExpression.java | 40 +---- .../org/apache/camel/reifier/AbstractReifier.java | 21 +++ .../org/apache/camel/reifier/AggregateReifier.java | 8 +- .../org/apache/camel/reifier/CatchReifier.java | 2 +- .../org/apache/camel/reifier/DelayReifier.java | 7 +- .../apache/camel/reifier/DynamicRouterReifier.java | 2 +- .../org/apache/camel/reifier/EnrichReifier.java | 2 +- .../apache/camel/reifier/ExpressionReifier.java | 2 +- .../camel/reifier/IdempotentConsumerReifier.java | 2 +- .../java/org/apache/camel/reifier/LoopReifier.java | 4 +- .../apache/camel/reifier/OnCompletionReifier.java | 2 +- .../apache/camel/reifier/OnExceptionReifier.java | 19 +- .../apache/camel/reifier/PollEnrichReifier.java | 2 +- .../apache/camel/reifier/RecipientListReifier.java | 2 +- .../apache/camel/reifier/ResequenceReifier.java | 4 +- .../apache/camel/reifier/RoutingSlipReifier.java | 2 +- .../org/apache/camel/reifier/ScriptReifier.java | 2 +- .../org/apache/camel/reifier/SetBodyReifier.java | 2 +- .../org/apache/camel/reifier/SetHeaderReifier.java | 2 +- .../apache/camel/reifier/SetPropertyReifier.java | 2 +- .../java/org/apache/camel/reifier/SortReifier.java | 2 +- .../org/apache/camel/reifier/SplitReifier.java | 2 +- .../org/apache/camel/reifier/ThrottleReifier.java | 11 +- .../org/apache/camel/reifier/TransformReifier.java | 2 +- .../org/apache/camel/reifier/ValidateReifier.java | 2 +- .../org/apache/camel/reifier/WireTapReifier.java | 2 +- .../camel/reifier/language/ExpressionReifier.java | 200 +++++++++++++++++++++ .../language/JsonPathExpressionReifier.java | 58 ++++++ .../language/MethodCallExpressionReifier.java | 64 +++++++ .../reifier/language/SimpleExpressionReifier.java | 54 ++++++ .../language/TokenizerExpressionReifier.java | 73 ++++++++ .../language/XMLTokenizerExpressionReifier.java | 66 +++++++ .../reifier/language/XPathExpressionReifier.java | 69 +++++++ .../reifier/language/XQueryExpressionReifier.java | 63 +++++++ .../loadbalancer/StickyLoadBalancerReifier.java | 2 +- 45 files changed, 767 insertions(+), 604 deletions(-) diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java index 7db2521..3bb97af 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java @@ -20,12 +20,10 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.Expression; import org.apache.camel.Predicate; import org.apache.camel.model.language.ExpressionDefinition; -import org.apache.camel.spi.RouteContext; /** * Represents an expression sub element @@ -35,20 +33,16 @@ import org.apache.camel.spi.RouteContext; public class ExpressionSubElementDefinition { @XmlElementRef private ExpressionDefinition expressionType; - @XmlTransient - private Expression expression; - @XmlTransient - private Predicate predicate; public ExpressionSubElementDefinition() { } public ExpressionSubElementDefinition(Expression expression) { - this.expression = expression; + this.expressionType = new ExpressionDefinition(expression); } public ExpressionSubElementDefinition(Predicate predicate) { - this.predicate = predicate; + this.expressionType = new ExpressionDefinition(predicate); } public ExpressionDefinition getExpressionType() { @@ -59,46 +53,10 @@ public class ExpressionSubElementDefinition { this.expressionType = expressionType; } - public Expression getExpression() { - return expression; - } - - public void setExpression(Expression expression) { - this.expression = expression; - } - - public void setPredicate(Predicate predicate) { - this.predicate = predicate; - } - - public Predicate getPredicate() { - return predicate; - } - - public Expression createExpression(RouteContext routeContext) { - ExpressionDefinition expressionType = getExpressionType(); - if (expressionType != null && expression == null) { - expression = expressionType.createExpression(routeContext); - } - return expression; - } - - public Predicate createPredicate(RouteContext routeContext) { - ExpressionDefinition expressionType = getExpressionType(); - if (expressionType != null && getPredicate() == null) { - setPredicate(expressionType.createPredicate(routeContext)); - } - return getPredicate(); - } - @Override public String toString() { - if (expression != null) { - return expression.toString(); - } else if (expressionType != null) { + if (expressionType != null) { return expressionType.toString(); - } else if (predicate != null) { - return predicate.toString(); } return super.toString(); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java index 02b07ca..643a1cd 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java @@ -451,15 +451,14 @@ public final class RouteDefinitionHelper { } private static void initRouteInput(CamelContext camelContext, FromDefinition input) { - // resolve property placeholders on route input which hasn't been done - // yet - if (input != null) { - try { - ProcessorDefinitionHelper.resolvePropertyPlaceholders(camelContext, input); - } catch (Exception e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } +// // resolve property placeholders on route input which hasn't been done yet +// if (input != null) { +// try { +// ProcessorDefinitionHelper.resolvePropertyPlaceholders(camelContext, input); +// } catch (Exception e) { +// throw RuntimeCamelException.wrapRuntimeCamelException(e); +// } +// } } private static void initParentAndErrorHandlerBuilder(CamelContext context, RouteDefinition route, List<ProcessorDefinition<?>> abstracts, diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java index f273cc7..e6fb629 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java @@ -28,24 +28,16 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlValue; -import javax.xml.namespace.QName; -import org.apache.camel.AfterPropertiesConfigured; import org.apache.camel.CamelContext; -import org.apache.camel.CamelContextAware; import org.apache.camel.Exchange; import org.apache.camel.Expression; import org.apache.camel.ExpressionFactory; -import org.apache.camel.ExtendedCamelContext; -import org.apache.camel.NoSuchLanguageException; import org.apache.camel.Predicate; import org.apache.camel.model.DefinitionPropertyPlaceholderConfigurer; import org.apache.camel.model.OtherAttributesAware; -import org.apache.camel.spi.Language; +import org.apache.camel.reifier.language.ExpressionReifier; import org.apache.camel.spi.Metadata; -import org.apache.camel.spi.RouteContext; -import org.apache.camel.support.ExpressionToPredicateAdapter; -import org.apache.camel.support.ScriptHelper; import org.apache.camel.util.CollectionStringBuffer; import org.apache.camel.util.ObjectHelper; @@ -122,113 +114,10 @@ public class ExpressionDefinition implements Expression, Predicate, OtherAttribu return sb.toString(); } - public Object evaluate(Exchange exchange) { - return evaluate(exchange, Object.class); - } - - @Override - public <T> T evaluate(Exchange exchange, Class<T> type) { - if (expressionValue == null) { - expressionValue = createExpression(exchange.getContext()); - } - ObjectHelper.notNull(expressionValue, "expressionValue"); - return expressionValue.evaluate(exchange, type); - } - - public void assertMatches(String text, Exchange exchange) throws AssertionError { - if (!matches(exchange)) { - throw new AssertionError(text + getExpression() + " for exchange: " + exchange); - } - } - - @Override - public boolean matches(Exchange exchange) { - if (predicate == null) { - predicate = createPredicate(exchange.getContext()); - } - ObjectHelper.notNull(predicate, "predicate"); - return predicate.matches(exchange); - } - public String getLanguage() { return ""; } - public final Predicate createPredicate(RouteContext routeContext) { - return createPredicate(routeContext.getCamelContext()); - } - - public Predicate createPredicate(CamelContext camelContext) { - if (predicate == null) { - if (getExpressionType() != null) { - predicate = getExpressionType().createPredicate(camelContext); - } else if (getExpressionValue() != null) { - predicate = new ExpressionToPredicateAdapter(getExpressionValue()); - } else if (getExpression() != null) { - ObjectHelper.notNull("language", getLanguage()); - Language language = camelContext.resolveLanguage(getLanguage()); - if (language == null) { - throw new NoSuchLanguageException(getLanguage()); - } - String exp = getExpression(); - // should be true by default - boolean isTrim = getTrim() == null || Boolean.parseBoolean(getTrim()); - // trim if configured to trim - if (exp != null && isTrim) { - exp = exp.trim(); - } - // resolve the expression as it may be an external script from - // the classpath/file etc - exp = ScriptHelper.resolveOptionalExternalScript(camelContext, exp); - - predicate = language.createPredicate(exp); - configurePredicate(camelContext, predicate); - } - } - // inject CamelContext if its aware - if (predicate instanceof CamelContextAware) { - ((CamelContextAware)predicate).setCamelContext(camelContext); - } - return predicate; - } - - public final Expression createExpression(RouteContext routeContext) { - return createExpression(routeContext.getCamelContext()); - } - - @Override - public Expression createExpression(CamelContext camelContext) { - if (getExpressionValue() == null) { - if (getExpressionType() != null) { - setExpressionValue(getExpressionType().createExpression(camelContext)); - } else if (getExpression() != null) { - ObjectHelper.notNull("language", getLanguage()); - Language language = camelContext.resolveLanguage(getLanguage()); - if (language == null) { - throw new NoSuchLanguageException(getLanguage()); - } - String exp = getExpression(); - // should be true by default - boolean isTrim = getTrim() == null || Boolean.parseBoolean(getTrim()); - // trim if configured to trim - if (exp != null && isTrim) { - exp = exp.trim(); - } - // resolve the expression as it may be an external script from - // the classpath/file etc - exp = ScriptHelper.resolveOptionalExternalScript(camelContext, exp); - - setExpressionValue(language.createExpression(exp)); - configureExpression(camelContext, getExpressionValue()); - } - } - // inject CamelContext if its aware - if (getExpressionValue() instanceof CamelContextAware) { - ((CamelContextAware)getExpressionValue()).setCamelContext(camelContext); - } - return getExpressionValue(); - } - public String getExpression() { return expression; } @@ -314,32 +203,39 @@ public class ExpressionDefinition implements Expression, Predicate, OtherAttribu this.expressionType = expressionType; } - protected void configurePredicate(CamelContext camelContext, Predicate predicate) { - // allows to perform additional logic after the properties has been - // configured which may be needed - // in the various camel components outside camel-core - if (predicate instanceof AfterPropertiesConfigured) { - ((AfterPropertiesConfigured)predicate).afterPropertiesConfigured(camelContext); - } + // + // ExpressionFactory + // + + @Override + public Expression createExpression(CamelContext camelContext) { + return ExpressionReifier.reifier(camelContext, this).createExpression(); } - protected void configureExpression(CamelContext camelContext, Expression expression) { - // allows to perform additional logic after the properties has been - // configured which may be needed - // in the various camel components outside camel-core - if (expression instanceof AfterPropertiesConfigured) { - ((AfterPropertiesConfigured)expression).afterPropertiesConfigured(camelContext); + // + // Expression + // + + @Override + public <T> T evaluate(Exchange exchange, Class<T> type) { + if (expressionValue == null) { + expressionValue = createExpression(exchange.getContext()); } + ObjectHelper.notNull(expressionValue, "expressionValue"); + return expressionValue.evaluate(exchange, type); } - /** - * Sets a named property on the object instance using introspection - */ - protected 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); + // + // Predicate + // + + @Override + public boolean matches(Exchange exchange) { + if (predicate == null) { + predicate = ExpressionReifier.reifier(exchange.getContext(), this).createPredicate(); } + ObjectHelper.notNull(predicate, "predicate"); + return predicate.matches(exchange); } + } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java index 1596961..75dd3d0 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java @@ -22,10 +22,6 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; -import org.apache.camel.CamelContext; -import org.apache.camel.Expression; -import org.apache.camel.Predicate; -import org.apache.camel.RuntimeCamelException; import org.apache.camel.spi.Metadata; /** @@ -145,62 +141,4 @@ public class JsonPathExpression extends ExpressionDefinition { return "jsonpath"; } - @Override - public Expression createExpression(CamelContext camelContext) { - if (resultType == null && resultTypeName != null) { - try { - resultType = camelContext.getClassResolver().resolveMandatoryClass(resultTypeName); - } catch (ClassNotFoundException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - return super.createExpression(camelContext); - } - - @Override - protected void configureExpression(CamelContext camelContext, Expression expression) { - if (resultType != null) { - setProperty(camelContext, expression, "resultType", resultType); - } - if (suppressExceptions != null) { - setProperty(camelContext, expression, "suppressExceptions", suppressExceptions); - } - if (allowSimple != null) { - setProperty(camelContext, expression, "allowSimple", allowSimple); - } - if (allowEasyPredicate != null) { - setProperty(camelContext, expression, "allowEasyPredicate", allowEasyPredicate); - } - if (writeAsString != null) { - setProperty(camelContext, expression, "writeAsString", writeAsString); - } - if (headerName != null) { - setProperty(camelContext, expression, "headerName", headerName); - } - super.configureExpression(camelContext, expression); - } - - @Override - protected void configurePredicate(CamelContext camelContext, Predicate predicate) { - if (resultType != null) { - setProperty(camelContext, predicate, "resultType", resultType); - } - if (suppressExceptions != null) { - setProperty(camelContext, predicate, "suppressExceptions", suppressExceptions); - } - if (allowSimple != null) { - setProperty(camelContext, predicate, "allowSimple", allowSimple); - } - if (allowEasyPredicate != null) { - setProperty(camelContext, predicate, "allowEasyPredicate", allowEasyPredicate); - } - if (writeAsString != null) { - setProperty(camelContext, predicate, "writeAsString", writeAsString); - } - if (headerName != null) { - setProperty(camelContext, predicate, "headerName", headerName); - } - super.configurePredicate(camelContext, predicate); - } - } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java index 587b24c..fc65cfd 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java @@ -22,12 +22,6 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; -import org.apache.camel.AfterPropertiesConfigured; -import org.apache.camel.CamelContext; -import org.apache.camel.Expression; -import org.apache.camel.Predicate; -import org.apache.camel.RuntimeCamelException; -import org.apache.camel.spi.Language; import org.apache.camel.spi.Metadata; import org.apache.camel.util.ObjectHelper; @@ -151,48 +145,6 @@ public class MethodCallExpression extends ExpressionDefinition { } } - @Override - public Expression createExpression(CamelContext camelContext) { - if (beanType == null && beanTypeName != null) { - try { - beanType = camelContext.getClassResolver().resolveMandatoryClass(beanTypeName); - } catch (ClassNotFoundException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - - // special for bean language where we need to configure it first - Language lan = camelContext.resolveLanguage("bean"); - configureLanguage(camelContext, lan); - // .. and create expression with null value as we use the configured - // properties instead - Expression exp = lan.createExpression(null); - if (exp instanceof AfterPropertiesConfigured) { - ((AfterPropertiesConfigured)exp).afterPropertiesConfigured(camelContext); - } - return exp; - } - - protected void configureLanguage(CamelContext camelContext, Language language) { - if (instance != null) { - setProperty(camelContext, language, "bean", instance); - } - if (beanType != null) { - setProperty(camelContext, language, "beanType", beanType); - } - if (ref != null) { - setProperty(camelContext, language, "ref", ref); - } - if (method != null) { - setProperty(camelContext, language, "method", method); - } - } - - @Override - public Predicate createPredicate(CamelContext camelContext) { - return (Predicate)createExpression(camelContext); - } - private String beanName() { if (ref != null) { return ref; diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java index 3411cb7..66c7d59 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java @@ -59,22 +59,4 @@ public abstract class NamespaceAwareExpression extends ExpressionDefinition impl this.namespaces = namespaces; } - @Override - protected void configureExpression(CamelContext camelContext, Expression expression) { - configureNamespaceAware(expression); - super.configureExpression(camelContext, expression); - } - - @Override - protected void configurePredicate(CamelContext camelContext, Predicate predicate) { - configureNamespaceAware(predicate); - super.configurePredicate(camelContext, predicate); - } - - protected void configureNamespaceAware(Object builder) { - if (namespaces != null && builder instanceof NamespaceAware) { - NamespaceAware namespaceAware = (NamespaceAware)builder; - namespaceAware.setNamespaces(namespaces); - } - } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java index ba19330..5951d6f 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java @@ -22,11 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; -import org.apache.camel.CamelContext; import org.apache.camel.Expression; -import org.apache.camel.Predicate; -import org.apache.camel.RuntimeCamelException; -import org.apache.camel.builder.SimpleBuilder; import org.apache.camel.spi.Metadata; /** @@ -79,31 +75,4 @@ public class SimpleExpression extends ExpressionDefinition { this.resultTypeName = resultTypeName; } - @Override - public Expression createExpression(CamelContext camelContext) { - if (resultType == null && resultTypeName != null) { - try { - resultType = camelContext.getClassResolver().resolveMandatoryClass(resultTypeName); - } catch (ClassNotFoundException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - - String exp = getExpression(); - // should be true by default - boolean isTrim = getTrim() == null || Boolean.parseBoolean(getTrim()); - if (exp != null && isTrim) { - exp = exp.trim(); - } - - SimpleBuilder answer = new SimpleBuilder(exp); - answer.setResultType(resultType); - return answer; - } - - @Override - public Predicate createPredicate(CamelContext camelContext) { - // SimpleBuilder is also a Predicate - return (Predicate)createExpression(camelContext); - } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java index 3883f05..bd9e4ed 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java @@ -21,12 +21,8 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.camel.CamelContext; -import org.apache.camel.Expression; -import org.apache.camel.Predicate; import org.apache.camel.language.tokenizer.TokenizeLanguage; import org.apache.camel.spi.Metadata; -import org.apache.camel.support.ExpressionToPredicateAdapter; /** * To use Camel message body or header with a tokenizer in Camel expressions or @@ -198,45 +194,6 @@ public class TokenizerExpression extends ExpressionDefinition { } @Override - public Expression createExpression(CamelContext camelContext) { - // special for new line tokens, if defined from XML then its 2 - // characters, so we replace that back to a single char - if (token.startsWith("\\n")) { - token = '\n' + token.substring(2); - } - - TokenizeLanguage language = new TokenizeLanguage(); - language.setToken(token); - language.setEndToken(endToken); - language.setInheritNamespaceTagName(inheritNamespaceTagName); - language.setHeaderName(headerName); - language.setGroupDelimiter(groupDelimiter); - if (regex != null) { - language.setRegex(Boolean.parseBoolean(regex)); - } - if (xml != null) { - language.setXml(Boolean.parseBoolean(xml)); - } - if (includeTokens != null) { - language.setIncludeTokens(Boolean.parseBoolean(includeTokens)); - } - if (group != null && !"0".equals(group)) { - language.setGroup(group); - } - - if (skipFirst != null) { - language.setSkipFirst(Boolean.parseBoolean(skipFirst)); - } - return language.createExpression(); - } - - @Override - public Predicate createPredicate(CamelContext camelContext) { - Expression exp = createExpression(camelContext); - return ExpressionToPredicateAdapter.toPredicate(exp); - } - - @Override public String toString() { if (endToken != null) { return "tokenize{body() using tokens: " + token + "..." + endToken + "}"; 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 93a5997..d206a4e 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 @@ -16,6 +16,9 @@ */ package org.apache.camel.model.language; +import java.util.HashMap; +import java.util.Map; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -96,32 +99,4 @@ public class XMLTokenizerExpression extends NamespaceAwareExpression { this.group = group; } - @Override - protected void configureExpression(CamelContext camelContext, Expression expression) { - if (headerName != null) { - setProperty(camelContext, expression, "headerName", headerName); - } - if (mode != null) { - setProperty(camelContext, expression, "mode", mode); - } - if (group != null) { - setProperty(camelContext, expression, "group", group); - } - super.configureExpression(camelContext, expression); - } - - @Override - protected void configurePredicate(CamelContext camelContext, Predicate predicate) { - if (headerName != null) { - setProperty(camelContext, predicate, "headerName", headerName); - } - if (mode != null) { - setProperty(camelContext, predicate, "mode", mode); - } - if (group != null) { - setProperty(camelContext, predicate, "group", group); - } - super.configurePredicate(camelContext, predicate); - } - } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java index 4cad7f6..8acd6da 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java @@ -16,6 +16,9 @@ */ package org.apache.camel.model.language; +import java.util.HashMap; +import java.util.Map; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -190,6 +193,14 @@ public class XPathExpression extends NamespaceAwareExpression { this.headerName = headerName; } + public XPathFactory getXPathFactory() { + return xpathFactory; + } + + public void setXPathFactory(XPathFactory xpathFactory) { + this.xpathFactory = xpathFactory; + } + public String getThreadSafety() { return threadSafety; } @@ -210,107 +221,6 @@ public class XPathExpression extends NamespaceAwareExpression { this.threadSafety = threadSafety; } - @Override - public Expression createExpression(CamelContext camelContext) { - if (documentType == null && documentTypeName != null) { - try { - documentType = camelContext.getClassResolver().resolveMandatoryClass(documentTypeName); - } catch (ClassNotFoundException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - if (resultType == null && resultTypeName != null) { - try { - resultType = camelContext.getClassResolver().resolveMandatoryClass(resultTypeName); - } catch (ClassNotFoundException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - resolveXPathFactory(camelContext); - return super.createExpression(camelContext); - } - - @Override - public Predicate createPredicate(CamelContext camelContext) { - if (documentType == null && documentTypeName != null) { - try { - documentType = camelContext.getClassResolver().resolveMandatoryClass(documentTypeName); - } catch (ClassNotFoundException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - resolveXPathFactory(camelContext); - return super.createPredicate(camelContext); - } - - @Override - protected void configureExpression(CamelContext camelContext, Expression expression) { - boolean isSaxon = getSaxon() != null && Boolean.parseBoolean(getSaxon()); - boolean isLogNamespaces = getLogNamespaces() != null && Boolean.parseBoolean(getLogNamespaces()); - - if (documentType != null) { - setProperty(camelContext, expression, "documentType", documentType); - } - if (resultType != null) { - setProperty(camelContext, expression, "resultType", resultType); - } - if (isSaxon) { - setProperty(camelContext, expression, "useSaxon", true); - } - if (xpathFactory != null) { - setProperty(camelContext, expression, "xPathFactory", xpathFactory); - } - if (objectModel != null) { - setProperty(camelContext, expression, "objectModelUri", objectModel); - } - if (threadSafety != null) { - setProperty(camelContext, expression, "threadSafety", threadSafety); - } - if (isLogNamespaces) { - setProperty(camelContext, expression, "logNamespaces", true); - } - if (ObjectHelper.isNotEmpty(getHeaderName())) { - setProperty(camelContext, expression, "headerName", getHeaderName()); - } - // moved the super configuration to the bottom so that the namespace - // init picks up the newly set XPath Factory - super.configureExpression(camelContext, expression); - } - - @Override - protected void configurePredicate(CamelContext camelContext, Predicate predicate) { - boolean isSaxon = getSaxon() != null && Boolean.parseBoolean(getSaxon()); - boolean isLogNamespaces = getLogNamespaces() != null && Boolean.parseBoolean(getLogNamespaces()); - - if (documentType != null) { - setProperty(camelContext, predicate, "documentType", documentType); - } - if (resultType != null) { - setProperty(camelContext, predicate, "resultType", resultType); - } - if (isSaxon) { - setProperty(camelContext, predicate, "useSaxon", true); - } - if (xpathFactory != null) { - setProperty(camelContext, predicate, "xPathFactory", xpathFactory); - } - if (objectModel != null) { - setProperty(camelContext, predicate, "objectModelUri", objectModel); - } - if (threadSafety != null) { - setProperty(camelContext, predicate, "threadSafety", threadSafety); - } - if (isLogNamespaces) { - setProperty(camelContext, predicate, "logNamespaces", true); - } - if (ObjectHelper.isNotEmpty(getHeaderName())) { - setProperty(camelContext, predicate, "headerName", getHeaderName()); - } - // moved the super configuration to the bottom so that the namespace - // init picks up the newly set XPath Factory - super.configurePredicate(camelContext, predicate); - } - private void resolveXPathFactory(CamelContext camelContext) { // Factory and Object Model can be set simultaneously. The underlying // XPathBuilder allows for setting Saxon too, as it is simply a shortcut diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java index c84679e..eaa9e27 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java @@ -16,6 +16,9 @@ */ package org.apache.camel.model.language; +import java.util.HashMap; +import java.util.Map; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -25,9 +28,7 @@ import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.CamelContext; import org.apache.camel.Expression; import org.apache.camel.Predicate; -import org.apache.camel.RuntimeCamelException; import org.apache.camel.spi.Metadata; -import org.apache.camel.util.ObjectHelper; /** * To use XQuery (XML) in Camel expressions or predicates. @@ -92,39 +93,4 @@ public class XQueryExpression extends NamespaceAwareExpression { this.headerName = headerName; } - @Override - public Expression createExpression(CamelContext camelContext) { - if (resultType == null && type != null) { - try { - resultType = camelContext.getClassResolver().resolveMandatoryClass(type); - } catch (ClassNotFoundException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - - return super.createExpression(camelContext); - } - - @Override - protected void configureExpression(CamelContext camelContext, Expression expression) { - if (resultType != null) { - setProperty(camelContext, expression, "resultType", resultType); - } - if (ObjectHelper.isNotEmpty(getHeaderName())) { - setProperty(camelContext, expression, "headerName", getHeaderName()); - } - super.configureExpression(camelContext, expression); - } - - @Override - protected void configurePredicate(CamelContext camelContext, Predicate predicate) { - if (resultType != null) { - setProperty(camelContext, predicate, "resultType", resultType); - } - if (ObjectHelper.isNotEmpty(getHeaderName())) { - setProperty(camelContext, predicate, "headerName", getHeaderName()); - } - super.configurePredicate(camelContext, predicate); - } - } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java index cefcfab..17eac69 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java @@ -17,6 +17,11 @@ package org.apache.camel.reifier; import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.model.ExpressionSubElementDefinition; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.reifier.language.ExpressionReifier; import org.apache.camel.spi.RouteContext; import org.apache.camel.support.CamelContextHelper; @@ -56,4 +61,20 @@ public abstract class AbstractReifier { return CamelContextHelper.parse(camelContext, clazz, text); } + protected Expression createExpression(ExpressionDefinition expression) { + return ExpressionReifier.reifier(camelContext, expression).createExpression(); + } + + protected Expression createExpression(ExpressionSubElementDefinition expression) { + return ExpressionReifier.reifier(camelContext, expression).createExpression(); + } + + protected Predicate createPredicate(ExpressionDefinition expression) { + return ExpressionReifier.reifier(camelContext, expression).createPredicate(); + } + + protected Predicate createPredicate(ExpressionSubElementDefinition expression) { + return ExpressionReifier.reifier(camelContext, expression).createPredicate(); + } + } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java index 81f129f..ce82896 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java @@ -54,7 +54,7 @@ public class AggregateReifier extends ProcessorReifier<AggregateDefinition> { CamelInternalProcessor internal = new CamelInternalProcessor(camelContext, childProcessor); internal.addAdvice(new CamelInternalProcessor.UnitOfWorkProcessorAdvice(routeContext, camelContext)); - Expression correlation = definition.getExpression().createExpression(routeContext); + Expression correlation = createExpression(definition.getExpression()); AggregationStrategy strategy = createAggregationStrategy(routeContext); boolean parallel = parseBoolean(definition.getParallelProcessing()); @@ -112,7 +112,7 @@ public class AggregateReifier extends ProcessorReifier<AggregateDefinition> { answer.setOptimisticLocking(parseBoolean(definition.getOptimisticLocking())); } if (definition.getCompletionPredicate() != null) { - Predicate predicate = definition.getCompletionPredicate().createPredicate(routeContext); + Predicate predicate = createPredicate(definition.getCompletionPredicate()); answer.setCompletionPredicate(predicate); } else if (strategy instanceof Predicate) { // if aggregation strategy implements predicate and was not @@ -121,7 +121,7 @@ public class AggregateReifier extends ProcessorReifier<AggregateDefinition> { answer.setCompletionPredicate((Predicate)strategy); } if (definition.getCompletionTimeoutExpression() != null) { - Expression expression = definition.getCompletionTimeoutExpression().createExpression(routeContext); + Expression expression = createExpression(definition.getCompletionTimeoutExpression()); answer.setCompletionTimeoutExpression(expression); } if (definition.getCompletionTimeout() != null) { @@ -131,7 +131,7 @@ public class AggregateReifier extends ProcessorReifier<AggregateDefinition> { answer.setCompletionInterval(parseLong(definition.getCompletionInterval())); } if (definition.getCompletionSizeExpression() != null) { - Expression expression = definition.getCompletionSizeExpression().createExpression(routeContext); + Expression expression = createExpression(definition.getCompletionSizeExpression()); answer.setCompletionSizeExpression(expression); } if (definition.getCompletionSize() != null) { diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java index f8a9ae5..82fbeb9 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java @@ -56,7 +56,7 @@ public class CatchReifier extends ProcessorReifier<CatchDefinition> { Predicate when = null; if (definition.getOnWhen() != null) { - when = definition.getOnWhen().getExpression().createPredicate(routeContext); + when = createPredicate(definition.getOnWhen().getExpression()); } return new CatchProcessor(definition.getExceptionClasses(), childProcessor, when, null); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java index 8109f5b..9c8a984 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java @@ -22,7 +22,6 @@ import org.apache.camel.Expression; import org.apache.camel.Processor; import org.apache.camel.model.DelayDefinition; import org.apache.camel.model.ProcessorDefinition; -import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.processor.Delayer; import org.apache.camel.spi.RouteContext; @@ -49,11 +48,7 @@ public class DelayReifier extends ExpressionReifier<DelayDefinition> { } private Expression createAbsoluteTimeDelayExpression() { - ExpressionDefinition expr = definition.getExpression(); - if (expr != null) { - return expr.createExpression(routeContext); - } - return null; + return definition.getExpression() != null ? createExpression(definition.getExpression()) : null; } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java index 0acf744..015d6be 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java @@ -34,7 +34,7 @@ public class DynamicRouterReifier extends ExpressionReifier<DynamicRouterDefinit @Override public Processor createProcessor() throws Exception { - Expression expression = definition.getExpression().createExpression(routeContext); + Expression expression = createExpression(definition.getExpression()); String delimiter = definition.getUriDelimiter() != null ? definition.getUriDelimiter() : DynamicRouterDefinition.DEFAULT_DELIMITER; DynamicRouter dynamicRouter = new DynamicRouter(camelContext, expression, delimiter); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java index 2263a8f..09e8dfa 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java @@ -34,7 +34,7 @@ public class EnrichReifier extends ExpressionReifier<EnrichDefinition> { @Override public Processor createProcessor() throws Exception { - Expression exp = definition.getExpression().createExpression(routeContext); + Expression exp = createExpression(definition.getExpression()); boolean isShareUnitOfWork = definition.getShareUnitOfWork() != null && Boolean.parseBoolean(definition.getShareUnitOfWork()); boolean isIgnoreInvalidEndpoint = definition.getIgnoreInvalidEndpoint() != null && Boolean.parseBoolean(definition.getIgnoreInvalidEndpoint()); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java index 30772b6..548c0e8 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java @@ -45,7 +45,7 @@ abstract class ExpressionReifier<T extends ExpressionNode> extends ProcessorReif * @return the created predicate */ protected Predicate createPredicate() { - return definition.getExpression().createPredicate(routeContext); + return createPredicate(definition.getExpression()); } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java index 6651036..7c5ae5c 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java @@ -38,7 +38,7 @@ public class IdempotentConsumerReifier extends ExpressionReifier<IdempotentConsu IdempotentRepository idempotentRepository = resolveMessageIdRepository(routeContext); ObjectHelper.notNull(idempotentRepository, "idempotentRepository", definition); - Expression expression = definition.getExpression().createExpression(routeContext); + Expression expression = createExpression(definition.getExpression()); // these boolean should be true by default boolean eager = definition.getEager() == null || Boolean.parseBoolean(definition.getEager()); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java index 477d4be..ec5a8bc 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java @@ -39,9 +39,9 @@ public class LoopReifier extends ExpressionReifier<LoopDefinition> { Predicate predicate = null; Expression expression = null; if (isWhile) { - predicate = definition.getExpression().createPredicate(routeContext); + predicate = createPredicate(definition.getExpression()); } else { - expression = definition.getExpression().createExpression(routeContext); + expression = createExpression(definition.getExpression()); } return new LoopProcessor(camelContext, output, expression, predicate, isCopy); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java index eb47895..19066fe 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java @@ -72,7 +72,7 @@ public class OnCompletionReifier extends ProcessorReifier<OnCompletionDefinition Predicate when = null; if (definition.getOnWhen() != null) { - when = definition.getOnWhen().getExpression().createPredicate(routeContext); + when = createPredicate(definition.getOnWhen().getExpression()); } boolean shutdownThreadPool = willCreateNewThreadPool(definition, isParallelProcessing); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java index 5f94c72..8f63f08 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java @@ -100,12 +100,12 @@ public class OnExceptionReifier extends ProcessorReifier<OnExceptionDefinition> Predicate when = null; if (definition.getOnWhen() != null) { - when = definition.getOnWhen().getExpression().createPredicate(routeContext); + when = createPredicate(definition.getOnWhen().getExpression()); } Predicate handle = null; if (definition.getHandled() != null) { - handle = definition.getHandled().createPredicate(routeContext); + handle = createPredicate(definition.getHandled()); } return new CatchProcessor(classes, childProcessor, when, handle); @@ -122,20 +122,23 @@ public class OnExceptionReifier extends ProcessorReifier<OnExceptionDefinition> } private void setHandledFromExpressionType() { - if (definition.getHandled() != null && definition.getHandledPolicy() == null && routeContext != null) { - definition.handled(definition.getHandled().createPredicate(routeContext)); + // TODO: should not modify + if (definition.getHandled() != null && definition.getHandledPolicy() == null && camelContext != null) { + definition.handled(createPredicate(definition.getHandled())); } } private void setContinuedFromExpressionType() { - if (definition.getContinued() != null && definition.getContinuedPolicy() == null && routeContext != null) { - definition.continued(definition.getContinued().createPredicate(routeContext)); + // TODO: should not modify + if (definition.getContinued() != null && definition.getContinuedPolicy() == null && camelContext != null) { + definition.continued(createPredicate(definition.getContinued())); } } private void setRetryWhileFromExpressionType() { - if (definition.getRetryWhile() != null && definition.getRetryWhilePolicy() == null && routeContext != null) { - definition.retryWhile(definition.getRetryWhile().createPredicate(routeContext)); + // TODO: should not modify + if (definition.getRetryWhile() != null && definition.getRetryWhilePolicy() == null && camelContext != null) { + definition.retryWhile(createPredicate(definition.getRetryWhile())); } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java index 05d8555..b13d4c3 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java @@ -38,7 +38,7 @@ public class PollEnrichReifier extends ProcessorReifier<PollEnrichDefinition> { // if no timeout then we should block, and there use a negative timeout long time = definition.getTimeout() != null ? parseLong(definition.getTimeout()) : -1; boolean isIgnoreInvalidEndpoint = definition.getIgnoreInvalidEndpoint() != null && parseBoolean(definition.getIgnoreInvalidEndpoint()); - Expression exp = definition.getExpression().createExpression(routeContext); + Expression exp = createExpression(definition.getExpression()); PollEnricher enricher = new PollEnricher(exp, time); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java index 68cc91c..7ad3b7f 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java @@ -43,7 +43,7 @@ public class RecipientListReifier extends ProcessorReifier<RecipientListDefiniti @Override public Processor createProcessor() throws Exception { - final Expression expression = definition.getExpression().createExpression(routeContext); + final Expression expression = createExpression(definition.getExpression()); boolean isParallelProcessing = definition.getParallelProcessing() != null && parseBoolean(definition.getParallelProcessing()); boolean isStreaming = definition.getStreaming() != null && parseBoolean(definition.getStreaming()); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java index ca70fb1..5168421 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java @@ -72,7 +72,7 @@ public class ResequenceReifier extends ProcessorReifier<ResequenceDefinition> { @SuppressWarnings("deprecation") protected Resequencer createBatchResequencer(RouteContext routeContext, BatchResequencerConfig config) throws Exception { Processor processor = this.createChildProcessor(true); - Expression expression = definition.getExpression().createExpression(routeContext); + Expression expression = createExpression(definition.getExpression()); // and wrap in unit of work CamelInternalProcessor internal = new CamelInternalProcessor(camelContext, processor); @@ -106,7 +106,7 @@ public class ResequenceReifier extends ProcessorReifier<ResequenceDefinition> { */ protected StreamResequencer createStreamResequencer(RouteContext routeContext, StreamResequencerConfig config) throws Exception { Processor processor = this.createChildProcessor(true); - Expression expression = definition.getExpression().createExpression(routeContext); + Expression expression = createExpression(definition.getExpression()); CamelInternalProcessor internal = new CamelInternalProcessor(camelContext, processor); internal.addAdvice(new CamelInternalProcessor.UnitOfWorkProcessorAdvice(routeContext, camelContext)); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java index d1b5659..d5a39e0 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java @@ -36,7 +36,7 @@ public class RoutingSlipReifier extends ExpressionReifier<RoutingSlipDefinition< @Override public Processor createProcessor() throws Exception { - Expression expression = definition.getExpression().createExpression(routeContext); + Expression expression = createExpression(definition.getExpression()); String delimiter = definition.getUriDelimiter() != null ? definition.getUriDelimiter() : DEFAULT_DELIMITER; RoutingSlip routingSlip = new RoutingSlip(camelContext, expression, delimiter); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java index 36ad49f..e7f6568 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java @@ -31,7 +31,7 @@ public class ScriptReifier extends ExpressionReifier<ScriptDefinition> { @Override public Processor createProcessor() throws Exception { - Expression expr = definition.getExpression().createExpression(routeContext); + Expression expr = createExpression(definition.getExpression()); return new ScriptProcessor(expr); } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java index 2490e02..840bc37 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java @@ -31,7 +31,7 @@ public class SetBodyReifier extends ExpressionReifier<SetBodyDefinition> { @Override public Processor createProcessor() throws Exception { - Expression expr = definition.getExpression().createExpression(routeContext); + Expression expr = createExpression(definition.getExpression()); return new SetBodyProcessor(expr); } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java index bc26948..4214c73 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java @@ -34,7 +34,7 @@ public class SetHeaderReifier extends ExpressionReifier<SetHeaderDefinition> { @Override public Processor createProcessor() throws Exception { ObjectHelper.notNull(definition.getName(), "headerName"); - Expression expr = definition.getExpression().createExpression(routeContext); + Expression expr = createExpression(definition.getExpression()); Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(definition.getName(), camelContext); return new SetHeaderProcessor(nameExpr, expr); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java index dd779bc..42da14b 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java @@ -34,7 +34,7 @@ public class SetPropertyReifier extends ExpressionReifier<SetPropertyDefinition> @Override public Processor createProcessor() throws Exception { ObjectHelper.notNull(definition.getName(), "propertyName", this); - Expression expr = definition.getExpression().createExpression(routeContext); + Expression expr = createExpression(definition.getExpression()); Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(definition.getName(), camelContext); return new SetPropertyProcessor(nameExpr, expr); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java index c7e30dd..dfbf103 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java @@ -57,7 +57,7 @@ public class SortReifier<T, U extends SortDefinition<T>> extends ExpressionReifi if (definition.getExpression() == null) { exp = bodyExpression(); } else { - exp = definition.getExpression().createExpression(routeContext); + exp = createExpression(definition.getExpression()); } return new SortProcessor<T>(exp, definition.getComparator()); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java index d678766..d532049 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java @@ -57,7 +57,7 @@ public class SplitReifier extends ExpressionReifier<SplitDefinition> { definition.setOnPrepare(CamelContextHelper.mandatoryLookup(camelContext, definition.getOnPrepareRef(), Processor.class)); } - Expression exp = definition.getExpression().createExpression(routeContext); + Expression exp = createExpression(definition.getExpression()); Splitter answer = new Splitter(camelContext, exp, childProcessor, definition.getAggregationStrategy(), isParallelProcessing, threadPool, shutdownThreadPool, isStreaming, definition.isStopOnException(), timeout, definition.getOnPrepare(), isShareUnitOfWork, isParallelAggregate, diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java index 7c69045..356772a 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java @@ -22,7 +22,6 @@ import org.apache.camel.Expression; import org.apache.camel.Processor; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.ThrottleDefinition; -import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.processor.Throttler; import org.apache.camel.spi.RouteContext; @@ -42,14 +41,14 @@ public class ThrottleReifier extends ExpressionReifier<ThrottleDefinition> { long period = definition.getTimePeriodMillis() != null ? definition.getTimePeriodMillis() : 1000L; // max requests per period is mandatory - Expression maxRequestsExpression = createMaxRequestsPerPeriodExpression(routeContext); + Expression maxRequestsExpression = createMaxRequestsPerPeriodExpression(); if (maxRequestsExpression == null) { throw new IllegalArgumentException("MaxRequestsPerPeriod expression must be provided on " + this); } Expression correlation = null; if (definition.getCorrelationExpression() != null) { - correlation = definition.getCorrelationExpression().createExpression(routeContext); + correlation = createExpression(definition.getCorrelationExpression()); } boolean reject = definition.getRejectExecution() != null && definition.getRejectExecution(); @@ -67,11 +66,7 @@ public class ThrottleReifier extends ExpressionReifier<ThrottleDefinition> { } private Expression createMaxRequestsPerPeriodExpression() { - ExpressionDefinition expr = definition.getExpression(); - if (expr != null) { - return expr.createExpression(routeContext); - } - return null; + return definition.getExpression() != null ? createExpression(definition.getExpression()) : null; } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java index bc0de91..0532fc0 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java @@ -31,7 +31,7 @@ public class TransformReifier extends ExpressionReifier<TransformDefinition> { @Override public Processor createProcessor() throws Exception { - Expression expr = definition.getExpression().createExpression(routeContext); + Expression expr = createExpression(definition.getExpression()); return new TransformProcessor(expr); } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java index f6ab5fc..30fbeb3 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java @@ -31,7 +31,7 @@ public class ValidateReifier extends ExpressionReifier<ValidateDefinition> { @Override public Processor createProcessor() throws Exception { - Predicate pred = definition.getExpression().createPredicate(routeContext); + Predicate pred = createPredicate(definition.getExpression()); return new PredicateValidatingProcessor(pred); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java index b720c1a..e10bb92 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java @@ -71,7 +71,7 @@ public class WireTapReifier extends ToDynamicReifier<WireTapDefinition<?>> { answer.addNewExchangeProcessor(definition.getNewExchangeProcessor()); } if (definition.getNewExchangeExpression() != null) { - answer.setNewExchangeExpression(definition.getNewExchangeExpression().createExpression(routeContext)); + answer.setNewExchangeExpression(createExpression(definition.getNewExchangeExpression())); } if (definition.getHeaders() != null && !definition.getHeaders().isEmpty()) { for (SetHeaderDefinition header : definition.getHeaders()) { diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java new file mode 100644 index 0000000..3c905a2 --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java @@ -0,0 +1,200 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.BiFunction; + +import org.apache.camel.AfterPropertiesConfigured; +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.Expression; +import org.apache.camel.NoSuchLanguageException; +import org.apache.camel.Predicate; +import org.apache.camel.model.ExpressionSubElementDefinition; +import org.apache.camel.model.language.ConstantExpression; +import org.apache.camel.model.language.ExchangePropertyExpression; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.GroovyExpression; +import org.apache.camel.model.language.HeaderExpression; +import org.apache.camel.model.language.Hl7TerserExpression; +import org.apache.camel.model.language.JsonPathExpression; +import org.apache.camel.model.language.LanguageExpression; +import org.apache.camel.model.language.MethodCallExpression; +import org.apache.camel.model.language.MvelExpression; +import org.apache.camel.model.language.OgnlExpression; +import org.apache.camel.model.language.RefExpression; +import org.apache.camel.model.language.SimpleExpression; +import org.apache.camel.model.language.SpELExpression; +import org.apache.camel.model.language.TokenizerExpression; +import org.apache.camel.model.language.XMLTokenizerExpression; +import org.apache.camel.model.language.XPathExpression; +import org.apache.camel.model.language.XQueryExpression; +import org.apache.camel.reifier.AbstractReifier; +import org.apache.camel.spi.Language; +import org.apache.camel.support.CamelContextHelper; +import org.apache.camel.support.ExpressionToPredicateAdapter; +import org.apache.camel.support.PropertyBindingSupport; +import org.apache.camel.support.ScriptHelper; +import org.apache.camel.util.ObjectHelper; + +public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractReifier { + + private static final Map<Class<?>, BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>>> EXPRESSIONS; + + static { + Map<Class<?>, BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>>> map = new LinkedHashMap<>(); + map.put(ConstantExpression.class, ExpressionReifier::new); + map.put(ExchangePropertyExpression.class, ExpressionReifier::new); + map.put(ExpressionDefinition.class, ExpressionReifier::new); + map.put(GroovyExpression.class, ExpressionReifier::new); + map.put(HeaderExpression.class, ExpressionReifier::new); + map.put(Hl7TerserExpression.class, ExpressionReifier::new); + map.put(JsonPathExpression.class, JsonPathExpressionReifier::new); + map.put(LanguageExpression.class, ExpressionReifier::new); + map.put(MethodCallExpression.class, MethodCallExpressionReifier::new); + map.put(MvelExpression.class, ExpressionReifier::new); + map.put(OgnlExpression.class, ExpressionReifier::new); + map.put(RefExpression.class, ExpressionReifier::new); + map.put(SimpleExpression.class, SimpleExpressionReifier::new); + map.put(SpELExpression.class, ExpressionReifier::new); + map.put(TokenizerExpression.class, TokenizerExpressionReifier::new); + map.put(XMLTokenizerExpression.class, XMLTokenizerExpressionReifier::new); + map.put(XPathExpression.class, XPathExpressionReifier::new); + map.put(XQueryExpression.class, XQueryExpressionReifier::new); + EXPRESSIONS = map; + } + + protected final T definition; + + public ExpressionReifier(CamelContext camelContext, T definition) { + super(camelContext); + this.definition = definition; + } + + public static ExpressionReifier<? extends ExpressionDefinition> reifier(CamelContext camelContext, ExpressionSubElementDefinition definition) { + return reifier(camelContext, definition.getExpressionType()); + } + + public static ExpressionReifier<? extends ExpressionDefinition> reifier(CamelContext camelContext, ExpressionDefinition definition) { + BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>> reifier = EXPRESSIONS.get(definition.getClass()); + if (reifier != null) { + return reifier.apply(camelContext, definition); + } + throw new IllegalStateException("Unsupported definition: " + definition); + } + + public Expression createExpression() { + Expression expression = definition.getExpressionValue(); + if (expression == null) { + if (definition.getExpressionType() != null) { + expression = reifier(camelContext, definition.getExpressionType()).createExpression(); + } else if (definition.getExpression() != null) { + ObjectHelper.notNull("language", definition.getLanguage()); + Language language = camelContext.resolveLanguage(definition.getLanguage()); + if (language == null) { + throw new NoSuchLanguageException(definition.getLanguage()); + } + String exp = CamelContextHelper.parseText(camelContext, definition.getExpression()); + // should be true by default + boolean isTrim = definition.getTrim() == null || CamelContextHelper.parseBoolean(camelContext, definition.getTrim()); + // trim if configured to trim + if (exp != null && isTrim) { + exp = exp.trim(); + } + // resolve the expression as it may be an external script from + // the classpath/file etc + exp = ScriptHelper.resolveOptionalExternalScript(camelContext, exp); + expression = language.createExpression(exp); + configureExpression(expression); + } + } + // inject CamelContext if its aware + if (expression instanceof CamelContextAware) { + ((CamelContextAware) expression).setCamelContext(camelContext); + } + return expression; + } + + public Predicate createPredicate() { + Predicate predicate = definition.getPredicate(); + if (predicate == null) { + if (definition.getExpressionType() != null) { + predicate = reifier(camelContext, definition.getExpressionType()).createPredicate(); + } else if (definition.getExpressionValue() != null) { + predicate = new ExpressionToPredicateAdapter(definition.getExpressionValue()); + } else if (definition.getExpression() != null) { + ObjectHelper.notNull("language", definition.getLanguage()); + Language language = camelContext.resolveLanguage(definition.getLanguage()); + if (language == null) { + throw new NoSuchLanguageException(definition.getLanguage()); + } + String exp = CamelContextHelper.parseText(camelContext, definition.getExpression()); + // should be true by default + boolean isTrim = definition.getTrim() == null || CamelContextHelper.parseBoolean(camelContext, definition.getTrim()); + // trim if configured to trim + if (exp != null && isTrim) { + exp = exp.trim(); + } + // resolve the expression as it may be an external script from + // the classpath/file etc + exp = ScriptHelper.resolveOptionalExternalScript(camelContext, exp); + + predicate = language.createPredicate(exp); + configurePredicate(predicate); + } + } + // inject CamelContext if its aware + if (predicate instanceof CamelContextAware) { + ((CamelContextAware) predicate).setCamelContext(camelContext); + } + return predicate; + } + + protected void configurePredicate(Predicate predicate) { + // allows to perform additional logic after the properties has been + // configured which may be needed + // in the various camel components outside camel-core + if (predicate instanceof AfterPropertiesConfigured) { + ((AfterPropertiesConfigured)predicate).afterPropertiesConfigured(camelContext); + } + } + + protected void configureExpression(Expression expression) { + // allows to perform additional logic after the properties has been + // configured which may be needed + // in the various camel components outside camel-core + if (expression instanceof AfterPropertiesConfigured) { + ((AfterPropertiesConfigured)expression).afterPropertiesConfigured(camelContext); + } + } + + protected void setProperties(Object target, Map<String, Object> properties) { + properties.entrySet().removeIf(e -> e.getValue() == null); + PropertyBindingSupport.build().bind(camelContext, target, properties); + } + + protected Object or(Object a, Object b) { + return a != null ? a : b; + } + + protected Object asRef(String s) { + return s != null ? s.startsWith("#") ? s : "#" + s : null; + } + +} 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 new file mode 100644 index 0000000..ea59a1c --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.JsonPathExpression; + +public class JsonPathExpressionReifier extends ExpressionReifier<JsonPathExpression> { + + public JsonPathExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (JsonPathExpression) definition); + } + + @Override + protected void configureExpression(Expression expression) { + bindProperties(expression); + super.configureExpression(expression); + } + + @Override + protected void configurePredicate(Predicate predicate) { + bindProperties(predicate); + super.configurePredicate(predicate); + } + + private void bindProperties(Object target) { + Map<String, Object> properties = new HashMap<>(); + properties.put("resultType", or(definition.getResultType(), definition.getResultTypeName())); + properties.put("suppressExceptions", definition.getSuppressExceptions()); + properties.put("allowSimple", definition.getAllowSimple()); + properties.put("allowEasyPredicate", definition.getAllowEasyPredicate()); + properties.put("writeAsString", definition.getWriteAsString()); + properties.put("headerName", definition.getHeaderName()); + setProperties(target, properties); + } + + +} 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 new file mode 100644 index 0000000..cdc14a4 --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.AfterPropertiesConfigured; +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.MethodCallExpression; +import org.apache.camel.spi.Language; + +public class MethodCallExpressionReifier extends ExpressionReifier<MethodCallExpression> { + + public MethodCallExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (MethodCallExpression) definition); + } + + @Override + public Expression createExpression() { + // special for bean language where we need to configure it first + Language lan = camelContext.resolveLanguage("bean"); + configureLanguage(lan); + // .. and create expression with null value as we use the configured + // properties instead + Expression exp = lan.createExpression(null); + if (exp instanceof AfterPropertiesConfigured) { + ((AfterPropertiesConfigured)exp).afterPropertiesConfigured(camelContext); + } + return exp; + } + + protected void configureLanguage(Language language) { + Map<String, Object> properties = new HashMap<>(); + properties.put("bean", definition.getInstance()); + properties.put("beanType", or(definition.getBeanType(), definition.getBeanTypeName())); + properties.put("ref", definition.getRef()); + properties.put("method", definition.getMethod()); + setProperties(language, properties); + } + + @Override + public Predicate createPredicate() { + return (Predicate) createExpression(); + } + +} diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java new file mode 100644 index 0000000..807c807 --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.builder.SimpleBuilder; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.SimpleExpression; +import org.apache.camel.support.CamelContextHelper; + +public class SimpleExpressionReifier extends ExpressionReifier<SimpleExpression> { + + public SimpleExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (SimpleExpression) definition); + } + + @Override + public Expression createExpression() { + String exp = parseString(definition.getExpression()); + // should be true by default + boolean isTrim = definition.getTrim() == null || parseBoolean(definition.getTrim()); + if (exp != null && isTrim) { + exp = exp.trim(); + } + + SimpleBuilder answer = new SimpleBuilder(exp); + answer.setResultType(CamelContextHelper.convertTo(camelContext, Class.class, + or(definition.getResultType(), definition.getResultTypeName()))); + return answer; + } + + @Override + public Predicate createPredicate() { + // SimpleBuilder is also a Predicate + return (Predicate) createExpression(); + } + +} 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 new file mode 100644 index 0000000..ff49e62 --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.language.tokenizer.TokenizeLanguage; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.TokenizerExpression; +import org.apache.camel.support.ExpressionToPredicateAdapter; + +public class TokenizerExpressionReifier extends ExpressionReifier<TokenizerExpression> { + + public TokenizerExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (TokenizerExpression) definition); + } + + @Override + public Expression createExpression() { + // special for new line tokens, if defined from XML then its 2 + // characters, so we replace that back to a single char + String token = definition.getToken(); + if (token.startsWith("\\n")) { + token = '\n' + token.substring(2); + } + + TokenizeLanguage language = new TokenizeLanguage(); + language.setToken(parseString(token)); + language.setEndToken(parseString(definition.getEndToken())); + language.setInheritNamespaceTagName(parseString(definition.getInheritNamespaceTagName())); + language.setHeaderName(parseString(definition.getHeaderName())); + language.setGroupDelimiter(parseString(definition.getGroupDelimiter())); + if (definition.getRegex() != null) { + language.setRegex(parseBoolean(definition.getRegex())); + } + if (definition.getXml() != null) { + language.setXml(parseBoolean(definition.getXml())); + } + if (definition.getIncludeTokens() != null) { + language.setIncludeTokens(parseBoolean(definition.getIncludeTokens())); + } + if (definition.getGroup() != null && !"0".equals(definition.getGroup())) { + language.setGroup(parseString(definition.getGroup())); + } + + if (definition.getSkipFirst() != null) { + language.setSkipFirst(parseBoolean(definition.getSkipFirst())); + } + return language.createExpression(); + } + + @Override + public Predicate createPredicate() { + Expression exp = createExpression(); + return ExpressionToPredicateAdapter.toPredicate(exp); + } + +} 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 new file mode 100644 index 0000000..7595951 --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.JsonPathExpression; +import org.apache.camel.model.language.XMLTokenizerExpression; +import org.apache.camel.spi.NamespaceAware; + +public class XMLTokenizerExpressionReifier extends ExpressionReifier<XMLTokenizerExpression> { + + public XMLTokenizerExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (XMLTokenizerExpression) definition); + } + + @Override + protected void configureExpression(Expression expression) { + bindProperties(expression); + configureNamespaceAware(expression); + super.configureExpression(expression); + } + + @Override + protected void configurePredicate(Predicate predicate) { + bindProperties(predicate); + configureNamespaceAware(predicate); + super.configurePredicate(predicate); + } + + protected void configureNamespaceAware(Object builder) { + if (definition.getNamespaces() != null && builder instanceof NamespaceAware) { + NamespaceAware namespaceAware = (NamespaceAware)builder; + namespaceAware.setNamespaces(definition.getNamespaces()); + } + } + + protected void bindProperties(Object target) { + Map<String, Object> properties = new HashMap<>(); + properties.put("headerName", definition.getHeaderName()); + properties.put("mode", definition.getMode()); + properties.put("group", definition.getGroup()); + setProperties(target, 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 new file mode 100644 index 0000000..8737a07 --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.XPathExpression; +import org.apache.camel.spi.NamespaceAware; + +public class XPathExpressionReifier extends ExpressionReifier<XPathExpression> { + + public XPathExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (XPathExpression) definition); + } + + @Override + protected void configureExpression(Expression expression) { + bindProperties(expression); + configureNamespaceAware(expression); + super.configureExpression(expression); + } + + @Override + protected void configurePredicate(Predicate predicate) { + bindProperties(predicate); + configureNamespaceAware(predicate); + super.configurePredicate(predicate); + } + + protected void configureNamespaceAware(Object builder) { + if (definition.getNamespaces() != null && builder instanceof NamespaceAware) { + NamespaceAware namespaceAware = (NamespaceAware)builder; + namespaceAware.setNamespaces(definition.getNamespaces()); + } + } + + protected void bindProperties(Object target) { + Map<String, Object> properties = new HashMap<>(); + properties.put("documentType", or(definition.getDocumentType(), definition.getDocumentTypeName())); + properties.put("resultType", or(definition.getResultType(), definition.getResultTypeName())); + properties.put("useSaxon", definition.getSaxon()); + properties.put("xPathFactory", or(definition.getXPathFactory(), asRef(definition.getFactoryRef()))); + properties.put("objectModelUri", definition.getObjectModel()); + properties.put("threadSafety", definition.getThreadSafety()); + properties.put("logNamespaces", definition.getLogNamespaces()); + properties.put("headerName", definition.getHeaderName()); + setProperties(target, properties); + } + +} 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 new file mode 100644 index 0000000..f74d74f --- /dev/null +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.XQueryExpression; +import org.apache.camel.spi.NamespaceAware; + +public class XQueryExpressionReifier extends ExpressionReifier<XQueryExpression> { + + public XQueryExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (XQueryExpression) definition); + } + + @Override + protected void configureExpression(Expression expression) { + bindProperties(expression); + configureNamespaceAware(expression); + super.configureExpression(expression); + } + + @Override + protected void configurePredicate(Predicate predicate) { + bindProperties(predicate); + configureNamespaceAware(predicate); + super.configurePredicate(predicate); + } + + protected void configureNamespaceAware(Object builder) { + if (definition.getNamespaces() != null && builder instanceof NamespaceAware) { + NamespaceAware namespaceAware = (NamespaceAware)builder; + namespaceAware.setNamespaces(definition.getNamespaces()); + } + } + + protected void bindProperties(Object target) { + Map<String, Object> properties = new HashMap<>(); + properties.put("resultType", or(definition.getResultType(), definition.getType())); + properties.put("headerName", definition.getHeaderName()); + setProperties(target, properties); + } + +} diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java index a05102f..f908307 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java @@ -30,7 +30,7 @@ public class StickyLoadBalancerReifier extends LoadBalancerReifier<StickyLoadBal @Override public LoadBalancer createLoadBalancer() { - return new StickyLoadBalancer(definition.getCorrelationExpression().createExpression(routeContext)); + return new StickyLoadBalancer(createExpression(definition.getCorrelationExpression())); } }