You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Andrew Hughes <ah...@gmail.com> on 2009/03/04 00:08:02 UTC
Re: JXPath over Generic Collection>, How?
Pretty sure this is a bug in JXPath - and it is not tested by the current
unit tests.
I can't quite work out 100% of what's going on here... but it has to do with
gathering the property names from a DynaBean child member of a (parent)
DynaBean. Especially, when it try's to deal with the property named 'name'
and 'class'.
The problem with query '//dog' etc's 'ArrayOutOfBoundsException 0' occurs
below. And rightfully so, names[] is a zero length array and for some reason
JXPath is trying to set a value for the first entry of a zero length array.
That aint ever going to work! But why is the array length zero? Because
the properties.length==1, however the 'hasClass==true' and it's count-- then
negates the correct count calculated from properties.length. I think the
problem is in the hasClass calculation... 'boolean hasClass =
dynaClass.getDynaProperty("class") != null;' or the conditional 'if'
statement. I don't understand the JXPath logic here completely, but I know
it doesn't deal with the way I am using it and I genuinely feel this is a
bug we can fix :'(
public String[] getPropertyNames() {
/* @todo do something about the sorting - LIKE WHAT? - MJB */
if (names == null) {
DynaClass dynaClass = dynaBean.getDynaClass();
DynaProperty[] properties = dynaClass.getDynaProperties();
//returns one property 'name=root' (correct)
int count = properties.length; //returns/set's '1' (correct)
boolean hasClass = dynaClass.getDynaProperty("class") != null;
//returns/sets 'true' (?unknown?)
if (hasClass) { //this is true and executes
count--; // Exclude "class" from properties
}
names = new String[count]; //names is a zero length array.....
WRONG!!! I do have at least 1 property called 'name'!!!!
for (int i = 0, j = 0; i < properties.length; i++) {
String name = properties[i].getName();
if (!hasClass || !name.equals("class")) {
names[j++] = name; //it breaks here
ArrayOutOfBoundsException 0!!!!! WRONG :'(
}
}
Arrays.sort(names);
}
return names;
}
On Fri, Feb 27, 2009 at 10:02 AM, Andrew Hughes <ah...@gmail.com> wrote:
> Thanks again Matt, good to hear that it's working at your end :) At my end
> JXPath's DynaBeanPropertyPointer seems to get into problems
> with ArraIndexOutOfBounds exceptions on the PropertyNames of my DynaBean (see
> the strack trace below) with many of the queries. I can only speculate why
> this might be... and I won't speculate publically. I'm running the code with
> JXPath 1.3, BeanUtils 1.8.0, and Java 1.6_u11 (within eclipse 3.4). The
> code I'm trying to run is pasted below VERBATIM.... if that works on your
> environment and not mine then it must be a compatibility/platform problem.
> You've helped me out heaps so far Matt but can I please ask you to
> copy/paste the VERBATIM code and test?
>
> 2009-02-27 08:43:59,940 ERROR (Main.java:89) [runEvaluation] Failed to
> evaluate /root/animal/cat/tiger[last()]
>
> java.lang.ArrayIndexOutOfBoundsException: 0
>
> at
> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>
> at
> org.apache.commons.jxpath.ri.axes.PredicateContext.nextSet(PredicateContext.java:174)
>
> at
> org.apache.commons.jxpath.ri.EvalContext.getSingleNodePointer(EvalContext.java:311)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>
> at
> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>
> at rnd.Main.runEvaluation(Main.java:68)
>
> at rnd.Main.main(Main.java:56)
>
> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
> evaulate the expression: /root/animal/dog/*
>
> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
> evaluate /root/animal/dog/*
>
> java.lang.ArrayIndexOutOfBoundsException: 0
>
> at
> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.getSingleNodePointer(ChildContext.java:70)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>
> at
> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>
> at rnd.Main.runEvaluation(Main.java:68)
>
> at rnd.Main.main(Main.java:57)
>
> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
> evaulate the expression: //dog
>
> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
> evaluate //dog
>
> java.lang.ArrayIndexOutOfBoundsException: 0
>
> at
> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.getNodePointer(PropertyIterator.java:106)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.getSingleNodePointer(ChildContext.java:76)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>
> at
> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>
> at rnd.Main.runEvaluation(Main.java:68)
>
> at rnd.Main.main(Main.java:58)
>
> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
> evaulate the expression: //dog/*
>
> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
> evaluate //dog/*
>
> java.lang.ArrayIndexOutOfBoundsException: 0
>
> at
> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.getSingleNodePointer(ChildContext.java:70)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>
> at
> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>
> at rnd.Main.runEvaluation(Main.java:68)
>
> at rnd.Main.main(Main.java:59)
>
> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
> evaulate the expression: //cat/*[objectName='LION']
>
> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
> evaluate //cat/*[objectName='LION']
>
> java.lang.ArrayIndexOutOfBoundsException: 0
>
> at
> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>
> at
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>
> at
> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>
> at org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>
> at
> org.apache.commons.jxpath.ri.axes.PredicateContext.nextSet(PredicateContext.java:174)
>
> at
> org.apache.commons.jxpath.ri.EvalContext.getSingleNodePointer(EvalContext.java:311)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>
> at
> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>
> at
> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>
> at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>
> at rnd.Main.runEvaluation(Main.java:68)
>
> at rnd.Main.main(Main.java:60)
>
>
>
>
> My Code VERBATIM
>
> package rnd;
>
> import java.util.ArrayList;
>
> import org.apache.commons.beanutils.LazyDynaBean;
> import org.apache.commons.jxpath.JXPathContext;
> import org.apache.log4j.Logger;
>
> public class Main {
>
> private static final Logger log = Logger.getLogger(Main.class);
>
> public static void main(String[] args) {
> log.info("Starting...");
> LazyDynaBean lazyDynaBean = new LazyDynaBean(); //the transparent root.
> LazyDynaBean root = new LazyDynaBean();
> LazyDynaBean animal = new LazyDynaBean();
> LazyDynaBean dog = new LazyDynaBean();
> LazyDynaBean cat = new LazyDynaBean();
> LazyDynaBean boxer = new LazyDynaBean();
> LazyDynaBean labrador = new LazyDynaBean();
> LazyDynaBean tiger1 = new LazyDynaBean();
> LazyDynaBean tiger2 = new LazyDynaBean();
> LazyDynaBean tiger3 = new LazyDynaBean();
> LazyDynaBean lion = new LazyDynaBean();
> //set the @objectName property of each bean, user UPPER to make them
> distinct for examples.
> root.set("objectName","ROOT");
> animal.set("objectName","ANIMAL");
> dog.set("objectName","DOG");
> cat.set("objectName","CAT");
> boxer.set("objectName","BOXER");
> labrador.set("objectName","LABRADOR");
> tiger1.set("objectName","TIGER-ONE");
> tiger2.set("objectName","TIGER-TWO");
> tiger3.set("objectName","TIGER-THREE");
> lion.set("objectName","LION");
> //build the bean hierarchy.
> lazyDynaBean.set("root",0, root);
> root.set("animal",0, animal);
> animal.set("dog",0,dog);
> animal.set("cat",0,cat);
> dog.set("labrador",0,labrador);
> dog.set("boxer",0, boxer);
> cat.set("tiger",0,tiger1);//duplicate
> cat.set("tiger",1,tiger2);//duplicate
> cat.set("tiger",2,tiger3);//duplicate
> cat.set("lion",0,lion);
>
> JXPathContext context = JXPathContext.newContext(lazyDynaBean);
>
> //these all work
> runEvaluation("/root/animal/dog", context); //absolute & single
> runEvaluation("/root/animal/cat/tiger[2]", context); //absolute &
> single
> runEvaluation("/root/animal/cat/tiger", context); //absolute &
> multiple
> //everything below fails
> runEvaluation("/root/animal/cat/tiger[last()]", context);
> //absolute & single
> runEvaluation("/root/animal/dog/*", context); //absolute & multiple
> runEvaluation("//dog", context); //deep search
> runEvaluation("//dog/*", context);//deep multiple
> runEvaluation("//cat/*[objectName='LION']", context);//deep filter
>
> }
>
>
> public static void runEvaluation(String expression,JXPathContext
> context){
> log.info("About to evaulate the expression: "+expression);
> try {
> Object value = context.getValue(expression);
> //we got a single result.
> if (value instanceof LazyDynaBean) {
> LazyDynaBean r = (LazyDynaBean)context.getValue(expression);
> log.info("Ran '" + expression + "' and got objectName='" +
> r.get("objectName") + "'");
>
> }
> //we got multiple results
> else if (value instanceof ArrayList) {
> String titles = "";
> for (LazyDynaBean bean : ((ArrayList<LazyDynaBean>) value )){
> titles += (bean.get("objectName")+",");
> }
> log.info("Ran " + expression + " and got "+((ArrayList)value).size()+"
> results: "+titles);
> }
> //we got a non-dyna bean.
> else {
> log.info("Ran '" + expression + "' and got a class '" +
> value.getClass().getName() + "' with toString() '" +value.toString() + "'");
> }
> } catch (Exception e) {
> // TODO Auto-generated catch block
> log.error("Failed to evaluate "+expression,e);
> }
> }
> }
>
>
>
>
> On Fri, Feb 27, 2009 at 3:56 AM, Matt Benson <gu...@yahoo.com> wrote:
>
>>
>> Those paths work for me. Maybe something else is going awry?
>>
>> -Matt
>>
>> --- On Thu, 2/26/09, Andrew Hughes <ah...@gmail.com> wrote:
>>
>> > From: Andrew Hughes <ah...@gmail.com>
>> > Subject: Re: JXPath over Generic Collection<?>, How?
>> > To: "Commons Users List" <us...@commons.apache.org>
>> > Date: Thursday, February 26, 2009, 12:53 AM
>> > Many queries don't work, I
>> > can't get any results for the following (code
>> > taken from previous email)...
>> >
>> > runEvaluation("/root/animal/cat/tiger[last()]", context);
>> > //absolute
>> > & single
>> >
>> > runEvaluation("/root/animal/dog/*", context); //absolute
>> > & multiple
>> > runEvaluation("//dog",
>> > context); //deep search
>> > runEvaluation("//dog/*",
>> > context);//deep multiple
>> >
>> > runEvaluation("//cat/*[objectName='LION']", context);//deep
>> > filter
>> >
>> > These are the really interesting benefits on xpath that I
>> > would dearly like
>> > to have.
>> >
>> > A Huge Thanks once again for your reply Matt!!! :)
>> >
>> >
>> >
>> > On Thu, Feb 26, 2009 at 10:55 AM, Matt Benson <gu...@yahoo.com>
>> > wrote:
>> >
>> > >
>> > > How so? If you simply treat the name property as
>> > an element rather than an
>> > > attribute, you're done, no?
>> > >
>> > > -Matt
>> > >
>> > > --- On Wed, 2/25/09, Andrew Hughes <ah...@gmail.com>
>> > wrote:
>> > >
>> > > > From: Andrew Hughes <ah...@gmail.com>
>> > > > Subject: Re: JXPath over Generic
>> > Collection<?>, How?
>> > > > To: "Commons Users List" <us...@commons.apache.org>
>> > > > Date: Wednesday, February 25, 2009, 6:22 PM
>> > > > Indeed Matt, you are correct and I do
>> > > > apologize... but I must say I find
>> > > > your emailed explanation much better. Kudos &
>> > Thanks!
>> > > > I'll (finally) get a chance to work on this
>> > tomorrow, but I
>> > > > think I am still
>> > > > stuck :'(
>> > > >
>> > > >
>> > > > Cheers for everything so far!!!!
>> > > >
>> > > >
>> > > > On Tue, Feb 24, 2009 at 1:43 PM, Matt Benson
>> > <gu...@yahoo.com>
>> > > > wrote:
>> > > >
>> > > > >
>> > > > > I won't get to look at this again at least
>> > before
>> > > > tomorrow (9PM for me now
>> > > > > and still have some late-night $work to look
>> > at), but
>> > > > I thought I would
>> > > > > mention straight off that the @name feature
>> > actually
>> > > > IS mentioned in the
>> > > > > userguide under the section about working
>> > with
>> > > > (java.util.)Maps. If you
>> > > > > have a suggestion of where in the guide
>> > would be
>> > > > another good place to
>> > > > > mention it as a caveat and/or even the
>> > wording to use,
>> > > > feel free to open a
>> > > > > documentation issue in JIRA for it.
>> > > > >
>> > > > > TBC,
>> > > > > Matt
>> > > > >
>> > > > > --- On Mon, 2/23/09, Andrew Hughes <ah...@gmail.com>
>> > > > wrote:
>> > > > >
>> > > > > > From: Andrew Hughes <ah...@gmail.com>
>> > > > > > Subject: Re: JXPath over Generic
>> > > > Collection<?>, How?
>> > > > > > To: "Commons Users List" <us...@commons.apache.org>
>> > > > > > Date: Monday, February 23, 2009, 6:24
>> > PM
>> > > > > > Hi Matt,
>> > > > > > Thanks HEAPS for you reply, I am really
>> > really
>> > > > really
>> > > > > > grateful. I think that
>> > > > > > I have progressed just a little with
>> > this but
>> > > > there are
>> > > > > > still some BIG
>> > > > > > shortfalls with this. I've attached
>> > code that
>> > > > should run
>> > > > > > out the box and is
>> > > > > > based on previous emails. If I can get
>> > the
>> > > > expressions
>> > > > > > below to correctly
>> > > > > > evaluate I would be heaps happy.
>> > > > > >
>> > > > > > Thanks heaps again, hopefully this will
>> > work soon
>> > > > enough.
>> > > > > >
>> > > > > > p.s. I can understand the 'name' vs
>> > '@name',
>> > > > perhaps the
>> > > > > > userguide could
>> > > > > > mention this is about all I can add.
>> > > > > >
>> > > > > >
>> > > > > > code...
>> > > > > >
>> > > > > > package rnd;
>> > > > > >
>> > > > > > import java.util.ArrayList;
>> > > > > >
>> > > > > > import
>> > > > org.apache.commons.beanutils.LazyDynaBean;
>> > > > > > import
>> > org.apache.commons.jxpath.JXPathContext;
>> > > > > > import org.apache.log4j.Logger;
>> > > > > >
>> > > > > > public class Main {
>> > > > > >
>> > > > > > private static final Logger log =
>> > > > > > Logger.getLogger(Main.class);
>> > > > > >
>> > > > > > public static void main(String[] args)
>> > {
>> > > > > > log.info("Starting...");
>> > > > > > LazyDynaBean lazyDynaBean = new
>> > LazyDynaBean();
>> > > > //the
>> > > > > > transparent root.
>> > > > > > LazyDynaBean root = new
>> > LazyDynaBean();
>> > > > > > LazyDynaBean animal = new
>> > LazyDynaBean();
>> > > > > > LazyDynaBean dog = new LazyDynaBean();
>> > > > > > LazyDynaBean cat = new LazyDynaBean();
>> > > > > > LazyDynaBean boxer = new
>> > LazyDynaBean();
>> > > > > > LazyDynaBean labrador = new
>> > LazyDynaBean();
>> > > > > > LazyDynaBean tiger1 = new
>> > LazyDynaBean();
>> > > > > > LazyDynaBean tiger2 = new
>> > LazyDynaBean();
>> > > > > > LazyDynaBean tiger3 = new
>> > LazyDynaBean();
>> > > > > > LazyDynaBean lion = new
>> > LazyDynaBean();
>> > > > > > //set the @objectName property of each
>> > bean, user
>> > > > UPPER to
>> > > > > > make them
>> > > > > > distinct for examples.
>> > > > > > root.set("objectName","ROOT");
>> > > > > > animal.set("objectName","ANIMAL");
>> > > > > > dog.set("objectName","DOG");
>> > > > > > cat.set("objectName","CAT");
>> > > > > > boxer.set("objectName","BOXER");
>> > > > > > labrador.set("objectName","LABRADOR");
>> > > > > > tiger1.set("objectName","TIGER-ONE");
>> > > > > > tiger2.set("objectName","TIGER-TWO");
>> > > > > >
>> > tiger3.set("objectName","TIGER-THREE");
>> > > > > > lion.set("objectName","LION");
>> > > > > > //build the bean hierarchy.
>> > > > > > lazyDynaBean.set("root",0, root);
>> > > > > > root.set("animal",0, animal);
>> > > > > > animal.set("dog",0,dog);
>> > > > > > animal.set("cat",0,cat);
>> > > > > > dog.set("labrador",0,labrador);
>> > > > > > dog.set("boxer",0, boxer);
>> > > > > > cat.set("tiger",0,tiger1);//duplicate
>> > > > > > cat.set("tiger",1,tiger2);//duplicate
>> > > > > > cat.set("tiger",2,tiger3);//duplicate
>> > > > > > cat.set("lion",0,lion);
>> > > > > >
>> > > > JXPathContext context =
>> > > > > >
>> > JXPathContext.newContext(lazyDynaBean);
>> > > > > >
>> > > > > >
>> > //these all
>> > > > work
>> > > > > >
>> > > > > > runEvaluation("/root/animal/dog",
>> > context);
>> > > > //absolute &
>> > > > > > single
>> > > > > >
>> > > > > >
>> > runEvaluation("/root/animal/cat/tiger[2]",
>> > > > context);
>> > > > > > //absolute &
>> > > > > > single
>> > > > > >
>> > > > > > runEvaluation("/root/animal/cat/tiger",
>> > context);
>> > > > //absolute
>> > > > > > &
>> > > > > > multiple
>> > > > > >
>> > > > //everything below fails
>> > > > > >
>> > > > > >
>> > runEvaluation("/root/animal/cat/tiger[last()]",
>> > > > context);
>> > > > > > //absolute
>> > > > > > & single
>> > > > > >
>> > > > > > runEvaluation("/root/animal/dog/*",
>> > context);
>> > > > //absolute
>> > > > > > & multiple
>> > > > > >
>> > > > runEvaluation("//dog",
>> > > > > > context); //deep search
>> > > > > >
>> > > > runEvaluation("//dog/*",
>> > > > > > context);//deep multiple
>> > > > > >
>> > > > > >
>> > runEvaluation("//cat/*[objectName='LION']",
>> > > > context);//deep
>> > > > > > filter
>> > > > > >
>> > > > > > }
>> > > > > > public static void
>> > runEvaluation(String
>> > > > > > expression,JXPathContext context){
>> > > > > > log.info("About to evaulate the
>> > expression:
>> > > > "+expression);
>> > > > > >
>> > try {
>> > > > > > Object value =
>> > context.getValue(expression);
>> > > > > > //we got a single result.
>> > > > > > if (value instanceof LazyDynaBean) {
>> > > > > > LazyDynaBean r =
>> > > > > >
>> > (LazyDynaBean)context.getValue(expression);
>> > > > > > log.info("Ran '" + expression + "' and
>> > got
>> > > > objectName='" +
>> > > > > > r.get("objectName") + "'");
>> > > > > > }
>> > > > > > //we got multiple results
>> > > > > > else if (value instanceof ArrayList) {
>> > > > > > String titles = "";
>> > > > > > for (LazyDynaBean bean :
>> > > > ((ArrayList<LazyDynaBean>)
>> > > > > > value )){
>> > > > > > titles +=
>> > (bean.get("objectName")+",");
>> > > > > > }
>> > > > > > log.info("Ran " + expression + " and
>> > got
>> > > > > > "+((ArrayList)value).size()+"
>> > > > > > results: "+titles);
>> > > > > > }
>> > > > > > //we got a non-dyna bean.
>> > > > > > else {
>> > > > > > log.info("Ran '" + expression + "' and
>> > got a
>> > > > class '" +
>> > > > > > value.getClass().getName() + "' with
>> > toString()
>> > > > '"
>> > > > > > +value.toString() + "'");
>> > > > > > }
>> > > > > > } catch (Exception e) {
>> > > > > > log.error(e);
>> > > > > > }
>> > > > > > }
>> > > > > > }
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > > On Tue, Feb 24, 2009 at 8:58 AM, Matt
>> > Benson
>> > > > <gu...@yahoo.com>
>> > > > > > wrote:
>> > > > > >
>> > > > > > >
>> > > > > > > And the answer is:
>> > > > > > >
>> > > > > > > In JXPath, a decision was
>> > made to
>> > > > overload the
>> > > > > > name attribute to refer to
>> > > > > > > an "element"'s property name WRT
>> > its
>> > > > parent. The
>> > > > > > reason this was done was
>> > > > > > > to support query maps with
>> > non-String keys
>> > > > in
>> > > > > > JXPath. This means that
>> > > > > > > anytime you actually want to refer
>> > to a
>> > > > property whose
>> > > > > > name literally is
>> > > > > > > "name", you must treat it as a
>> > child element
>> > > > rather
>> > > > > > than an attribute. So
>> > > > > > > in your case you could either
>> > change "name"
>> > > > to "title"
>> > > > > > and query
>> > > > > > > [@title='foo'] or simply use
>> > [name='foo'].
>> > > > > > >
>> > > > > > > Regards,
>> > > > > > > Matt
>> > > > > > >
>> > > > > > > --- On Mon, 2/23/09, Matt Benson
>> > <gu...@yahoo.com>
>> > > > > > wrote:
>> > > > > > >
>> > > > > > > > From: Matt Benson <gu...@yahoo.com>
>> > > > > > > > Subject: Re: JXPath over
>> > Generic
>> > > > > > Collection<?>, How?
>> > > > > > > > To: "Commons Users List"
>> > <us...@commons.apache.org>
>> > > > > > > > Date: Monday, February 23,
>> > 2009, 2:58
>> > > > PM
>> > > > > > > >
>> > > > > > > > To follow up, the 'name'
>> > attribute in
>> > > > particular
>> > > > > > is what
>> > > > > > > > doesn't seem to be working
>> > here (change
>> > > > it to
>> > > > > > e.g. 'game'
>> > > > > > > > and it works fine)... if you
>> > could file
>> > > > a bug it
>> > > > > > would help
>> > > > > > > > me remember as I don't have
>> > time to do
>> > > > it myself
>> > > > > > right this
>> > > > > > > > minute.
>> > > > > > > >
>> > > > > > > > -Matt
>> > > > > > > >
>> > > > > > > > --- On Mon, 2/23/09, Matt
>> > Benson <gu...@yahoo.com>
>> > > > > > > > wrote:
>> > > > > > > >
>> > > > > > > > > From: Matt Benson <gu...@yahoo.com>
>> > > > > > > > > Subject: Re: JXPath over
>> > Generic
>> > > > > > Collection<?>,
>> > > > > > > > How?
>> > > > > > > > > To: "Commons Users List"
>> > <us...@commons.apache.org>
>> > > > > > > > > Date: Monday, February
>> > 23, 2009,
>> > > > 12:27 PM
>> > > > > > > > >
>> > > > > > > > > Andrew,
>> > > > > > > > > I've
>> > been meaning
>> > > > to look
>> > > > > > into this but haven't
>> > > > > > > > > yet. If you have
>> > any
>> > > > ready-to-run code
>> > > > > > you can send
>> > > > > > > > to
>> > > > > > > > > the list, that wouldn't
>> > hurt...
>> > > > > > > > >
>> > > > > > > > > -Matt
>> > > > > > > > >
>> > > > > > > > > --- On Mon, 2/23/09,
>> > Andrew Hughes
>> > > > <ah...@gmail.com>
>> > > > > > > > > wrote:
>> > > > > > > > >
>> > > > > > > > > > From: Andrew Hughes
>> > <ah...@gmail.com>
>> > > > > > > > > > Subject: Re: JXPath
>> > over
>> > > > Generic
>> > > > > > > > Collection<?>,
>> > > > > > > > > How?
>> > > > > > > > > > To: "Commons Users
>> > List"
>> > > > <us...@commons.apache.org>
>> > > > > > > > > > Date: Monday,
>> > February 23,
>> > > > 2009, 5:42
>> > > > > > AM
>> > > > > > > > > > OK, email #19 to
>> > the list.
>> > > > I'm both
>> > > > > > > > > > incredibly patient
>> > and
>> > > > skeptical that
>> > > > > > > > > > this will ever
>> > work. I might
>> > > > try and
>> > > > > > run this in
>> > > > > > > > a
>> > > > > > > > > debugger
>> > > > > > > > > > and track down
>> > > > > > > > > > "how" JXPath
>> > traverses the
>> > > > DynaBean....
>> > > > > > but given
>> > > > > > > > the
>> > > > > > > > > > reflection
>> > involved
>> > > > > > > > > > that might be a
>> > painful
>> > > > task.
>> > > > > > > > > > --AH
>> > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > > > On Tue, Feb 17,
>> > 2009 at 1:11
>> > > > PM, Andrew
>> > > > > > Hughes
>> > > > > > > > <ah...@gmail.com>
>> > > > > > > > > > wrote:
>> > > > > > > > > >
>> > > > > > > > > > > Ping... if
>> > anyone can
>> > > > help with
>> > > > > > this JXPath
>> > > > > > > > > &
>> > > > > > > > > > DynaBeans problem
>> > I'd be
>> > > > > > > > > > > REALLY
>> > THANKFUL :)
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > On Fri, Feb
>> > 13, 2009 at
>> > > > 1:55 PM,
>> > > > > > Andrew
>> > > > > > > > Hughes
>> > > > > > > > > <ah...@gmail.com>
>> > > > > > > > > > wrote:
>> > > > > > > > > > >
>> > > > > > > > > > >> Howdy,
>> > > > > > > > > > >> I've taken
>> > Matt's
>> > > > suggestion
>> > > > > > onboard and
>> > > > > > > > I
>> > > > > > > > > have
>> > > > > > > > > > investigated
>> > DynaBeans.
>> > > > > > > > > > >> These look
>> > pretty
>> > > > good for
>> > > > > > all
>> > > > > > > > intestive
>> > > > > > > > > purposes
>> > > > > > > > > > and there's a code
>> > > > > > > > > > >> examples
>> > below how
>> > > > to build
>> > > > > > the data
>> > > > > > > > > structure:
>> > > > > > > > > > >>
>> > > > > > > > > > >> + root
>> > > > [@name="ROOT"]
>> > > > > > > > > > >>
>> > > > +
>> > > > > > animal [@name="ANIMAL"]
>> > > > > > > > > > >>
>> > > > > > + dog
>> > > > > > > > > > [@name="DOG"]
>> > > > > > > > > > >>
>> > > > > > > > > > +
>> > boxer
>> > > > [@name="BOXER"]
>> > > > > > > > > > >>
>> > > > > > > > > > +
>> > labrador
>> > > > > > [@name="LABRADOR"]
>> > > > > > > > > > >>
>> > > > > > + cat
>> > > > > > > > > > [@name="CAT"]
>> > > > > > > > > > >>
>> > > > > > > > > > +
>> > tiger
>> > > > > > [@name="TIGER-ONE"]
>> > > > > > > > > > >>
>> > > > > > > > > > +
>> > tiger
>> > > > > > [@name="TIGER-TWO"]
>> > > > > > > > > > >>
>> > > > > > > > > > +
>> > tiger
>> > > > > > [@name="TIGER-THREE"]
>> > > > > > > > > > >>
>> > > > > > > > > > +
>> > lion
>> > > > [@name="LION"]
>> > > > > > > > > > >>
>> > > > > > > > > > >>
>> > > > > > > > > > >> And the
>> > code looks
>> > > > like...
>> > > > > > > > > > >>
>> > > > > > > > > > >>
>> > LazyDynaBean
>> > > > > > lazyDynaBean = new
>> > > > > > > > > > LazyDynaBean();
>> > //the
>> > > > transpar
>>
> ...
>
> [Message clipped]
Re: JXPath over Generic Collection>, How?
Posted by Andrew Hughes <ah...@gmail.com>.
For efficiency reasons I can see why you are using String[] here and not
List.add()...
Anyway, I have a fix (sort of) for this bug. The number of names needs to be
calculated a little differently to what it currently is...
public String[] getPropertyNames() {
/* @todo do something about the sorting - LIKE WHAT? - MJB */
if (names == null) {
DynaClass dynaClass = dynaBean.getDynaClass();
DynaProperty[] properties = dynaClass.getDynaProperties();
int count = properties.length;
boolean hasClass = dynaClass.getDynaProperty("class") != null;
//count the number of property names we have
count = 0;
for (int i = 0; i < properties.length; i++) {
String name = properties[i].getName();
if (!hasClass || !name.equals("class")) {
count++; //it's only a property is it's not a class and
doesn't just have a class property.
}
}
//read the property names into a String[] to return
names = new String[count];
for (int i = 0, j = 0; i < properties.length; i++) {
String name = properties[i].getName();
if (!hasClass || !name.equals("class")) {
names[j++] = name;
}
}
Arrays.sort(names);
}
return names;
}
Now I can sort of sucessfully run all my expressions, yippee!! However, I
now have a problem with multiple deep results. Queries like //dog/* I would
expect to return all "dog's"[] but this just returns the first one it finds.
Maybe this is asking a little too much of JXPath and child/node
step-up/step-down traversal? Matt can probably tell me if this is or is not
the case pleeeease :)
On Wed, Mar 4, 2009 at 9:38 AM, Andrew Hughes <ah...@gmail.com> wrote:
> Pretty sure this is a bug in JXPath - and it is not tested by the current
> unit tests.
> I can't quite work out 100% of what's going on here... but it has to do
> with gathering the property names from a DynaBean child member of a (parent)
> DynaBean. Especially, when it try's to deal with the property named 'name'
> and 'class'.
>
> The problem with query '//dog' etc's 'ArrayOutOfBoundsException 0' occurs
> below. And rightfully so, names[] is a zero length array and for some
> reason JXPath is trying to set a value for the first entry of a zero length
> array. That aint ever going to work! But why is the array length zero?
> Because the properties.length==1, however the 'hasClass==true' and it's
> count-- then negates the correct count calculated from properties.length. I
> think the problem is in the hasClass calculation... 'boolean hasClass =
> dynaClass.getDynaProperty("class") != null;' or the conditional 'if'
> statement. I don't understand the JXPath logic here completely, but I know
> it doesn't deal with the way I am using it and I genuinely feel this is a
> bug we can fix :'(
>
>
> public String[] getPropertyNames() {
> /* @todo do something about the sorting - LIKE WHAT? - MJB */
> if (names == null) {
> DynaClass dynaClass = dynaBean.getDynaClass();
> DynaProperty[] properties = dynaClass.getDynaProperties();
> //returns one property 'name=root' (correct)
> int count = properties.length; //returns/set's '1' (correct)
> boolean hasClass = dynaClass.getDynaProperty("class") != null;
> //returns/sets 'true' (?unknown?)
> if (hasClass) { //this is true and executes
> count--; // Exclude "class" from properties
> }
> names = new String[count]; //names is a zero length array.....
> WRONG!!! I do have at least 1 property called 'name'!!!!
> for (int i = 0, j = 0; i < properties.length; i++) {
> String name = properties[i].getName();
> if (!hasClass || !name.equals("class")) {
> names[j++] = name; //it breaks here
> ArrayOutOfBoundsException 0!!!!! WRONG :'(
> }
> }
> Arrays.sort(names);
> }
> return names;
> }
>
>
>
>
> On Fri, Feb 27, 2009 at 10:02 AM, Andrew Hughes <ah...@gmail.com>wrote:
>
>> Thanks again Matt, good to hear that it's working at your end :) At my end
>> JXPath's DynaBeanPropertyPointer seems to get into problems
>> with ArraIndexOutOfBounds exceptions on the PropertyNames of my DynaBean (see
>> the strack trace below) with many of the queries. I can only speculate
>> why this might be... and I won't speculate publically. I'm running the code
>> with JXPath 1.3, BeanUtils 1.8.0, and Java 1.6_u11 (within eclipse 3.4). The
>> code I'm trying to run is pasted below VERBATIM.... if that works on your
>> environment and not mine then it must be a compatibility/platform problem.
>> You've helped me out heaps so far Matt but can I please ask you to
>> copy/paste the VERBATIM code and test?
>>
>> 2009-02-27 08:43:59,940 ERROR (Main.java:89) [runEvaluation] Failed to
>> evaluate /root/animal/cat/tiger[last()]
>>
>> java.lang.ArrayIndexOutOfBoundsException: 0
>>
>> at
>> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.PredicateContext.nextSet(PredicateContext.java:174)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.getSingleNodePointer(EvalContext.java:311)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>>
>> at rnd.Main.runEvaluation(Main.java:68)
>>
>> at rnd.Main.main(Main.java:56)
>>
>> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
>> evaulate the expression: /root/animal/dog/*
>>
>> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
>> evaluate /root/animal/dog/*
>>
>> java.lang.ArrayIndexOutOfBoundsException: 0
>>
>> at
>> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:339)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.getSingleNodePointer(ChildContext.java:70)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>>
>> at rnd.Main.runEvaluation(Main.java:68)
>>
>> at rnd.Main.main(Main.java:57)
>>
>> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
>> evaulate the expression: //dog
>>
>> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
>> evaluate //dog
>>
>> java.lang.ArrayIndexOutOfBoundsException: 0
>>
>> at
>> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.getNodePointer(PropertyIterator.java:106)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.getSingleNodePointer(ChildContext.java:76)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>>
>> at rnd.Main.runEvaluation(Main.java:68)
>>
>> at rnd.Main.main(Main.java:58)
>>
>> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
>> evaulate the expression: //dog/*
>>
>> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
>> evaluate //dog/*
>>
>> java.lang.ArrayIndexOutOfBoundsException: 0
>>
>> at
>> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.getSingleNodePointer(ChildContext.java:70)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>>
>> at rnd.Main.runEvaluation(Main.java:68)
>>
>> at rnd.Main.main(Main.java:59)
>>
>> 2009-02-27 08:43:59,956 INFO (Main.java:66) [runEvaluation] About to
>> evaulate the expression: //cat/*[objectName='LION']
>>
>> 2009-02-27 08:43:59,956 ERROR (Main.java:89) [runEvaluation] Failed to
>> evaluate //cat/*[objectName='LION']
>>
>> java.lang.ArrayIndexOutOfBoundsException: 0
>>
>> at
>> org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanPropertyPointer.getPropertyNames(DynaBeanPropertyPointer.java:84)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.prepareForIndividualProperty(PropertyIterator.java:270)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:154)
>>
>> at
>> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:139)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:101)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:340)
>>
>> at
>> org.apache.commons.jxpath.ri.axes.PredicateContext.nextSet(PredicateContext.java:174)
>>
>> at
>> org.apache.commons.jxpath.ri.EvalContext.getSingleNodePointer(EvalContext.java:311)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
>>
>> at
>> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
>>
>> at
>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
>>
>> at rnd.Main.runEvaluation(Main.java:68)
>>
>> at rnd.Main.main(Main.java:60)
>>
>>
>>
>>
>> My Code VERBATIM
>>
>> package rnd;
>>
>> import java.util.ArrayList;
>>
>> import org.apache.commons.beanutils.LazyDynaBean;
>> import org.apache.commons.jxpath.JXPathContext;
>> import org.apache.log4j.Logger;
>>
>> public class Main {
>>
>> private static final Logger log = Logger.getLogger(Main.class);
>>
>> public static void main(String[] args) {
>> log.info("Starting...");
>> LazyDynaBean lazyDynaBean = new LazyDynaBean(); //the transparent root.
>> LazyDynaBean root = new LazyDynaBean();
>> LazyDynaBean animal = new LazyDynaBean();
>> LazyDynaBean dog = new LazyDynaBean();
>> LazyDynaBean cat = new LazyDynaBean();
>> LazyDynaBean boxer = new LazyDynaBean();
>> LazyDynaBean labrador = new LazyDynaBean();
>> LazyDynaBean tiger1 = new LazyDynaBean();
>> LazyDynaBean tiger2 = new LazyDynaBean();
>> LazyDynaBean tiger3 = new LazyDynaBean();
>> LazyDynaBean lion = new LazyDynaBean();
>> //set the @objectName property of each bean, user UPPER to make them
>> distinct for examples.
>> root.set("objectName","ROOT");
>> animal.set("objectName","ANIMAL");
>> dog.set("objectName","DOG");
>> cat.set("objectName","CAT");
>> boxer.set("objectName","BOXER");
>> labrador.set("objectName","LABRADOR");
>> tiger1.set("objectName","TIGER-ONE");
>> tiger2.set("objectName","TIGER-TWO");
>> tiger3.set("objectName","TIGER-THREE");
>> lion.set("objectName","LION");
>> //build the bean hierarchy.
>> lazyDynaBean.set("root",0, root);
>> root.set("animal",0, animal);
>> animal.set("dog",0,dog);
>> animal.set("cat",0,cat);
>> dog.set("labrador",0,labrador);
>> dog.set("boxer",0, boxer);
>> cat.set("tiger",0,tiger1);//duplicate
>> cat.set("tiger",1,tiger2);//duplicate
>> cat.set("tiger",2,tiger3);//duplicate
>> cat.set("lion",0,lion);
>>
>> JXPathContext context = JXPathContext.newContext(lazyDynaBean);
>>
>> //these all work
>> runEvaluation("/root/animal/dog", context); //absolute & single
>> runEvaluation("/root/animal/cat/tiger[2]", context); //absolute &
>> single
>> runEvaluation("/root/animal/cat/tiger", context); //absolute &
>> multiple
>> //everything below fails
>> runEvaluation("/root/animal/cat/tiger[last()]", context);
>> //absolute & single
>> runEvaluation("/root/animal/dog/*", context); //absolute &
>> multiple
>> runEvaluation("//dog", context); //deep search
>> runEvaluation("//dog/*", context);//deep multiple
>> runEvaluation("//cat/*[objectName='LION']", context);//deep filter
>>
>> }
>>
>>
>> public static void runEvaluation(String expression,JXPathContext
>> context){
>> log.info("About to evaulate the expression: "+expression);
>> try {
>> Object value = context.getValue(expression);
>> //we got a single result.
>> if (value instanceof LazyDynaBean) {
>> LazyDynaBean r = (LazyDynaBean)context.getValue(expression);
>> log.info("Ran '" + expression + "' and got objectName='" +
>> r.get("objectName") + "'");
>>
>> }
>> //we got multiple results
>> else if (value instanceof ArrayList) {
>> String titles = "";
>> for (LazyDynaBean bean : ((ArrayList<LazyDynaBean>) value )){
>> titles += (bean.get("objectName")+",");
>> }
>> log.info("Ran " + expression + " and got "+((ArrayList)value).size()+"
>> results: "+titles);
>> }
>> //we got a non-dyna bean.
>> else {
>> log.info("Ran '" + expression + "' and got a class '" +
>> value.getClass().getName() + "' with toString() '" +value.toString() + "'");
>> }
>> } catch (Exception e) {
>> // TODO Auto-generated catch block
>> log.error("Failed to evaluate "+expression,e);
>> }
>> }
>> }
>>
>>
>>
>>
>> On Fri, Feb 27, 2009 at 3:56 AM, Matt Benson <gu...@yahoo.com>wrote:
>>
>>>
>>> Those paths work for me. Maybe something else is going awry?
>>>
>>> -Matt
>>>
>>> --- On Thu, 2/26/09, Andrew Hughes <ah...@gmail.com> wrote:
>>>
>>> > From: Andrew Hughes <ah...@gmail.com>
>>> > Subject: Re: JXPath over Generic Collection<?>, How?
>>> > To: "Commons Users List" <us...@commons.apache.org>
>>> > Date: Thursday, February 26, 2009, 12:53 AM
>>> > Many queries don't work, I
>>> > can't get any results for the following (code
>>> > taken from previous email)...
>>> >
>>> > runEvaluation("/root/animal/cat/tiger[last()]", context);
>>> > //absolute
>>> > & single
>>> >
>>> > runEvaluation("/root/animal/dog/*", context); //absolute
>>> > & multiple
>>> > runEvaluation("//dog",
>>> > context); //deep search
>>> > runEvaluation("//dog/*",
>>> > context);//deep multiple
>>> >
>>> > runEvaluation("//cat/*[objectName='LION']", context);//deep
>>> > filter
>>> >
>>> > These are the really interesting benefits on xpath that I
>>> > would dearly like
>>> > to have.
>>> >
>>> > A Huge Thanks once again for your reply Matt!!! :)
>>> >
>>> >
>>> >
>>> > On Thu, Feb 26, 2009 at 10:55 AM, Matt Benson <gu...@yahoo.com>
>>> > wrote:
>>> >
>>> > >
>>> > > How so? If you simply treat the name property as
>>> > an element rather than an
>>> > > attribute, you're done, no?
>>> > >
>>> > > -Matt
>>> > >
>>> > > --- On Wed, 2/25/09, Andrew Hughes <ah...@gmail.com>
>>> > wrote:
>>> > >
>>> > > > From: Andrew Hughes <ah...@gmail.com>
>>> > > > Subject: Re: JXPath over Generic
>>> > Collection<?>, How?
>>> > > > To: "Commons Users List" <us...@commons.apache.org>
>>> > > > Date: Wednesday, February 25, 2009, 6:22 PM
>>> > > > Indeed Matt, you are correct and I do
>>> > > > apologize... but I must say I find
>>> > > > your emailed explanation much better. Kudos &
>>> > Thanks!
>>> > > > I'll (finally) get a chance to work on this
>>> > tomorrow, but I
>>> > > > think I am still
>>> > > > stuck :'(
>>> > > >
>>> > > >
>>> > > > Cheers for everything so far!!!!
>>> > > >
>>> > > >
>>> > > > On Tue, Feb 24, 2009 at 1:43 PM, Matt Benson
>>> > <gu...@yahoo.com>
>>> > > > wrote:
>>> > > >
>>> > > > >
>>> > > > > I won't get to look at this again at least
>>> > before
>>> > > > tomorrow (9PM for me now
>>> > > > > and still have some late-night $work to look
>>> > at), but
>>> > > > I thought I would
>>> > > > > mention straight off that the @name feature
>>> > actually
>>> > > > IS mentioned in the
>>> > > > > userguide under the section about working
>>> > with
>>> > > > (java.util.)Maps. If you
>>> > > > > have a suggestion of where in the guide
>>> > would be
>>> > > > another good place to
>>> > > > > mention it as a caveat and/or even the
>>> > wording to use,
>>> > > > feel free to open a
>>> > > > > documentation issue in JIRA for it.
>>> > > > >
>>> > > > > TBC,
>>> > > > > Matt
>>> > > > >
>>> > > > > --- On Mon, 2/23/09, Andrew Hughes <ah...@gmail.com>
>>> > > > wrote:
>>> > > > >
>>> > > > > > From: Andrew Hughes <ah...@gmail.com>
>>> > > > > > Subject: Re: JXPath over Generic
>>> > > > Collection<?>, How?
>>> > > > > > To: "Commons Users List" <us...@commons.apache.org>
>>> > > > > > Date: Monday, February 23, 2009, 6:24
>>> > PM
>>> > > > > > Hi Matt,
>>> > > > > > Thanks HEAPS for you reply, I am really
>>> > really
>>> > > > really
>>> > > > > > grateful. I think that
>>> > > > > > I have progressed just a little with
>>> > this but
>>> > > > there are
>>> > > > > > still some BIG
>>> > > > > > shortfalls with this. I've attached
>>> > code that
>>> > > > should run
>>> > > > > > out the box and is
>>> > > > > > based on previous emails. If I can get
>>> > the
>>> > > > expressions
>>> > > > > > below to correctly
>>> > > > > > evaluate I would be heaps happy.
>>> > > > > >
>>> > > > > > Thanks heaps again, hopefully this will
>>> > work soon
>>> > > > enough.
>>> > > > > >
>>> > > > > > p.s. I can understand the 'name' vs
>>> > '@name',
>>> > > > perhaps the
>>> > > > > > userguide could
>>> > > > > > mention this is about all I can add.
>>> > > > > >
>>> > > > > >
>>> > > > > > code...
>>> > > > > >
>>> > > > > > package rnd;
>>> > > > > >
>>> > > > > > import java.util.ArrayList;
>>> > > > > >
>>> > > > > > import
>>> > > > org.apache.commons.beanutils.LazyDynaBean;
>>> > > > > > import
>>> > org.apache.commons.jxpath.JXPathContext;
>>> > > > > > import org.apache.log4j.Logger;
>>> > > > > >
>>> > > > > > public class Main {
>>> > > > > >
>>> > > > > > private static final Logger log =
>>> > > > > > Logger.getLogger(Main.class);
>>> > > > > >
>>> > > > > > public static void main(String[] args)
>>> > {
>>> > > > > > log.info("Starting...");
>>> > > > > > LazyDynaBean lazyDynaBean = new
>>> > LazyDynaBean();
>>> > > > //the
>>> > > > > > transparent root.
>>> > > > > > LazyDynaBean root = new
>>> > LazyDynaBean();
>>> > > > > > LazyDynaBean animal = new
>>> > LazyDynaBean();
>>> > > > > > LazyDynaBean dog = new LazyDynaBean();
>>> > > > > > LazyDynaBean cat = new LazyDynaBean();
>>> > > > > > LazyDynaBean boxer = new
>>> > LazyDynaBean();
>>> > > > > > LazyDynaBean labrador = new
>>> > LazyDynaBean();
>>> > > > > > LazyDynaBean tiger1 = new
>>> > LazyDynaBean();
>>> > > > > > LazyDynaBean tiger2 = new
>>> > LazyDynaBean();
>>> > > > > > LazyDynaBean tiger3 = new
>>> > LazyDynaBean();
>>> > > > > > LazyDynaBean lion = new
>>> > LazyDynaBean();
>>> > > > > > //set the @objectName property of each
>>> > bean, user
>>> > > > UPPER to
>>> > > > > > make them
>>> > > > > > distinct for examples.
>>> > > > > > root.set("objectName","ROOT");
>>> > > > > > animal.set("objectName","ANIMAL");
>>> > > > > > dog.set("objectName","DOG");
>>> > > > > > cat.set("objectName","CAT");
>>> > > > > > boxer.set("objectName","BOXER");
>>> > > > > > labrador.set("objectName","LABRADOR");
>>> > > > > > tiger1.set("objectName","TIGER-ONE");
>>> > > > > > tiger2.set("objectName","TIGER-TWO");
>>> > > > > >
>>> > tiger3.set("objectName","TIGER-THREE");
>>> > > > > > lion.set("objectName","LION");
>>> > > > > > //build the bean hierarchy.
>>> > > > > > lazyDynaBean.set("root",0, root);
>>> > > > > > root.set("animal",0, animal);
>>> > > > > > animal.set("dog",0,dog);
>>> > > > > > animal.set("cat",0,cat);
>>> > > > > > dog.set("labrador",0,labrador);
>>> > > > > > dog.set("boxer",0, boxer);
>>> > > > > > cat.set("tiger",0,tiger1);//duplicate
>>> > > > > > cat.set("tiger",1,tiger2);//duplicate
>>> > > > > > cat.set("tiger",2,tiger3);//duplicate
>>> > > > > > cat.set("lion",0,lion);
>>> > > > > >
>>> > > > JXPathContext context =
>>> > > > > >
>>> > JXPathContext.newContext(lazyDynaBean);
>>> > > > > >
>>> > > > > >
>>> > //these all
>>> > > > work
>>> > > > > >
>>> > > > > > runEvaluation("/root/animal/dog",
>>> > context);
>>> > > > //absolute &
>>> > > > > > single
>>> > > > > >
>>> > > > > >
>>> > runEvaluation("/root/animal/cat/tiger[2]",
>>> > > > context);
>>> > > > > > //absolute &
>>> > > > > > single
>>> > > > > >
>>> > > > > > runEvaluation("/root/animal/cat/tiger",
>>> > context);
>>> > > > //absolute
>>> > > > > > &
>>> > > > > > multiple
>>> > > > > >
>>> > > > //everything below fails
>>> > > > > >
>>> > > > > >
>>> > runEvaluation("/root/animal/cat/tiger[last()]",
>>> > > > context);
>>> > > > > > //absolute
>>> > > > > > & single
>>> > > > > >
>>> > > > > > runEvaluation("/root/animal/dog/*",
>>> > context);
>>> > > > //absolute
>>> > > > > > & multiple
>>> > > > > >
>>> > > > runEvaluation("//dog",
>>> > > > > > context); //deep search
>>> > > > > >
>>> > > > runEvaluation("//dog/*",
>>> > > > > > context);//deep multiple
>>> > > > > >
>>> > > > > >
>>> > runEvaluation("//cat/*[objectName='LION']",
>>> > > > context);//deep
>>> > > > > > filter
>>> > > > > >
>>> > > > > > }
>>> > > > > > public static void
>>> > runEvaluation(String
>>> > > > > > expression,JXPathContext context){
>>> > > > > > log.info("About to evaulate the
>>> > expression:
>>> > > > "+expression);
>>> > > > > >
>>> > try {
>>> > > > > > Object value =
>>> > context.getValue(expression);
>>> > > > > > //we got a single result.
>>> > > > > > if (value instanceof LazyDynaBean) {
>>> > > > > > LazyDynaBean r =
>>> > > > > >
>>> > (LazyDynaBean)context.getValue(expression);
>>> > > > > > log.info("Ran '" + expression + "' and
>>> > got
>>> > > > objectName='" +
>>> > > > > > r.get("objectName") + "'");
>>> > > > > > }
>>> > > > > > //we got multiple results
>>> > > > > > else if (value instanceof ArrayList) {
>>> > > > > > String titles = "";
>>> > > > > > for (LazyDynaBean bean :
>>> > > > ((ArrayList<LazyDynaBean>)
>>> > > > > > value )){
>>> > > > > > titles +=
>>> > (bean.get("objectName")+",");
>>> > > > > > }
>>> > > > > > log.info("Ran " + expression + " and
>>> > got
>>> > > > > > "+((ArrayList)value).size()+"
>>> > > > > > results: "+titles);
>>> > > > > > }
>>> > > > > > //we got a non-dyna bean.
>>> > > > > > else {
>>> > > > > > log.info("Ran '" + expression + "' and
>>> > got a
>>> > > > class '" +
>>> > > > > > value.getClass().getName() + "' with
>>> > toString()
>>> > > > '"
>>> > > > > > +value.toString() + "'");
>>> > > > > > }
>>> > > > > > } catch (Exception e) {
>>> > > > > > log.error(e);
>>> > > > > > }
>>> > > > > > }
>>> > > > > > }
>>> > > > > >
>>> > > > > >
>>> > > > > >
>>> > > > > >
>>> > > > > >
>>> > > > > > On Tue, Feb 24, 2009 at 8:58 AM, Matt
>>> > Benson
>>> > > > <gu...@yahoo.com>
>>> > > > > > wrote:
>>> > > > > >
>>> > > > > > >
>>> > > > > > > And the answer is:
>>> > > > > > >
>>> > > > > > > In JXPath, a decision was
>>> > made to
>>> > > > overload the
>>> > > > > > name attribute to refer to
>>> > > > > > > an "element"'s property name WRT
>>> > its
>>> > > > parent. The
>>> > > > > > reason this was done was
>>> > > > > > > to support query maps with
>>> > non-String keys
>>> > > > in
>>> > > > > > JXPath. This means that
>>> > > > > > > anytime you actually want to refer
>>> > to a
>>> > > > property whose
>>> > > > > > name literally is
>>> > > > > > > "name", you must treat it as a
>>> > child element
>>> > > > rather
>>> > > > > > than an attribute. So
>>> > > > > > > in your case you could either
>>> > change "name"
>>> > > > to "title"
>>> > > > > > and query
>>> > > > > > > [@title='foo'] or simply use
>>> > [name='foo'].
>>> > > > > > >
>>> > > > > > > Regards,
>>> > > > > > > Matt
>>> > > > > > >
>>> > > > > > > --- On Mon, 2/23/09, Matt Benson
>>> > <gu...@yahoo.com>
>>> > > > > > wrote:
>>> > > > > > >
>>> > > > > > > > From: Matt Benson <gu...@yahoo.com>
>>> > > > > > > > Subject: Re: JXPath over
>>> > Generic
>>> > > > > > Collection<?>, How?
>>> > > > > > > > To: "Commons Users List"
>>> > <us...@commons.apache.org>
>>> > > > > > > > Date: Monday, February 23,
>>> > 2009, 2:58
>>> > > > PM
>>> > > > > > > >
>>> > > > > > > > To follow up, the 'name'
>>> > attribute in
>>> > > > particular
>>> > > > > > is what
>>> > > > > > > > doesn't seem to be working
>>> > here (change
>>> > > > it to
>>> > > > > > e.g. 'game'
>>> > > > > > > > and it works fine)... if you
>>> > could file
>>> > > > a bug it
>>> > > > > > would help
>>> > > > > > > > me remember as I don't have
>>> > time to do
>>> > > > it myself
>>> > > > > > right this
>>> > > > > > > > minute.
>>> > > > > > > >
>>> > > > > > > > -Matt
>>> > > > > > > >
>>> > > > > > > > --- On Mon, 2/23/09, Matt
>>> > Benson <gu...@yahoo.com>
>>> > > > > > > > wrote:
>>> > > > > > > >
>>> > > > > > > > > From: Matt Benson <gu...@yahoo.com>
>>> > > > > > > > > Subject: Re: JXPath over
>>> > Generic
>>> > > > > > Collection<?>,
>>> > > > > > > > How?
>>> > > > > > > > > To: "Commons Users List"
>>> > <us...@commons.apache.org>
>>> > > > > > > > > Date: Monday, February
>>> > 23, 2009,
>>> > > > 12:27 PM
>>> > > > > > > > >
>>> > > > > > > > > Andrew,
>>> > > > > > > > > I've
>>> > been meaning
>>> > > > to look
>>> > > > > > into this but haven't
>>> > > > > > > > > yet. If you have
>>> > any
>>> > > > ready-to-run code
>>> > > > > > you can send
>>> > > > > > > > to
>>> > > > > > > > > the list, that wouldn't
>>> > hurt...
>>> > > > > > > > >
>>> > > > > > > > > -Matt
>>> > > > > > > > >
>>> > > > > > > > > --- On Mon, 2/23/09,
>>> > Andrew Hughes
>>> > > > <ah...@gmail.com>
>>> > > > > > > > > wrote:
>>> > > > > > > > >
>>> > > > > > > > > > From: Andrew Hughes
>>> > <ah...@gmail.com>
>>> > > > > > > > > > Subject: Re: JXPath
>>> > over
>>> > > > Generic
>>> > > > > > > > Collection<?>,
>>> > > > > > > > > How?
>>> > > > > > > > > > To: "Commons Users
>>> > List"
>>> > > > <us...@commons.apache.org>
>>> > > > > > > > > > Date: Monday,
>>> > February 23,
>>> > > > 2009, 5:42
>>> > > > > > AM
>>> > > > > > > > > > OK, email #19 to
>>> > the list.
>>> > > > I'm both
>>> > > > > > > > > > incredibly patient
>>> > and
>>> > > > skeptical that
>>> > > > > > > > > > this will ever
>>> > work. I might
>>> > > > try and
>>> > > > > > run this in
>>> > > > > > > > a
>>> > > > > > > > > debugger
>>> > > > > > > > > > and track down
>>> > > > > > > > > > "how" JXPath
>>> > traverses the
>>> > > > DynaBean....
>>> > > > > > but given
>>> > > > > > > > the
>>> > > > > > > > > > reflection
>>> > involved
>>> > > > > > > > > > that might be a
>>> > painful
>>> > > > task.
>>> > > > > > > > > > --AH
>>> > > > > > > > > >
>>> > > > > > > > > >
>>> > > > > > > > > > On Tue, Feb 17,
>>> > 2009 at 1:11
>>> > > > PM, Andrew
>>> > > > > > Hughes
>>> > > > > > > > <ah...@gmail.com>
>>> > > > > > > > > > wrote:
>>> > > > > > > > > >
>>> > > > > > > > > > > Ping... if
>>> > anyone can
>>> > > > help with
>>> > > > > > this JXPath
>>> > > > > > > > > &
>>> > > > > > > > > > DynaBeans problem
>>> > I'd be
>>> > > > > > > > > > > REALLY
>>> > THANKFUL :)
>>> > > > > > > > > > >
>>> > > > > > > > > > >
>>> > > > > > > > > > > On Fri, Feb
>>> > 13, 2009 at
>>> > > > 1:55 PM,
>>> > > > > > Andrew
>>> > > > > > > > Hughes
>>> > > > > > > > > <ah...@gmail.com>
>>> > > > > > > > > > wrote:
>>> > > > > > > > > > >
>>> > > > > > > > > > >> Howdy,
>>> > > > > > > > > > >> I've taken
>>> > Matt's
>>> > > > suggestion
>>> > > > > > onboard and
>>> > > > > > > > I
>>> > > > > > > > > have
>>> > > > > > > > > > investigated
>>> > DynaBeans.
>>> > > > > > > > > > >> These look
>>> > pretty
>>> > > > good for
>>> > > > > > all
>>> > > > > > > > intestive
>>> > > > > > > > > purposes
>>> > > > > > > > > > and there's a code
>>> > > > > > > > > > >> examples
>>> > below how
>>> > > > to build
>>> > > > > > the data
>>> > > > > > > > > structure:
>>> > > > > > > > > > >>
>>> > > > > > > > > > >> + root
>>> > > > [@name="ROOT"]
>>> > > > > > > > > > >>
>>> > > > +
>>> > > > > > animal [@name="ANIMAL"]
>>> > > > > > > > > > >>
>>> > > > > > + dog
>>> > > > > > > > > > [@name="DOG"]
>>> > > > > > > > > > >>
>>> > > > > > > > > > +
>>> > boxer
>>> > > > [@name="BOXER"]
>>> > > > > > > > > > >>
>>> > > > > > > > > > +
>>> > labrador
>>> > > > > > [@name="LABRADOR"]
>>> > > > > > > > > > >>
>>> > > > > > + cat
>>> > > > > > > > > > [@name="CAT"]
>>> > > > > > > > > > >>
>>> > > > > > > > > > +
>>> > tiger
>>> > > > > > [@name="TIGER-ONE"]
>>> > > > > > > > > > >>
>>> > > > > > > > > > +
>>> > tiger
>>> > > > > > [@name="TIGER-TWO"]
>>> > > > > > > > > > >>
>>> > > > > > > > > > +
>>> > tiger
>>> > > > > > [@name="TIGER-THREE"]
>>> > > > > > > > > > >>
>>> > > > > > > > > > +
>>> > lion
>>> > > > [@name="LION"]
>>> > > > > > > > > > >>
>>> > > > > > > > > > >>
>>> > > > > > > > > > >> And the
>>> > code looks
>>> > > > like...
>>> > > > > > > > > > >>
>>> > > > > > > > > > >>
>>> > LazyDynaBean
>>> > > > > > lazyDynaBean = new
>>> > > > > > > > > > LazyDynaBean();
>>> > //the
>>> > > > transpar
>>>
>> ...
>>
>> [Message clipped]
>
>
>