This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 900ab2c  CAMEL-15636: camel-bean - optimize to not resolve simple 
language per message if ongl method call expressions.
900ab2c is described below

commit 900ab2cd3fb639ab5f89eb258ae435063c7c70c9
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Tue Oct 6 21:46:30 2020 +0200

    CAMEL-15636: camel-bean - optimize to not resolve simple language per 
message if ongl method call expressions.
---
 .../apache/camel/language/bean/BeanExpression.java | 37 +++++++++++++---------
 .../apache/camel/language/bean/BeanLanguage.java   |  5 +++
 .../language/simple/SimpleExpressionBuilder.java   | 24 +++++++++++---
 3 files changed, 46 insertions(+), 20 deletions(-)

diff --git 
a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
 
b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
index 7ead3d5..5a8982e 100644
--- 
a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
+++ 
b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
@@ -27,6 +27,7 @@ import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.Predicate;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.TypeConverter;
 import org.apache.camel.component.bean.BeanExpressionProcessor;
 import org.apache.camel.component.bean.BeanHolder;
 import org.apache.camel.component.bean.BeanInfo;
@@ -53,13 +54,13 @@ import static 
org.apache.camel.util.ObjectHelper.hasDefaultPublicNoArgConstructo
 public class BeanExpression implements Expression, Predicate {
 
     private ParameterMappingStrategy parameterMappingStrategy;
+    private Language simple;
 
     private Object bean;
     private String beanName;
     private Class<?> type;
     private String method;
     private BeanHolder beanHolder;
-    private Language simple;
     private boolean ognlMethod;
 
     public BeanExpression(Object bean, String method) {
@@ -107,6 +108,14 @@ public class BeanExpression implements Expression, 
Predicate {
         this.parameterMappingStrategy = parameterMappingStrategy;
     }
 
+    public Language getSimple() {
+        return simple;
+    }
+
+    public void setSimple(Language simple) {
+        this.simple = simple;
+    }
+
     @Override
     public void init(CamelContext context) {
         if (parameterMappingStrategy == null) {
@@ -139,12 +148,6 @@ public class BeanExpression implements Expression, 
Predicate {
         }
 
         ognlMethod = OgnlHelper.isValidOgnlExpression(method);
-        if (ognlMethod) {
-            // ognl may use simple language
-            if (simple == null) {
-                simple = context.resolveLanguage("simple");
-            }
-        }
     }
 
     @Override
@@ -238,12 +241,12 @@ public class BeanExpression implements Expression, 
Predicate {
         }
 
         if (bean != null) {
-            BeanInfo info = new BeanInfo(context, bean.getClass());
+            BeanInfo info = new BeanInfo(context, bean.getClass(), 
parameterMappingStrategy);
             if (!info.hasMethod(method)) {
                 throw RuntimeCamelException.wrapRuntimeCamelException(new 
MethodNotFoundException(null, bean, method));
             }
         } else {
-            BeanInfo info = new BeanInfo(context, type);
+            BeanInfo info = new BeanInfo(context, type, 
parameterMappingStrategy);
             // must be a static method as we do not have a bean instance to 
invoke
             if (!info.hasStaticMethod(method)) {
                 throw RuntimeCamelException.wrapRuntimeCamelException(new 
MethodNotFoundException(null, type, method, true));
@@ -307,7 +310,7 @@ public class BeanExpression implements Expression, 
Predicate {
             if (resultExchange.hasProperties()) {
                 
exchange.getProperties().putAll(resultExchange.getProperties());
             }
-            if (resultExchange.getOut().hasHeaders()) {
+            if (resultExchange.hasOut() && 
resultExchange.getOut().hasHeaders()) {
                 
exchange.getIn().getHeaders().putAll(resultExchange.getOut().getHeaders());
             }
 
@@ -415,7 +418,9 @@ public class BeanExpression implements Expression, 
Predicate {
             if (key != null) {
                 // if key is a nested simple expression then re-evaluate that 
again
                 if (LanguageSupport.hasSimpleFunction(key)) {
-                    key = simple.createExpression(key).evaluate(exchange, 
String.class);
+                    Expression exp = simple.createExpression(key);
+                    exp.init(exchange.getContext());
+                    key = exp.evaluate(exchange, String.class);
                 }
                 if (key != null) {
                     result = lookupResult(resultExchange, key, result, 
nullSafe, ognlPath, holder.getBean(exchange));
@@ -439,6 +444,8 @@ public class BeanExpression implements Expression, 
Predicate {
             Exchange exchange, String key, Object result, boolean nullSafe, 
String ognlPath, Object bean) {
         StringHelper.notEmpty(key, "key", "in Simple language ognl path: " + 
ognlPath);
 
+        final TypeConverter typeConverter = 
exchange.getContext().getTypeConverter();
+
         // trim key
         key = key.trim();
 
@@ -446,17 +453,17 @@ public class BeanExpression implements Expression, 
Predicate {
         key = StringHelper.removeLeadingAndEndingQuotes(key);
 
         // try map first
-        Map<?, ?> map = 
exchange.getContext().getTypeConverter().convertTo(Map.class, result);
+        Map<?, ?> map = typeConverter.convertTo(Map.class, result);
         if (map != null) {
             return map.get(key);
         }
 
         // special for list is last keyword
-        Integer num = 
exchange.getContext().getTypeConverter().tryConvertTo(Integer.class, key);
+        Integer num = typeConverter.tryConvertTo(Integer.class, key);
         boolean checkList = key.startsWith("last") || num != null;
 
         if (checkList) {
-            List<?> list = 
exchange.getContext().getTypeConverter().convertTo(List.class, result);
+            List<?> list = typeConverter.convertTo(List.class, result);
             if (list != null) {
                 if (key.startsWith("last")) {
                     num = list.size() - 1;
@@ -464,7 +471,7 @@ public class BeanExpression implements Expression, 
Predicate {
                     // maybe its an expression to subtract a number after last
                     String after = StringHelper.after(key, "-");
                     if (after != null) {
-                        Integer redux = 
exchange.getContext().getTypeConverter().tryConvertTo(Integer.class, 
after.trim());
+                        Integer redux = 
typeConverter.tryConvertTo(Integer.class, after.trim());
                         if (redux != null) {
                             num -= redux;
                         } else {
diff --git 
a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
 
b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
index 6dc1b3c..c1da63f 100644
--- 
a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
+++ 
b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
@@ -24,6 +24,7 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StaticService;
 import org.apache.camel.component.bean.ParameterMappingStrategy;
 import org.apache.camel.component.bean.ParameterMappingStrategyHelper;
+import org.apache.camel.spi.Language;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
 import org.apache.camel.support.LanguageSupport;
 import org.apache.camel.util.StringHelper;
@@ -43,6 +44,7 @@ import org.apache.camel.util.StringHelper;
 public class BeanLanguage extends LanguageSupport implements StaticService {
 
     private volatile ParameterMappingStrategy parameterMappingStrategy;
+    private volatile Language simple;
 
     private Object bean;
     private Class<?> beanType;
@@ -113,6 +115,7 @@ public class BeanLanguage extends LanguageSupport 
implements StaticService {
         }
 
         answer.setParameterMappingStrategy(parameterMappingStrategy);
+        answer.setSimple(simple);
         answer.init(getCamelContext());
         return answer;
     }
@@ -167,6 +170,7 @@ public class BeanLanguage extends LanguageSupport 
implements StaticService {
         }
 
         answer.setParameterMappingStrategy(parameterMappingStrategy);
+        answer.setSimple(simple);
         answer.init(getCamelContext());
         return answer;
     }
@@ -174,6 +178,7 @@ public class BeanLanguage extends LanguageSupport 
implements StaticService {
     @Override
     public void start() {
         parameterMappingStrategy = 
ParameterMappingStrategyHelper.createParameterMappingStrategy(getCamelContext());
+        simple = getCamelContext().resolveLanguage("simple");
     }
 
     @Override
diff --git 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
index fea7544..0ab00ed 100644
--- 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
+++ 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
@@ -19,8 +19,10 @@ package org.apache.camel.language.simple;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 import java.util.TimeZone;
@@ -36,6 +38,7 @@ import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.ExchangeFormatter;
+import org.apache.camel.spi.Language;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.ExpressionAdapter;
 import org.apache.camel.support.MessageHelper;
@@ -835,8 +838,10 @@ public final class SimpleExpressionBuilder {
         private final KeyedEntityRetrievalStrategy 
keyedEntityRetrievalStrategy;
         private String key;
         private String keySuffix;
+        private String method;
         private Expression keyExpression;
         private Expression ognlExpression;
+        private Language beanLanguage;
 
         KeyedOgnlExpressionAdapter(String ognl, String toStringValue,
                                    KeyedEntityRetrievalStrategy 
keyedEntityRetrievalStrategy) {
@@ -858,15 +863,16 @@ public final class SimpleExpressionBuilder {
             }
             // remove any OGNL operators so we got the pure key name
             key = OgnlHelper.removeOperators(key);
+            // and this may be the last remainder method to try as OGNL if 
there are no exchange properties with those key names
+            method = StringHelper.after(ognl, key + keySuffix);
         }
 
         @Override
         public void init(CamelContext context) {
+            beanLanguage = context.resolveLanguage("bean");
             ognlExpression = ExpressionBuilder.simpleExpression(ognl);
             ognlExpression.init(context);
             // key must be lazy eval as it only used in special situations
-            // keyExpression = ExpressionBuilder.simpleExpression(key);
-            // keyExpression.init(context);
         }
 
         @Override
@@ -887,9 +893,17 @@ public final class SimpleExpressionBuilder {
             if (property == null) {
                 return null;
             }
-            // the remainder is the rest of the ognl without the key
-            String remainder = StringHelper.after(ognl, key + keySuffix);
-            return ExpressionBuilder.beanExpression(property, 
remainder).evaluate(exchange, Object.class);
+            if (method != null) {
+                // okay we have a property value, the remainder is OGNL method 
call on it
+                Map<String, Object> properties = new HashMap<>(2);
+                properties.put("bean", property);
+                properties.put("method", method);
+                Expression exp = beanLanguage.createExpression(null, 
properties);
+                exp.init(exchange.getContext());
+                return exp.evaluate(exchange, Object.class);
+            } else {
+                return property;
+            }
         }
 
         @Override

Reply via email to