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 0ef4475db18a1953da4730fd97d5cf3f590d4160 Author: Guillaume Nodet <[email protected]> AuthorDate: Tue Feb 11 07:11:16 2020 +0100 Fix support for other properties on expressions --- .../camel/language/tokenizer/TokenizeLanguage.java | 31 +++++++++++++++- .../org/apache/camel/builder/SimpleBuilder.java | 17 ++++++++- .../camel/reifier/language/ExpressionReifier.java | 33 ++++++++--------- .../language/MethodCallExpressionReifier.java | 14 -------- .../reifier/language/SimpleExpressionReifier.java | 8 +++-- .../language/TokenizerExpressionReifier.java | 42 +++++++++------------- .../language/XMLTokenizerExpressionReifier.java | 1 - 7 files changed, 86 insertions(+), 60 deletions(-) diff --git a/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java b/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java index 2eafc00..8fafba9 100644 --- a/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java +++ b/core/camel-base/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java @@ -16,12 +16,15 @@ */ package org.apache.camel.language.tokenizer; +import org.apache.camel.CamelContext; import org.apache.camel.Expression; import org.apache.camel.IsSingleton; import org.apache.camel.Predicate; +import org.apache.camel.spi.GeneratedPropertyConfigurer; import org.apache.camel.spi.Language; import org.apache.camel.support.ExpressionToPredicateAdapter; import org.apache.camel.support.builder.ExpressionBuilder; +import org.apache.camel.support.component.PropertyConfigurerSupport; import org.apache.camel.util.ObjectHelper; /** @@ -38,7 +41,7 @@ import org.apache.camel.util.ObjectHelper; * And the <tt>xml</tt> mode supports the <tt>inheritNamespaceTagName</tt> option. */ @org.apache.camel.spi.annotations.Language("tokenize") -public class TokenizeLanguage implements Language, IsSingleton { +public class TokenizeLanguage implements Language, IsSingleton, GeneratedPropertyConfigurer { private String token; private String endToken; @@ -91,6 +94,32 @@ public class TokenizeLanguage implements Language, IsSingleton { } @Override + public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { + if (target != this) { + throw new IllegalStateException("Can only configure our own instance !"); + } + switch (ignoreCase ? name.toLowerCase() : name) { + case "token": setToken(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "endtoken": + case "endToken": setEndToken(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "inheritnamespacetagname": + case "inheritNamespaceTagName": setInheritNamespaceTagName(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "headername": + case "headerName": setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "regex": setRegex(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "xml": setXml(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "includetokens": + case "includeTokens": setIncludeTokens(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "group": setGroup(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "groupdelimiter": + case "groupDelimiter": setGroupDelimiter(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "skipfirst": + case "skipFirst": setSkipFirst(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + default: return false; + } + } + + @Override public Predicate createPredicate(String expression) { return ExpressionToPredicateAdapter.toPredicate(createExpression(expression)); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/SimpleBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/SimpleBuilder.java index 9927d3d..1d54633 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/SimpleBuilder.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/SimpleBuilder.java @@ -16,15 +16,18 @@ */ package org.apache.camel.builder; +import org.apache.camel.CamelContext; import org.apache.camel.CamelExecutionException; import org.apache.camel.Exchange; import org.apache.camel.Expression; import org.apache.camel.Predicate; import org.apache.camel.language.simple.Simple; import org.apache.camel.spi.ExpressionResultTypeAware; +import org.apache.camel.spi.GeneratedPropertyConfigurer; import org.apache.camel.spi.Language; import org.apache.camel.support.PredicateToExpressionAdapter; import org.apache.camel.support.ScriptHelper; +import org.apache.camel.support.component.PropertyConfigurerSupport; /** * Creates an {@link Simple} language builder. @@ -33,7 +36,7 @@ import org.apache.camel.support.ScriptHelper; * means that using simple language for {@link Expression}s or * {@link Predicate}s is very easy with the help of this builder. */ -public class SimpleBuilder implements Predicate, Expression, ExpressionResultTypeAware { +public class SimpleBuilder implements Predicate, Expression, ExpressionResultTypeAware, GeneratedPropertyConfigurer { private final String text; private Class<?> resultType; @@ -63,6 +66,18 @@ public class SimpleBuilder implements Predicate, Expression, ExpressionResultTyp return simple(String.format(formatText, values), resultType); } + @Override + public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { + if (target != this) { + throw new IllegalStateException("Can only configure our own instance !"); + } + switch (ignoreCase ? name.toLowerCase() : name) { + case "resulttype": + case "resultType": setResultType(PropertyConfigurerSupport.property(camelContext, Class.class, value)); return true; + default: return false; + } + } + public String getText() { return text; } 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 index 3b63184..6d633a2 100644 --- 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 @@ -26,7 +26,10 @@ import org.apache.camel.CamelContextAware; import org.apache.camel.Expression; import org.apache.camel.NoSuchLanguageException; import org.apache.camel.Predicate; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.model.Constants; import org.apache.camel.model.ExpressionSubElementDefinition; +import org.apache.camel.model.OtherAttributesAware; import org.apache.camel.model.language.ConstantExpression; import org.apache.camel.model.language.ExchangePropertyExpression; import org.apache.camel.model.language.ExpressionDefinition; @@ -47,6 +50,7 @@ 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.spi.PropertiesComponent; import org.apache.camel.spi.PropertyConfigurer; import org.apache.camel.spi.PropertyConfigurerAware; import org.apache.camel.support.CamelContextHelper; @@ -106,15 +110,15 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR if (expression == null) { if (definition.getExpressionType() != null) { expression = reifier(camelContext, definition.getExpressionType()).createExpression(); - } else if (definition.getExpression() != null) { - ObjectHelper.notNull("language", definition.getLanguage()); + } else { + ObjectHelper.notNull(definition.getLanguage(), "language"); Language language = camelContext.resolveLanguage(definition.getLanguage()); if (language == null) { throw new NoSuchLanguageException(definition.getLanguage()); } - String exp = CamelContextHelper.parseText(camelContext, definition.getExpression()); + String exp = parseString(definition.getExpression()); // should be true by default - boolean isTrim = definition.getTrim() == null || CamelContextHelper.parseBoolean(camelContext, definition.getTrim()); + boolean isTrim = definition.getTrim() == null || parseBoolean(definition.getTrim()); // trim if configured to trim if (exp != null && isTrim) { exp = exp.trim(); @@ -122,6 +126,7 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR // resolve the expression as it may be an external script from // the classpath/file etc exp = ScriptHelper.resolveOptionalExternalScript(camelContext, exp); + configureLanguage(language); expression = language.createExpression(exp); configureExpression(expression); } @@ -141,14 +146,14 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR } else if (definition.getExpressionValue() != null) { predicate = new ExpressionToPredicateAdapter(definition.getExpressionValue()); } else if (definition.getExpression() != null) { - ObjectHelper.notNull("language", definition.getLanguage()); + ObjectHelper.notNull(definition.getLanguage(), "language"); Language language = camelContext.resolveLanguage(definition.getLanguage()); if (language == null) { throw new NoSuchLanguageException(definition.getLanguage()); } - String exp = CamelContextHelper.parseText(camelContext, definition.getExpression()); + String exp = parseString(definition.getExpression()); // should be true by default - boolean isTrim = definition.getTrim() == null || CamelContextHelper.parseBoolean(camelContext, definition.getTrim()); + boolean isTrim = definition.getTrim() == null || parseBoolean(definition.getTrim()); // trim if configured to trim if (exp != null && isTrim) { exp = exp.trim(); @@ -156,7 +161,7 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR // resolve the expression as it may be an external script from // the classpath/file etc exp = ScriptHelper.resolveOptionalExternalScript(camelContext, exp); - + configureLanguage(language); predicate = language.createPredicate(exp); configurePredicate(predicate); } @@ -168,6 +173,9 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR return predicate; } + protected void configureLanguage(Language language) { + } + protected void configurePredicate(Predicate predicate) { // allows to perform additional logic after the properties has been // configured which may be needed @@ -188,6 +196,7 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR protected void setProperties(Object target, Map<String, Object> properties) { properties.entrySet().removeIf(e -> e.getValue() == null); + addOtherAttributes(definition, properties); PropertyConfigurer configurer = null; if (target instanceof PropertyConfigurerAware) { @@ -200,12 +209,4 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR .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/MethodCallExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java index cdc14a4..013d493 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java @@ -33,20 +33,6 @@ public class MethodCallExpressionReifier extends ExpressionReifier<MethodCallExp 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()); 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 index 807c807..7806272 100644 --- 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 @@ -16,6 +16,9 @@ */ 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; @@ -40,8 +43,9 @@ public class SimpleExpressionReifier extends ExpressionReifier<SimpleExpression> } SimpleBuilder answer = new SimpleBuilder(exp); - answer.setResultType(CamelContextHelper.convertTo(camelContext, Class.class, - or(definition.getResultType(), definition.getResultTypeName()))); + Map<String, Object> props = new HashMap<>(); + props.put("resultType", or(definition.getResultType(), definition.getResultTypeName())); + setProperties(answer, props); return answer; } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java index ff49e62..f56ba1c 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java @@ -16,12 +16,16 @@ */ 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.language.tokenizer.TokenizeLanguage; import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.language.TokenizerExpression; +import org.apache.camel.spi.Language; import org.apache.camel.support.ExpressionToPredicateAdapter; public class TokenizerExpressionReifier extends ExpressionReifier<TokenizerExpression> { @@ -31,37 +35,25 @@ public class TokenizerExpressionReifier extends ExpressionReifier<TokenizerExpre } @Override - public Expression createExpression() { + protected void configureLanguage(Language language) { + Map<String, Object> props = new HashMap<>(); // 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(); + props.put("token", token); + props.put("endToken", definition.getEndToken()); + props.put("inheritNamespaceTagName", definition.getInheritNamespaceTagName()); + props.put("headerName", definition.getHeaderName()); + props.put("groupDelimiter", definition.getGroupDelimiter()); + props.put("regex", definition.getRegex()); + props.put("xml", definition.getXml()); + props.put("includeTokens", definition.getIncludeTokens()); + props.put("group", definition.getGroup()); + props.put("skipFirst", definition.getSkipFirst()); + setProperties(language, props); } @Override diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java index 7595951..8a10253 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java @@ -23,7 +23,6 @@ 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;
