You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2010/11/04 22:26:48 UTC

svn commit: r1031258 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/component/bean/BeanInfo.java test/java/org/apache/camel/component/bean/BeanExplicitMethodAmbiguousTest.java test/java/org/apache/camel/component/bean/MyDummyBean.java

Author: cmueller
Date: Thu Nov  4 21:26:48 2010
New Revision: 1031258

URL: http://svn.apache.org/viewvc?rev=1031258&view=rev
Log:
CAMEL-3311: bean parameter binding - Add support for type option to force Camel to pick method with compatible type
improve the ability to choose the right method (work in progress)

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExplicitMethodAmbiguousTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/MyDummyBean.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=1031258&r1=1031257&r2=1031258&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 Thu Nov  4 21:26:48 2010
@@ -469,23 +469,26 @@ public class BeanInfo {
             // lets try converting
             Object newBody = null;
             MethodInfo matched = null;
+            int matchCounter = 0;
             for (MethodInfo methodInfo : operationList) {
+                if (methodInfo.getBodyParameterType().isInstance(body)) {
+                    return methodInfo;
+                }
+                
                 Object value = convertToType(exchange, methodInfo.getBodyParameterType(), body);
                 if (value != null) {
                     if (LOG.isTraceEnabled()) {
                         LOG.trace("Converted body from: " + body.getClass().getCanonicalName()
                                 + "to: " + methodInfo.getBodyParameterType().getCanonicalName());
                     }
-                    if (newBody != null) {
-                        // we already have found one new body that could be converted so now we have 2 methods
-                        // and then its ambiguous
-                        throw new AmbiguousMethodCallException(exchange, Arrays.asList(matched, methodInfo));
-                    } else {
-                        newBody = value;
-                        matched = methodInfo;
-                    }
+                    matchCounter++;
+                    newBody = value;
+                    matched = methodInfo;
                 }
             }
+            if (matchCounter > 1) {
+                throw new AmbiguousMethodCallException(exchange, Arrays.asList(matched, matched));
+            }
             if (matched != null) {
                 if (LOG.isTraceEnabled()) {
                     LOG.trace("Setting converted body: " + body);

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExplicitMethodAmbiguousTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExplicitMethodAmbiguousTest.java?rev=1031258&r1=1031257&r2=1031258&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExplicitMethodAmbiguousTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExplicitMethodAmbiguousTest.java Thu Nov  4 21:26:48 2010
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.bean;
 
+import java.io.ByteArrayInputStream;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.JndiRegistry;
@@ -46,6 +48,16 @@ public class BeanExplicitMethodAmbiguous
         String out = template.requestBody("direct:bye", "Camel", String.class);
         assertEquals("Bye Camel", out);
     }
+    
+    public void testBeanExplicitMethodInvocationStringBody() throws Exception {
+        String out = template.requestBody("direct:foo", "Camel", String.class);
+        assertEquals("String", out);
+    }
+    
+    public void testBeanExplicitMethodInvocationInputStreamBody() throws Exception {
+        String out = template.requestBody("direct:foo", new ByteArrayInputStream("Camel".getBytes()), String.class);
+        assertEquals("InputStream", out);
+    }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
@@ -55,6 +67,8 @@ public class BeanExplicitMethodAmbiguous
                 from("direct:hello").beanRef("dummy", "hello");
 
                 from("direct:bye").beanRef("dummy");
+                
+                from("direct:foo").beanRef("dummy", "bar");
             }
         };
     }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/MyDummyBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/MyDummyBean.java?rev=1031258&r1=1031257&r2=1031258&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/MyDummyBean.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/MyDummyBean.java Thu Nov  4 21:26:48 2010
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.component.bean;
 
+import java.io.InputStream;
+import java.io.Reader;
+
 import org.apache.camel.Handler;
 
 /**
@@ -35,4 +38,16 @@ public class MyDummyBean {
     public String bye(String s) {
         return "Bye " + s;
     }
+    
+    public String bar(String s) {
+        return "String";
+    }
+    
+    public String bar(Reader s) {
+        return "Reader";
+    }
+    
+    public String bar(InputStream s) {
+        return "InputStream";
+    }
 }