You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Andrei Iltchenko (JIRA)" <ax...@ws.apache.org> on 2005/08/31 11:33:04 UTC

[jira] Created: (AXIS-2202) Axis doesn't propertly support JavaBeans with array-type properties.

Axis doesn't propertly support JavaBeans with array-type properties.
--------------------------------------------------------------------

         Key: AXIS-2202
         URL: http://issues.apache.org/jira/browse/AXIS-2202
     Project: Apache Axis
        Type: Bug
  Components: Serialization/Deserialization  
    Versions: current (nightly), 1.2, 1.2.1    
 Reporter: Andrei Iltchenko
    Priority: Critical


Axis fails to adequately support JavaBean classes with array-type properties when objects of such classes are deserialized by a service endpoint exposed with JBoss.

The problem occurs with those JavaBean array-type properties whose setters and getters are not idempotent -- i.e. given a property called 'Prop', an array value 'val1',
and a call to the the property's setter and getter:

BeanClass   bean = ...;
ValueType   val1 = ...;
bean.setProp(val1);
ValueType   val2 = bean.getProp();

val1 != val2.

In other words Axis will work fine with the following JavaBean:

public class JavaBean1 {
    Double   values[];
    Double[]  getValues() {
        return  values;
    }
    void  setValues(Double values[]) {
        this.values = values;
    }
}

but will fail to work with JavaBean2:

public class JavaBean2 {
    ArrayList   values;
    Double[]  getValues() {
        return  (Double[]) values.toArray(new Double[0]);
    }
    void  setValues(Double values[]) {
        this.values.clear();
        this.values.addAll(java.util.Arrays.asList(values);
    }
}

I investigated the cause of the problem and tracked it down to the 'set(Object, int, Object)' method of the 'org.apache.axis.utils.BeanPropertyDescriptor' class. Presented below is the code of the method with my fix for the problem (another problem with this method is that it makes an unnecessary call to the property's setter when growing the array, the fix takes care of that too). I will also attach a diffs file for the patch:

    public void set(Object obj, int i, Object newValue) 
        throws InvocationTargetException, IllegalAccessException {
        // Set the new value
        if (isIndexed()) {
            IndexedPropertyDescriptor id = (IndexedPropertyDescriptor)myPD;
            growArrayToSize(obj, id.getIndexedPropertyType(), i);
            id.getIndexedWriteMethod().invoke(obj,
                                              new Object[] {
                                                  new Integer(i), newValue});
        } else {
            // Not calling 'growArrayToSize' to avoid an extra call to the
            // property's setter. The setter will be called at the end anyway.
            // growArrayToSize(obj, myPD.getPropertyType().getComponentType(), i);
            Object array = get(obj);
            if (array == null || Array.getLength(array) <= i) {
                Class componentType = getType().getComponentType();
                Object newArray = Array.newInstance(componentType, i + 1);
                // Copy over the old elements
                if (array != null) {
                    System.arraycopy(array, 0, newArray, 0, Array.getLength(array));
                }
                array = newArray;
            }
            Array.set(array, i, newValue);
            // Fix for non-indempondent array-type propertirs.
            // Make sure we call the property's setter.
            set(obj, array);
        }
    }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


[jira] Resolved: (AXIS-2202) Axis doesn't propertly support JavaBeans with array-type properties.

Posted by "Davanum Srinivas (JIRA)" <ax...@ws.apache.org>.
     [ http://issues.apache.org/jira/browse/AXIS-2202?page=all ]
     
Davanum Srinivas resolved AXIS-2202:
------------------------------------

    Resolution: Fixed

Applied Patch.

thanks,
dims

> Axis doesn't propertly support JavaBeans with array-type properties.
> --------------------------------------------------------------------
>
>          Key: AXIS-2202
>          URL: http://issues.apache.org/jira/browse/AXIS-2202
>      Project: Apache Axis
>         Type: Bug
>   Components: Serialization/Deserialization
>     Versions: current (nightly), 1.2, 1.2.1
>     Reporter: Andrei Iltchenko
>     Priority: Critical
>  Attachments: bug2202.txt
>
> Axis fails to adequately support JavaBean classes with array-type properties when objects of such classes are deserialized by a service endpoint exposed with JBoss.
> The problem occurs with those JavaBean array-type properties whose setters and getters are not idempotent -- i.e. given a property called 'Prop', an array value 'val1',
> and a call to the the property's setter and getter:
> BeanClass   bean = ...;
> ValueType   val1 = ...;
> bean.setProp(val1);
> ValueType   val2 = bean.getProp();
> val1 != val2.
> In other words Axis will work fine with the following JavaBean:
> public class JavaBean1 {
>     Double   values[];
>     Double[]  getValues() {
>         return  values;
>     }
>     void  setValues(Double values[]) {
>         this.values = values;
>     }
> }
> but will fail to work with JavaBean2:
> public class JavaBean2 {
>     ArrayList   values;
>     Double[]  getValues() {
>         return  (Double[]) values.toArray(new Double[0]);
>     }
>     void  setValues(Double values[]) {
>         this.values.clear();
>         this.values.addAll(java.util.Arrays.asList(values);
>     }
> }
> I investigated the cause of the problem and tracked it down to the 'set(Object, int, Object)' method of the 'org.apache.axis.utils.BeanPropertyDescriptor' class. Presented below is the code of the method with my fix for the problem (another problem with this method is that it makes an unnecessary call to the property's setter when growing the array, the fix takes care of that too). I will also attach a diffs file for the patch:
>     public void set(Object obj, int i, Object newValue) 
>         throws InvocationTargetException, IllegalAccessException {
>         // Set the new value
>         if (isIndexed()) {
>             IndexedPropertyDescriptor id = (IndexedPropertyDescriptor)myPD;
>             growArrayToSize(obj, id.getIndexedPropertyType(), i);
>             id.getIndexedWriteMethod().invoke(obj,
>                                               new Object[] {
>                                                   new Integer(i), newValue});
>         } else {
>             // Not calling 'growArrayToSize' to avoid an extra call to the
>             // property's setter. The setter will be called at the end anyway.
>             // growArrayToSize(obj, myPD.getPropertyType().getComponentType(), i);
>             Object array = get(obj);
>             if (array == null || Array.getLength(array) <= i) {
>                 Class componentType = getType().getComponentType();
>                 Object newArray = Array.newInstance(componentType, i + 1);
>                 // Copy over the old elements
>                 if (array != null) {
>                     System.arraycopy(array, 0, newArray, 0, Array.getLength(array));
>                 }
>                 array = newArray;
>             }
>             Array.set(array, i, newValue);
>             // Fix for non-indempondent array-type propertirs.
>             // Make sure we call the property's setter.
>             set(obj, array);
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


[jira] Updated: (AXIS-2202) Axis doesn't propertly support JavaBeans with array-type properties.

Posted by "Andrei Iltchenko (JIRA)" <ax...@ws.apache.org>.
     [ http://issues.apache.org/jira/browse/AXIS-2202?page=all ]

Andrei Iltchenko updated AXIS-2202:
-----------------------------------

    Attachment: bug2202.txt

The patch for the problem.

> Axis doesn't propertly support JavaBeans with array-type properties.
> --------------------------------------------------------------------
>
>          Key: AXIS-2202
>          URL: http://issues.apache.org/jira/browse/AXIS-2202
>      Project: Apache Axis
>         Type: Bug
>   Components: Serialization/Deserialization
>     Versions: current (nightly), 1.2, 1.2.1
>     Reporter: Andrei Iltchenko
>     Priority: Critical
>  Attachments: bug2202.txt
>
> Axis fails to adequately support JavaBean classes with array-type properties when objects of such classes are deserialized by a service endpoint exposed with JBoss.
> The problem occurs with those JavaBean array-type properties whose setters and getters are not idempotent -- i.e. given a property called 'Prop', an array value 'val1',
> and a call to the the property's setter and getter:
> BeanClass   bean = ...;
> ValueType   val1 = ...;
> bean.setProp(val1);
> ValueType   val2 = bean.getProp();
> val1 != val2.
> In other words Axis will work fine with the following JavaBean:
> public class JavaBean1 {
>     Double   values[];
>     Double[]  getValues() {
>         return  values;
>     }
>     void  setValues(Double values[]) {
>         this.values = values;
>     }
> }
> but will fail to work with JavaBean2:
> public class JavaBean2 {
>     ArrayList   values;
>     Double[]  getValues() {
>         return  (Double[]) values.toArray(new Double[0]);
>     }
>     void  setValues(Double values[]) {
>         this.values.clear();
>         this.values.addAll(java.util.Arrays.asList(values);
>     }
> }
> I investigated the cause of the problem and tracked it down to the 'set(Object, int, Object)' method of the 'org.apache.axis.utils.BeanPropertyDescriptor' class. Presented below is the code of the method with my fix for the problem (another problem with this method is that it makes an unnecessary call to the property's setter when growing the array, the fix takes care of that too). I will also attach a diffs file for the patch:
>     public void set(Object obj, int i, Object newValue) 
>         throws InvocationTargetException, IllegalAccessException {
>         // Set the new value
>         if (isIndexed()) {
>             IndexedPropertyDescriptor id = (IndexedPropertyDescriptor)myPD;
>             growArrayToSize(obj, id.getIndexedPropertyType(), i);
>             id.getIndexedWriteMethod().invoke(obj,
>                                               new Object[] {
>                                                   new Integer(i), newValue});
>         } else {
>             // Not calling 'growArrayToSize' to avoid an extra call to the
>             // property's setter. The setter will be called at the end anyway.
>             // growArrayToSize(obj, myPD.getPropertyType().getComponentType(), i);
>             Object array = get(obj);
>             if (array == null || Array.getLength(array) <= i) {
>                 Class componentType = getType().getComponentType();
>                 Object newArray = Array.newInstance(componentType, i + 1);
>                 // Copy over the old elements
>                 if (array != null) {
>                     System.arraycopy(array, 0, newArray, 0, Array.getLength(array));
>                 }
>                 array = newArray;
>             }
>             Array.set(array, i, newValue);
>             // Fix for non-indempondent array-type propertirs.
>             // Make sure we call the property's setter.
>             set(obj, array);
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira