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 2020/10/02 10:35:09 UTC

[camel] 04/04: CAMEL-15606: camel-core - Simple with bean function should resolve language once

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

commit 6076b39926746cc4ae5102e28571ffb0c3154af0
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Oct 2 12:27:01 2020 +0200

    CAMEL-15606: camel-core - Simple with bean function should resolve language once
---
 .../reifier/language/SimpleExpressionReifier.java  |  2 +
 .../camel/language/simple/SimpleLanguage.java      |  8 ++-
 .../simple/ast/SimpleFunctionExpression.java       |  5 +-
 .../file/FileConsumerFileExpressionTest.java       |  4 +-
 .../component/file/FileProducerExpressionTest.java |  4 +-
 .../apache/camel/language/FileLanguageTest.java    |  5 +-
 .../apache/camel/language/simple/SimpleTest.java   | 75 +++++++++++-----------
 .../camel/support/builder/ExpressionBuilder.java   | 21 ++++++
 8 files changed, 77 insertions(+), 47 deletions(-)

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 e14bf79..66e1b78 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
@@ -72,6 +72,8 @@ public class SimpleExpressionReifier extends ExpressionReifier<SimpleExpression>
             exp = exp.trim();
         }
         SimpleBuilder answer = new SimpleBuilder(exp);
+        // need to configure result type which can be set via xml dsl vs java dsl
+        configureLanguage(null);
         answer.setResultType(definition.getResultType());
         return answer;
     }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
index b7e05ce..6c0415f 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
@@ -72,7 +72,9 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
 
     @Override
     public void start() {
-        // noop
+        if (getCamelContext() != null) {
+            SIMPLE.setCamelContext(getCamelContext());
+        }
     }
 
     @Override
@@ -143,6 +145,7 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
      * <b>Important:</b> If you need to use a predicate (function to return true|false) then use
      * {@link #predicate(String)} instead.
      */
+    @Deprecated
     public static Expression simple(String expression) {
         return expression(expression);
     }
@@ -151,6 +154,7 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
      * Creates a new {@link Expression} (or {@link Predicate} if the resultType is a <tt>Boolean</tt>, or
      * <tt>boolean</tt> type).
      */
+    @Deprecated
     public static Expression simple(String expression, Class<?> resultType) {
         return new SimpleLanguage().createExpression(expression, resultType);
     }
@@ -175,6 +179,7 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
      * <b>Important:</b> If you need to use a predicate (function to return true|false) then use
      * {@link #predicate(String)} instead.
      */
+    @Deprecated
     public static Expression expression(String expression) {
         return SIMPLE.createExpression(expression);
     }
@@ -182,6 +187,7 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
     /**
      * Creates a new {@link Predicate}.
      */
+    @Deprecated
     public static Predicate predicate(String predicate) {
         return SIMPLE.createPredicate(predicate);
     }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
index 12ddf6c..db79f6c 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
@@ -23,6 +23,7 @@ import org.apache.camel.Expression;
 import org.apache.camel.language.simple.SimpleExpressionBuilder;
 import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.spi.Language;
 import org.apache.camel.support.builder.ExpressionBuilder;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.OgnlHelper;
@@ -206,7 +207,9 @@ public class SimpleFunctionExpression extends LiteralExpression {
         // bean: prefix
         remainder = ifStartsWithReturnRemainder("bean:", function);
         if (remainder != null) {
-            return ExpressionBuilder.beanExpression(remainder);
+            // resolve bean language early
+            Language bean = camelContext.resolveLanguage("bean");
+            return ExpressionBuilder.languageExpression("bean", bean, remainder);
         }
 
         // properties: prefix
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java
index 53e7f09..ba48a33 100644
--- a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionTest.java
@@ -24,8 +24,6 @@ import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.apache.camel.language.simple.SimpleLanguage.simple;
-
 /**
  * Unit test for expression option for file consumer.
  */
@@ -74,7 +72,7 @@ public class FileConsumerFileExpressionTest extends ContextTestSupport {
         template.sendBodyAndHeader("file://target/data/filelanguage/date", "Hello World", Exchange.FILE_NAME,
                 "myfile-20081129.txt");
         template.sendBodyAndHeader("file://target/data/filelanguage/date", "Goodday World", Exchange.FILE_NAME,
-                simple("myfile-${date:now:yyyyMMdd}.txt"));
+                context.resolveLanguage("simple").createExpression("myfile-${date:now:yyyyMMdd}.txt"));
 
         context.addRoutes(new RouteBuilder() {
             @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java
index b7d5b47..1465601 100644
--- a/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerExpressionTest.java
@@ -26,8 +26,6 @@ import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.apache.camel.language.simple.SimpleLanguage.simple;
-
 /**
  * Unit test for expression option for file producer.
  */
@@ -66,7 +64,7 @@ public class FileProducerExpressionTest extends ContextTestSupport {
     @Test
     public void testProducerDateByHeader() throws Exception {
         template.sendBodyAndHeader("file://target/data/filelanguage", "Hello World", Exchange.FILE_NAME,
-                simple("myfile-${date:now:yyyyMMdd}.txt"));
+                context.resolveLanguage("simple").createExpression("myfile-${date:now:yyyyMMdd}.txt"));
 
         String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
         assertFileExists("target/data/filelanguage/myfile-" + date + ".txt");
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java
index a861d60..c935b1b 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java
@@ -27,7 +27,6 @@ import org.apache.camel.LanguageTestSupport;
 import org.apache.camel.component.file.FileConsumer;
 import org.apache.camel.component.file.FileEndpoint;
 import org.apache.camel.component.file.GenericFile;
-import org.apache.camel.language.simple.SimpleLanguage;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.util.FileUtil;
 import org.junit.jupiter.api.Test;
@@ -94,7 +93,7 @@ public class FileLanguageTest extends LanguageTestSupport {
         assertExpression("${file:size}", file.length());
 
         // modified is a long object
-        Long modified = SimpleLanguage.simple("${file:modified}").evaluate(exchange, Long.class);
+        Long modified = context.resolveLanguage("simple").createExpression("${file:modified}").evaluate(exchange, Long.class);
         assertEquals(file.lastModified(), modified.longValue());
     }
 
@@ -114,7 +113,7 @@ public class FileLanguageTest extends LanguageTestSupport {
         assertExpression("$simple{file:size}", file.length());
 
         // modified is a long object
-        long modified = SimpleLanguage.simple("${file:modified}").evaluate(exchange, long.class);
+        long modified = context.resolveLanguage("simple").createExpression("${file:modified}").evaluate(exchange, long.class);
         assertEquals(file.lastModified(), modified);
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
index 15d6fb6..d76bc59 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
@@ -60,37 +60,39 @@ public class SimpleTest extends LanguageTestSupport {
 
     @Test
     public void testSimpleExpressionOrPredicate() throws Exception {
-        Predicate predicate = SimpleLanguage.predicate("${header.bar} == 123");
+        Predicate predicate = context.resolveLanguage("simple").createPredicate("${header.bar} == 123");
         assertTrue(predicate.matches(exchange));
 
-        predicate = SimpleLanguage.predicate("${header.bar} == 124");
+        predicate = context.resolveLanguage("simple").createPredicate("${header.bar} == 124");
         assertFalse(predicate.matches(exchange));
 
-        Expression expression = SimpleLanguage.expression("${body}");
+        Expression expression = context.resolveLanguage("simple").createExpression("${body}");
         assertEquals("<hello id='m123'>world!</hello>", expression.evaluate(exchange, String.class));
 
-        expression = SimpleLanguage.simple("${body}");
+        expression = context.resolveLanguage("simple").createExpression("${body}");
         assertEquals("<hello id='m123'>world!</hello>", expression.evaluate(exchange, String.class));
-        expression = SimpleLanguage.simple("${body}", String.class);
+        expression = context.resolveLanguage("simple").createExpression("${body}");
         assertEquals("<hello id='m123'>world!</hello>", expression.evaluate(exchange, String.class));
 
-        expression = SimpleLanguage.simple("${header.bar} == 123", boolean.class);
-        assertEquals(Boolean.TRUE, expression.evaluate(exchange, Object.class));
-        expression = SimpleLanguage.simple("${header.bar} == 124", boolean.class);
-        assertEquals(Boolean.FALSE, expression.evaluate(exchange, Object.class));
-        expression = SimpleLanguage.simple("${header.bar} == 123", Boolean.class);
-        assertEquals(Boolean.TRUE, expression.evaluate(exchange, Object.class));
-        expression = SimpleLanguage.simple("${header.bar} == 124", Boolean.class);
-        assertEquals(Boolean.FALSE, expression.evaluate(exchange, Object.class));
+        predicate = context.resolveLanguage("simple").createPredicate("${header.bar} == 123");
+        assertEquals(Boolean.TRUE, predicate.matches(exchange));
+        predicate = context.resolveLanguage("simple").createPredicate("${header.bar} == 124");
+        assertEquals(Boolean.FALSE, predicate.matches(exchange));
+        predicate = context.resolveLanguage("simple").createPredicate("${header.bar} == 123");
+        assertEquals(Boolean.TRUE, predicate.matches(exchange));
+        predicate = context.resolveLanguage("simple").createPredicate("${header.bar} == 124");
+        assertEquals(Boolean.FALSE, predicate.matches(exchange));
     }
 
     @Test
     public void testResultType() throws Exception {
-        assertEquals(123, SimpleLanguage.simple("${header.bar}", int.class).evaluate(exchange, Object.class));
-        assertEquals("123", SimpleLanguage.simple("${header.bar}", String.class).evaluate(exchange, Object.class));
+        assertEquals(123, context.resolveLanguage("simple").createExpression("${header.bar}").evaluate(exchange, int.class));
+        assertEquals("123",
+                context.resolveLanguage("simple").createExpression("${header.bar}").evaluate(exchange, String.class));
         // should not be possible
-        assertEquals(null, SimpleLanguage.simple("${header.bar}", Date.class).evaluate(exchange, Object.class));
-        assertEquals(null, SimpleLanguage.simple("${header.unknown}", String.class).evaluate(exchange, Object.class));
+        assertEquals(null, context.resolveLanguage("simple").createExpression("${header.bar}").evaluate(exchange, Date.class));
+        assertEquals(null,
+                context.resolveLanguage("simple").createExpression("${header.unknown}").evaluate(exchange, String.class));
     }
 
     @Test
@@ -110,7 +112,7 @@ public class SimpleTest extends LanguageTestSupport {
 
     @Test
     public void testNull() throws Exception {
-        assertNull(SimpleLanguage.simple("${null}").evaluate(exchange, Object.class));
+        assertNull(context.resolveLanguage("simple").createExpression("${null}").evaluate(exchange, Object.class));
     }
 
     @Test
@@ -141,7 +143,7 @@ public class SimpleTest extends LanguageTestSupport {
 
     @Test
     public void testExchangeExpression() throws Exception {
-        Expression exp = SimpleLanguage.simple("${exchange}");
+        Expression exp = context.resolveLanguage("simple").createExpression("${exchange}");
         assertNotNull(exp);
         assertEquals(exchange, exp.evaluate(exchange, Object.class));
 
@@ -150,7 +152,7 @@ public class SimpleTest extends LanguageTestSupport {
 
     @Test
     public void testExchangeOgnlExpression() throws Exception {
-        Expression exp = SimpleLanguage.simple("${exchange.exchangeId}");
+        Expression exp = context.resolveLanguage("simple").createExpression("${exchange.exchangeId}");
         assertNotNull(exp);
         assertEquals(exchange.getExchangeId(), exp.evaluate(exchange, Object.class));
 
@@ -160,18 +162,18 @@ public class SimpleTest extends LanguageTestSupport {
 
     @Test
     public void testBodyExpression() throws Exception {
-        Expression exp = SimpleLanguage.simple("${body}");
+        Expression exp = context.resolveLanguage("simple").createExpression("${body}");
         assertNotNull(exp);
     }
 
     @Test
     public void testBodyOgnlExpression() throws Exception {
-        Expression exp = SimpleLanguage.simple("${body.xxx}");
+        Expression exp = context.resolveLanguage("simple").createExpression("${body.xxx}");
         assertNotNull(exp);
 
         // must start with a dot
         try {
-            SimpleLanguage.simple("${bodyxxx}");
+            context.resolveLanguage("simple").createExpression("${bodyxxx}");
             fail("Should throw exception");
         } catch (SimpleIllegalSyntaxException e) {
             // expected
@@ -180,14 +182,14 @@ public class SimpleTest extends LanguageTestSupport {
 
     @Test
     public void testBodyExpressionUsingAlternativeStartToken() throws Exception {
-        Expression exp = SimpleLanguage.simple("$simple{body}");
+        Expression exp = context.resolveLanguage("simple").createExpression("$simple{body}");
         assertNotNull(exp);
     }
 
     @Test
     public void testBodyExpressionNotStringType() throws Exception {
         exchange.getIn().setBody(123);
-        Expression exp = SimpleLanguage.simple("${body}");
+        Expression exp = context.resolveLanguage("simple").createExpression("${body}");
         assertNotNull(exp);
         Object val = exp.evaluate(exchange, Object.class);
         assertIsInstanceOf(Integer.class, val);
@@ -197,12 +199,12 @@ public class SimpleTest extends LanguageTestSupport {
     @Test
     public void testBodyExpressionWithArray() throws Exception {
         exchange.getIn().setBody(new MyClass());
-        Expression exp = SimpleLanguage.simple("${body.myArray}");
+        Expression exp = context.resolveLanguage("simple").createExpression("${body.myArray}");
         assertNotNull(exp);
         Object val = exp.evaluate(exchange, Object.class);
         assertIsInstanceOf(Object[].class, val);
 
-        exp = SimpleLanguage.simple("${body.myArray.length}");
+        exp = context.resolveLanguage("simple").createExpression("${body.myArray.length}");
         assertNotNull(exp);
         val = exp.evaluate(exchange, Object.class);
         assertIsInstanceOf(Integer.class, val);
@@ -702,7 +704,8 @@ public class SimpleTest extends LanguageTestSupport {
     public void testExceptionStacktrace() throws Exception {
         exchange.setException(new IllegalArgumentException("Just testing"));
 
-        String out = SimpleLanguage.simple("${exception.stacktrace}").evaluate(exchange, String.class);
+        String out = context.resolveLanguage("simple").createExpression("${exception.stacktrace}").evaluate(exchange,
+                String.class);
         assertNotNull(out);
         assertTrue(out.startsWith("java.lang.IllegalArgumentException: Just testing"));
         assertTrue(out.contains("at org.apache.camel.language."));
@@ -712,7 +715,7 @@ public class SimpleTest extends LanguageTestSupport {
     public void testException() throws Exception {
         exchange.setException(new IllegalArgumentException("Just testing"));
 
-        Exception out = SimpleLanguage.simple("${exception}").evaluate(exchange, Exception.class);
+        Exception out = context.resolveLanguage("simple").createExpression("${exception}").evaluate(exchange, Exception.class);
         assertNotNull(out);
         assertIsInstanceOf(IllegalArgumentException.class, out);
         assertEquals("Just testing", out.getMessage());
@@ -1826,18 +1829,18 @@ public class SimpleTest extends LanguageTestSupport {
         int iterations = 30;
         int i = 0;
         for (i = 0; i < iterations; i++) {
-            Expression expression = SimpleLanguage.simple("${random(1,10)}", Integer.class);
+            Expression expression = context.resolveLanguage("simple").createExpression("${random(1,10)}");
             assertTrue(
                     min <= expression.evaluate(exchange, Integer.class) && expression.evaluate(exchange, Integer.class) < max);
         }
         for (i = 0; i < iterations; i++) {
-            Expression expression = SimpleLanguage.simple("${random(10)}", Integer.class);
+            Expression expression = context.resolveLanguage("simple").createExpression("${random(10)}");
             assertTrue(0 <= expression.evaluate(exchange, Integer.class) && expression.evaluate(exchange, Integer.class) < max);
         }
-        Expression expression = SimpleLanguage.simple("${random(1, 10)}", Integer.class);
+        Expression expression = context.resolveLanguage("simple").createExpression("${random(1, 10)}");
         assertTrue(min <= expression.evaluate(exchange, Integer.class) && expression.evaluate(exchange, Integer.class) < max);
 
-        Expression expression1 = SimpleLanguage.simple("${random( 10)}", Integer.class);
+        Expression expression1 = context.resolveLanguage("simple").createExpression("${random( 10)}");
         assertTrue(0 <= expression1.evaluate(exchange, Integer.class) && expression1.evaluate(exchange, Integer.class) < max);
 
         try {
@@ -1854,7 +1857,7 @@ public class SimpleTest extends LanguageTestSupport {
         }
 
         exchange.getIn().setHeader("max", 20);
-        Expression expression3 = SimpleLanguage.simple("${random(10,${header.max})}", Integer.class);
+        Expression expression3 = context.resolveLanguage("simple").createExpression("${random(10,${header.max})}");
         int num = expression3.evaluate(exchange, Integer.class);
         assertTrue(num >= 0 && num < 20, "Should be 10..20");
     }
@@ -1868,7 +1871,7 @@ public class SimpleTest extends LanguageTestSupport {
 
         assertEquals(2, data.size());
 
-        Expression expression = SimpleLanguage.simple("${body.remove('A')}");
+        Expression expression = context.resolveLanguage("simple").createExpression("${body.remove('A')}");
         expression.evaluate(exchange, Object.class);
 
         assertEquals(1, data.size());
@@ -1884,7 +1887,7 @@ public class SimpleTest extends LanguageTestSupport {
 
         assertEquals(2, data.size());
 
-        Expression expression = SimpleLanguage.simple("${body.remove(0)}");
+        Expression expression = context.resolveLanguage("simple").createExpression("${body.remove(0)}");
         expression.evaluate(exchange, Object.class);
 
         assertEquals(1, data.size());
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 c180124..7c2997e 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
@@ -668,6 +668,27 @@ public class ExpressionBuilder {
     /**
      * Returns an expression for evaluating the expression/predicate using the given language
      *
+     * @param languageName  the language name
+     * @param language      the language
+     * @param expression  the expression or predicate
+     * @return an expression object which will evaluate the expression/predicate using the given language
+     */
+    public static Expression languageExpression(final String languageName, final Language language, final String expression) {
+        return new ExpressionAdapter() {
+            public Object evaluate(Exchange exchange) {
+                return language.createExpression(expression).evaluate(exchange, Object.class);
+            }
+
+            @Override
+            public String toString() {
+                return languageName + "(" + expression + ")";
+            }
+        };
+    }
+
+    /**
+     * Returns an expression for evaluating the expression/predicate using the given language
+     *
      * @param expression  the expression or predicate
      * @return an expression object which will evaluate the expression/predicate using the given language
      */