On Thu, Jan 13, 2011 at 12:39 PM, KARR, DAVID (ATTSI) <dk0...@att.com> wrote:
>> -----Original Message-----
>> From: Rahul Akolkar
>> Sent: Monday, December 20, 2010 10:18 PM
>> To: Commons Users List
>> Subject: Re: [digester] Need help with simple digester usage
>>
>> On Mon, Dec 20, 2010 at 11:08 PM, KARR, DAVID (ATTSI) <dk0...@att.com>
>> wrote:
>> >> -----Original Message-----
>> >> From: KARR, DAVID (ATTSI)
>> >> Sent: Monday, December 20, 2010 7:54 PM
>> >> To: user@commons.apache.org
>> >> Subject: [digester] Need help with simple digester usage
>> >>
>> >> I'm trying to use Digester for a simple application.  I want to
>> define
>> >> the structure of a binary tree in XML, and then construct that node
>> >> tree
>> >> using Digester.
>> >>
>> >> The trivial "Node" class is just this:
>> >> --------------------
>> >>     public static class Node {
>> >>         private Node left;
>> >>         private Node right;
>> >>         private String value;
>> >>
>> >>         public Node getLeft() { return left; }
>> >>         public Node getRight() { return right; }
>> >>         public String getValue() { return value; }
>> >>
>> >>         public void setLeft(Node left) { this.left = left; }
>> >>         public void setRight(Node right) { this.right = right; }
>> >>         public void setValue(String value) { this.value = value; }
>> >>     }
>> >> ------------
>> >>
>> >> The XML is composed of nested "node" elements.  The first "node"
>> child
>> >> gets set as the "left" property of the root, and the second gets set
>> > as
>> >> the "right" property.
>> >>
>> >> For instance:
>> >>
>> >>   <node value="abc">
>> >>     <node value="def"/>
>> >>   </node>
>> >>
>> >> Should result in a root Node with a "left" property referring to the
>> >> second node.
>> >>
>> >> So, going through the Digester documentation, which I haven't looked
>> > at
>> >> in many years, I figured it would be something like this:
>> >>
>> >>         digester.addRule("*/node", new
>> >> ObjectCreateRule(AugmentedNode.class));
>> >>         digester.addRule("*/node", new SetPropertiesRule());
>> >>         digester.addRule("*/node", new SetNextRule("addChild",
>> >> AugmentedNode.class.getName()));
>> >>
>> >> Where "AugmentedNode" extends "Node", adding:
>> >>
>> >>        public void addChild(Node node) {
>> >>             if (getLeft() == null)
>> >>                 setLeft(node);
>> >>             else
>> >>                 setRight(node);
>> >>         }
>> >>
>> >> For those well steeped in Digester lore, I imagine you can
>> immediately
>> >> tell this won't work.  You're right, of course.  This dies with an
>> NPE
>> >> in "MethodUtils.invokeMethod()" (object is null).  I have no clue
>> >> what's
>> >> wrong with this, or what I should be doing instead.
>> >
>> > Oh, ok.  I figured out one thing.  I have to push an AugmentedNode on
>> > the stack before I start parsing, and then I take the result as the
>> > "left" property of that top node.  Is that all I should have figured
>> > out?  Is there a better way to do this in the first place?
>> >
>> <snip/>
>>
>> Add this as the first rule, then the parse method will get you the
>> actual (root) node:
>>
>>   digester.addRule("node", new ObjectCreateRule(AugmentedNode.class));
>>
>> This calls out the root as different from other nodes -- the root
>> doesn't need a SetNextRule (thats the one causing the NPE since it has
>> no parent).
>
> I'm still not quite sure how to transform my existing code so I can use the 
> top node, not the "left" of the top node.
>
> My existing code is this:
>
>        digester.push(new AugmentedNode());
>
>        digester.addRule("*/node", new ObjectCreateRule(AugmentedNode.class));
>        digester.addRule("*/node", new SetPropertiesRule());
>        digester.addRule("*/node", new SetNextRule("addChild", 
> AugmentedNode.class.getName()));
>
>        return ((Node) digester.parse(new StringReader(xml))).getLeft();
>
> I've tried several variations with adding that line you suggest, but I can't 
> get it to work, and I'm not sure exactly what it's trying to accomplish.
>
<snip/>

Try this, per previous email:

    digester.addRule("node", new ObjectCreateRule(AugmentedNode.class));
    // above line is better match for root (not using push)
    digester.addRule("*/node", new ObjectCreateRule(AugmentedNode.class));
    digester.addRule("*/node", new SetPropertiesRule());
    digester.addRule("*/node", new SetNextRule("addChild",
AugmentedNode.class.getName()));
    return ((Node) digester.parse(new StringReader(xml)));
    // above line is without getLeft()

-Rahul

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

Reply via email to