You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/01/15 17:54:46 UTC

svn commit: r1231707 - in /camel/branches/camel-2.9.x: ./ camel-core/src/main/java/org/apache/camel/util/ camel-core/src/test/java/org/apache/camel/processor/ camel-core/src/test/java/org/apache/camel/util/

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