Yeah, that makes sense. The part that was confusing me is that if I have...
public class Thing { private List<Thing> children; } I was assuming I would need to prefix all of my expressions "steps" with '/children'. From what you said earlier this is not the case as collections are "auto traversed/loaded". Thanks again matt! I won't get to test this out til later tonight be look foward to seeing it working!!! Andrew On Wed, Feb 11, 2009 at 2:57 PM, Matt Benson <gudnabr...@yahoo.com> wrote: > > It should be as simple as Thing _containing_ a List<Thing> rather than > _being_ a List<Thing>. Composition over inheritance, do you see? > > HTH, > 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>, gudnabr...@yahoo.com > > Date: Tuesday, February 10, 2009, 7:06 PM > > 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 > > > > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > >