commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Frank W. Zammetti" <fzli...@omnytex.com>
Subject Re: [Digester] How to change when rules fire
Date Fri, 16 Sep 2005 03:25:19 GMT
I thought I'd post to let anyone readint his know that I did find a 
solution, although it's not truly a Digester-based solution (in a way), 
and not nearly as elegant as I was hoping for... but it *does* have one 
important virtue: IT WORKS!!

My rules now look like this:

   digester.addCallMethod("dependencies/dependency/initList/listItem",
     "addInitListTemp", 1);
   digester.addCallParam("dependencies/dependency/initList/listItem", 0,
     "value");
   digester.addCallMethod("dependencies/dependency/initList",
     "addInitList", 2);
   digester.addCallParam("dependencies/dependency/initList", 0,
     "method");
   digester.addCallParam("dependencies/dependency/initList", 1,
     "name");

The addInitListTemp() method now adds the <listItem> elements to a 
temporary array.  Then, when the rule for the <initList> element fires 
(at the end), which is after the temporary array has been all built up, 
I can then take that array and do what needs to be done with it, and 
reset the temporary array to empty so another group can be dealt with if 
need be.

Like I said, not very elegant in my book, but effective.  I'd still love 
to hear if anyone has a more "proper" way of accomplishing this, if for 
nothing else than a learning experience now, but I am all set at the 
moment.  Thanks!

Frank

Frank W. Zammetti wrote:
> Hi everyone,
> 
> I have a situation where I need to parse some XML that looks like this:
> 
>   <dependencies>
>     <dependency>
>       <initList name="children" method="addChild">
>         <listItem value="Andrew" />
>         <listItem value="Michael" />
>       </initList>
>     </dependency>
>   </dependencies>
> 
> What I want to have happen is that for each <listItem> element 
> encountered, I want to call this method of the top object on the stack:
> 
>   public void addInitList(String inMethod, String inName,
>     String inValue);
> 
> ...where the inMethod and inName parameters get their value from the 
> parent <initList> element.  Here's what I've done:
> 
>   digester.addCallMethod("dependencies/dependency/initList",
>     "addInitList", 3);
>   digester.addCallParam("dependencies/dependency/initList", 0,
>     "method");
>   digester.addCallParam("dependencies/dependency/initList", 1,
>     "name");
>   digester.addCallParam("dependencies/dependency/initList/listItem", 2,
>     "value");
> 
> Now, this works, sort of... what actually happens is only the last 
> <listItem> encountered triggers the call to addInitList().  And I'm not 
> sure I see how to do otherwise,
> 
> One thought I had was to call a method when <initList> is encountered 
> that would save the name and method attributes, then just write a 
> separate rule for <listItem> to call a method that knows how to get 
> those temporary values.  That would work I think, but the problem is 
> that CallMethodRule only seems capable of firing at end(), and I would 
> need it to fire at begin() in this case.  I didn't see one, but is there 
> a way to tell a rule to fire at a different event trigger like this?  I 
> suppose a custom rule would be one answer, but is there another way?
> 
> Assuming not though, can anyone give me some pointers as to how to 
> modify the rules as written above to do what I need?  I'll keep at it, 
> but so far I haven't figured it out.  Thanks all!
> 

-- 
Frank W. Zammetti
Founder and Chief Software Architect
Omnytex Technologies
http://www.omnytex.com


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


Mime
View raw message