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)