Hi,
1. The question I ask myself is: is there really a point to being able to specify what events we want to listen to? I mean,one will only treat events he wants to in the listener's notify() method, right?
-> that would solve your 1st problem the easy way ;) If you wish to keep that possibility, there's probably no easy way to make it useful and not too verbose. An idea might be to create some groups of events, for example NODE_TOKEN_EVENTS, or CREATION_EVENTS, etc. but I guess it might lead to a lot of different combinations, making it a little overkill. And I think that using the mask as in your first example should be avoided.
2. Regarding the class name issue, I don't think it's as complex as a node. If you look at how to register a listener via Engine#addExecutionListener(), you need to pass a class, and then a call to newInstance() is performed on that class; you could do the same from the definition file using Class.forName(String).newInstance() - there's no need to load custom tags etc.
Now for the portability issue, I guess what you mean is that by requiring a fully qualified name, the xml file wouldn't work with, say, the Haskell version of Sarasvati (right?).
In that case, the simplest thing to do is probably to do like this:
<listener type="MyListener">
<blah blah blah>
</listener>
<listener-type name="MyListener">
<java classname="com.mybusiness.listeners.MyListener"/>
</listener-type>
and then have each language-flavoured version of Sarasvati load its own <linstener-type> sub-tag only, i.e. the Java engine would look for a <java> tag, the Haskell for a <haskell>, etc. and they return an error if they don't find what they want. That way, you could use the same xml file with any version I guess.
Cheers,
Vincent