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