Author: davsclaus Date: Sun Jan 15 16:54:46 2012 New Revision: 1231707 URL: http://svn.apache.org/viewvc?rev=1231707&view=rev Log: CAMEL-4894: Fixed ognl parser to take into account parameter bindings encloded in parenthesis pairs, in the method names.
Added: camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/util/OgnlHelperTest.java - copied unchanged from r1231704, camel/trunk/camel-core/src/test/java/org/apache/camel/util/OgnlHelperTest.java Modified: camel/branches/camel-2.9.x/ (props changed) camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/OgnlHelper.java camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/processor/RecipientListBeanTest.java Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Sun Jan 15 16:54:46 2012 @@ -1 +1 @@ -/camel/trunk:1227209,1227212,1227540,1228015,1228027,1228223,1228879,1229565,1231135 +/camel/trunk:1227209,1227212,1227540,1228015,1228027,1228223,1228879,1229565,1231135,1231704 Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ --- svnmerge-integrated (original) +++ svnmerge-integrated Sun Jan 15 16:54:46 2012 @@ -1 +1 @@ -/camel/trunk:1-1227196,1227209,1227212,1227540,1228015,1228027,1228223,1228879,1229565,1231135 +/camel/trunk:1-1227196,1227209,1227212,1227540,1228015,1228027,1228223,1228879,1229565,1231135,1231704 Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/OgnlHelper.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/OgnlHelper.java?rev=1231707&r1=1231706&r2=1231707&view=diff ============================================================================== --- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/OgnlHelper.java (original) +++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/OgnlHelper.java Sun Jan 15 16:54:46 2012 @@ -164,14 +164,23 @@ public final class OgnlHelper { * Regular expression with repeating groups is a pain to get right * and then nobody understands the reg exp afterwards. * So we use a bit ugly/low-level Java code to split the OGNL into methods. + * + * @param ognl the ognl expression + * @return a list of methods, will return an empty list, if ognl expression has no methods */ public static List<String> splitOgnl(String ognl) { List<String> methods = new ArrayList<String>(); + // return an empty list if ognl is empty + if (ObjectHelper.isEmpty(ognl)) { + return methods; + } + 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 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}) for (int i = 0; i < ognl.length(); i++) { char ch = ognl.charAt(i); // special for starting a new method @@ -179,12 +188,16 @@ public final class OgnlHelper { || (ch != '.' && ch != '?' && ch != ']')) { sb.append(ch); // special if we are doing square bracket - if (ch == '[') { + if (ch == '[' && !parenthesisBracket) { squareBracket = true; + } else if (ch == '(') { + parenthesisBracket = true; + } else if (ch == ')') { + parenthesisBracket = false; } j++; // advance } else { - if (ch == '.' && !squareBracket) { + if (ch == '.' && !squareBracket && !parenthesisBracket) { // 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 @@ -205,7 +218,7 @@ public final class OgnlHelper { // reset j to begin a new method j = 0; - } else if (ch == ']') { + } else if (ch == ']' && !parenthesisBracket) { // append ending ] to method name sb.append(ch); String s = sb.toString(); @@ -223,11 +236,16 @@ public final class OgnlHelper { squareBracket = false; } - // and dont lose the char if its not an ] end marker (as we already added that) - if (ch != ']') { + // and don't lose the char if its not an ] end marker (as we already added that) + if (ch != ']' || parenthesisBracket) { sb.append(ch); } + // check for end of parenthesis + if (ch == ')') { + parenthesisBracket = false; + } + // only advance if already begun on the new method if (j > 0) { j++; Modified: camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/processor/RecipientListBeanTest.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/processor/RecipientListBeanTest.java?rev=1231707&r1=1231706&r2=1231707&view=diff ============================================================================== --- camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/processor/RecipientListBeanTest.java (original) +++ camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/processor/RecipientListBeanTest.java Sun Jan 15 16:54:46 2012 @@ -16,6 +16,9 @@ */ package org.apache.camel.processor; +import java.util.HashMap; +import java.util.Map; + import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; @@ -42,10 +45,26 @@ public class RecipientListBeanTest exten assertMockEndpointsSatisfied(); } + + public void testRecipientListWithParams() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Hello b"); + + Map<String, Object> headers = new HashMap<String, Object>(); + headers.put("one", 21); + headers.put("two", "direct:a,direct:b,direct:c"); + + String out = template.requestBodyAndHeaders("direct:params", "Hello World", headers, String.class); + assertEquals("Hello b", out); + + assertMockEndpointsSatisfied(); + } + protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { public void configure() { from("direct:start").recipientList(bean("myBean", "foo")).to("mock:result"); + from("direct:params").recipientList(bean("myBean", "bar(${header.one}, ${header.two})"), ",").to("mock:result"); from("direct:a").transform(constant("Hello a")); from("direct:b").transform(constant("Hello b")); @@ -59,6 +78,12 @@ public class RecipientListBeanTest exten public String[] foo(String body) { return body.split(","); } + + public String bar(int one, String two) { + assertEquals(21, one); + assertEquals("direct:a,direct:b,direct:c", two); + return "direct:c,direct:b"; + } } } \ No newline at end of file