commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Benson <gudnabr...@yahoo.com>
Subject Re: JXPath over Generic Collection<?>, How?
Date Wed, 04 Mar 2009 13:57:26 GMT

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


Mime
View raw message