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;
 

Reply via email to