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 10:19:46 GMT
Still No Luck, I have removed recursive generic collections and have tried
the following code... this is becoming a marathon effort :'(

public class Thing {

    public Thing(String name) {
        this.name = name;
    }
    private String name = "";

    public String getName() {
        return name;
    }
    private ArrayList<Thing> children = new ArrayList<Thing>();

    public ArrayList<Thing> getChildren() {
        return children;
    }

}


    public static void main(String[] args) {
        //get some same data
        Thing animal = new Thing("Animal");
        //Animal.Dog.*
        Thing dog = new Thing("Dog");
        dog.getChildren().add(new Thing("Labrador"));
        dog.getChildren().add(new Thing("Boxer"));
        animal.getChildren().add(dog);
        //Animal.Cat.*
        Thing cat = new Thing("Cat");
        cat.getChildren().add(new Thing("Lion"));
        cat.getChildren().add(new Thing("Tiger"));
        animal.getChildren().add(cat);

        //run a query on it
        JXPathContext context = JXPathContext.newContext(animal);
        String query = "/Animal";
        Thing result = (Thing) context.getValue(query);
        String path = context.getPointer(query).asPath();
        System.out.println("Ran '" + query + "' and got '" +
result.getName() + "' on path '" + path + "'.");
    }




On Wed, Feb 11, 2009 at 3:08 PM, Andrew Hughes <ahhughes@gmail.com> wrote:

> 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