Keith,

FieldHandlers for collections still isn't working for me with RC2
(although the processContainerAttributes() fix is in it).  My
FieldHandler is still passed an object of type
J2CollectionHandlers$IteratorEnumerator when I try to marshal an object
with a collection field that requires a handler.  The behavior works as
expected when unmarshalling - the convertUponSet() is called once
per-item in the collection.  However, when marshalling, it calls
convertUponGet() with an instance of the aforementioned class.

The line that my application is currently breaking on is
Marshaller.java:1381 where it simply calls getValue() on the field
handler, passing in the enumeration.  I am digging through the code, but
I am sure you are much more familiar with the algorithm (we really need
to break it into smaller methods =)  If you could look at this, I would
really appreciate it.

Thanks,
Jeremy



On Tue, 24 Feb 2004 15:16:02 -0600, "Keith Visco" <[EMAIL PROTECTED]>
said:
> 
> 
> A modified version of the "enumeration" patch from Balaji was included
> in RC2, actually, I modified his code to include a while loop instead of
> a single if statement, since that would only handle the first item from
> the enumeration.
> 
> --Keith
> 
> Jeremy Haile wrote:
> > 
> > Thanks Balaji!
> > 
> > Keith, should this be integrated into CVS?
> > 
> > Jeremy
> > 
> > On Tue, 24 Feb 2004 12:34:19 -0500, "Adikesavelu, Balaji"
> > <[EMAIL PROTECTED]> said:
> > > I had the same issue with Arrays and to fix it, I changed the
> > > marshaller.java to handle enumerators.
> > >
> > > Here's the change I made to processContainerAttributes method in
> > > Marshaller.java to fix the issue:
> > >
> > >       private void processContainerAttributes(
> > >               Object target,
> > >               XMLFieldDescriptor containerFieldDesc,
> > >               AttributeListImpl atts)
> > >               throws MarshalException {
> > >               if (target.getClass().isArray()) {
> > >                       int length = Array.getLength(target);
> > >                       for (int j = 0; j < length; j++) {
> > >                               Object item = Array.get(target, j);
> > >                               if (item != null)
> > >                                       processContainerAttributes(item,
> > > containerFieldDesc, atts);
> > >                       }
> > >                       return;
> > >               } else if (target instanceof Enumeration) {
> > >                       Enumeration enum = (Enumeration) target;
> > >                       if (enum.hasMoreElements()) {
> > >                               Object item = enum.nextElement();
> > >                               if (item != null)
> > >                                       processContainerAttributes(item,
> > > containerFieldDesc, atts);
> > >
> > >                       }
> > >                       return;
> > >               }
> > >
> > > Thanks
> > >
> > > Balaji
> > >
> > > -----Original Message-----
> > > From: Jeremy Haile [mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> > > ]
> > > Sent: Tuesday, February 24, 2004 11:46 AM
> > > To: [EMAIL PROTECTED]
> > > Subject: [castor-dev] FieldHandlers and collections
> > >
> > >
> > >
> > > Maybe this has been explained before, but I'm still unclear.  I have a
> > > collection where each object in the collection needs to be processed by a
> > > fieldhandler.  I am using the following mapping right now:
> > >
> > >     <field name="inputs"
> > >            type="string"
> > >            handler="mypackage.InputFieldHandler"
> > >            get-method="getInputs"
> > >            set-method="setInputs"
> > >            collection="collection">
> > >       <bind-xml name="input"
> > >                 node="element" />
> > >     </field>
> > >
> > > An example of how this field would be used:
> > >     <input>someInput</input>
> > >     <input>anotherInput</input>
> > >
> > > This seems to work fine on unmarshalling - with convertUponSet() being
> > > called on my GeneralizedFieldHandler implementation for each input.
> > > However, for marshalling, a J2CollectionHandlers.IteratorEnumerator
> > > (internal class) object is being passed into my convertUponGet().  Why
> > > does
> > > Castor not simply call my GeneralizedFieldHandler for each object in the
> > > collection as opposed to passing in the entire collection (or enumeration
> > > in
> > > this case) to my field handler?  Is this behavior appropriate?  If not,
> > > how
> > > hard would it be to change?
> > >
> > > Jeremy
> > > --
> > >   Jeremy Haile
> > >   [EMAIL PROTECTED]
> > >
> > > -----------------------------------------------------------
> > > If you wish to unsubscribe from this mailing, send mail to
> > > [EMAIL PROTECTED] with a subject of:
> > >         unsubscribe castor-dev
> > --
> >   Jeremy Haile
> >   [EMAIL PROTECTED]
> > 
> > -----------------------------------------------------------
> > If you wish to unsubscribe from this mailing, send mail to
> > [EMAIL PROTECTED] with a subject of:
> >         unsubscribe castor-dev
> 
> ----------------------------------------------------------- 
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
>         unsubscribe castor-dev
> 
-- 
  Jeremy Haile
  [EMAIL PROTECTED]

----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-dev

Reply via email to