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]>

Reply via email to