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 e32bd84 CAMEL-15704: camel-csimple - Compiled simple language.
e32bd84 is described below
commit e32bd841809a29ca3206d2c3c3cb8d0b770693f0
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Nov 30 21:07:14 2020 +0100
CAMEL-15704: camel-csimple - Compiled simple language.
---
.../language/csimple/joor/OriginalSimpleTest.java | 11 ++-
.../simple/ast/SimpleFunctionExpression.java | 100 ++++++++++++++++++---
2 files changed, 93 insertions(+), 18 deletions(-)
diff --git
a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
index 4d586df..f72db88 100644
---
a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
+++
b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
@@ -489,8 +489,11 @@ public class OriginalSimpleTest extends
LanguageTestSupport {
lines.add(new OrderLine(456, "ActiveMQ in Action"));
exchange.setProperty("wicket", lines);
- assertExpression("${exchangePropertyAs(wicket, List)[0].getId}", 123);
- assertExpression("${exchangePropertyAs(wicket, List)[1].getName}",
"ActiveMQ in Action");
+ assertExpression("${exchangePropertyAsIndex(wicket, OrderLine,
'0').getId}", 123);
+ assertExpression("${exchangePropertyAsIndex(wicket, OrderLine,
'1').getName}", "ActiveMQ in Action");
+
+ assertExpression("${exchangePropertyAs(wicket, OrderLine)[0].getId}",
123);
+ assertExpression("${exchangePropertyAs(wicket,
OrderLine)[1].getName}", "ActiveMQ in Action");
try {
assertExpression("${exchangeProperty.wicket[2]}", "");
fail("Should have thrown an exception");
@@ -989,8 +992,8 @@ public class OriginalSimpleTest extends LanguageTestSupport
{
lines.add(new OrderLine(456, "ActiveMQ in Action"));
exchange.getIn().setHeader("wicket", lines);
- assertExpression("${header.wicket[0].getId}", 123);
- assertExpression("${header.wicket[1].getName}", "ActiveMQ in Action");
+ assertExpression("${headerAsIndex(wicket, OrderLine, 0).getId}", 123);
+ assertExpression("${headerAsIndex(wicket, OrderLine, 1).getName}",
"ActiveMQ in Action");
try {
assertExpression("${header.wicket[2]}", "");
fail("Should have thrown an exception");
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 becf312..00f9dcc 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
@@ -564,7 +564,11 @@ public class SimpleFunctionExpression extends
LiteralExpression {
}
// body and headers first
- answer = createCodeBodyOrHeader(function);
+ answer = createCodeBody(function);
+ if (answer != null) {
+ return answer;
+ }
+ answer = createCodeHeader(function);
if (answer != null) {
return answer;
}
@@ -863,7 +867,7 @@ public class SimpleFunctionExpression extends
LiteralExpression {
return null;
}
- private String createCodeBodyOrHeader(final String function) {
+ private String createCodeBody(final String function) {
// bodyAsIndex
String remainder = ifStartsWithReturnRemainder("bodyAsIndex(",
function);
if (remainder != null) {
@@ -929,7 +933,7 @@ public class SimpleFunctionExpression extends
LiteralExpression {
if (!last.isEmpty()) {
func += "." + last;
}
- return createCodeBodyOrHeader(func);
+ return createCodeBody(func);
}
}
return "bodyAs(message, " + type + ")" +
ognlCodeMethods(remainder, type);
@@ -1004,7 +1008,7 @@ public class SimpleFunctionExpression extends
LiteralExpression {
if (!last.isEmpty()) {
func += "." + last;
}
- return createCodeBodyOrHeader(func);
+ return createCodeBody(func);
}
}
return "mandatoryBodyAs(message, " + type + ")" +
ognlCodeMethods(remainder, type);
@@ -1035,12 +1039,60 @@ public class SimpleFunctionExpression extends
LiteralExpression {
if (!last.isEmpty()) {
func += "." + last;
}
- return createCodeBodyOrHeader(func);
+ return createCodeBody(func);
}
}
return "body" + ognlCodeMethods(remainder, null);
}
+ return null;
+ }
+
+ private String createCodeHeader(final String function) {
+ // headerAsIndex
+ String remainder = ifStartsWithReturnRemainder("headerAsIndex(",
function);
+ if (remainder != null) {
+ String keyTypeAndIndex = StringHelper.before(remainder, ")");
+ if (keyTypeAndIndex == null) {
+ throw new SimpleParserException(
+ "Valid syntax: ${headerAsIndex(key, type, index)} was:
" + function, token.getIndex());
+ }
+ String[] parts = keyTypeAndIndex.split(",");
+ if (parts.length != 3) {
+ throw new SimpleParserException(
+ "Valid syntax: ${headerAsIndex(key, type, index)} was:
" + function, token.getIndex());
+ }
+ String key = parts[0];
+ String type = parts[1];
+ String index = parts[2];
+ if (ObjectHelper.isEmpty(key) || ObjectHelper.isEmpty(type) ||
ObjectHelper.isEmpty(index)) {
+ throw new SimpleParserException(
+ "Valid syntax: ${headerAsIndex(key, type, index)} was:
" + function, token.getIndex());
+ }
+ key = StringHelper.removeQuotes(key);
+ key = key.trim();
+ type = StringHelper.removeQuotes(type);
+ if (!type.endsWith(".class")) {
+ type = type + ".class";
+ }
+ type = type.replace('$', '.');
+ type = type.trim();
+ index = StringHelper.removeQuotes(index);
+ index = index.trim();
+ remainder = StringHelper.after(remainder, ")");
+ if (ObjectHelper.isNotEmpty(remainder)) {
+ boolean invalid =
OgnlHelper.isInvalidValidOgnlExpression(remainder);
+ if (invalid) {
+ throw new SimpleParserException(
+ "Valid syntax: ${headerAsIndex(key, type,
index).OGNL} was: " + function, token.getIndex());
+ }
+ return "headerAsIndex(message, " + type + ", \"" + key + "\",
\"" + index + "\")"
+ + ognlCodeMethods(remainder, type);
+ } else {
+ return "headerAsIndex(message, " + type + ", \"" + key + "\",
\"" + index + "\")";
+ }
+ }
+
// headerAs
remainder = ifStartsWithReturnRemainder("headerAs(", function);
if (remainder != null) {
@@ -1071,6 +1123,8 @@ public class SimpleFunctionExpression extends
LiteralExpression {
return "message.getHeaders()";
}
+ // TODO: exchangePropertyAsIndex
+
// in header function
remainder = ifStartsWithReturnRemainder("in.headers", function);
if (remainder == null) {
@@ -1100,19 +1154,37 @@ public class SimpleFunctionExpression extends
LiteralExpression {
if (invalid) {
throw new SimpleParserException("Valid syntax:
${header.name[key]} was: " + function, token.getIndex());
}
- // it is an index?
- String index = null;
- if (key.endsWith("]")) {
- index = StringHelper.between(key, "[", "]");
- if (index != null) {
- key = StringHelper.before(key, "[");
+
+ // the key can contain index as it may be a map header.foo[0]
+ // and the key can also be OGNL (eg if there is a dot)
+ boolean index = false;
+ List<String> parts = splitOgnl(key);
+ if (parts.size() > 0) {
+ String s = parts.get(0);
+ int pos = s.indexOf('[');
+ if (pos != -1) {
+ index = true;
+ // split key into name and index
+ String before = s.substring(0, pos);
+ String after = s.substring(pos);
+ parts.set(0, before);
+ parts.add(1, after);
}
}
- if (index != null) {
- return "headerAsIndex(message, Object.class, \"" + key + "\",
\"" + index + "\")";
+ if (index) {
+ // is there any index, then we should use headerAsIndex
function instead
+ // (use splitOgnl which assembles multiple indexes into a
single part)
+ String func = "headerAsIndex(\"" + parts.get(0) + "\",
Object.class, \"" + parts.get(1) + "\")";
+ if (parts.size() > 2) {
+ String last = String.join("", parts.subList(2,
parts.size()));
+ if (!last.isEmpty()) {
+ func += "." + last;
+ }
+ }
+ return createCodeHeader(func);
} else if (OgnlHelper.isValidOgnlExpression(key)) {
// ognl based header must be typed
- throw new SimpleParserException("Valid syntax: ${headerAs(key,
type)} was: " + function, token.getIndex());
+ throw new SimpleParserException("Valid syntax: ${headerAs(key,
type).OGNL} was: " + function, token.getIndex());
} else {
// regular header
return "header(message, \"" + key + "\")";