This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9e696d136331268cb6e8c09ddc7aed2f9b9815f5 Author: Michael Pätzold <michael.paetz...@aoe.com> AuthorDate: Thu Sep 12 10:32:06 2019 +0200 CAMEL-13962: keep track of brackets that belong to a method in order to prevent false method splitting --- .../java/org/apache/camel/util/OgnlHelper.java | 23 ++++++++++--------- .../java/org/apache/camel/util/OgnlHelperTest.java | 26 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 11 deletions(-) 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 df806ea..564df2a 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 @@ -204,8 +204,9 @@ public final class OgnlHelper { StringBuilder sb = new StringBuilder(); int j = 0; // j is used as counter per method - boolean squareBracket = false; // special to keep track if we are inside a square bracket block, eg: [foo] - boolean parenthesisBracket = false; // special to keep track if we are inside a parenthesis block, eg: bar(${body}, ${header.foo}) + int squareBracketCnt = 0; // special to keep track if and how deep we are inside a square bracket block, eg: [foo] + int parenthesisBracketCnt = 0; // special to keep track if and how deep we are inside a parenthesis block, eg: bar(${body}, ${header.foo}) + for (int i = 0; i < ognl.length(); i++) { char ch = ognl.charAt(i); // special for starting a new method @@ -213,16 +214,16 @@ public final class OgnlHelper { || (ch != '.' && ch != '?' && ch != ']')) { sb.append(ch); // special if we are doing square bracket - if (ch == '[' && !parenthesisBracket) { - squareBracket = true; + if (ch == '[' && parenthesisBracketCnt == 0) { + squareBracketCnt++; } else if (ch == '(') { - parenthesisBracket = true; + parenthesisBracketCnt++; } else if (ch == ')') { - parenthesisBracket = false; + parenthesisBracketCnt--; } j++; // advance } else { - if (ch == '.' && !squareBracket && !parenthesisBracket) { + if (ch == '.' && squareBracketCnt == 0 && parenthesisBracketCnt == 0) { // only treat dot as a method separator if not inside a square bracket block // as dots can be used in key names when accessing maps @@ -243,7 +244,7 @@ public final class OgnlHelper { // reset j to begin a new method j = 0; - } else if (ch == ']' && !parenthesisBracket) { + } else if (ch == ']' && parenthesisBracketCnt == 0) { // append ending ] to method name sb.append(ch); String s = sb.toString(); @@ -258,11 +259,11 @@ public final class OgnlHelper { j = 0; // no more square bracket - squareBracket = false; + squareBracketCnt--; } // and don't lose the char if its not an ] end marker (as we already added that) - if (ch != ']' || parenthesisBracket) { + if (ch != ']' || parenthesisBracketCnt > 0) { sb.append(ch); } @@ -279,7 +280,7 @@ public final class OgnlHelper { } String last = methods.isEmpty() ? null : methods.get(methods.size() - 1); - if (parenthesisBracket && last != null) { + if (parenthesisBracketCnt>0 && last != null) { // there is an unclosed parenthesis bracket on the last method, so it should end with a parenthesis if (last.contains("(") && !last.endsWith(")")) { throw new IllegalArgumentException("Method should end with parenthesis, was " + last); diff --git a/core/camel-util/src/test/java/org/apache/camel/util/OgnlHelperTest.java b/core/camel-util/src/test/java/org/apache/camel/util/OgnlHelperTest.java new file mode 100644 index 0000000..6d2874a --- /dev/null +++ b/core/camel-util/src/test/java/org/apache/camel/util/OgnlHelperTest.java @@ -0,0 +1,26 @@ +package org.apache.camel.util; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +public class OgnlHelperTest extends Assert { + + /** + * Tests correct splitting in case the OGNL expression contains method parameters with brackets. + */ + @Test + public void splitOgnlWithRegexInMethod() { + String ognl = "header.cookie.replaceFirst(\".*;?iwanttoknow=([^;]+);?.*\", \"$1\")"; + assertFalse(OgnlHelper.isInvalidValidOgnlExpression(ognl)); + assertTrue(OgnlHelper.isValidOgnlExpression(ognl)); + + List<String> strings = OgnlHelper.splitOgnl(ognl); + assertEquals(3, strings.size()); + assertEquals("header", strings.get(0)); + assertEquals(".cookie", strings.get(1)); + assertEquals(".replaceFirst(\".*;?iwanttoknow=([^;]+);?.*\", \"$1\")", strings.get(2)); + } + +}