users@jaxb.java.net

Re: JaxB and DOM dictionary

From: Ganga Sah <ganga_sah_at_yahoo.com>
Date: Wed, 04 Jun 2003 12:10:42 -0700

Here is the futher deatils on my approach to this
problem.
I am attaching PropertyUtil class which has methods to
find property value(JAXB Java content object) inside
any base object(also JAXB Java content object, which
could be the root of Java content tree) with a given
one propertyName or an array of propertyName(s).
The methods returns the first object matching the
propertyName, which can be enhanced to return a list
of all matching objects.
Hope this helps.

(I have extraced these methods with some twicking out
of my application, and have not tested it seperately).

--ganga

--- ritika maheshwari <runjhun1_at_yahoo.com> wrote:
> Could you please send further details on the
> alternative
>
> thanks
>
>
>
> CANDAT Jerome <jerome.candat_at_c-s.fr> wrote:
> Hello everyone,
>
> I'm currently using JAXB for one of my projects and
> I have the same problem
> : cannot get XPath of the elements.
>
> I'm really interested in your alternative though I
> don't know how to do
> this. Please send further details on your
> alternative.
>
>
> Thanks in advance,
> J?r?me.
> ----- Original Message -----
> From: "Ganga Sah"
> To:
> Sent: Wednesday, June 04, 2003 7:56 AM
> Subject: Re: JaxB and DOM dictionary
>
>
> > There is an alternative to accessing DOM tree thru
> > JAXB generated gettter(readMethod) by recursively
> > using Java reflection & PropertyDescriptor API
> from
> > the root of JAXB generated class. If this approach
> > helps you, I could send futher details if needed.
> > thanks,
> > ganga
> > --- SUBSCRIBE JAXB-INTEREST Annonymous
> > wrote:
> > > does jaxb generate some kind of a dictionary
> while
> > > generating the java classes from xsd. A
> dictionary
> > > which contains information about each element in
> the
> > > xsd. For example from the generated classes I
> cannot
> > > get the XPath of a certain element in xsd. So
> for
> > > this I would have to navigate the dom tree. So
> > > instead of my navigating the dom tree I could
> use
> > > the dictionary to get any details about the
> element
> > > which I cannot get from the java classes
> produced.If
> > > JAXB does not do something like this would you
> know
> > > any other tool that would.
> >
> >
> > __________________________________
> > Do you Yahoo!?
> > Yahoo! Calendar - Free online calendar with sync
> to Outlook(TM).
> > http://calendar.yahoo.com
> >
>
> ---------------------------------
> Do you Yahoo!?
> Free online calendar with sync to Outlook(TM).


__________________________________
Do you Yahoo!?
Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
http://calendar.yahoo.com



import java.util.Iterator;
import java.util.List;
import java.beans.PropertyDescriptor;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.IntrospectionException;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class PropertyUtil {
    public static PropertyDescriptor[] getPropertyDescriptors(Object obj) {
        if (obj == null) return null;
        Class bean = obj.getClass();
        BeanInfo beanInfo = null;
        try {
            beanInfo = Introspector.getBeanInfo(bean, Object.class);
        } catch(IntrospectionException e) {
            System.err.println("Couldn't introspect " + bean.getName());
            return null;
        }
        return beanInfo.getPropertyDescriptors();
    }

    public static Object getPropertyByName(Object obj, String propertyName) {
        if (obj == null) return null;
        PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(obj);
        for (int i = 0; i < propertyDescriptors.length; i++) {
            if (propertyName.startsWith("primaryInterface")) continue;//unwanted property
            String thisPropertyName = propertyDescriptors[i].getName();
            if (thisPropertyName.compareTo(propertyName) == 0) {
                Method readMethod = propertyDescriptors[i].getReadMethod();
                Object propertyValue = null;
                try {
                    propertyValue = readMethod.invoke(obj, null);
                } catch (IllegalAccessException illAccEx) {
                    illAccEx.printStackTrace();
                } catch (InvocationTargetException invTarEx) {
                    invTarEx.printStackTrace();
                }
                return propertyValue;
            }
        }
        return null;
    }

    public static Object getPropertyByName(List objList, String propertyName) {
        for (Iterator objListIter = objList.iterator(); objListIter.hasNext();) {
            Object nextObj = objListIter.next();
            Object propertyValue = getPropertyByName(nextObj, propertyName) ;
            if (propertyValue != null) return propertyValue;
        }
        return null;
    }

    public static Object getPropertyByNames(Object obj, String[] propertyNames) {
        Object propertyValue = obj;
        for (int i = 0; i < propertyNames.length; i++) {
            propertyValue = getPropertyByName(propertyValue, propertyNames[i]) ;
            if (propertyValue != null) {
                continue;
            } else {
                return null;
            }
        }
        return null;
    }

}