Sorry if this is covered, I looked up in documentation and searched
here before posting.
env: Drools 4.0.7 running in Eclipse 3.3.2 on Mac OSX 10.5
Here's the confusion......
create 2 rules in agenda A in package A
create 2 rules in agenda B in package A
setFocus(A)
setFocus(B)
load some objects to evaluate in stateless session, call fireallrules
and works as expected.
now, say I wish to remove the rules in Agenda A from the RuleBase, I
tried three different ways, including removing the rules directly from
the rulebase!
But then, when I load in some new objects in a new session, set the
focus to Agenda A (which I thought I removed all the rules for
it)...instead of getting nothing or an exception, the rules in agenda
A still fire, even though I removed them (or I thought I did).
1) how do I remove rules if these three ways dont work (at least they
dont appear to
- or much more likely -
1) what the heck am I doing wrong....
2) my needs are two add and subtract agendas on the fly, as I will
have multiple customers with multiple sets of rules with different
agendas (is there a better way then this - i.e. should I have separate
rulebases?)
Thanks,
James A. Brannan
package com.sample;
import java.io.*;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.compiler.PackageBuilder;
import org.drools.StatefulSession;
import org.drools.rule.Package;
import org.drools.rule.Rule;
/**
* This is a sample file to launch a rule package from a rule source
file.
*/
public class DroolsTestTwo {
public static void main(String[] args) {
try
{
File dir = new File("/Users/brannanj/Documents/workspace/
BankingTutorial/src/main/rules");
File[] files = dir.listFiles();
PackageBuilder builder = new PackageBuilder();
for(int i = 0; i < files.length; i++)
{
if(files[i].getName().indexOf(".xml") > 0)
continue;
//Reader reader = ;
builder.addPackageFromXml(new FileReader(files[i]));
}
Package pkg = builder.getPackage();
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
ruleBase.addPackage(builder.getPackage());
final StatefulSession session =
ruleBase.newStatefulSession(false);
User user = new User();
user.addRole("admin");
user.addRole("tester");
FooBarInfoTwo y = new FooBarInfoTwo();
y.setProperty("type");
y.setValue("cheddar");
FooBarInfoTwo z = new FooBarInfoTwo();
z.setProperty("age");
z.setValue(new Integer(32));
FooBarInfoTwo a = new FooBarInfoTwo();
z.setProperty("weight");
z.setValue(new Double(22.222));
FooBarInfo x = new FooBarInfo();
x.setValue("color", "red");
x.setValue("count", new Integer(23));
FooBarInfoTwo b = new FooBarInfoTwo();
b.setProperty("smelly");
b.setValue("true");
FooBarInfoTwo c = new FooBarInfoTwo();
b.setProperty("birthday");
b.setValue(new SimpleDate("12/01/2006"));
session.insert(x);
session.insert(y);
session.insert(z);
session.insert(a);
session.insert(b);
session.insert(user);
session.setFocus("GroupOne");
session.setFocus("GlobalsGroup");
session.setFocus("GroupTwo");
session.fireAllRules();
//remove GroupOne rules from package
pkg = builder.getPackage();
Rule[] rules = pkg.getRules();
for(int i =0;i<rules.length;i++)
{
System.out.println("Agendagroup in package: " +
rules[i].getAgendaGroup());
if(rules[i].getAgendaGroup().equals("GroupOne"))
{
pkg.removeRule(rules[i]);
}
}
System.out.println("GET THE RULES AGAIN TO SEE IF BY
REFERENCE......");
pkg = builder.getPackage();
rules = pkg.getRules();
for(int i =0;i<rules.length;i++)
{
System.out.println("Agendagroup in package: " +
rules[i].getAgendaGroup());
}
System.out.println("NOW EVALUATE THE RULEBASE
PACKAGE......");
pkg = ruleBase.getPackages()[0];
rules = pkg.getRules();
for(int i =0;i<rules.length;i++)
{
System.out.println("Agendagroup in package from
rulebase: " + rules[i].getAgendaGroup());
}
session.dispose();
final StatefulSession session2 =
ruleBase.newStatefulSession(false);
User user2 = new User();
user2.addRole("admin");
user2.addRole("tester");
FooBarInfo x2 = new FooBarInfo();
x2.setValue("color", "red");
x2.setValue("count", new Integer(23));
x2.setValue("description", "a foobarinfo");
System.out.println("SECOND TEST**************************");
session2.insert(x2);
session2.insert(user2);
session2.setFocus("GroupOne");
session2.fireAllRules();
session2.dispose();
System.out.println("RULES STILL THERE EVEN THOUGH SEEMS TO BE
BY REFERENCE!");
rules = pkg.getRules();
for(int i =0;i<rules.length;i++)
{
System.out.println("Agendagroup in package from rulebase: "
+ rules[i].getAgendaGroup());
if(rules[i].getAgendaGroup().equals("GroupOne"))
{
ruleBase.removeRule(rules[i].getAgendaGroup(),
rules[i].getName());
System.out.println("removed rule: " + rules[i].getName() +
" directly from ruleBase");
}
}
System.out.println("THIRD TEST WITH RULES REMOVED FROM
RULEBASE ************************");
final StatefulSession session3 =
ruleBase.newStatefulSession(false);
User user3 = new User();
user3.addRole("admin");
user3.addRole("tester");
FooBarInfo x3 = new FooBarInfo();
x3.setValue("color", "red");
x3.setValue("count", new Integer(23));
x3.setValue("description", "a foobarinfo");
session3.insert(x3);
session3.insert(user3);
session3.setFocus("GroupOne");
session3.fireAllRules();
System.out.println("Mystifying I still get the rules
fired....");
} catch (Throwable t) {
t.printStackTrace();
}
}
}