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