List<String> list = new ArrayList<String>();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
//Create a new Agent with newInstace=true
KnowledgeAgent kagent = this.createKAgent(kbase,true);
//Agent: take care of them!
kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
this.kbaseUpdated = false;
StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
ksession.setGlobal("list", list);
ksession.insert(new Person());
ksession.fireAllRules();
//The rule should be fired
assertEquals(1, list.size());
assertTrue(list.contains("Rule1"));
list.clear();
ksession.dispose();
Thread.sleep(2000);
//Let's modify the dsl file
f1 = fileManager.newFile("myExpander.dsl");
output = new BufferedWriter(new FileWriter(f1));
output.write(this.createCommonDSL("name == \"John\""));
output.close();
//We need to mark the dslr file as modified (even when it was not) so
//the agent could recreate the rules it contains using the new dsl.
f1 = fileManager.newFile("rules.drl");
output = new BufferedWriter(new FileWriter(f1));
output.write(header);
output.write(this.createCommonDSLRRule("Rule1"));
output.close();
this.waitUntilKBaseUpdate();
//get a new ksession
ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
//A Person without name shouldn't fire any rule now (because it was
//modified)
ksession.setGlobal("list", list);
ksession.insert(new Person());
ksession.fireAllRules();
assertEquals(0, list.size());
//A "John" Person should fire the modified rule
Person p = new Person();
p.setName("John");
ksession.insert(p);
ksession.fireAllRules();
assertEquals(1, list.size());
assertTrue(list.contains("Rule1"));
ksession.dispose();
Thread.sleep(2000);
//Let's add a new Rule
f1 = fileManager.newFile("rules.drl");
output = new BufferedWriter(new FileWriter(f1));
output.write(header);
output.write(this.createCommonDSLRRule("Rule1"));
output.write(this.createCommonDSLRRule("Rule2"));
output.close();
this.waitUntilKBaseUpdate();
//get a new ksession
ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
//A "John" Person now should fire 2 rules
list.clear();
ksession.setGlobal("list", list);
ksession.insert(p);
ksession.fireAllRules();
assertEquals(2, list.size());
assertTrue(list.contains("Rule1"));
assertTrue(list.contains("Rule2"));
ksession.dispose();
Thread.sleep(2000);
//Let's remove both rules and add a new one: Rule3
f1 = fileManager.newFile("rules.drl");
output = new BufferedWriter(new FileWriter(f1));
output.write(header);
output.write(this.createCommonDSLRRule("Rule3"));
output.close();
this.waitUntilKBaseUpdate();
//get a new ksession
ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
//A "John" Person now should only Rule3 (the other two rules were removes)
list.clear();
ksession.setGlobal("list", list);
ksession.insert(p);
ksession.fireAllRules();
assertEquals(1, list.size());
assertTrue(list.contains("Rule3"));
ksession.dispose();
Thread.sleep(2000);
//let's delete the dsl file (errors are expected)
f1 = fileManager.newFile("myExpander.dsl");
f1.delete();
f1 = fileManager.newFile("rules.drl");
output = new BufferedWriter(new FileWriter(f1));
output.write(header);
output.write(this.createCommonDSLRRule("Rule1"));
output.close();
this.waitUntilKBaseUpdate();
//Compilation errors should occurred
assertTrue(this.compilationErrors);
this.compilationErrors=false;
kagent.monitorResourceChangeEvents(false);
}