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 Tue, 03 Mar 2009 23:08:02 GMT
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]

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