[rules-users] How to Capture the rule which does not get executed

Michael Anstis michael.anstis at gmail.com
Thu Oct 14 15:16:07 EDT 2010


The simplest would be to create a physical subclass of
DefaultAgendaEventListener rather than the anonymous one used to date:-

MyEventListener myEventListener = new MyEventListener(myGlobal);
ksession.addEventListener(myEventListener);

class MyEventListener extends DefaultAgendaEventListener {

    private Set<Rule> rules;

    public MyEventListener(Set<Rule> rules) {
        this.rules = rules;
    }

    @Override
    public void activationCreated(ActivationCreatedEvent event) {
        rules.remove(event.getActivation().getRule());
    }

    @Override
    public void activationCancelled(ActivationCancelledEvent event) {
        rules.add((Rule) event.getActivation().getRule());
    }
}

Note: you also need to use a Set instead of a List for your "myGlobal".

2010/10/14 Navdeep Kumar <nkumar at objectwave.com>

> Yes i am using Eclipse IDE, i tried other import statements and errors are
> gone now.
>
> Map<String,String> availablity = new HashMap<String,String>();
>  *List<Rule>myGlobal = new ArrayList<Rule>();*
> //Feature feature = new Feature();
>  try{
> LOG.info("Before calling the function readKnowledgeBase");
>  //KnowledgeBase kbase = readKnowledgeBase();
> LOG.info("Rule file is loaded");
>  KnowledgeBuilder kbuilder =
> KnowledgeBuilderFactory.newKnowledgeBuilder();
> kbuilder.add(ResourceFactory.newClassPathResource("AvailabilityRule.drl"),
> ResourceType.DRL);
>  LOG.info("Rule file added to the knowledgebuilder");
> KnowledgeBuilderErrors errors = kbuilder.getErrors();
>  if (errors.size() > 0) {
> for (KnowledgeBuilderError error: errors) {
>  LOG.error(errors);
> LOG.error("in error loop of readKnowledgeBase");
>  }
> throw new IllegalArgumentException("Could not parse knowledge.");
>  }
> KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
>
>  Collection<KnowledgePackage>kpackages = kbuilder.getKnowledgePackages();
> kbase.addKnowledgePackages(kpackages);
>  StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
> KnowledgeRuntimeLogger logger =
> KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
>  ksession.setGlobal("availablity", availablity);
> *for(KnowledgePackage kpackage : kpackages) {*
> * **    for(org.drools.definition.rule.Rule rule : kpackage.getRules()) {*
> * **        myGlobal.add((Rule) rule);*
> * **    }*
> * **}*
>
> ksession.insert(Obj1);
>  ksession.insert(Obj2);
> LOG.info("Rules are fired");
> *ksession.addEventListener(new DefaultAgendaEventListener() {*
> * **    @Override*
> * **public*
> * **    void activationCreated(ActivationCreatedEvent event) {*
> * **        myGlobal.remove(event.getActivation().getRule());*
> * **    }*
> *
> *
> * **    @Override*
> * **public*
> * **    void activationCancelled(ActivationCancelledEvent event) {*
> * **        myGlobal.add((Rule) event.getActivation().getRule());*
> * **    }*
> * **});*
> ksession.addEventListener( new DefaultAgendaEventListener() {
>     public void afterActivationFired(AfterActivationFiredEvent event) {
>         super.afterActivationFired( event );
>         System.out.println( event );
>     }
> });
>  ksession.fireAllRules();
>
>
>
>
> i declared myGlobal at the top of the program before the rule file is
> loading. the added code is in bold. it changed Rule:rule to some import
> statement, i guess that is because of casting. but in the both of the action
> listeners it is giving me an error saying that myGlobal should be declared
> final because of inner class. if i will declare this final i cant do
> anything with this. this is the last error which i have now. please suggest
> what to do with that.
>
> Thanks
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20101014/6e50eaa8/attachment.html 


More information about the rules-users mailing list