Gyula Komlossi created ZEPPELIN-4386:
----------------------------------------

             Summary: Resource.invokeMethod() doesn't find the right method to 
call
                 Key: ZEPPELIN-4386
                 URL: https://issues.apache.org/jira/browse/ZEPPELIN-4386
             Project: Zeppelin
          Issue Type: Bug
          Components: zeppelin-interpreter
    Affects Versions: 0.9.0
            Reporter: Gyula Komlossi


The logic in Resource.invokeMethod() seems to be failing to find the correct 
method signature if the method is overloaded. 

In this part in 
[Resource.java|[https://github.com/gkomlossi/zeppelin/blob/master/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/Resource.java#L288]]

 
{code:java}
int pidx = 0;
for (int i = 0; i < paramTypes.length; i++) {
    if (pidx == params.length) {  // not enough param for this method signature
        continue;
    } else {
        paramValues[i] = params[pidx++];
    }
}

if (pidx == params.length) {  // param number does not match
    found = true;
    methodParams = paramValues;
    methodTypes = paramTypes;
    break;
}
{code}
pidx == params.length will always be true, even if the params.length (incoming 
param nr) is less than the paramTypes.length (number of parameters required by 
the method).

The previous logic can easily find such a method (same name but different 
argument list), because it checks the method name only while it iterates over 
the array of methods, so it will say found = true, but when it actually invokes 
the method it will cause an 
{code:java}
java.lang.IllegalArgumentExceptionjava.lang.IllegalArgumentException at 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498) at 
org.apache.zeppelin.resource.Resource.invokeMethod(Resource.java:335) at 
org.apache.zeppelin.resource.Resource.invokeMethod(Resource.java:313) at 
org.apache.zeppelin.resource.Resource.invokeMethod(Resource.java:258) at 
org.apache.zeppelin.resource.Resource.invokeMethod(Resource.java:146){code}

It can be verified by adding this line
assertEquals(2, r.invokeMethod("indexOf", new Object[]{'j'}));
into the test case 
ResourceTest#testInvokeMethod_shouldAbleToInvokeMethodWithTypeInference

It will find first and try to call method:
public int java.lang.String.indexOf(java.lang.String,int)
instead of 
public int java.lang.String.indexOf(int)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to