Author: davsclaus
Date: Mon Jul 25 17:02:41 2011
New Revision: 1150780

URL: http://svn.apache.org/viewvc?rev=1150780&view=rev
Log:
CAMEL-3961: Bean component now supports parameter values specified directly in 
method name option. You can now bind body, headers, fixed values etc. without 
any annotations or other means.

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodParameterValueTest.java
      - copied, changed from r1150672, 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodTest.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOgnlTest.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOverloadedTest.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueTest.java
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodFQNTest.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
 Mon Jul 25 17:02:41 2011
@@ -684,7 +684,7 @@ public class BeanInfo {
         while (it.hasNext()) {
             MethodInfo info = it.next();
             if (!matchMethod(info.getMethod(), name)) {
-                // name does not match so remove it
+                // method does not match so remove it
                 it.remove();
             }
         }
@@ -718,20 +718,39 @@ public class BeanInfo {
             for (int i = 0; i < method.getParameterTypes().length; i++) {
                 if (it.hasNext()) {
                     String qualifyType = (String) it.next();
+                    if (ObjectHelper.isEmpty(qualifyType)) {
+                        continue;
+                    }
+                    qualifyType = qualifyType.trim();
+
                     if ("*".equals(qualifyType)) {
                         // * is a wildcard so we accept and match that 
parameter type
                         continue;
                     }
 
-                    // match on either simple name or FQN decided by end user 
as how
-                    // he specified the qualify type
-                    String parameterType = 
method.getParameterTypes()[i].getSimpleName();
-                    if (qualifyType.indexOf(".") > -1) {
-                        parameterType = 
method.getParameterTypes()[i].getName();
+                    if (qualifyType.startsWith("'") || 
qualifyType.startsWith("\"")) {
+                        // if the type starts with a quote, then its a 
parameter value instead
+                        continue;
                     }
-                    if (!parameterType.equals(qualifyType)) {
-                        return false;
+
+                    // so it can either be a type or a parameter value
+                    // - type: Boolean, String etc.
+                    // - value: true, 5, 'Hello World' etc
+
+                    Class<?> qualifyClass = 
getCamelContext().getClassResolver().resolveClass(qualifyType);
+                    // class resolver will return null if not a class
+                    if (qualifyClass != null) {
+                        Class<?> parameterClass = 
method.getParameterTypes()[i];
+                        if (!parameterClass.isAssignableFrom(qualifyClass)) {
+                            return false;
+                        }
                     }
+
+                    // maybe its a FQN for simple name
+                    if 
(qualifyType.equals(method.getParameterTypes()[i].getSimpleName())) {
+                        continue;
+                    }
+
                 } else {
                     // there method has more parameters than was specified in 
the method name qualifiers
                     return false;

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
 Mon Jul 25 17:02:41 2011
@@ -23,6 +23,7 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -43,6 +44,7 @@ import org.apache.camel.processor.aggreg
 import org.apache.camel.util.CamelContextHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ServiceHelper;
+import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -348,34 +350,135 @@ public class MethodInfo {
                 if 
(exchange.getIn().getHeader(Exchange.BEAN_MULTI_PARAMETER_ARRAY) != null) {
                     multiParameterArray = 
exchange.getIn().getHeader(Exchange.BEAN_MULTI_PARAMETER_ARRAY, Boolean.class);
                 }
+
+                // if there was an explicit method name to invoke, then we 
should support using
+                // any provided parameter values in the method name
+                String methodName = 
exchange.getIn().getHeader(Exchange.BEAN_METHOD_NAME, "", String.class);
+                // the parameter values is between the parenthesis
+                String methodParameters = ObjectHelper.between(methodName, 
"(", ")");
+                // use an iterator to walk the parameter values
+                Iterator it = null;
+                if (methodParameters != null) {
+                    it = ObjectHelper.createIterator(methodParameters);
+                }
+
                 for (int i = 0; i < size; i++) {
+                    // grab the parameter value for the given index
+                    Object parameterValue = it != null && it.hasNext() ? 
it.next() : null;
+                    // and the expected parameter type
+                    Class<?> parameterType = parameters.get(i).getType();
+                    // the value for the parameter to use
                     Object value = null;
+
                     if (multiParameterArray) {
+                        // get the value from the array
                         value = ((Object[])body)[i];
                     } else {
+                        // prefer to use parameter value if given, as they 
override any bean parameter binding
+                        // we should skip * as its a type placeholder to 
indicate any type
+                        if (parameterValue != null && 
!parameterValue.equals("*")) {
+                            // evaluate the parameter value binding
+                            value = evaluateParameterValue(exchange, i, 
parameterValue, parameterType);
+                        }
+
+                        // use bean parameter binding, if still no value
                         Expression expression = expressions[i];
-                        if (expression != null) {
-                            // use object first to avoid type conversion so we 
know if there is a value or not
-                            Object result = expression.evaluate(exchange, 
Object.class);
-                            if (result != null) {
+                        if (value == null && expression != null) {
+                            value = evaluateParameterBinding(exchange, 
expression, i, parameterType);
+                        }
+                    }
+
+                    // remember the value to use
+                    answer[i] = value;
+                }
+
+                return (T) answer;
+            }
+
+            /**
+             * Evaluate using parameter values where the values can be 
provided in the method name syntax.
+             *
+             * @since 2.9
+             */
+            private Object evaluateParameterValue(Exchange exchange, int 
index, Object parameterValue, Class<?> parameterType) {
+                Object answer = null;
+
+                // at first evaluate it as a simple expression as it may 
contain references to headers, etc
+                String exp = 
exchange.getContext().getTypeConverter().convertTo(String.class, 
parameterValue);
+                if (exp != null) {
+                    // must trim first as there may be spaces between 
parameters
+                    exp = exp.trim();
+
+                    // TODO: make rule about how a parameter value should be 
defined
+                    // and use this rule to pre determine if its class or not
+                    // - boolean as true|false
+                    // - numeric such as 5, 7, 123
+                    // - string literals which must be quoted, either single 
or double
+
+                    // so it can either be a type or a parameter value
+                    // - type: Boolean, String etc.
+                    // - value: true, 5, 'Hello World' etc
+                    boolean isClass = false;
+                    if (exp.startsWith("'") || exp.startsWith("\"")) {
+                        // if the type starts with a quote, then its a 
parameter value
+                        exp = StringHelper.removeLeadingAndEndingQuotes(exp);
+                    } else {
+                        // it could be a type, so lets so if we can resolve 
the class
+                        Class<?> expClass = 
exchange.getContext().getClassResolver().resolveClass(exp);
+                        if (expClass != null) {
+                            isClass = true;
+                        } else {
+                            // lets try to match by simple name as well
+                            if (exp.equals(parameterType.getSimpleName())) {
+                                isClass = true;
+                            }
+                        }
+                    }
+
+                    // if its a parameter value (not a class) then use the 
simple expression language to evaluate the expression
+                    // and convert the result to the parameter type, so we can 
pass in the result to the method, when we invoke it
+                    if (!isClass) {
+                        parameterValue = 
exchange.getContext().resolveLanguage("simple").createExpression(exp).evaluate(exchange,
 Object.class);
+                        if (parameterValue != null) {
+                            try {
                                 // we got a value now try to convert it to the 
expected type
-                                try {
-                                    value = 
exchange.getContext().getTypeConverter().mandatoryConvertTo(parameters.get(i).getType(),
 result);
-                                    if (LOG.isTraceEnabled()) {
-                                        LOG.trace("Parameter #{} evaluated as: 
{} type: ", new Object[]{i, value, ObjectHelper.type(value)});
-                                    }
-                                } catch (NoTypeConversionAvailableException e) 
{
-                                    throw 
ObjectHelper.wrapCamelExecutionException(exchange, e);
+                                answer = 
exchange.getContext().getTypeConverter().mandatoryConvertTo(parameterType, 
parameterValue);
+                                if (LOG.isTraceEnabled()) {
+                                    LOG.trace("Parameter #{} evaluated as: {} 
type: ", new Object[]{index, answer, ObjectHelper.type(answer)});
                                 }
-                            } else {
-                                LOG.trace("Parameter #{} evaluated as null", 
i);
+                            } catch (NoTypeConversionAvailableException e) {
+                                throw 
ObjectHelper.wrapCamelExecutionException(exchange, e);
                             }
                         }
                     }
-                    // now lets try to coerce the value to the required type
-                    answer[i] = value;
                 }
-                return (T) answer;
+
+                return answer;
+            }
+
+            /**
+             * Evaluate using classic parameter binding using the pre compute 
expression
+             */
+            private Object evaluateParameterBinding(Exchange exchange, 
Expression expression, int index, Class<?> parameterType) {
+                Object answer = null;
+
+                // use object first to avoid type conversion so we know if 
there is a value or not
+                Object result = expression.evaluate(exchange, Object.class);
+                if (result != null) {
+                    // we got a value now try to convert it to the expected 
type
+                    try {
+                        answer = 
exchange.getContext().getTypeConverter().mandatoryConvertTo(parameterType, 
result);
+                        if (LOG.isTraceEnabled()) {
+                            LOG.trace("Parameter #{} evaluated as: {} type: ", 
new Object[]{index, answer, ObjectHelper.type(answer)});
+                        }
+                    } catch (NoTypeConversionAvailableException e) {
+                        throw 
ObjectHelper.wrapCamelExecutionException(exchange, e);
+                    }
+                } else {
+                    LOG.trace("Parameter #{} evaluated as null", index);
+                }
+
+                return answer;
             }
 
             @Override

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java
 Mon Jul 25 17:02:41 2011
@@ -16,10 +16,9 @@
  */
 package org.apache.camel.component.bean;
 
-import java.util.List;
-
 import org.apache.camel.CamelExchangeException;
 import org.apache.camel.Exchange;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * @version 
@@ -32,13 +31,13 @@ public class MethodNotFoundException ext
     @SuppressWarnings("rawtypes")
 
     public MethodNotFoundException(Exchange exchange, Object pojo, String 
methodName) {
-        super("Method with name: " + methodName + " not found on bean: " + 
pojo, exchange);
+        super("Method with name: " + methodName + " not found on bean: " + 
pojo + " of type: " + ObjectHelper.className(pojo), exchange);
         this.methodName = methodName;
         this.bean = pojo;
     }
 
     public MethodNotFoundException(Object pojo, String methodName, Throwable 
cause) {
-        super("Method with name: " + methodName + " not found on bean: " + 
pojo, null, cause);
+        super("Method with name: " + methodName + " not found on bean: " + 
pojo + " of type:" + ObjectHelper.className(pojo), null, cause);
         this.methodName = methodName;
         this.bean = pojo;
     }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
 Mon Jul 25 17:02:41 2011
@@ -174,6 +174,9 @@ public class BeanExpression implements E
             Exchange resultExchange = exchange.copy();
             // force to use InOut to retrieve the result on the OUT message
             resultExchange.setPattern(ExchangePattern.InOut);
+            // do not propagate any method name when using OGNL, as with OGNL 
we
+            // compute and provide the method name to explicit to invoke
+            resultExchange.getIn().removeHeader(Exchange.BEAN_METHOD_NAME);
 
             // current ognl path as we go along
             String ognlPath = "";

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java 
Mon Jul 25 17:02:41 2011
@@ -745,8 +745,10 @@ public final class ObjectHelper {
         } else if ("double".equals(name)) {
             return double.class;
         }
+
         return null;
     }
+
     /**
      * Loads the given class with the provided classloader (may be null).
      * Will ignore any class not found and return null.
@@ -760,6 +762,7 @@ public final class ObjectHelper {
         if (loader == null) {
             return null;
         }
+
         try {
             LOG.trace("Loading class: {} using classloader: {}", name, loader);
             return loader.loadClass(name);
@@ -767,8 +770,8 @@ public final class ObjectHelper {
             if (LOG.isTraceEnabled()) {
                 LOG.trace("Cannot load class: " + name + " using classloader: 
" + loader, e);
             }
-
         }
+
         return null;
     }
 

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java 
Mon Jul 25 17:02:41 2011
@@ -76,6 +76,20 @@ public final class StringHelper {
         return s;
     }
 
+    public static String removeLeadingAndEndingQuotes(String s) {
+        if (ObjectHelper.isEmpty(s)) {
+            return s;
+        }
+
+        if (s.startsWith("'") && s.endsWith("'")) {
+            return s.substring(1, s.length() - 1);
+        }
+        if (s.startsWith("\"") && s.endsWith("\"")) {
+            return s.substring(1, s.length() - 1);
+        }
+        return s;
+    }
+
     /**
      * Encodes the text into safe XML by replacing < > and & with XML tokens
      *

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodFQNTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodFQNTest.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodFQNTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodFQNTest.java
 Mon Jul 25 17:02:41 2011
@@ -18,6 +18,7 @@ package org.apache.camel.component.bean;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.builder.RouteBuilder;
 
 /**
@@ -65,8 +66,8 @@ public class BeanOverloadedMethodFQNTest
             template.sendBody("direct:start", new MyOrder());
             fail("Should have thrown an exception");
         } catch (CamelExecutionException e) {
-            AmbiguousMethodCallException cause = 
assertIsInstanceOf(AmbiguousMethodCallException.class, e.getCause());
-            assertEquals(2, cause.getMethods().size());
+            NoTypeConversionAvailableException cause = 
assertIsInstanceOf(NoTypeConversionAvailableException.class, e.getCause());
+            assertEquals("Unknown", cause.getValue());
         }
     }
 
@@ -124,8 +125,8 @@ public class BeanOverloadedMethodFQNTest
             template.sendBody("direct:start", new MyOrder());
             fail("Should have thrown an exception");
         } catch (CamelExecutionException e) {
-            AmbiguousMethodCallException cause = 
assertIsInstanceOf(AmbiguousMethodCallException.class, e.getCause());
-            assertEquals(2, cause.getMethods().size());
+            NoTypeConversionAvailableException cause = 
assertIsInstanceOf(NoTypeConversionAvailableException.class, e.getCause());
+            
assertEquals("org.apache.camel.component.bean.BeanOverloadedMethodFQNTest$Unknown",
 cause.getValue());
         }
     }
 

Copied: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodParameterValueTest.java
 (from r1150672, 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodParameterValueTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodParameterValueTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodTest.java&r1=1150672&r2=1150780&rev=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanOverloadedMethodParameterValueTest.java
 Mon Jul 25 17:02:41 2011
@@ -16,27 +16,25 @@
  */
 package org.apache.camel.component.bean;
 
-import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.Header;
 import org.apache.camel.builder.RouteBuilder;
 
 /**
  *
  */
-public class BeanOverloadedMethodTest extends ContextTestSupport {
+public class BeanOverloadedMethodParameterValueTest extends ContextTestSupport 
{
 
     @Override
     public boolean isUseRouteBuilder() {
         return false;
     }
 
-    public void testHelloOverloadedHeString() throws Exception {
+    public void testHelloOverloadedString() throws Exception {
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
                 from("direct:start")
-                    .bean(MyBean.class, "hello(String)")
+                    .bean(MyBean.class, "hello(body)")
                     .to("mock:result");
 
             }
@@ -75,7 +73,7 @@ public class BeanOverloadedMethodTest ex
             public void configure() throws Exception {
                 // START SNIPPET: e2
                 from("direct:start")
-                    .bean(MyBean.class, "hello(String,String)")
+                    .bean(MyBean.class, "hello(body, header.country)")
                     .to("mock:result");
                 // END SNIPPET: e2
             }
@@ -94,7 +92,7 @@ public class BeanOverloadedMethodTest ex
             @Override
             public void configure() throws Exception {
                 from("direct:start")
-                    .bean(MyBean.class, "hello(*,String)")
+                    .bean(MyBean.class, "hello(*, ${header.country})")
                     .to("mock:result");
 
             }
@@ -108,114 +106,31 @@ public class BeanOverloadedMethodTest ex
         assertMockEndpointsSatisfied();
     }
 
-    public void testHelloOverloadedWildcardWildcard() throws Exception {
-        context.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                // START SNIPPET: e3
-                from("direct:start")
-                    .bean(MyBean.class, "hello(*,*)")
-                    .to("mock:result");
-                // END SNIPPET: e3
-            }
-        });
-        context.start();
-
-        getMockEndpoint("mock:result").expectedBodiesReceived("Hello Claus you 
are from Denmark");
-
-        template.sendBodyAndHeader("direct:start", "Claus", "country", 
"Denmark");
-
-        assertMockEndpointsSatisfied();
-    }
-
-    public void testHelloOverloadedPickCamelAnnotated() throws Exception {
+    public void testTimesOverloadedStringInt() throws Exception {
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
                 from("direct:start")
-                    .bean(MyBean.class, "hello")
+                    .bean(MyBean.class, "times(${body},3)")
                     .to("mock:result");
 
             }
         });
         context.start();
 
-        getMockEndpoint("mock:result").expectedBodiesReceived("Hello Claus you 
are from Denmark");
+        getMockEndpoint("mock:result").expectedBodiesReceived("AAA");
 
-        template.sendBodyAndHeader("direct:start", "Claus", "country", 
"Denmark");
+        template.sendBody("direct:start", "A");
 
         assertMockEndpointsSatisfied();
     }
 
-    public void testHelloOverloadedAmbiguousStringStringString() throws 
Exception {
-        context.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:start")
-                    .bean(MyBean.class, "hello(String,String,String)")
-                    .to("mock:result");
-
-            }
-        });
-        context.start();
-
-        try {
-            template.sendBodyAndHeader("direct:start", "Claus", "country", 
"Denmark");
-            fail("Should have thrown an exception");
-        } catch (CamelExecutionException e) {
-            AmbiguousMethodCallException cause = 
assertIsInstanceOf(AmbiguousMethodCallException.class, e.getCause());
-            assertEquals(2, cause.getMethods().size());
-        }
-    }
-
-    public void testHelloOverloadedStringInt() throws Exception {
-        context.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:start")
-                    .bean(MyBean.class, "hello(String,int)")
-                    .to("mock:result");
-
-            }
-        });
-        context.start();
-
-        try {
-            template.sendBodyAndHeader("direct:start", "Claus", "country", 
"Denmark");
-            fail("Should have thrown an exception");
-        } catch (CamelExecutionException e) {
-            AmbiguousMethodCallException cause = 
assertIsInstanceOf(AmbiguousMethodCallException.class, e.getCause());
-            assertEquals(2, cause.getMethods().size());
-        }
-    }
-
-    public void testHelloOverloadedIntString() throws Exception {
-        context.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:start")
-                    .bean(MyBean.class, "hello(int,String)")
-                    .to("mock:result");
-
-            }
-        });
-        context.start();
-
-        try {
-            template.sendBodyAndHeader("direct:start", "Claus", "country", 
"Denmark");
-            fail("Should have thrown an exception");
-        } catch (CamelExecutionException e) {
-            AmbiguousMethodCallException cause = 
assertIsInstanceOf(AmbiguousMethodCallException.class, e.getCause());
-            assertEquals(2, cause.getMethods().size());
-        }
-    }
-
-    public void testTimesOverloadedStringInt() throws Exception {
+    public void testTimesOverloadedStringIntHeader() throws Exception {
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
                 from("direct:start")
-                    .bean(MyBean.class, "times(String,int)")
+                    .bean(MyBean.class, "times(${body},${header.times})")
                     .to("mock:result");
 
             }
@@ -224,7 +139,7 @@ public class BeanOverloadedMethodTest ex
 
         getMockEndpoint("mock:result").expectedBodiesReceived("AAA");
 
-        template.sendBodyAndHeader("direct:start", "A", "times", "3");
+        template.sendBodyAndHeader("direct:start", "A", "times", 3);
 
         assertMockEndpointsSatisfied();
     }
@@ -234,7 +149,7 @@ public class BeanOverloadedMethodTest ex
             @Override
             public void configure() throws Exception {
                 from("direct:start")
-                    .bean(MyBean.class, "times(byte[],int)")
+                    .bean(MyBean.class, "times(byte[],${header.times})")
                     .to("mock:result");
 
             }
@@ -256,11 +171,11 @@ public class BeanOverloadedMethodTest ex
             return "Hello " + name;
         }
 
-        public String hello(String name, @Header("country") String country) {
+        public String hello(String name, String country) {
             return "Hello " + name + " you are from " + country;
         }
 
-        public String times(String name, @Header("times") int times) {
+        public String times(String name, int times) {
             StringBuilder sb = new StringBuilder();
             for (int i = 0; i < times; i++) {
                 sb.append(name);
@@ -268,7 +183,7 @@ public class BeanOverloadedMethodTest ex
             return sb.toString();
         }
 
-        public String times(byte[] data, @Header("times") int times) {
+        public String times(byte[] data, int times) {
             String s = new String(data);
             StringBuilder sb = new StringBuilder();
             for (int i = 0; i < times; i++) {

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOgnlTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOgnlTest.java?rev=1150780&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOgnlTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOgnlTest.java
 Mon Jul 25 17:02:41 2011
@@ -0,0 +1,144 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.bean;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ *
+ */
+public class BeanParameterValueOgnlTest extends ContextTestSupport {
+
+    public void testBeanParameterValue() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueBodyOgnl() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello Tony");
+
+        Animal tiger = new Animal("Tony", 13);
+        template.sendBody("direct:start2", tiger);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueHeaderOgnl() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello Kong");
+
+        Animal kong = new Animal("Kong", 34);
+        Animal tiger = new Animal("Tony", 13);
+        tiger.setFriend(kong);
+
+        template.sendBodyAndHeader("direct:start3", "Hello World", "animal", 
tiger);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("foo", new MyBean());
+        return jndi;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("bean:foo?method=bar(body,true)")
+                    .to("mock:result");
+
+                from("direct:start2")
+                    .to("bean:foo?method=bar(${body.name}, true)")
+                    .to("mock:result");
+
+                from("direct:start3")
+                    .to("bean:foo?method=bar(${header.animal?.friend.name}, 
true)")
+                    .to("mock:result");
+            }
+        };
+    }
+
+    public static class MyBean {
+
+        public String bar(String body, boolean hello) {
+            if (hello) {
+                return "Hello " + body;
+            } else {
+                return body;
+            }
+        }
+
+        public String echo(String body, int times) {
+            if (times > 0) {
+                StringBuilder sb = new StringBuilder();
+                for (int i = 0; i < times; i++) {
+                    sb.append(body);
+                }
+                return sb.toString();
+            }
+
+            return body;
+        }
+    }
+
+    public static final class Animal {
+        private String name;
+        private int age;
+        private Animal friend;
+
+        private Animal(String name, int age) {
+            this.name = name;
+            this.age = age;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public int getAge() {
+            return age;
+        }
+
+        public Animal getFriend() {
+            return friend;
+        }
+
+        public void setFriend(Animal friend) {
+            this.friend = friend;
+        }
+
+        public boolean isDangerous() {
+            return name.contains("Tiger");
+        }
+
+        @Override
+        public String toString() {
+            return name;
+        }
+    }
+
+
+}

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOverloadedTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOverloadedTest.java?rev=1150780&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOverloadedTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueOverloadedTest.java
 Mon Jul 25 17:02:41 2011
@@ -0,0 +1,88 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.bean;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ *
+ */
+public class BeanParameterValueOverloadedTest extends ContextTestSupport {
+
+    public void testBeanParameterValueBoolean() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueBoolean2() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        template.sendBody("direct:start2", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("foo", new MyBean());
+        return jndi;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("bean:foo?method=bar(*,true)")
+                    .to("mock:result");
+
+                from("direct:start2")
+                    .to("bean:foo?method=bar(body,false,true)")
+                    .to("mock:result");
+            }
+        };
+    }
+
+    public static class MyBean {
+
+        public String bar(String body, boolean hello) {
+            if (hello) {
+                return "Hello " + body;
+            } else {
+                return body;
+            }
+        }
+
+        public String bar(String body, boolean hello, boolean bye) {
+            if (hello) {
+                return "Hi " + body;
+            } else if (bye) {
+                return "Bye " + body;
+            } else {
+                return body;
+            }
+        }
+
+    }
+}

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueTest.java?rev=1150780&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanParameterValueTest.java
 Mon Jul 25 17:02:41 2011
@@ -0,0 +1,137 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.bean;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ *
+ */
+public class BeanParameterValueTest extends ContextTestSupport {
+
+    public void testBeanParameterValueBoolean() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueBoolean2() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start2", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueBoolean3() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start3", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueBoolean4() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello Camel");
+
+        template.sendBody("direct:start4", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueInteger() throws Exception {
+        
getMockEndpoint("mock:result").expectedBodiesReceived("WorldWorldWorld");
+
+        template.sendBody("direct:echo", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBeanParameterValueHeaderInteger() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("WorldWorld");
+
+        template.sendBodyAndHeader("direct:echo2", "World", "times", 2);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("foo", new MyBean());
+        return jndi;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("bean:foo?method=bar(*,true)")
+                    .to("mock:result");
+
+                from("direct:start2")
+                    .to("bean:foo?method=bar(body,true)")
+                    .to("mock:result");
+
+                from("direct:start3")
+                    .to("bean:foo?method=bar(${body}, true)")
+                    .to("mock:result");
+
+                from("direct:start4")
+                    .to("bean:foo?method=bar('Camel', true)")
+                    .to("mock:result");
+
+                from("direct:echo")
+                    .to("bean:foo?method=echo(*, 3)")
+                    .to("mock:result");
+
+                from("direct:echo2")
+                    .to("bean:foo?method=echo(*, ${in.header.times})")
+                    .to("mock:result");
+            }
+        };
+    }
+
+    public static class MyBean {
+
+        public String bar(String body, boolean hello) {
+            if (hello) {
+                return "Hello " + body;
+            } else {
+                return body;
+            }
+        }
+
+        public String echo(String body, int times) {
+            if (times > 0) {
+                StringBuilder sb = new StringBuilder();
+                for (int i = 0; i < times; i++) {
+                    sb.append(body);
+                }
+                return sb.toString();
+            }
+
+            return body;
+        }
+    }
+}

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java?rev=1150780&r1=1150779&r2=1150780&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java
 Mon Jul 25 17:02:41 2011
@@ -58,6 +58,16 @@ public class StringHelperTest extends Te
         assertEquals("foo", StringHelper.removeQuotes("'foo\""));
     }
 
+    public void testRemoveLeadingAndEndingQuotes() throws Exception {
+        assertEquals(null, StringHelper.removeLeadingAndEndingQuotes(null));
+        assertEquals("", StringHelper.removeLeadingAndEndingQuotes(""));
+        assertEquals(" ", StringHelper.removeLeadingAndEndingQuotes(" "));
+        assertEquals("Hello World", 
StringHelper.removeLeadingAndEndingQuotes("Hello World"));
+        assertEquals("Hello World", 
StringHelper.removeLeadingAndEndingQuotes("'Hello World'"));
+        assertEquals("Hello World", 
StringHelper.removeLeadingAndEndingQuotes("\"Hello World\""));
+        assertEquals("Hello 'Camel'", 
StringHelper.removeLeadingAndEndingQuotes("Hello 'Camel'"));
+    }
+
     public void testHasUpper() throws Exception {
         assertEquals(false, StringHelper.hasUpperCase(null));
         assertEquals(false, StringHelper.hasUpperCase(""));


Reply via email to