You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Simon Kitching <sk...@apache.org> on 2005/04/13 17:00:04 UTC
Re: [Digester] How to apply rules on XML tags (SAX events) based
on previously encountered tags?
On Wed, 2005-04-13 at 09:41 -0400, Soaring Eagle wrote:
> Hello,
>
> I am using Digester to create a rules engine for an application. This
> rules engine should be capable of determining what should be done for
> certain type of financial securities based on their type and the
> business event that has occured. Such rules are maintained in XML. How
> do I apply digester rules based on nested criteria in this case?
>
> For example, in the XML below, I would like to instantiate the class
> com.services.EmailAction only if the type of security is "MEGA" and
> the action is "Publish". How do i do that?
>
> --
> Thanks in advance!
> Eagle
>
> <Services>
> <Security type="DUSARM">
> <Event type="Preview">
> <Action>
> <ClassName>
> com.services.EmailAction
> </ClassName>
> <ClassName>
> com.services.EmailAction
> </ClassName>
> </Action>
> </Event>
> </Security>
> <Security type="MEGA">
> <Event type="Preview">
> <Action>
> <ClassName>
> com.services.EmailAction
> </ClassName>
> <ClassName>
> com.services.EmailAction
> </ClassName>
> </Action>
> </Event>
> </Security>
> </Services>
I think you could use the FactoryCreateRule to achieve this (instead of
using ObjectCreateRule).
MyActionFactory myActionFactory = new MyActionFactory();
digester.addFactoryCreate(
"Services/Security/Event/Action/ClassName",
myActionFactory);
where
class MyActionFactory extends ObjectCreationFactory {
public Object createObject(Attributes attributes)
throws Exception {
Digester d = getDigester();
// here you can inspect the xml attributes on the ClassName tag,
// and inspect any of the objects on the Digester stack in order
// to determine what kind of object to instantiate and return.
// Presumably there will be objects representing the current
// Security and Event on the digester stack so their "type"
// is accessable.
//
// If you don't want to create *any* object, I don't know whether
// you can get away with returning null, or will have to return
// some kind of NoAction dummy object.
}
}
Is this what you wanted to achieve?
Regards,
Simon
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org
Re: [Digester] How to apply rules on XML tags (SAX events) based on previously encountered tags?
Posted by Soaring Eagle <co...@gmail.com>.
Thank you for the responses. It looks like the responses indicate a
different way of doing what I am doing right now - though both the
responses help me understand the issue better.
This is how I am achieving the desired effect right now:
I am extending the Rule abstract class and in the begin event for
Security and Event tags, I check for required conditions. If
conditions match, I add a boolean true object on a named object stack
(named as "SecurityEventMatch"). I have another Rule object that looks
for the body of a "ClassName" tag and then instantiates the class in
the ClassName tag only of all objects on the SecurityEventMatch stack
are true. In this process, I remove all objects from the
SecurityEventMatch stack.
The above approach works fine, but is highly dependent on the xml
contents (i.e. this is not generic), is dependent on the names I use
in code.
I am thinking that this may be a usual problem for many developers and
am hoping to find a design pattern that will help here.
--Eagle.
On 4/13/05, Simon Kitching <sk...@apache.org> wrote:
> On Wed, 2005-04-13 at 09:41 -0400, Soaring Eagle wrote:
> > Hello,
> >
> > I am using Digester to create a rules engine for an application. This
> > rules engine should be capable of determining what should be done for
> > certain type of financial securities based on their type and the
> > business event that has occured. Such rules are maintained in XML. How
> > do I apply digester rules based on nested criteria in this case?
> >
> > For example, in the XML below, I would like to instantiate the class
> > com.services.EmailAction only if the type of security is "MEGA" and
> > the action is "Publish". How do i do that?
> >
> > --
> > Thanks in advance!
> > Eagle
> >
> > <Services>
> > <Security type="DUSARM">
> > <Event type="Preview">
> > <Action>
> > <ClassName>
> > com.services.EmailAction
> > </ClassName>
> > <ClassName>
> > com.services.EmailAction
> > </ClassName>
> > </Action>
> > </Event>
> > </Security>
> > <Security type="MEGA">
> > <Event type="Preview">
> > <Action>
> > <ClassName>
> > com.services.EmailAction
> > </ClassName>
> > <ClassName>
> > com.services.EmailAction
> > </ClassName>
> > </Action>
> > </Event>
> > </Security>
> > </Services>
>
> I think you could use the FactoryCreateRule to achieve this (instead of
> using ObjectCreateRule).
>
> MyActionFactory myActionFactory = new MyActionFactory();
> digester.addFactoryCreate(
> "Services/Security/Event/Action/ClassName",
> myActionFactory);
>
> where
>
> class MyActionFactory extends ObjectCreationFactory {
> public Object createObject(Attributes attributes)
> throws Exception {
> Digester d = getDigester();
>
> // here you can inspect the xml attributes on the ClassName tag,
> // and inspect any of the objects on the Digester stack in order
> // to determine what kind of object to instantiate and return.
> // Presumably there will be objects representing the current
> // Security and Event on the digester stack so their "type"
> // is accessable.
> //
> // If you don't want to create *any* object, I don't know whether
> // you can get away with returning null, or will have to return
> // some kind of NoAction dummy object.
> }
> }
>
> Is this what you wanted to achieve?
>
> Regards,
>
> Simon
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org