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