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" <h...@trippaers.nl> 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 <min.c...@citrix.com> 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" <kelven.y...@citrix.com> wrote:
>> 
>>> Master VMware was broken by this commit
>>> 
>>> author  Hugo 
>>> 
>>>Trippaers<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=sea
>>>rc
>>> 
>>>h;h=b20add810e5751f53946f695b6223a8016f104a5;s=Hugo+Trippaers;st=author>
>>> 
>>><htrippa...@schubergphilis.com><https://git-wip-us.apache.org/repos/asf?
>>>p=
>>> 
>>>cloudstack.git;a=search;h=b20add810e5751f53946f695b6223a8016f104a5;s=htr
>>>ip
>>> pa...@schubergphilis.com;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=sea
>>>rc
>>> 
>>>h;h=b20add810e5751f53946f695b6223a8016f104a5;s=Hugo+Trippaers;st=committ
>>>er
>>>> 
>>>> 
>>>><htrippa...@schubergphilis.com><https://git-wip-us.apache.org/repos/asf
>>>>?p
>>>> 
>>>>=cloudstack.git;a=search;h=b20add810e5751f53946f695b6223a8016f104a5;s=h
>>>>tr
>>>> ippa...@schubergphilis.com;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=89e7e66704b09959bc5d77e4e20562e6dcc0530
>>>6;
>>> hb=b20add810e5751f53946f695b6223a8016f104a5>
>>> 
>>>tree<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=tree;h=8
>>>9e
>>> 
>>>7e66704b09959bc5d77e4e20562e6dcc05306;hb=b20add810e5751f53946f695b6223a8
>>>01
>>> 6f104a5> | 
>>> 
>>>snapshot<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=snap
>>>sh
>>> ot;h=b20add810e5751f53946f695b6223a8016f104a5;sf=tgz>
>>> parent  
>>> 
>>>86124138a1a9129dedaf0f73fcd570156bfe53f6<https://git-wip-us.apache.org/r
>>>ep
>>> 
>>>os/asf?p=cloudstack.git;a=commit;h=86124138a1a9129dedaf0f73fcd570156bfe5
>>>3f
>>> 6>  
>>> 
>>>commit<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=commit
>>>;h
>>> =86124138a1a9129dedaf0f73fcd570156bfe53f6> |
>>> 
>>>diff<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=commitdi
>>>ff
>>> 
>>>;h=b20add810e5751f53946f695b6223a8016f104a5;hp=86124138a1a9129dedaf0f73f
>>>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=3c2c
>>>81
>>> 
>>>d8a5ea3e242a6407ab5a0d2710fa1d0b73;hb=3c2c81d8a5ea3e242a6407ab5a0d2710fa
>>>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=e816
>>>65
>>> 
>>>f71b76a3772b13dae5cc0733d26220c64a;hb=e81665f71b76a3772b13dae5cc0733d262
>>>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(Messag
>>>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=blob;
>>>f=
>>> 
>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=3c2
>>>c8
>>> 
>>>1d8a5ea3e242a6407ab5a0d2710fa1d0b73;hb=3c2c81d8a5ea3e242a6407ab5a0d2710f
>>>a1
>>> d0b73#l256> 
>>> 
>>>+257,18<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blob;
>>>f=
>>> 
>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=e81
>>>66
>>> 
>>>5f71b76a3772b13dae5cc0733d26220c64a;hb=e81665f71b76a3772b13dae5cc0733d26
>>>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=blob;
>>>f=
>>> 
>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=3c2
>>>c8
>>> 
>>>1d8a5ea3e242a6407ab5a0d2710fa1d0b73;hb=3c2c81d8a5ea3e242a6407ab5a0d2710f
>>>a1
>>> d0b73#l274> 
>>> 
>>>+276,13<https://git-wip-us.apache.org/repos/asf?p=cloudstack.git;a=blob;
>>>f=
>>> 
>>>vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java;h=e81
>>>66
>>> 
>>>5f71b76a3772b13dae5cc0733d26220c64a;hb=e81665f71b76a3772b13dae5cc0733d26
>>>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);
>>>                }
>>>            }
>>>        }
>> 
>

Reply via email to