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 <claus.ib...@gmail.com> 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 + "\")";