For me: context.selectNodes("/root/animal/dog/*[name]")
selects [LazyDynaBean {name=(BOXER)}, LazyDynaBean {name=(LABRADOR)}] --- On Wed, 3/11/09, Andrew Hughes <ahhug...@gmail.com> wrote: > From: Andrew Hughes <ahhug...@gmail.com> > Subject: Re: JXPath over Generic Collection<?>, How? > To: "Commons Users List" <user@commons.apache.org> > Date: Wednesday, March 11, 2009, 1:12 AM > A whirl and a win! > I'm very close to a complete solution here (with loads of > assistance from > Matt, THANK YOU) based on Dyna Beans however there is one > remaining problem > (since we have duplicate elements). > > According to: <http://www.w3.org/TR/xpath#path-abbrev> > http://www.w3.org/TR/xpath#path-abbrev > > "* selects all element children of the context node" > > > > Expression: '/root/animal/dog/*' should return all dog's, > instead it returns > the first() dog (BOXER) only. I am unsure if this in an > unrealistic > requirement of JXPath and also where should I look to > possibly 'fix' this if > it indeed would compliment the current features? > > > Thanks HEAPS! > > > > > On Thu, Mar 5, 2009 at 3:05 AM, Matt Benson <gudnabr...@yahoo.com> > wrote: > > > > > Apparently the reason I was so ready to agree this was > a bug that should be > > fixed is that I already fixed it as > > http://issues.apache.org/jira/browse/JXPATH-128 . > So since you're already > > experienced with building JXPath now you should be > able to build from svn > > trunk and give that a whirl. > > > > -Matt > > > > --- On Wed, 3/4/09, Matt Benson <gudnabr...@yahoo.com> > wrote: > > > > > From: Matt Benson <gudnabr...@yahoo.com> > > > Subject: Re: JXPath over Generic > Collection<?>, How? > > > To: "Commons Users List" <user@commons.apache.org> > > > Date: Wednesday, March 4, 2009, 7:57 AM > > > > > > Hi Andrew, > > > I agree that going through the > list of properties > > > should avoid the explicit "class" check problem > (I think > > > this is because you are using LazyDynaBeans > instead of > > > "regular" DynaBeans). As for returning all > matches vs. > > > the first match, rather than selectValue(...) you > need to > > > selectNodes(...), or iterate(...). There > are other > > > useful methods, e.g. those dealing with pointers, > also > > > available on JXPathContext. > > > > > > So as for your bug, yes it can/should be fixed, > but you > > > might also consider whether you can use non-lazy > DynaBeans > > > instead. > > > > > > Regards, > > > Matt > > > > > > --- On Tue, 3/3/09, Andrew Hughes <ahhug...@gmail.com> > > > wrote: > > > > > > > From: Andrew Hughes <ahhug...@gmail.com> > > > > Subject: Re: JXPath over Generic > Collection<?>, > > > How? > > > > To: "Commons Users List" <user@commons.apache.org> > > > > Date: Tuesday, March 3, 2009, 5:37 PM > > > > 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 <ahhug...@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 > > > <ahhug...@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 > > > > <gudnabr...@yahoo.com>wrote: > > > > >> > > > > >>> > > > > >>> Those paths work for me. > Maybe > > > something > > > > else is going awry? > > > > >>> > > > > >>> -Matt > > > > >>> > > > > >>> --- On Thu, 2/26/09, Andrew > Hughes <ahhug...@gmail.com> > > > > wrote: > > > > >>> > > > > >>> > From: Andrew Hughes <ahhug...@gmail.com> > > > > >>> > Subject: Re: JXPath over > Generic > > > > Collection<?>, How? > > > > >>> > To: "Commons Users List" > <user@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 <gudnabr...@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 > > > > <ahhug...@gmail.com> > > > > >>> > wrote: > > > > >>> > > > > > > >>> > > > From: Andrew > Hughes <ahhug...@gmail.com> > > > > >>> > > > Subject: Re: > JXPath over > > > > Generic > > > > >>> > Collection<?>, How? > > > > >>> > > > To: "Commons > Users List" > > > <user@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 > > > > >>> > <gudnabr...@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 <ahhug...@gmail.com> > > > > >>> > > > wrote: > > > > >>> > > > > > > > > >>> > > > > > From: > Andrew > > > Hughes > > > > <ahhug...@gmail.com> > > > > >>> > > > > > > Subject: Re: > > > JXPath > > > > over Generic > > > > >>> > > > > Collection<?>, How? > > > > >>> > > > > > To: > "Commons > > > Users > > > > List" <user@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 > > > > >>> > > > <gudnabr...@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 > > > > >>> > <gudnabr...@yahoo.com> > > > > >>> > > > > > > wrote: > > > > >>> > > > > > > > > > > >>> > > > > > > > > From: > > > Matt > > > > Benson <gudnabr...@yahoo.com> > > > > >>> > > > > > > > > > > > Subject: > > > > Re: JXPath over > > > > >>> > Generic > > > > >>> > > > > > > > > Collection<?>, > > > > How? > > > > >>> > > > > > > > > To: > > > > "Commons Users List" > > > > >>> > <user@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 <gudnabr...@yahoo.com> > > > > >>> > > > > > > > > > > > wrote: > > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > > > > From: > > > > Matt Benson <gudnabr...@yahoo.com> > > > > >>> > > > > > > > > > > > > > Subject: Re: JXPath over > > > > >>> > Generic > > > > >>> > > > > > > > > Collection<?>, > > > > >>> > > > > > > > > How? > > > > >>> > > > > > > > > > > > > To: > > > > "Commons Users List" > > > > >>> > <user@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 > > > > >>> > > > <ahhug...@gmail.com> > > > > >>> > > > > > > > > > > > > > wrote: > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > From: Andrew Hughes > > > > >>> > <ahhug...@gmail.com> > > > > >>> > > > > > > > > > > > > > > > > > Subject: Re: JXPath > > > > >>> > over > > > > >>> > > > Generic > > > > >>> > > > > > > > > > > > > Collection<?>, > > > > >>> > > > > > > > > > > > > How? > > > > >>> > > > > > > > > > > > > > > > > > To: "Commons Users > > > > >>> > List" > > > > >>> > > > <user@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 > > > > >>> > > > > > > > > <ahhug...@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 > > > > >>> > > > > > > > > > > > > <ahhug...@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] > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > > > For additional commands, e-mail: user-h...@commons.apache.org > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > > For additional commands, e-mail: user-h...@commons.apache.org > > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org