Hi Jeremy,

I recall the discussion, though the problem obviously still exists if
you are running into it. You might want to file a bug on that
(http://bugzilla.exolab.org).

There is an "undocumented" workaround for anyone using the CVS version,
it's the ability to set a GeneralizedFieldHandler for a specific type
and not only for a specific field:

1. Implement org.exolab.castor.mapping.FieldHandlerFactory

   This factory should return your GeneralizedFieldHandler for
   the InetAddress class.

2. Remove the GeneralizedFieldHandler reference from the mapping file.
   Leave the <field> mapping, just remove the handler="myHandler".

3. Set the FieldHandlerFactory in the introspector as such:

   import org.exolab.castor.xml.ClassDescriptorResolver;
   import org.exolab.castor.xml.Introspector;
   import org.exolab.castor.xml.util.ClassDescriptorResolverImpl;


   ClassDescriptorResolverImpl cdr = new ClassDescriptorResolverImpl();
   cdr.getIntrospector().addFieldHandlerFactory(myFactory);

4. Now use this ClassDescriptorResolver in the Unmarshaller and
Unmarshal:


   Unmarshaller unm = new Unmarshaller(...);
   unm.setResolver(cdr);
   Object root = unm.unmarshal(reader);

Hope that helps,

--Keith


  
Jeremy Haile wrote:
> 
> I'm new to the list, so I hope I'm not rehashing a question that has been
> discussed recently.  I looked in the mail archives and only found posts
> up to March of last year discussing using GeneralizedFieldHandler with
> Collections.  It seems that the strange behavior when using a
> GeneralizedFieldHandler with collections is still present.
> 
> My needs are similar to those of the old "URL" post.  In short, I am
> trying to marshall and unmarshall a Set of java.net.InetAddress objects.
> I want to marshall them into a java.lang.String via the
> InetAddress.getHostName() method.  My generalized field handler receives
> an enumeration of InetAddress objects in convertUponGet() while
> marshalling.  I simply convert this to a set of java.lang.String objects
> and return it.  This works as expected.
> 
> However, it is odd that when unmarshalling, convertUponSet() gets called
> for each element in the collection instead of with an enumeration - fine,
> I can deal with that.  But why does convertUponGet() get called while I
> am unmarshalling.  Has this not been fixed in 0.9.5.2?  How should I be
> handling this situation?
> 
> Relevant code is below.  Note that my code fails during unmarshalling
> when convertUponGet() is called.  If I comment out my convertUponGet() my
> code functions (I could probably develop a workaround), but I figured
> that Castor should have a defined, working way of dealing with this
> situation.
> 
> Thanks!
> 
> Running in Redhat Linux, JDK 1.4.2_03, Castor 0.9.5.2
> 
> -==MAPPING==-
> 
>     <field name="ipAddresses"
>            type="java.lang.String"
>            handler="com.company.module.support.InetAddressFieldHandler"
>            get-method="getIpAddresses"
>            set-method="setIpAddresses"
>            collection="set">
>       <bind-xml name="ip-address"
>                 node="element" />
>     </field>
> 
> -==FIELD HANDLER==-
>     /**
>      * Used for marshalling of a collection of InetAddresses by
>      converting them
>      * into a set of strings that represents their hostnames.
>      * <p>
>      * This method uses the [EMAIL PROTECTED] InetAddress#getHostAddress} method to
>      * convert the InetAddress object into a string form.
>      *
>      * @param o the InetAddress object to convert
>      *
>      * @return a String encoding of the InetAddress object
>      */
>     public Object convertUponGet(Object o) {
> 
>         if( o == null )
>             return null;
> 
>         // Create new set to hold ip addresses that are marshalled
>         Set addressSet = new HashSet();
> 
>         // Loop through each value given by castor and convert to a
>         string.
>         // The string will be stored in the new set and returned to
>         castor
>         // to be marshalled in the XML file.
>         Enumeration enum = (Enumeration) o;
>         while ( enum.hasMoreElements() ) {
>             InetAddress address = (InetAddress)enum.nextElement();
> 
>             // Add address host name to the address collection
>             addressSet.add( address.getHostName() );
>         }
> 
>         return addressSet;
>     }
> 
>     /**
>      * Unmarshalls a set of String IP Addresses into a set of InetAddress
>      * objects.
>      * <p>
>      * The IP address is expected to be formatted in a way accepted by
>      * [EMAIL PROTECTED] InetAddress#getByName(String)}.
>      *
>      *
>      * @param o the String encoding of a InetAddress object
>      *
>      * @return the newly create java.util.InetAddress object
>      */
>     public Object convertUponSet(Object o) {
> 
>         if( o == null )
>             return null;
> 
>         String hostName = (String) o;
>         InetAddress inetAddress = null;
> 
>         try {
> 
>             // convert string into an inet address object
>             inetAddress = InetAddress.getByName( hostName );
> 
>         } catch (UnknownHostException e) {
> 
>             // Castor doesn't allow us to throw exceptions in this class,
>             so
>             // a runtime exception is thrown as this is a fatal error...
>             //todo Create a more elegant error reporting mechanism for
>             field support
>             throw new RuntimeException( "Host name is not a legal value:
>             '" + hostName + "'" );
>         }
> 
>         return inetAddress;
>     }
> 
> --
>   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