You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Apache Wiki <wi...@apache.org> on 2006/09/07 17:49:20 UTC

[Jakarta-commons Wiki] Update of "Betwixt/TipsAndHints/HierarchalXmlIntrospector" by JesseSweetland

Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Jakarta-commons Wiki" for change notification.

The following page has been changed by JesseSweetland:
http://wiki.apache.org/jakarta-commons/Betwixt/TipsAndHints/HierarchalXmlIntrospector

New page:
This works for marshalling, but has some quirks when unmarshalling.  (Specifically, when unmarshalling the correct bean type is created, but none of the properties are initialized.  I suspect this is because the AttributeDescriptor has no updaters, which may in turn be caused by some quirk when executing java.beans.Introspector on a subclass.)

{{{
import java.io.*;
import java.util.*;
import org.apache.commons.betwixt.*;
import org.apache.commons.betwixt.digester.*;
import org.apache.commons.logging.*;

/**
 *
 * @author Jesse Sweetland
 */
public class HierarchalXMLIntrospector extends XMLIntrospector {
    /** Private, so we have to copy here */
    private XMLBeanInfoDigester digester;
    
    protected synchronized XMLBeanInfo findByXMLDescriptor(Class c) {
        Set<Class> classes = new LinkedHashSet<Class>();
        Class temp = c;
        while(temp != null) {
            classes.add(temp);
            for(Class ifc: temp.getInterfaces()) {
                classes.add(ifc);
            }
            temp = temp.getSuperclass();
        }
        
        for(Class c2: classes) {
            String resourcePath = getResourcePath(c2);
            InputStream in = c2.getResourceAsStream(resourcePath);
            if(in != null) {
                try {
                    configureDigester(c);
                    return (XMLBeanInfo)digester.parse(in);
                } catch(Throwable t) {
                    getLog().warn("Error parsing XML bean info resource " + resourcePath, t);
                }
            }
        }
        return null;
    }
    
    /** Private, so we have to copy here */
    private synchronized void configureDigester(Class aClass) {
        if ( digester == null ) {
            digester = new XMLBeanInfoDigester();
            digester.setXMLIntrospector( this );
        }
        digester.setBeanClass( aClass );
    }
    
    protected String getResourcePath(Class c) {
        return c.getName().substring(c.getName().lastIndexOf('.') + 1) + ".betwixt";
    }
}
}}}

To use this, just set the XMLIntrospector property on the BeanWriter:

{{{
BeanWriter bw = new BeanWriter();
bw.setXMLIntrospector(new HierarchalXMLIntrospector());
}}}

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org