[ 
https://issues.apache.org/activemq/browse/CAMEL-1488?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen reassigned CAMEL-1488:
----------------------------------

    Assignee: Claus Ibsen

> BeanInfo.overridesExistingMethod() doesn't handle overloaded methods 
> correctly.
> -------------------------------------------------------------------------------
>
>                 Key: CAMEL-1488
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-1488
>             Project: Apache Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.0-M1
>            Reporter: Bruce Elmore
>            Assignee: Claus Ibsen
>             Fix For: 2.0.0, 1.6.1
>
>         Attachments: BeanInfoTest.java
>
>
> Camel can fail to determine the appropriate method to call on a bean that has 
> overloaded (vs. overridden) methods. It will always call the first overloaded 
> method, even if the parameter is not the same type as that of the message 
> being processed.
> The bug is in BeanInfo.overridesExistingMethod. Here's the offending code:
>             for (int i = 0; i < info.getMethod().getParameterTypes().length; 
> i++) {
>                 Class type1 = info.getMethod().getParameterTypes()[i];
>                 Class type2 = methodInfo.getMethod().getParameterTypes()[i];
>                 if (!type1.equals(type2)) {
>                     continue;
>                 }
>             }
>             // same name, same parameters, then its overrides an existing 
> class
>             return info;
> If the parameter types don't match, the continue statement is not going to do 
> what you'd want. The author obviously intended the "continue" to continue 
> with the next methodInfo. Instead, it checks the next parameter and will 
> always return the current methodInfo  if it reaches this point.
> Here's a unit test that exemplifies the issue:
> ----------------------------------
> package biz.firethorn.hostinterface.camel;
> import java.lang.reflect.Method;
> import junit.framework.Assert;
> import junit.framework.TestCase;
> import org.apache.camel.CamelContext;
> import org.apache.camel.Exchange;
> import org.apache.camel.Message;
> import org.apache.camel.RuntimeCamelException;
> import org.apache.camel.component.bean.AmbiguousMethodCallException;
> import org.apache.camel.component.bean.BeanInfo;
> import org.apache.camel.component.bean.MethodInvocation;
> import org.apache.camel.impl.DefaultCamelContext;
> import org.apache.camel.impl.DefaultExchange;
> import org.apache.camel.impl.DefaultMessage;
> public class BeanInfoTest extends TestCase {
>       public void test() throws Exception {
>               
>               CamelContext camelContext = new DefaultCamelContext();
>               BeanInfo beanInfo = new BeanInfo(camelContext, Bean.class);
>               
>               Message message = new DefaultMessage();
>               message.setBody(new RequestB());
>               Exchange exchange = new DefaultExchange(camelContext);
>               exchange.setIn(message);
>               
>               MethodInvocation methodInvocation = 
> beanInfo.createInvocation(new Bean(), exchange);
>               Method method = methodInvocation.getMethod();
>               
>               Assert.assertEquals("doSomething", method.getName());
>               
>               Assert.assertEquals(RequestB.class, 
> method.getGenericParameterTypes()[0]);
>       }
> }
> class Bean {
>       public void doSomething(RequestA request) {     
>       }
>       
>       public void doSomething(RequestB request) {
>       }
> }
> class RequestA {
>       public int i;
> }
> class RequestB {
>       public String s;
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to