package br.ufes.inf.lprm.scene.base.evaluators;
import java.io.Serializable;
import org.drools.KnowledgeBase;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.ResourceType;
import org.drools.event.rule.AfterActivationFiredEvent;
import org.drools.event.rule.DefaultAgendaEventListener;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import br.ufes.inf.lprm.scene.SituationKnowledgeBaseFactory;
import br.ufes.inf.lprm.scene.SituationKnowledgeBuilderFactory;
import br.ufes.inf.lprm.situation.Role;
import br.ufes.inf.lprm.situation.SituationType;
import org.junit.Test;
import static org.junit.Assert.*;
class RuleEngineThread extends Thread {
private StatefulKnowledgeSession ksession;
public RuleEngineThread(StatefulKnowledgeSession ksession) {
this.ksession = ksession;
}
public void run() {
this.ksession.fireUntilHalt();
}
}
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int identifier;
private String name;
private int temperature;
public Person(String name, int id) {
this.setName(name);
this.setIdentifier(id);
this.setTemperature(37);
}
public void setTemperature(int temperature) {
this.temperature = temperature;
}
public int getTemperature() {
return temperature;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getIdentifier() {
return identifier;
}
public void setIdentifier(int identifier) {
this.identifier = identifier;
}
}
class Fever extends SituationType {
private static final long serialVersionUID = 1L;
@Role
private Person febrile;
public void setFebrile(Person febrile) {
this.febrile = febrile;
}
public Person getFebrile() {
return febrile;
}
}
class FeverAfterFever extends SituationType {
private static final long serialVersionUID = 1L;
@Role
private Fever previous;
@Role
private Fever latter;
public Fever getPrevious() {
return previous;
}
public void setPrevious(Fever previous) {
this.previous = previous;
}
public Fever getLatter() {
return latter;
}
public void setLatter(Fever latter) {
this.latter = latter;
}
}
public class AfterEvaluatorTest {
private int detection_counter = 0;
public class AfterEvaluatorListener extends DefaultAgendaEventListener {
@Override
public void afterActivationFired(final AfterActivationFiredEvent event) {
if (event.getActivation().getRule().getName() == "FeverAfterFever") {
detection_counter++;
Fever f1 = (Fever) event.getActivation().getDeclarationValue("previous");
Fever f2 = (Fever) event.getActivation().getDeclarationValue("latter");
assertTrue("f2 after f1", f2.getActivation().getTimestamp() < f1.getDeactivation().getTimestamp());
}
}
}
@Test
public void Test() {
try {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.addEventListener(new AfterEvaluatorListener());
final RuleEngineThread eng = new RuleEngineThread(ksession);
eng.start();
Person p = new Person("John", 1);
FactHandle fh = ksession.insert(p);
Thread.sleep(500);
//first fever starts
p.setTemperature(38);
ksession.update(fh, p);
Thread.sleep(1000);
//first fever stops
p.setTemperature(37);
ksession.update(fh, p);
Thread.sleep(1000);
//second fever starts
p.setTemperature(38);
ksession.update(fh, p);
Thread.sleep(1000);
//second fever stops
p.setTemperature(37);
ksession.update(fh, p);
Thread.sleep(1000);
eng.stop();
assertEquals("single situation detected!", 1, detection_counter);
}
catch(Exception e) {
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = SituationKnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("br/ufes/inf/lprm/scene/base/evaluators/AfterEvaluatorTestRules.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = SituationKnowledgeBaseFactory.newKnowledgeBase(kbuilder);
return kbase;
}
}