[jboss-jira] [JBoss JIRA] Closed: (JBRULES-1329) RuleBase.removeRule() prevents other rules from being applied
Edson Tirelli (JIRA)
jira-events at lists.jboss.org
Mon Feb 4 09:22:04 EST 2008
[ http://jira.jboss.com/jira/browse/JBRULES-1329?page=all ]
Edson Tirelli closed JBRULES-1329.
----------------------------------
Fix Version/s: 4.0.5
5.0.0-M1
Resolution: Done
Fixed. Test case added.
Thanks for reporting and providing test case.
> RuleBase.removeRule() prevents other rules from being applied
> -------------------------------------------------------------
>
> Key: JBRULES-1329
> URL: http://jira.jboss.com/jira/browse/JBRULES-1329
> Project: JBoss Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Affects Versions: 4.0.3
> Environment: JDK 1.6.0
> Reporter: James Sparrow
> Assigned To: Edson Tirelli
> Fix For: 4.0.5, 5.0.0-M1
>
> Attachments: DroolsRemoveRuleTest.java, Tester.java, testRemoveRule.drl
>
>
> After adding a package containing two rules and then removing one of the rules, the remaining rule is no longer activated when a matching fact is asserted. Following is a unit test displaying this behavior, along with its .drl file.
> import java.io.InputStreamReader;
> import java.io.Reader;
> import java.util.ArrayList;
> import java.util.List;
> import java.util.Properties;
> import junit.framework.TestCase;
> import org.drools.RuleBase;
> import org.drools.RuleBaseFactory;
> import org.drools.StatelessSession;
> import org.drools.WorkingMemory;
> import org.drools.compiler.PackageBuilder;
> import org.drools.compiler.PackageBuilderConfiguration;
> import org.drools.event.AfterActivationFiredEvent;
> import org.drools.event.DefaultAgendaEventListener;
> import org.drools.rule.Package;
> import org.drools.rule.Rule;
> public class DroolsRemoveRuleTest extends TestCase
> {
> /**
> * Create a new RuleBase from a package containing two rules, "Hello" and
> * "Goodbye". First verify both rules are applied as expected. Then remove
> * the "Hello" rule and verify the "Hello" rule is no longer applied, but
> * the "Goodbye" rule is applied. In Drools 4.0.3, the removal of the
> * "Hello" rule causes the "Goodbye" rule to no longer be applied.
> */
> public void testRemoveRule() throws Exception
> {
> Reader removeRuleSource = new InputStreamReader(getClass().getResourceAsStream("testRemoveRule.drl"));
>
> Properties props = new Properties();
> props.setProperty("drools.dialect.java.compiler", "JANINO");
> PackageBuilderConfiguration cfg = new PackageBuilderConfiguration(props);
>
> PackageBuilder packageBuilder = new PackageBuilder(cfg);
> packageBuilder.addPackageFromDrl(removeRuleSource);
> assertFalse(packageBuilder.hasErrors());
> Package pkg = packageBuilder.getPackage();
> RuleBase ruleBase = RuleBaseFactory.newRuleBase();
> ruleBase.addPackage(pkg);
>
> Message hello = new Message();
> hello.setName("Chuck");
> hello.setType(Type.HELLO);
>
> Message goodbye = new Message();
> goodbye.setName("Charles");
> goodbye.setType(Type.GOODBYE);
>
> StatelessSession session = ruleBase.newStatelessSession();
> FiredRulesListener listener = new FiredRulesListener();
> session.addEventListener(listener);
> session.execute(hello);
> assertEquals(1, listener.getFiredRules().size());
> assertEquals("Hello", listener.getFiredRules().get(0).getName());
>
> session = ruleBase.newStatelessSession();
> listener = new FiredRulesListener();
> session.addEventListener(listener);
> session.execute(goodbye);
> assertEquals(1, listener.getFiredRules().size());
> assertEquals("Goodbye", listener.getFiredRules().get(0).getName());
>
> ruleBase.removeRule(pkg.getName(), "Hello");
>
> session = ruleBase.newStatelessSession();
> listener = new FiredRulesListener();
> session.addEventListener(listener);
> session.execute(hello);
> assertEquals(0, listener.getFiredRules().size());
>
> session = ruleBase.newStatelessSession();
> listener = new FiredRulesListener();
> session.addEventListener(listener);
> session.execute(goodbye);
> // The following assertion currently fails
> assertEquals(1, listener.getFiredRules().size());
> assertEquals("Goodbye", listener.getFiredRules().get(0).getName());
> }
>
> public static class FiredRulesListener extends DefaultAgendaEventListener
> {
> List<Rule> firedRules = new ArrayList<Rule>();
> public List<Rule> getFiredRules()
> {
> return this.firedRules;
> }
> @Override
> public void afterActivationFired(AfterActivationFiredEvent event, WorkingMemory workingMemory)
> {
> Rule rule = event.getActivation().getRule();
> this.firedRules.add(rule);
> }
> }
>
> public static enum Type
> {
> HELLO, GOODBYE
> };
>
> public static class Message
> {
> private Type type = null;
> private String name = null;
>
> public Type getType()
> {
> return this.type;
> }
> public void setType(Type type)
> {
> this.type = type;
> }
> public String getName()
> {
> return this.name;
> }
> public void setName(String name)
> {
> this.name = name;
> }
> }
> }
> package test
> import DroolsRemoveRuleTest.Message
> import DroolsRemoveRuleTest.Type
> rule "Hello"
> dialect "java"
> when
> Message( type == Type.HELLO, name : name )
> then
> System.out.println("Hello " + name);
> end
> rule "Goodbye"
> dialect "java"
> when
> Message( type == Type.GOODBYE, name : name )
> then
> System.out.println("Goodbye " + name);
> end
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list