Diff the change and send a mail to the commons dev list with [PATCH] bug 
- (bugNumber)

Might take a couple of attempts, but someone should get it. Might have a 
conversation as to that it should be painted yellow, but that'd be about 
it. I went through the same ordeal to get the List support in there.
This is with the spec so it should be easier.


Arron.

Jason Chaffee wrote:

>It isn't ignorance, we just weren't on the same page.  :)
>
>Anyway, I filed a bug in commons back in October or ealy November.  I
>was hoping it would have been fixed by now, but it appears it hasn't...
>
>I have tested my change and it works fine.
>
>-----Original Message-----
>From: Arron Bates [mailto:[EMAIL PROTECTED]]
>Sent: Monday, January 14, 2002 3:03 PM
>To: Struts Users Mailing List
>Subject: Re: Bug in BeanUtils.populate()
>
>
>I get what you're trying to do now.
>Sorry about all that.
>
>If you can test your change and make a CVS diff of the changes, why 
>don't you log a bugzilla bug in commons and submit it to the commons dev
>
>list?...
> ...otherwise I can look into it for you.
>
>Once again, sorry about the ignorance.
>
>
>Arron.
>
>Jason Chaffee wrote:
>
>>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]>
>
>>
>
>
>
>--
>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