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