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 Wed, 11 Feb 2009 04:38:30 GMT
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 <gudnabrsam@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 <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>, gudnabrsam@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
> > <gudnabrsam@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
> > <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, 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
> > > > //Thing[@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
> > > > <ahhughes@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
> > > > <ahhughes@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 =
> > > >
> > "//hierarchyPojo[@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:
> > > > >> //hierarchyPojo[@name='Tiger']
> > > > >>
> > > > >> Thanks for reading,
> > > > >> Andrew
> > > > >>
> > > > >>
> > > > >>
> > > > >> On Mon, Feb 9, 2009 at 10:24 PM, Andrew
> > Hughes
> > > > <ahhughes@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
> > > > <gudnabrsam@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
> > > > <ahhughes@gmail.com> wrote:
> > > > >>>>
> > > > >>>> > From: Andrew Hughes
> > > > <ahhughes@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-unsubscribe@commons.apache.org
> > > > >>>> For additional commands, e-mail:
> > > > user-help@commons.apache.org
> > > > >>>>
> > > > >>>>
> > > > >>>
> > > > >>
> > > > >
> > >
> > >
> > >
> > >
> > >
> > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail:
> > user-unsubscribe@commons.apache.org
> > > For additional commands, e-mail:
> > user-help@commons.apache.org
> > >
> > >
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>
>

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