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 6c3d567 CAMEL-15704: camel-csimple - Compiled simple language. 6c3d567 is described below commit 6c3d5671945d1034e94d4b12aa02f2de8f2552b1 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Dec 3 20:06:34 2020 +0100 CAMEL-15704: camel-csimple - Compiled simple language. --- .../language/csimple/joor/OriginalSimpleTest.java | 17 +++++++---- .../simple/ast/SimpleFunctionExpression.java | 5 ++++ .../java/org/apache/camel/util/OgnlHelperTest.java | 9 ++++++ .../java/org/apache/camel/util/OgnlHelper.java | 34 ++++++++++++++++++++++ 4 files changed, 60 insertions(+), 5 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 f18b8ee..f30184f 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 @@ -1583,13 +1583,12 @@ public class OriginalSimpleTest extends LanguageTestSupport { public void testBodyOgnlSpaces() throws Exception { exchange.getIn().setBody("Hello World"); - // no quotes, which is discouraged to use - // TODO: single quotes as double quotes - // assertExpression("${bodyAs(String).compareTo('Hello World')}", 0); - + assertExpression("${bodyAs(String).compareTo('Hello World')}", 0); assertExpression("${bodyAs(String).compareTo(\"Hello World\")}", 0); + + assertExpression("${bodyAs(String).compareTo('Hello World')}", 0); assertExpression("${bodyAs(String).compareTo(${bodyAs(String)})}", 0); - assertExpression("${bodyAs(String).compareTo(\"foo\")}", "Hello World".compareTo("foo")); + assertExpression("${bodyAs(String).compareTo('foo')}", "Hello World".compareTo("foo")); assertExpression("${bodyAs(String).compareTo( \"Hello World\" )}", 0); assertExpression("${bodyAs(String).compareTo( ${bodyAs(String)} )}", 0); @@ -1597,6 +1596,14 @@ public class OriginalSimpleTest extends LanguageTestSupport { } @Test + public void testBodySingleQuote() throws Exception { + exchange.getIn().setBody("It's a great World"); + + assertExpression("${bodyAs(String).compareTo(\"It's a great World\")}", 0); + assertExpression("${bodyAs(String).compareTo('It\\'s a great World')}", 0); + } + + @Test public void testClassSimpleName() throws Exception { Animal tiger = new Animal("Tony the Tiger", 13); exchange.getIn().setBody(tiger); 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 2db72c1..af823d8 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 @@ -1394,6 +1394,11 @@ public class SimpleFunctionExpression extends LiteralExpression { } } + // single quotes for string literals should be replaced as double quotes + if (m != null) { + m = OgnlHelper.methodAsDoubleQuotes(m); + } + // shorthand getter syntax: .name -> .getName() if (m != null && !m.isEmpty()) { // a method so append with a dot diff --git a/core/camel-core/src/test/java/org/apache/camel/util/OgnlHelperTest.java b/core/camel-core/src/test/java/org/apache/camel/util/OgnlHelperTest.java index bb86e95..297de96 100644 --- a/core/camel-core/src/test/java/org/apache/camel/util/OgnlHelperTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/util/OgnlHelperTest.java @@ -136,4 +136,13 @@ public class OgnlHelperTest { assertEquals(".bar(true, ${header.bar[0]?.code})", methods.get(1)); } + @Test + public void testMethodAsDoubleQuotes() throws Exception { + String out = OgnlHelper.methodAsDoubleQuotes("${bodyAs(String).compareTo('It\\'s a great World')}"); + assertEquals("${bodyAs(String).compareTo(\"It's a great World\")}", out); + + out = OgnlHelper.methodAsDoubleQuotes("${bodyAs(String).compareTo(\"It's a great World\")}"); + assertEquals("${bodyAs(String).compareTo(\"It's a great World\")}", out); + } + } diff --git a/core/camel-util/src/main/java/org/apache/camel/util/OgnlHelper.java b/core/camel-util/src/main/java/org/apache/camel/util/OgnlHelper.java index b10d7ae..c1c2a8d 100644 --- a/core/camel-util/src/main/java/org/apache/camel/util/OgnlHelper.java +++ b/core/camel-util/src/main/java/org/apache/camel/util/OgnlHelper.java @@ -276,4 +276,38 @@ public final class OgnlHelper { return methods; } + public static String methodAsDoubleQuotes(String ognl) { + StringBuilder sb = new StringBuilder(); + + int singleBracketCnt = 0; + int doubleBracketCnt = 0; + for (int i = 0; i < ognl.length(); i++) { + char ch = ognl.charAt(i); + char next = i < ognl.length() - 1 ? ognl.charAt(i + 1) : 0; + + if (ch == '\\' && next == '\'') { + if (singleBracketCnt % 2 != 0) { + // its an escaped single quote inside an existing quote + // then unescape it + sb.append('\''); + // and skip over to next + i++; + continue; + } + } + + if (doubleBracketCnt % 2 == 0 && ch == '\'') { + singleBracketCnt++; + sb.append('"'); + } else if (singleBracketCnt % 2 == 0 && ch == '"') { + doubleBracketCnt++; + sb.append('"'); + } else { + sb.append(ch); + } + } + + return sb.toString(); + } + }