Matt, Thank You. Is there any other data structure I can use that would work with JXPath? My requirement is that... a "Thing" can have contain multiple child "Thing(s)" (and the children are allowed to be non-unique). This is equivalent to an XML element as it can contain multiple child elements, how do these guy's handle it I wonder?
--Andrew On Wed, Feb 11, 2009 at 9:09 AM, Matt Benson <gudnabr...@yahoo.com> wrote: > > I admit I hadn't looked at this with a highly critical eye, but this > business of Thing extending ArrayList<Thing> seems quite strange to me. > JXPath basically functions by "opening up" collections automatically, so > the very fact that Thing is itself a Collection implies that a Thing will be > opened up, and its children will be searched... but in this example, either > there are no children, at the leaves, or the children themselves are > (possibly empty) collections. It looks as though you're trying to represent > a tree structure. This may be a good example of a reason for the idea of > composition over inheritance. I don't think you're going to get any > traction using JXPath with this object model. > > Sorry for the bad news, > Matt > > > --- On Tue, 2/10/09, Andrew Hughes <ahhug...@gmail.com> wrote: > > > From: Andrew Hughes <ahhug...@gmail.com> > > Subject: Re: JXPath over Generic Collection<?>, How? > > To: "Commons Users List" <user@commons.apache.org> > > Date: Tuesday, February 10, 2009, 7:16 AM > > Still busted. Example is now simplified. As soon as a > > generic Collection > > becomes involved BOOM! > > > > The Main Method to exec: > > public class App { > > public static void main( String[] args ){ > > JXPathContext context = > > JXPathContext.newContext(new ThingRoot()); > > > > System.out.println(((Thing)context.getValue("/root")).getName()); > > } > > } > > > > The (populated) context root I am using, where root is a > > single object > > holding a List of Thing's. > > package jxpathresearch; > > > > import java.util.ArrayList; > > import java.util.List; > > > > public class ThingRoot { > > private List<Thing> root new ArrayList(); //this > > will serve as the root. > > public ThingRoot() { > > Thing animal = new Thing("Animal"); > > root.add(animal);//Animal > > Thing dog = new Thing("Dog"); > > animal.add(dog);//Animal.Dog > > dog.add(new > > Thing("Labrador"));//Animal.Dog.Labrador > > dog.add(new > > Thing("Boxer"));//Animal.Dog.Boxer > > } > > public List<Thing> getRoot() { return root; } > > } > > > > Finally here's a very simple 'Thing' that > > contains a List of Thing(s): > > public class Thing extends ArrayList<Thing> { > > public Thing(String name){this.name = name;} > > private String name = ""; > > public String getName() {return name;} > > } > > > > I can't query anything beyond /root, it doesn't > > seem to ever get traversed. > > I would expect results for //Thing and > > //thi...@name='Labrador'] etc but I > > get no results only exceptions. > > > > > > My brain is hurting. > > > > > > > > On Tue, Feb 10, 2009 at 12:22 AM, Andrew Hughes > > <ahhug...@gmail.com> wrote: > > > > > I've noew tested a whole heap of expressions even > > //name='Tiger' nothing > > > works. > > > > > > On Tue, Feb 10, 2009 at 12:01 AM, Andrew Hughes > > <ahhug...@gmail.com>wrote: > > > > > >> I got cracking on testing this out... no luck > > (yet). Here's my testing > > >> code if some kind person could please take a > > look.... > > >> First my generic collection hierarchy (which only > > contains a name and > > >> children)... > > >> > > >> package jxpathresearch; > > >> > > >> import java.util.ArrayList; > > >> > > >> public class HierarchyPojo extends > > ArrayList<HierarchyPojo> { > > >> > > >> public HierarchyPojo(String name){ > > >> this.setName(name); > > >> } > > >> private String name = ""; > > >> > > >> public String getName() { > > >> return name; > > >> } > > >> public void setName(String name) { > > >> this.name = name; > > >> } > > >> > > >> } > > >> > > >> > > >> Next, the wrapper for the root context (as Matt > > suggested) and populated > > >> with animals... > > >> > > >> package jxpathresearch; > > >> > > >> > > >> public class CollectionRoot { > > >> > > >> > > >> private HierarchyPojo hierarchyPojo; > > >> > > >> > > >> public CollectionRoot(){ > > >> > > >> //Animal > > >> > > >> hierarchyPojo = new > > HierarchyPojo("Animal"); > > >> > > >> //Animal.Dog > > >> > > >> HierarchyPojo dog = new > > HierarchyPojo("Dog"); > > >> > > >> //Animal.Dog.Labrador > > >> > > >> dog.add(new > > HierarchyPojo("Labrador")); > > >> > > >> //Animal.Dog.Boxer > > >> > > >> dog.add(new > > HierarchyPojo("Boxer")); > > >> > > >> //Animal.Dog.Mastiff > > >> > > >> dog.add(new > > HierarchyPojo("Mastiff")); > > >> > > >> //Animal.Cat > > >> > > >> HierarchyPojo cat = new > > HierarchyPojo("Cat"); > > >> > > >> //Animal.Cat.Tiger > > >> > > >> cat.add(new > > HierarchyPojo("Tiger")); > > >> > > >> //Animal.Cat.Cougar > > >> > > >> cat.add(new > > HierarchyPojo("Cougar")); > > >> > > >> //Animal.Cat.Leopard > > >> > > >> cat.add(new > > HierarchyPojo("Leopard")); > > >> > > >> //Add Animal.Dog & Animal.Cat > > >> > > >> hierarchyPojo.add(dog); > > >> > > >> hierarchyPojo.add(cat); > > >> > > >> } > > >> > > >> > > >> public HierarchyPojo getHierarchyPojo() > > {return hierarchyPojo;} > > >> > > >> > > >> public void setHierarchyPojo(HierarchyPojo > > hierarchyPojo) > > >> {this.hierarchyPojo = hierarchyPojo;} > > >> > > >> > > >> } > > >> > > >> > > >> Finally invoke and test... > > >> > > >> public class App > > >> > > >> { > > >> > > >> public static void main( String[] args ) > > >> > > >> { > > >> > > >> JXPathContext context = > > JXPathContext.newContext(new > > >> CollectionRoot()); > > >> > > >> String query = > > "//hierarchypo...@name='Tiger']"; > > >> > > >> String fName = > > context.getValue(query).toString(); > > >> > > >> System.out.println("Ran > > '"+query+"' and got > > '"+fName+"'"); > > >> > > >> } > > >> > > >> } > > >> > > >> > > >> > > >> Above, should find one entry for > > 'name=Tiger' but it does not, I get an > > >> exception. This still doesn't seem to traverse > > the Collection correctly. Any > > >> help would be most welcome. > > >> Exception in thread "main" > > >> org.apache.commons.jxpath.JXPathNotFoundException: > > No value for xpath: > > >> //hierarchypo...@name='Tiger'] > > >> > > >> Thanks for reading, > > >> Andrew > > >> > > >> > > >> > > >> On Mon, Feb 9, 2009 at 10:24 PM, Andrew Hughes > > <ahhug...@gmail.com>wrote: > > >> > > >>> Thanks Matt - I will test this out tomorrow > > when I am back in the > > >>> office... > > >>> > > >>> Being constructive... > > >>> Surely this should at least be a precondition > > check and throw a specific > > >>> exception if it's not supported? > > >>> Thank You > > >>> --Andrew > > >>> > > >>> > > >>> On Mon, Feb 9, 2009 at 2:27 PM, Matt Benson > > <gudnabr...@yahoo.com>wrote: > > >>> > > >>>> > > >>>> Most likely your problem is not with > > generics, but simply with the fact > > >>>> that JXPath has a hard time using a > > collection as its root. The easiest > > >>>> workaround is to use some parent object to > > hold a reference to your > > >>>> container. > > >>>> > > >>>> HTH, > > >>>> Matt > > >>>> > > >>>> > > >>>> --- On Sun, 2/8/09, Andrew Hughes > > <ahhug...@gmail.com> wrote: > > >>>> > > >>>> > From: Andrew Hughes > > <ahhug...@gmail.com> > > >>>> > Subject: JXPath over Generic > > Collection<?>, How? > > >>>> > To: "Commons Users List" > > <user@commons.apache.org> > > >>>> > Date: Sunday, February 8, 2009, 5:09 > > PM > > >>>> > Hi All, > > >>>> > Hopefully the solution is as easy as > > the question. I would > > >>>> > like to perform > > >>>> > evaluation on a (very simple) generic > > collection... as you > > >>>> > can see below > > >>>> > (HeirarchyPojo). I should be able to > > ask for a > > >>>> > HeirarchyPojo's with > > >>>> > name='Bill' or the 3rd > > Child... The problem is that > > >>>> > nothing ever evaluate on > > >>>> > this data structure. What's the > > deal with Generic > > >>>> > Collections and JXPath? > > >>>> > > > >>>> > p.s this is not in the userguide and > > would be a most > > >>>> > welcomed addition (if > > >>>> > we can nut this out with your help). > > >>>> > > > >>>> > Cheers. > > >>>> > > > >>>> > > > >>>> > package xpath.and.generics; > > >>>> > > > >>>> > import java.util.ArrayList; > > >>>> > > > >>>> > public class HeirarchyPojo extends > > >>>> > ArrayList<HeirarchyPojo>{ > > >>>> > > > >>>> > public HeirarchyPojo(){} > > >>>> > > > >>>> > private String id; > > >>>> > private String name; > > >>>> > > > >>>> > public String getId() { > > >>>> > return id; > > >>>> > } > > >>>> > > > >>>> > public void setId(String id) { > > >>>> > this.id = id; > > >>>> > } > > >>>> > > > >>>> > public String getName() { > > >>>> > return name; > > >>>> > } > > >>>> > > > >>>> > public void setName(String name) > > { > > >>>> > this.name = name; > > >>>> > } > > >>>> > > > >>>> > } > > >>>> > > >>>> > > >>>> > > >>>> > > >>>> > > --------------------------------------------------------------------- > > >>>> To unsubscribe, e-mail: > > user-unsubscr...@commons.apache.org > > >>>> For additional commands, e-mail: > > user-h...@commons.apache.org > > >>>> > > >>>> > > >>> > > >> > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > >