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 <[email protected]> wrote:

> From: Andrew Hughes <[email protected]>
> Subject: Re: JXPath over Generic Collection<?>, How?
> To: "Commons Users List" <[email protected]>
> 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
> <[email protected]> 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
> <[email protected]>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
> <[email protected]>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
> <[email protected]>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
> <[email protected]> wrote:
> >>>>
> >>>> > From: Andrew Hughes
> <[email protected]>
> >>>> > Subject: JXPath over Generic
> Collection<?>, How?
> >>>> > To: "Commons Users List"
> <[email protected]>
> >>>> > 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:
> [email protected]
> >>>> For additional commands, e-mail:
> [email protected]
> >>>>
> >>>>
> >>>
> >>
> >


      

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to