commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrew Hughes <ahhug...@gmail.com>
Subject Re: JXPath over Generic Collection<?>, How?
Date Wed, 11 Mar 2009 23:13:22 GMT
GOLD, absolute GOLD!!!!!! Thanks mate. I'm very happy with this now and I've
got a HUGE thank you for helping me out through all this... do you think the
patch for DynaBean's could be released? Is it possible to release v1.3.1
with the bug fix in it?

On Thu, Mar 12, 2009 at 12:48 AM, Matt Benson <gudnabrsam@yahoo.com> wrote:

>
> For me:
>
> context.selectNodes("/root/animal/dog/*[name]")
>
> selects
>
> [LazyDynaBean {name=(BOXER)}, LazyDynaBean {name=(LABRADOR)}]
>
> --- On Wed, 3/11/09, Andrew Hughes <ahhughes@gmail.com> wrote:
>
> > From: Andrew Hughes <ahhughes@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 <gudnabrsam@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 <gudnabrsam@yahoo.com>
> > wrote:
> > >
> > > > From: Matt Benson <gudnabrsam@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 <ahhughes@gmail.com>
> > > > wrote:
> > > >
> > > > > From: Andrew Hughes <ahhughes@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 <ahhughes@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
> > > > <ahhughes@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
> > > > > <gudnabrsam@yahoo.com>wrote:
> > > > > >>
> > > > > >>>
> > > > > >>> Those paths work for me.
> > Maybe
> > > > something
> > > > > else is going awry?
> > > > > >>>
> > > > > >>> -Matt
> > > > > >>>
> > > > > >>> --- On Thu, 2/26/09, Andrew
> > Hughes <ahhughes@gmail.com>
> > > > > wrote:
> > > > > >>>
> > > > > >>> > From: Andrew Hughes <ahhughes@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 <gudnabrsam@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
> > > > > <ahhughes@gmail.com>
> > > > > >>> > wrote:
> > > > > >>> > >
> > > > > >>> > > > From: Andrew
> > Hughes <ahhughes@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
> > > > > >>> > <gudnabrsam@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 <ahhughes@gmail.com>
> > > > > >>> > > > wrote:
> > > > > >>> > > > >
> > > > > >>> > > > > > From:
> > Andrew
> > > > Hughes
> > > > > <ahhughes@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
> > > > > >>> > > > <gudnabrsam@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
> > > > > >>> > <gudnabrsam@yahoo.com>
> > > > > >>> > > > > >
> > wrote:
> > > > > >>> > > > > > >
> > > > > >>> > > > > > >
> > > From:
> > > > Matt
> > > > > Benson <gudnabrsam@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 <gudnabrsam@yahoo.com>
> > > > > >>> > > > > > >
> > >
> > > > wrote:
> > > > > >>> > > > > > >
> > >
> > > > > >>> > > > > > >
> > > >
> > > > From:
> > > > > Matt Benson <gudnabrsam@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
> > > > > >>> > > > <ahhughes@gmail.com>
> > > > > >>> > > > > > >
> > > >
> > > > > wrote:
> > > > > >>> > > > > > >
> > > >
> > > > > >>> > > > > > >
> > > >
> > > > >
> > > > > From: Andrew Hughes
> > > > > >>> > <ahhughes@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
> > > > > >>> > > > > > >
> > > <ahhughes@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
> > > > > >>> > > > > > >
> > > >
> > > > <ahhughes@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-unsubscribe@commons.apache.org
> > > > For additional commands, e-mail: user-help@commons.apache.org
> > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> > > For additional commands, e-mail: user-help@commons.apache.org
> > >
> > >
> >
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message