To be exact, line
Method getMorMethod = dpCls.getDeclaredMethod(methodName,
(Class<?>)null);
will be translated by compiler as
Method getMorMethod = dpCls.getDeclaredMethod(methodName, new Class[] {
null } );
line
Method getMorMethod = dpCls.getDeclaredMethod(methodName,
(Class<?>[])null); and
Method getMorMethod = dpCls.getDeclaredMethod(methodName, null);
will be translated by compiler as
Method getMorMethod = dpCls.getDeclaredMethod(methodName, null);
Kelven
On 1/23/14, 11:54 AM, "Kelven Yang" <[email protected]> wrote:
>Hugo,
>
>The root cause of the problem comes from this line of change, it is very
>subtle, but it indeed causes the problem
>
>Method getMorMethod = dpCls.getDeclaredMethod(methodName, (Class<?>)null);
>
>
>There is a subtle difference between
>
>
>Method getMorMethod = dpCls.getDeclaredMethod(methodName, (Class<?>)null);
>
>
>and
>
>Method getMorMethod = dpCls.getDeclaredMethod(methodName, null);
>
>a plain null will direct Java to search for a method with no parameters,
>but a casting of it (Class<?>)null breaks the contract of
>getDeclareMethod(String, Class<?>…) since Class<?>… is actually of type
>Class<?>[]
>
>so if we really wants explicit typing, it should be written as
>
>
>Method getMorMethod = dpCls.getDeclaredMethod(methodName,
>(Class<?>[])null);
>
>Kelven
>
>
>
>
>
>On 1/23/14, 9:16 AM, "Min Chen" <[email protected]> wrote:
>
>>It failed in invoking addVmwareDC, where we will invoke vmware API to get
>>CustomeField. Using java generics, class reflection failed in finding
>>that
>>declared method, thus throwing NoSuchMethodFound exception.
>>
>>Thanks
>>-min
>>
>>On 1/22/14 10:52 PM, "Hugo Trippaers" <[email protected]> wrote:
>>
>>>Sorry about that :-( Thanks for finding and fixing it.
>>>
>>>Where did you encounter the error? I wonder why i didn¹t catch it with
>>>my
>>>tests against vmware.
>>>
>>>Cheers,
>>>
>>>Hugo
>>>
>>>On 23 jan. 2014, at 03:01, Min Chen <[email protected]> wrote:
>>>
>>>> FYI, I checked in a fix 206c35c620a8e7a707f371e5a9e5dfd795912f5b for
>>>>this
>>>> to unblock my testing.
>>>>
>>>> Thanks
>>>> -min
>>>>
>>>> On 1/22/14 5:43 PM, "Kelven Yang" <[email protected]> wrote:
>>>>
>>>>> Master VMware was broken by this commit
>>>>>
>>>>> author Hugo
>>>>>
>>>>>Trippaers<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=s
>>>>>e
>>>>>a
>>>>>rc
>>>>>
>>>>>h;h=b20add810e5751f53946f695b6223a8016f104a5;s=Hugo+Trippaers;st=autho
>>>>>r
>>>>>>
>>>>>
>>>>><[email protected]><https://git-wip-us.apache.org/repos/as
>>>>>f
>>>>>?
>>>>>p=
>>>>>
>>>>>cloudstack.git;a=search;h=b20add810e5751f53946f695b6223a8016f104a5;s=h
>>>>>t
>>>>>r
>>>>>ip
>>>>> [email protected];st=author>
>>>>> Wed, 22 Jan 2014 08:34:46 +0000 (09:34 +0100)
>>>>> committer Hugo
>>>>>
>>>>>Trippaers<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=s
>>>>>e
>>>>>a
>>>>>rc
>>>>>
>>>>>h;h=b20add810e5751f53946f695b6223a8016f104a5;s=Hugo+Trippaers;st=commi
>>>>>t
>>>>>t
>>>>>er
>>>>>>
>>>>>>
>>>>>><[email protected]><https://git-wip-us.apache.org/repos/a
>>>>>>s
>>>>>>f
>>>>>>?p
>>>>>>
>>>>>>=cloudstack.git;a=search;h=b20add810e5751f53946f695b6223a8016f104a5;s
>>>>>>=
>>>>>>h
>>>>>>tr
>>>>>> [email protected];st=committer>
>>>>> Wed, 22 Jan 2014 08:37:34 +0000 (09:37 +0100)
>>>>> commit b20add810e5751f53946f695b6223a8016f104a5
>>>>> tree
>>>>>
>>>>>89e7e66704b09959bc5d77e4e20562e6dcc05306<https://git-wip-us.apache.org
>>>>>/
>>>>>r
>>>>>ep
>>>>>
>>>>>os/asf?p=cloudstack.git;a=tree;h=89e7e66704b09959bc5d77e4e20562e6dcc05
>>>>>3
>>>>>0
>>>>>6;
>>>>> hb=b20add810e5751f53946f695b6223a8016f104a5>
>>>>>
>>>>>tree<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=tree;h
>>>>>=
>>>>>8
>>>>>9e
>>>>>
>>>>>7e66704b09959bc5d77e4e20562e6dcc05306;hb=b20add810e5751f53946f695b6223
>>>>>a
>>>>>8
>>>>>01
>>>>> 6f104a5> |
>>>>>
>>>>>snapshot<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=sn
>>>>>a
>>>>>p
>>>>>sh
>>>>> ot;h=b20add810e5751f53946f695b6223a8016f104a5;sf=tgz>
>>>>> parent
>>>>>
>>>>>86124138a1a9129dedaf0f73fcd570156bfe53f6<https://git-wip-us.apache.org
>>>>>/
>>>>>r
>>>>>ep
>>>>>
>>>>>os/asf?p=cloudstack.git;a=commit;h=86124138a1a9129dedaf0f73fcd570156bf
>>>>>e
>>>>>5
>>>>>3f
>>>>> 6>
>>>>>
>>>>>commit<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=comm
>>>>>i
>>>>>t
>>>>>;h
>>>>> =86124138a1a9129dedaf0f73fcd570156bfe53f6> |
>>>>>
>>>>>diff<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=commit
>>>>>d
>>>>>i
>>>>>ff
>>>>>
>>>>>;h=b20add810e5751f53946f695b6223a8016f104a5;hp=86124138a1a9129dedaf0f7
>>>>>3
>>>>>f
>>>>>cd
>>>>> 570156bfe53f6>
>>>>> Get rid of compiler warnings in vmware-base
>>>>>
>>>>> Min and I spent two hours on this to trace down the cause, Hugo,
>>>>>please
>>>>> do test before check-in even if it seems like to remove compiler
>>>>>warning,
>>>>> but because of the tricky business with Java generics, it does cause
>>>>> problem at runtime
>>>>>
>>>>> One of the problem comes from following code, please checkout my
>>>>>comments
>>>>> below.
>>>>>
>>>>> -Kelven
>>>>>
>>>>>
>>>>> import org.apache.log4j.Logger;
>>>>>
>>>>> @@
>>>>>
>>>>>-144,6<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blob
>>>>>;
>>>>>f
>>>>>=v
>>>>>
>>>>>mware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=3c
>>>>>2
>>>>>c
>>>>>81
>>>>>
>>>>>d8a5ea3e242a6407ab5a0d2710fa1d0b73;hb=3c2c81d8a5ea3e242a6407ab5a0d2710
>>>>>f
>>>>>a
>>>>>1d
>>>>> 0b73#l144>
>>>>>
>>>>>+144,7<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blob
>>>>>;
>>>>>f
>>>>>=v
>>>>>
>>>>>mware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=e8
>>>>>1
>>>>>6
>>>>>65
>>>>>
>>>>>f71b76a3772b13dae5cc0733d26220c64a;hb=e81665f71b76a3772b13dae5cc0733d2
>>>>>6
>>>>>2
>>>>>20
>>>>> c64a#l144> @@ public class VmwareClient {
>>>>> ServiceContent serviceContent =
>>>>> vimPort.retrieveServiceContent(svcInstRef);
>>>>>
>>>>> // Extract a cookie. See vmware sample program
>>>>> com.vmware.httpfileaccess.GetVMFiles
>>>>> + @SuppressWarnings("unchecked")
>>>>> Map<String, List<String>> headers = (Map<String,
>>>>>
>>>>>List<String>>)((BindingProvider)vimPort).getResponseContext().get(Mess
>>>>>a
>>>>>g
>>>>>eC
>>>>> ontext.HTTP_RESPONSE_HEADERS);
>>>>> List<String> cookies = headers.get("Set-cookie");
>>>>> String cookieValue = cookies.get(0);
>>>>> @@
>>>>>
>>>>>-256,17<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blo
>>>>>b
>>>>>;
>>>>>f=
>>>>>
>>>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=3
>>>>>c
>>>>>2
>>>>>c8
>>>>>
>>>>>1d8a5ea3e242a6407ab5a0d2710fa1d0b73;hb=3c2c81d8a5ea3e242a6407ab5a0d271
>>>>>0
>>>>>f
>>>>>a1
>>>>> d0b73#l256>
>>>>>
>>>>>+257,18<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blo
>>>>>b
>>>>>;
>>>>>f=
>>>>>
>>>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=e
>>>>>8
>>>>>1
>>>>>66
>>>>>
>>>>>5f71b76a3772b13dae5cc0733d26220c64a;hb=e81665f71b76a3772b13dae5cc0733d
>>>>>2
>>>>>6
>>>>>22
>>>>> 0c64a#l257> @@ public class VmwareClient {
>>>>> * @throws Exception
>>>>> * in case of error.
>>>>> */
>>>>> - public Object getDynamicProperty(ManagedObjectReference mor,
>>>>>String
>>>>> propertyName) throws Exception {
>>>>> + @SuppressWarnings("unchecked")
>>>>> + public <T> T getDynamicProperty(ManagedObjectReference mor,
>>>>>String
>>>>> propertyName) throws Exception {
>>>>> List<String> props = new ArrayList<String>();
>>>>> props.add(propertyName);
>>>>> List<ObjectContent> objContent = retrieveMoRefProperties(mor,
>>>>> props);
>>>>>
>>>>>
>>>>>
>>>>> - Object propertyValue = null;
>>>>> + T propertyValue = null;
>>>>>
>>>>> [Kelven] This is a wrong change, since propertyValue is intermediate
>>>>> variable that could have type that is different than the returning
>>>>>type.
>>>>> It will eventually cause getDeclaredMethod() call to fail at runtime
>>>>>
>>>>>
>>>>> if (objContent != null && objContent.size() > 0) {
>>>>> List<DynamicProperty> dynamicProperty =
>>>>> objContent.get(0).getPropSet();
>>>>> if (dynamicProperty != null && dynamicProperty.size() > 0)
>>>>>{
>>>>> DynamicProperty dp = dynamicProperty.get(0);
>>>>> - propertyValue = dp.getVal();
>>>>> + propertyValue = (T)dp.getVal();
>>>>> /*
>>>>> * If object is ArrayOfXXX object, then get the XXX[]
>>>>>by
>>>>> * invoking getXXX() on the object.
>>>>> @@
>>>>>
>>>>>-274,13<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blo
>>>>>b
>>>>>;
>>>>>f=
>>>>>
>>>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=3
>>>>>c
>>>>>2
>>>>>c8
>>>>>
>>>>>1d8a5ea3e242a6407ab5a0d2710fa1d0b73;hb=3c2c81d8a5ea3e242a6407ab5a0d271
>>>>>0
>>>>>f
>>>>>a1
>>>>> d0b73#l274>
>>>>>
>>>>>+276,13<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blo
>>>>>b
>>>>>;
>>>>>f=
>>>>>
>>>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=e
>>>>>8
>>>>>1
>>>>>66
>>>>>
>>>>>5f71b76a3772b13dae5cc0733d26220c64a;hb=e81665f71b76a3772b13dae5cc0733d
>>>>>2
>>>>>6
>>>>>22
>>>>> 0c64a#l276> @@ public class VmwareClient {
>>>>> *
>>>>> ArrayOfManagedObjectReference.getManagedObjectReference()
>>>>> * returns ManagedObjectReference[] array.
>>>>> */
>>>>> - Class dpCls = propertyValue.getClass();
>>>>> + Class<? extends Object> dpCls =
>>>>>propertyValue.getClass();
>>>>> String dynamicPropertyName = dpCls.getName();
>>>>> if (dynamicPropertyName.indexOf("ArrayOf") != -1) {
>>>>> String methodName = "get" +
>>>>> dynamicPropertyName.substring(dynamicPropertyName.indexOf("ArrayOf")
>>>>>+
>>>>> "ArrayOf".length(), dynamicPropertyName.length());
>>>>>
>>>>> - Method getMorMethod =
>>>>> dpCls.getDeclaredMethod(methodName, null);
>>>>> - propertyValue =
>>>>>getMorMethod.invoke(propertyValue,
>>>>> (Object[])null);
>>>>> + Method getMorMethod =
>>>>> dpCls.getDeclaredMethod(methodName, (Class<?>)null);
>>>>> + propertyValue =
>>>>> (T)getMorMethod.invoke(propertyValue, (Object[])null);
>>>>> }
>>>>> }
>>>>> }
>>>>
>>>
>>
>