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 + "\")";

Reply via email to