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
*/