You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/06/08 12:06:38 UTC
[camel] branch main updated: CAMEL-18172: camel-core - Optimize ref language to eager lookup for static refs
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 01336f06fd0 CAMEL-18172: camel-core - Optimize ref language to eager lookup for static refs
01336f06fd0 is described below
commit 01336f06fd0092e06795c6a53868cab11a838cda
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jun 8 14:06:12 2022 +0200
CAMEL-18172: camel-core - Optimize ref language to eager lookup for static refs
---
.../org/apache/camel/language/ref/RefLanguage.java | 64 +++++++++++++++++++---
.../java/org/apache/camel/language/RefTest.java | 17 ++++++
.../camel/support/builder/ExpressionBuilder.java | 6 +-
3 files changed, 79 insertions(+), 8 deletions(-)
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
index d9bd8cde37a..ecb0cdf95b4 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
@@ -20,6 +20,7 @@ import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Predicate;
+import org.apache.camel.spi.Registry;
import org.apache.camel.support.ExpressionAdapter;
import org.apache.camel.support.ExpressionToPredicateAdapter;
import org.apache.camel.support.LanguageSupport;
@@ -34,18 +35,66 @@ public class RefLanguage extends LanguageSupport {
@Override
public Predicate createPredicate(String expression) {
- return ExpressionToPredicateAdapter.toPredicate(createExpression(expression));
+ if (hasSimpleFunction(expression)) {
+ return createDynamic(expression);
+ } else {
+ return createStaticPredicate(expression);
+ }
}
@Override
- public Expression createExpression(final String expression) {
- Expression answer = new ExpressionAdapter() {
+ public Expression createExpression(String expression) {
+ if (hasSimpleFunction(expression)) {
+ return createDynamic(expression);
+ } else {
+ return createStaticExpression(expression);
+ }
+ }
+
+ protected Expression createStaticExpression(String expression) {
+ Expression answer;
+
+ Object exp = getCamelContext().getRegistry().lookupByName(expression);
+ if (exp instanceof Expression) {
+ answer = (Expression) exp;
+ } else if (exp instanceof Predicate) {
+ answer = PredicateToExpressionAdapter.toExpression((Predicate) exp);
+ } else {
+ throw new IllegalArgumentException(
+ "Cannot find expression or predicate in registry with ref: " + expression);
+ }
+
+ answer.init(getCamelContext());
+ return answer;
+ }
+
+ protected Predicate createStaticPredicate(String expression) {
+ Predicate answer;
+
+ Object exp = getCamelContext().getRegistry().lookupByName(expression);
+ if (exp instanceof Expression) {
+ answer = ExpressionToPredicateAdapter.toPredicate((Expression) exp);
+ } else if (exp instanceof Predicate) {
+ answer = (Predicate) exp;
+ } else {
+ throw new IllegalArgumentException(
+ "Cannot find expression or predicate in registry with ref: " + expression);
+ }
+
+ answer.init(getCamelContext());
+ return answer;
+ }
+
+ protected ExpressionAdapter createDynamic(final String expression) {
+ ExpressionAdapter answer = new ExpressionAdapter() {
private Expression exp;
+ private Registry registry;
@Override
public void init(CamelContext context) {
- exp = ExpressionBuilder.refExpression(expression);
+ registry = context.getRegistry();
+ exp = ExpressionBuilder.simpleExpression(expression);
exp.init(context);
}
@@ -53,7 +102,8 @@ public class RefLanguage extends LanguageSupport {
public Object evaluate(Exchange exchange) {
Expression target = null;
- Object lookup = exp.evaluate(exchange, Object.class);
+ String ref = exp.evaluate(exchange, String.class);
+ Object lookup = ref != null ? registry.lookupByName(ref) : null;
// must favor expression over predicate
if (lookup instanceof Expression) {
@@ -66,12 +116,12 @@ public class RefLanguage extends LanguageSupport {
return target.evaluate(exchange, Object.class);
} else {
throw new IllegalArgumentException(
- "Cannot find expression or predicate in registry with ref: " + expression);
+ "Cannot find expression or predicate in registry with ref: " + ref);
}
}
public String toString() {
- return exp.toString();
+ return "ref:" + exp.toString();
}
};
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/RefTest.java b/core/camel-core/src/test/java/org/apache/camel/language/RefTest.java
index 6ce6a0672c8..3d5c6394adc 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/RefTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/RefTest.java
@@ -49,6 +49,23 @@ public class RefTest extends LanguageTestSupport {
}
}
+ @Test
+ public void testRefDynamicExpressions() throws Exception {
+ exchange.getMessage().setHeader("foo", "myExp");
+ assertExpression("${header.foo}", "Hello World");
+ }
+
+ @Test
+ public void testRefDynamicExpressionsNotFound() throws Exception {
+ exchange.getMessage().setHeader("foo", "myExp2");
+ try {
+ assertExpression("${header.foo}", "Hello World");
+ fail("Should have thrown exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals("Cannot find expression or predicate in registry with ref: myExp2", e.getMessage());
+ }
+ }
+
@Test
public void testPredicates() throws Exception {
assertPredicate("myExp");
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
index aecb1721a31..8ba01fb5581 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
@@ -347,7 +347,11 @@ public class ExpressionBuilder {
@Override
public Object evaluate(Exchange exchange) {
String text = ref.evaluate(exchange, String.class);
- return registry.lookupByName(text);
+ if (text != null) {
+ return registry.lookupByName(text);
+ } else {
+ return null;
+ }
}
@Override