Hi Jeff,
On Mon, 2006-06-12 at 08:04 -0700, Jeff Marendo wrote:
> Hello,
>
> Would anyone be able to tell me how to structure an XML rules file so that
> the Digester can create objects (from the example file below) and store them
> into a Map as opposed to a Collection?
>
> <?xml version="1.0" encoding="UTF-8"?>
> <user>
> <id>doej01</id>
> <demographic-info>
> <firstName>John</firstName>
> <lastName>Doe</lastName>
> </demographic-info>
[snip]
>
> I want to store the User instance in a Map and use the value in the "id"
> element as the key.
I assume you've really got something like:
<users>
<user>
<id>...</id>
...
</user>
<user>
<id>...</id>
...
</user>
</users>
If user is the root level, then you've not got a lot of object in the
map :-)
This won't be trivial to do, because the key to use is embedded within
the user element. Remember that Digester is just a simple layer over
SAX, so it doesn't "look ahead" or "look behind"; data must be processed
when it is encountered.
The best solution would be to simply *not* use a map. If you instead
declare:
public class Users {
private Map<User> userMap = new HashMap<User>();
public void addUser(User u) {
userMap.put(u.getId(), u);
}
...
}
then the solution is pretty obvious from there.
If you are determined to use a primitive Map, then I think that you'll
need to write a custom Rule class that knows how to add a User to a Map
(ie implements the operation in the addUser method above). The rule's
end method should assume that the top of stack contains a User, the
second-to-top contains the target Map, and do the appropriate put call.
Writing a custom Rule is really pretty easy and quite "normal";
Digester's built-in rules are really just a starting point.
Unfortunately, invoking a custom rule when using the xmlrules module
isn't easy. It's been a long time since I did it, so I can't even
remember how it is done...
It *might* be possible to get this working with just a CallMethodRule as
documented in the FAQ on the wiki. However having the pattern for call
parameters match stuff at a different level from the element the call
occurs on can have unexpected interactions with other CallMethodRule
rules; it's better avoided.
http://wiki.apache.org/jakarta-commons/Digester/FAQ
Regards,
Simon
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]