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 <[email protected]>
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