Again, you are missing the point.  The following is allowed:

void setFoo(int index, PropertyType value)

This means that the PropertyType can be of the type Object[].

-----Original Message-----
From: Arron Bates [mailto:[EMAIL PROTECTED]]
Sent: Monday, January 14, 2002 2:36 PM
To: Struts Users Mailing List
Subject: Re: Bug in BeanUtils.populate()


Here is the spec...

http://java.sun.com/products/javabeans/docs/beans.101.pdf


...where in it does it have...

void setFoo(int index, Object[] array)

...?  Indexed methods description starts on page 40, and go over to 41.


Arron.

Jason Chaffee wrote:

>Let me try to clearify this again.  The following is supported by the
>JavaBean spec.
>
>void setFoo(int index, Object[] array)
>
>where Object[] is the Propertytype.
>
>This means that foo is an array of arrays.  Now, look at the code
>snippet from BeanUtils.populate(), you will notice that there is
special
>logic to handle a parameterType that is an array.  However, this check
>is only checking the first parameter.  In other words, it doesn't
>account for the fact that the second parameter in an indexed setter may
>be of array type.  In particular, see the line, if
>(parameterTypes[0].isArray()), this should be, if
>(parameterType.isArray()).  This would account for an indexed setter
and
>it would handle the logic if it is of type array.  The bug is really
>quite obivious when looking at the code.
>
>            Class parameterTypes[] = setter.getParameterTypes();
>            /*
>            if (debug >= 1)
>                System.out.println("    Setter method is '" +
>                                   setter.getName() + "(" +
>                                   parameterTypes[0].getName() +
>                                   (parameterTypes.length > 1 ?
>                                    ", " + parameterTypes[1].getName()
:
>"" )
>                                   + ")'");
>            */
>            Class parameterType = parameterTypes[0];
>            if (parameterTypes.length > 1)
>                parameterType = parameterTypes[1];      // Indexed
>setter
>
>            // Convert the parameter value as required for this setter
>method
>            Object parameters[] = new Object[1];
>            if (parameterTypes[0].isArray()) {
>                if (value instanceof String) {
>                    String values[] = new String[1];
>                    values[0] = (String) value;
>                    parameters[0] = ConvertUtils.convert((String[])
>values,
>                    parameterType);
>                } else if (value instanceof String[]) {
>                    parameters[0] = ConvertUtils.convert((String[])
>value,
>                    parameterType);
>                } else {
>                    parameters[0] = value;
>                }
>            } else {
>                if (value instanceof String) {
>                    parameters[0] = ConvertUtils.convert((String)
value,
>                    parameterType);
>                } else if (value instanceof String[]) {
>                    parameters[0] = ConvertUtils.convert(((String[])
>value)[0],
>                    parameterType);
>                } else {
>                    parameters[0] = value;
>                }
>            }
>
>-----Original Message-----
>From: Arron [mailto:[EMAIL PROTECTED]]
>Sent: Monday, January 14, 2002 2:55 AM
>To: Struts Users Mailing List
>Subject: Re: Bug in BeanUtils.populate()
>
>
>The method definitions were literally cut-and-paste from the spec.
>There is no other code in the spec relating to indexed properties.
>
>Arron.
>
>
>Jason Chaffee wrote:
>
>>The spec. supports the following:
>>
>>setFoo(int index, Object[] array)
>>
>>However, BeanUtils.populate() does not.  The problem is that
>>BeanUtils.populate() isn't checking if the second parameter is an
array
>>or not, it only checks the first parameter.  However, the JavaBean
>>
>spec.
>
>>allows for the second paramter to be of an array type.  If you try
>>
>this,
>
>>you will find that it doesn't work in struts1.0 or struts1.0.1 unless
>>you make the change to the code that I suggested below.  If you look
at
>>the code, the bug is very obivious.
>>
>>
>>      -----Original Message----- 
>>      From: Arron Bates 
>>      Sent: Sun 1/13/2002 11:31 PM 
>>      To: Struts Users Mailing List 
>>      Cc: 
>>      Subject: Re: Bug in BeanUtils.populate()
>>      
>>      
>>
>>      BeanUtils works correctly in that if you want to set against an
>>index,
>>      you can have the following forms.
>>      
>>      Quoted from the bean spec --==>>
>>      
>>      void setter(int index, PropertyType value); // indexed setter
>>      PropertyType getter(int index);             // indexed getter
>>      
>>      void setter(PropertyType values[]);         // array setter
>>      PropertyType[] getter();                    // array getter
>>      
>>      ...so it's either setting and getting an entire array
>>collection, or
>>      directly setting and getting objects against an index which can
>>mean
>>      absolutely anything internally to the bean. The BeanUtils class
>>uses
>>      separate code blocks to handle both.
>>      
>>      Builds as of a few days ago will accept implementations of
>>      java.util.List as well as the primitive arrays the spec defines.
>>      
>>      I think the ones you're after are the array methods.
>>      
>>      Arron.
>>      
>>      >It appears there is a bug in BeanUtils.populate() for an
>>indexed setter
>>      >of array type.  It doesn't take into account that it is an
>>indexed
>>      >setter and that the second parameter is an array because it
>>only checks
>>      >the first parameter which is always an int for an indexed
>>setter.  This
>>      >is the code in the 1.0.1 release:
>>      >
>>      >           ...
>>      >            Class parameterType = parameterTypes[0];
>>      >            if (parameterTypes.length > 1)
>>      >                parameterType = parameterTypes[1];      //
>>Indexed
>>      >setter
>>      >            // Convert the parameter value as required for this
>>setter
>>      >method
>>      >            Object parameters[] = new Object[1];
>>      >            if (parameterTypes[0].isArray()) {
>>      >          ...
>>      >
>>      >it should be as follows:
>>      >
>>      >           ...
>>      >            Class parameterType = parameterTypes[0];
>>      >            if (parameterTypes.length > 1)
>>      >                parameterType = parameterTypes[1];      //
>>Indexed
>>      >setter
>>      >            // Convert the parameter value as required for this
>>setter
>>      >method
>>      >            Object parameters[] = new Object[1];
>>      >            if (parameterType.isArray()) {
>>      >          ...
>>      >
>>      >
>>      
>>      
>>      
>>      --
>>      To unsubscribe, e-mail:
>><mailto:[EMAIL PROTECTED]>
>>      For additional commands, e-mail:
>><mailto:[EMAIL PROTECTED]>
>>      
>>      
>>
>>
>>----------------------------------------------------------------------
-
>>
>-
>
>>--
>>To unsubscribe, e-mail:
>>
><mailto:[EMAIL PROTECTED]>
>
>>For additional commands, e-mail:
>>
><mailto:[EMAIL PROTECTED]>
>
>>winmail.dat
>>
>>Content-Type:
>>
>>application/ms-tnef
>>Content-Encoding:
>>
>>base64
>>
>>
>>
>-----------------------------------------------------------------------
-
>
>>Part 1.3
>>
>>Content-Type:
>>
>>text/plain
>>
>>
>
>
>
>--
>To unsubscribe, e-mail:
><mailto:[EMAIL PROTECTED]>
>For additional commands, e-mail:
><mailto:[EMAIL PROTECTED]>
>
>
>--
>To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
>For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
>
>



--
To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to