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 fd48f19 CAMEL-15704: camel-csimple - Compiled simple language.
fd48f19 is described below
commit fd48f19f2a5109f96572c8edc5023c6c006398b3
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Nov 27 09:48:07 2020 +0100
CAMEL-15704: camel-csimple - Compiled simple language.
---
.../language/csimple/joor/OriginalSimpleTest.java | 5 +++--
.../camel/language/csimple/CSimpleCodeGenerator.java | 4 +++-
.../camel/language/simple/SimpleExpressionParser.java | 18 ++++++++++++++++++
.../camel/language/simple/SimplePredicateParser.java | 18 ++++++++++++++++++
.../language/simple/ast/SimpleFunctionExpression.java | 8 +++++---
5 files changed, 47 insertions(+), 6 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 ba10ddd..a68db8c 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
@@ -537,7 +537,7 @@ public class OriginalSimpleTest extends LanguageTestSupport
{
fail("Should have thrown an exception");
} catch (ExpressionIllegalSyntaxException e) {
assertTrue(e.getMessage()
- .startsWith("Valid syntax: ${exchangeProperty.OGNL} was:
exchangeProperty.foobar[bar at location 0"));
+ .startsWith("Valid syntax: ${exchangePropertyAs(key,
type).OGNL} was: exchangeProperty.foobar[bar at location 0"));
}
}
@@ -548,7 +548,7 @@ public class OriginalSimpleTest extends LanguageTestSupport
{
fail("Should have thrown an exception");
} catch (Exception e) {
assertTrue(e.getMessage()
- .startsWith("Valid syntax: ${exchangePropertyAs.OGNL} was:
exchangeProperty.foobar[bar at location 0"));
+ .startsWith("Valid syntax: ${exchangePropertyAs(key,
type).OGNL} was: exchangeProperty.foobar[bar at location 0"));
}
}
@@ -1639,6 +1639,7 @@ public class OriginalSimpleTest extends
LanguageTestSupport {
public void testJSonLike() throws Exception {
exchange.getIn().setBody("Something");
+ assertExpression("{\"oneline\": \"${body}\"}", "{\"oneline\":
\"Something\"}");
assertExpression("{\n\"data\": \"${body}\"\n}", "{\n\"data\":
\"Something\"\n}");
}
diff --git
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
index d3f0c24..b336aa8 100644
---
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
+++
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
@@ -104,8 +104,10 @@ public class CSimpleCodeGenerator {
sb.append(" @Override\n");
sb.append(" public String getText() {\n");
+ // \ should be escaped
+ String escaped = StringHelper.replaceAll(text, "\\", "\\\\");
// we need to escape all " so its a single literal string
- String escaped = StringHelper.replaceAll(text, "\"", "\\\"");
+ escaped = StringHelper.replaceAll(escaped, "\"", "\\\"");
sb.append(" return \"").append(escaped).append("\";\n");
sb.append(" }\n");
sb.append("\n");
diff --git
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
index 949856a..7b5740d 100644
---
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
+++
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
@@ -222,6 +222,8 @@ public class SimpleExpressionParser extends
BaseSimpleParser {
if (node instanceof LiteralNode) {
exp = StringHelper.removeLeadingAndEndingQuotes(exp);
sb.append("\"");
+ // " should be escaped to \"
+ exp = escapeQuotes(exp);
// \n \t \r should be escaped
exp = exp.replaceAll("\n", "\\\\n");
exp = exp.replaceAll("\t", "\\\\t");
@@ -236,6 +238,22 @@ public class SimpleExpressionParser extends
BaseSimpleParser {
return sb.toString();
}
+ private static String escapeQuotes(String text) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < text.length(); i++) {
+ char prev = i > 0 ? text.charAt(i - 1) : 0;
+ char ch = text.charAt(i);
+
+ if (ch == '"' && (i == 0 || prev != '\\')) {
+ sb.append('\\');
+ sb.append('"');
+ } else {
+ sb.append(ch);
+ }
+ }
+ return sb.toString();
+ }
+
// --------------------------------------------------------------
// grammar
// --------------------------------------------------------------
diff --git
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
index a1d759d..71d173c 100644
---
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
+++
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
@@ -172,6 +172,8 @@ public class SimplePredicateParser extends BaseSimpleParser
{
if (node instanceof LiteralNode) {
exp = StringHelper.removeLeadingAndEndingQuotes(exp);
sb.append("\"");
+ // " should be escaped to \"
+ exp = escapeQuotes(exp);
// \n \t \r should be escaped
exp = exp.replaceAll("\n", "\\\\n");
exp = exp.replaceAll("\t", "\\\\t");
@@ -185,6 +187,22 @@ public class SimplePredicateParser extends
BaseSimpleParser {
return sb.toString();
}
+ private static String escapeQuotes(String text) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < text.length(); i++) {
+ char prev = i > 0 ? text.charAt(i - 1) : 0;
+ char ch = text.charAt(i);
+
+ if (ch == '"' && (i == 0 || prev != '\\')) {
+ sb.append('\\');
+ sb.append('"');
+ } else {
+ sb.append(ch);
+ }
+ }
+ return sb.toString();
+ }
+
/**
* Parses the tokens and crates the AST nodes.
* <p/>
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 d3c0863..dab943f 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
@@ -600,7 +600,7 @@ public class SimpleFunctionExpression extends
LiteralExpression {
if (remainder != null) {
boolean invalid =
OgnlHelper.isInvalidValidOgnlExpression(remainder);
if (invalid) {
- throw new SimpleParserException("Valid syntax:
${exception.OGNL} was: " + function, token.getIndex());
+ throw new SimpleParserException("Valid syntax:
${exceptionAs(type).OGNL} was: " + function, token.getIndex());
}
return "exception(exchange)" + ognlCodeMethods(remainder);
}
@@ -648,12 +648,14 @@ public class SimpleFunctionExpression extends
LiteralExpression {
boolean invalid =
OgnlHelper.isInvalidValidOgnlExpression(remainder);
if (invalid) {
// must use exchangePropertyAs as we need to be typed
- throw new SimpleParserException("Valid syntax:
${exchangePropertyAs.OGNL} was: " + function, token.getIndex());
+ throw new SimpleParserException(
+ "Valid syntax: ${exchangePropertyAs(key, type).OGNL}
was: " + function, token.getIndex());
}
if (OgnlHelper.isValidOgnlExpression(remainder)) {
// must use exchangePropertyAs as we need to be typed
- throw new SimpleParserException("Valid syntax:
${exchangePropertyAs.OGNL} was: " + function, token.getIndex());
+ throw new SimpleParserException(
+ "Valid syntax: ${exchangePropertyAs(key, type).OGNL}
was: " + function, token.getIndex());
} else {
// regular property
return "exchangeProperty(exchange, \"" + remainder + "\")";