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