use of org.drools.core.definitions.rule.impl.RuleImpl in project drools by kiegroup.
the class KnowledgeBaseEventSupportTest method setUp.
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Before
public void setUp() throws Exception {
kbase = KnowledgeBaseFactory.newKnowledgeBase();
listener1 = new TestRuleBaseListener("(listener-1) ");
listener2 = new TestRuleBaseListener("(listener-2) ");
kbase.addEventListener(listener1);
kbase.addEventListener(listener2);
final RuleImpl rule1 = new RuleImpl("test1");
final ClassObjectType cheeseObjectType = new ClassObjectType(Cheese.class);
final Pattern pattern = new Pattern(0, cheeseObjectType);
ClassFieldAccessorStore store = new ClassFieldAccessorStore();
store.setClassFieldAccessorCache(new ClassFieldAccessorCache(Thread.currentThread().getContextClassLoader()));
store.setEagerWire(true);
final ClassFieldReader extractor = store.getReader(Cheese.class, "type");
final FieldValue field = FieldFactory.getInstance().getFieldValue("cheddar");
final MvelConstraint constraint = new MvelConstraintTestUtil("type == \"cheddar\"", field, extractor);
pattern.addConstraint(constraint);
rule1.addPattern(pattern);
rule1.setConsequence(new Consequence() {
private static final long serialVersionUID = 510l;
public void evaluate(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory) throws Exception {
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
return "default";
}
});
final RuleImpl rule2 = new RuleImpl("test2");
final ClassObjectType cheeseObjectType2 = new ClassObjectType(Cheese.class);
final Pattern pattern2 = new Pattern(0, cheeseObjectType2);
final FieldValue field2 = FieldFactory.getInstance().getFieldValue("stilton");
final MvelConstraint constraint2 = new MvelConstraintTestUtil("type == \"stilton\"", field, extractor);
pattern2.addConstraint(constraint2);
rule2.addPattern(pattern2);
rule2.setConsequence(new Consequence() {
private static final long serialVersionUID = 510l;
public void evaluate(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory) throws Exception {
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
return "default";
}
});
pkg = new KnowledgePackageImpl("org.drools.test1");
pkg.addRule(rule1);
pkg.addRule(rule2);
}
use of org.drools.core.definitions.rule.impl.RuleImpl in project drools by kiegroup.
the class AgendaEventSupportTest method testAgendaEventListener.
// public void testIsSerializable() {
// assertTrue( Serializable.class.isAssignableFrom( AgendaEventSupport.class ) );
// }
@Test
@Ignore
public void testAgendaEventListener() throws Exception {
InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
// create a simple package with one rule to test the events
InternalKnowledgePackage pkg = new KnowledgePackageImpl("org.drools.test");
final RuleImpl rule = new RuleImpl("test1");
rule.setEager(true);
rule.setAgendaGroup("test group");
final ClassObjectType cheeseObjectType = new ClassObjectType(Cheese.class);
final Pattern pattern = new Pattern(0, cheeseObjectType);
pkg.setClassFieldAccessorCache(new ClassFieldAccessorCache(Thread.currentThread().getContextClassLoader()));
pkg.getClassFieldAccessorStore().setEagerWire(true);
final ClassFieldReader extractor = pkg.getClassFieldAccessorStore().getReader(Cheese.class, "type");
final FieldValue field = FieldFactory.getInstance().getFieldValue("cheddar");
final MvelConstraint constraint = new MvelConstraintTestUtil("type == \"cheddar\"", field, extractor);
pattern.addConstraint(constraint);
rule.addPattern(pattern);
rule.setConsequence(new Consequence() {
public void evaluate(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory) throws Exception {
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
// TODO Auto-generated method stub
return null;
}
});
pkg.addRule(rule);
kbase.addPackages(Collections.singleton(pkg));
// create a new working memory and add an AgendaEventListener
KieSession ksession = kbase.newKieSession();
final List agendaList = new ArrayList();
final AgendaEventListener agendaEventListener = new AgendaEventListener() {
public void matchCancelled(MatchCancelledEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void matchCreated(MatchCreatedEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void afterMatchFired(AfterMatchFiredEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void agendaGroupPopped(AgendaGroupPoppedEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void agendaGroupPushed(AgendaGroupPushedEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void beforeMatchFired(BeforeMatchFiredEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
public void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) {
assertNotNull(event.getKieRuntime());
agendaList.add(event);
}
};
ksession.addEventListener(agendaEventListener);
assertEquals(1, ksession.getAgendaEventListeners().size());
// assert the cheese fact
final Cheese cheddar = new Cheese("cheddar", 15);
FactHandle cheddarHandle = ksession.insert(cheddar);
InternalAgenda agenda = (InternalAgenda) ksession.getAgenda();
agenda.evaluateEagerList();
// should be one MatchCreatedEvent
assertEquals(1, agendaList.size());
MatchCreatedEvent createdEvent = (MatchCreatedEvent) agendaList.get(0);
assertSame(cheddarHandle, createdEvent.getMatch().getFactHandles().toArray()[0]);
// clear the agenda to check CLEAR events occur
ksession.getAgenda().clear();
MatchCancelledEvent cancelledEvent = (MatchCancelledEvent) agendaList.get(1);
assertEquals(MatchCancelledCause.CLEAR, cancelledEvent.getCause());
agendaList.clear();
// update results in an MatchCreatedEvent
cheddar.setPrice(14);
ksession.update(cheddarHandle, cheddar);
agenda.evaluateEagerList();
assertEquals(1, agendaList.size());
createdEvent = (MatchCreatedEvent) agendaList.get(0);
assertSame(cheddarHandle, createdEvent.getMatch().getFactHandles().toArray()[0]);
agendaList.clear();
// update should not result in cancelation+activation events
cheddar.setPrice(14);
ksession.update(cheddarHandle, cheddar);
assertEquals(0, agendaList.size());
// cancelledEvent = (ActivationCancelledEvent) agendaList.get( 0 );
// assertEquals( ActivationCancelledCause.WME_MODIFY, cancelledEvent.getCause() );
// assertSame( cheddarHandle,
// cancelledEvent.getActivation().toFactHandles().toArray()[0] );
// createdEvent = (ActivationCreatedEvent) agendaList.get( 1 );
// assertSame( cheddarHandle,
// createdEvent.getActivation().toFactHandles().toArray()[0] );
// agendaList.clear();
// retract results in a ActivationCancelledEvent, note the object is not resolveable now as it no longer exists
ksession.retract(cheddarHandle);
assertEquals(1, agendaList.size());
cancelledEvent = (MatchCancelledEvent) agendaList.get(0);
// invalidated handles no longer set the object to null
assertNotNull(((InternalFactHandle) cancelledEvent.getMatch().getFactHandles().toArray()[0]).getObject());
// re-assert the fact so we can test the agenda group events
cheddarHandle = ksession.insert(cheddar);
agendaList.clear();
// setFocus results in an AgendaGroupPushedEvent
ksession.getAgenda().getAgendaGroup("test group").setFocus();
assertEquals(1, agendaList.size());
final AgendaGroupPushedEvent pushedEvent = (AgendaGroupPushedEvent) agendaList.get(0);
assertEquals("test group", pushedEvent.getAgendaGroup().getName());
agendaList.clear();
// fireAllRules results in a BeforeActivationFiredEvent and an AfterActivationFiredEvent
// the AgendaGroup becomes empty, which results in a popped event.
ksession.fireAllRules();
assertEquals(3, agendaList.size());
final BeforeMatchFiredEvent beforeEvent = (BeforeMatchFiredEvent) agendaList.get(0);
assertSame(cheddarHandle, beforeEvent.getMatch().getFactHandles().toArray()[0]);
final AfterMatchFiredEvent afterEvent = (AfterMatchFiredEvent) agendaList.get(1);
assertSame(cheddarHandle, afterEvent.getMatch().getFactHandles().toArray()[0]);
final AgendaGroupPoppedEvent poppedEvent = (AgendaGroupPoppedEvent) agendaList.get(2);
assertEquals("test group", poppedEvent.getAgendaGroup().getName());
}
use of org.drools.core.definitions.rule.impl.RuleImpl in project drools by kiegroup.
the class BaseMannersTest method getAssignFirstSeatRule.
/**
* <pre>
* rule assignFirstSeat() {
* Context context;
* Guest guest;
* Count count;
* when {
* context : Context( state == Context.START_UP )
* guest : Guest()
* count : Count()
* } then {
* String guestName = guest.getName();
* drools.assert( new Seating( count.getValue(), 1, true, 1, guestName, 1, guestName) );
* drools.assert( new Path( count.getValue(), 1, guestName ) );
* count.setCount( count.getValue() + 1 );
*
* System.err.println( "seat 1 " + guest.getName() + " );
*
* context.setPath( Context.ASSIGN_SEATS );
* }
* }
* </pre>
*
* @return
* @throws InvalidRuleException
*/
private RuleImpl getAssignFirstSeatRule() throws InvalidRuleException {
final RuleImpl rule = new RuleImpl("assignFirstSeat");
// -----------
// context : Context( state == Context.START_UP )
// -----------
final Pattern contextPattern = new Pattern(0, this.contextType, "context");
contextPattern.addConstraint(getLiteralConstraint(contextPattern, "state", Context.START_UP));
rule.addPattern(contextPattern);
final Declaration contextDeclaration = rule.getDeclaration("context");
// -----------
// guest: Guest()
// -----------
final Pattern guestPattern = new Pattern(1, this.guestType, "guest");
rule.addPattern(guestPattern);
final Declaration guestDeclaration = rule.getDeclaration("guest");
// ------------
// count : Count()
// ------------
final Pattern countPattern = new Pattern(2, this.countType, "count");
rule.addPattern(countPattern);
final Declaration countDeclaration = rule.getDeclaration("count");
final Consequence consequence = new Consequence() {
public void evaluate(KnowledgeHelper drools, WorkingMemory workingMemory) throws ConsequenceException {
try {
RuleImpl rule = drools.getRule();
LeftTuple tuple = (LeftTuple) drools.getTuple();
Guest guest = (Guest) drools.get(guestDeclaration);
Context context = (Context) drools.get(contextDeclaration);
Count count = (Count) drools.get(countDeclaration);
String guestName = guest.getName();
Seating seating = new Seating(count.getValue(), 0, true, 1, guestName, 1, guestName);
drools.insert(seating);
Path path = new Path(count.getValue(), 1, guestName);
drools.insert(path);
count.setValue(count.getValue());
drools.update(tuple.get(countDeclaration), count);
context.setState(Context.ASSIGN_SEATS);
// drools.update( tuple.get( contextDeclaration ),
// context );
drools.update(tuple.get(contextDeclaration));
// System.err.println( "assign first seat : " + seating + " : " + path );
} catch (Exception e) {
e.printStackTrace();
throw new ConsequenceException(e);
}
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
return "default";
}
};
rule.setConsequence(consequence);
return rule;
}
use of org.drools.core.definitions.rule.impl.RuleImpl in project drools by kiegroup.
the class BaseMannersTest method getPathDone.
/**
* <pre>
* rule pathDone() {
* Context context; Seating seating;
* when {
* context : Context( state == Context.MAKE_PATH )
* seating : Seating( pathDone == false )
* } then {
* seating.setPathDone( true );
* context.setName( Context.CHECK_DONE );
* }
* }
* </pre>
*
* @return
* @throws InvalidRuleException
*/
private RuleImpl getPathDone() throws InvalidRuleException {
final RuleImpl rule = new RuleImpl("pathDone");
// -----------
// context : Context( state == Context.MAKE_PATH )
// -----------
final Pattern contextPattern = new Pattern(0, this.contextType, "context");
contextPattern.addConstraint(getLiteralConstraint(contextPattern, "state", Context.MAKE_PATH));
rule.addPattern(contextPattern);
final Declaration contextDeclaration = rule.getDeclaration("context");
// ---------------
// seating : Seating( pathDone == false )
// ---------------
final Pattern seatingPattern = new Pattern(1, this.seatingType, "seating");
seatingPattern.addConstraint(getLiteralConstraint(seatingPattern, "pathDone", false));
rule.addPattern(seatingPattern);
final Declaration seatingDeclaration = rule.getDeclaration("seating");
// ------------
// context.setName( Context.CHECK_DONE );
// seating.setPathDone( true );
// ------------
final Consequence consequence = new Consequence() {
public void evaluate(KnowledgeHelper drools, WorkingMemory workingMemory) throws ConsequenceException {
try {
RuleImpl rule = drools.getRule();
LeftTuple tuple = (LeftTuple) drools.getTuple();
Context context = (Context) drools.get(contextDeclaration);
Seating seating = (Seating) drools.get(seatingDeclaration);
seating.setPathDone(true);
// if ( seating.getId() == 6 ) {
// System.err.println( "pause" );
// }
drools.update(tuple.get(seatingDeclaration));
context.setState(Context.CHECK_DONE);
drools.update(tuple.get(contextDeclaration), context);
// System.err.println( "path done" + seating );
} catch (Exception e) {
e.printStackTrace();
throw new ConsequenceException(e);
}
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
return "default";
}
};
rule.setConsequence(consequence);
return rule;
}
use of org.drools.core.definitions.rule.impl.RuleImpl in project drools by kiegroup.
the class BaseMannersTest method getFindSeating.
/**
* <pre>
* rule findSeating() {
* Context context;
* int seatingId, seatingPid;
* String seatingRightGuestName, leftGuestName;
* Sex rightGuestSex;
* Hobby rightGuestHobby;
* Count count;
*
* when {
* context : Context( state == Context.ASSIGN_SEATS )
* Seating( seatingId:id, seatingPid:pid, pathDone == true
* seatingRightSeat:rightSeat seatingRightGuestName:rightGuestName )
* Guest( name == seatingRightGuestName, rightGuestSex:sex, rightGuestHobby:hobby )
* Guest( leftGuestName:name , sex != rightGuestSex, hobby == rightGuestHobby )
*
* count : Count()
*
* not ( Path( id == seatingId, guestName == leftGuestName) )
* not ( Chosen( id == seatingId, guestName == leftGuestName, hobby == rightGuestHobby) )
* } then {
* int newSeat = rightSeat + 1;
* drools.assert( new Seating( coung.getValue(), rightSeat, rightSeatName, leftGuestName, newSeat, countValue, id, false );
* drools.assert( new Path( countValue, leftGuestName, newSeat );
* drools.assert( new Chosen( id, leftGuestName, rightGuestHobby ) );
*
* System.err.println( "seat " + rightSeat + " " + rightSeatName + " " + leftGuestName );
*
* count.setCount( countValue + 1 );
* context.setPath( Context.MAKE_PATH );
* }
* }
* </pre>
*
* @return
* @throws InvalidRuleException
*/
private RuleImpl getFindSeating() throws InvalidRuleException {
final RuleImpl rule = new RuleImpl("findSeating");
// ---------------
// context : Context( state == Context.ASSIGN_SEATS )
// ---------------
final Pattern contextPattern = new Pattern(0, this.contextType, "context");
contextPattern.addConstraint(getLiteralConstraint(contextPattern, "state", Context.ASSIGN_SEATS));
rule.addPattern(contextPattern);
final Declaration contextDeclaration = rule.getDeclaration("context");
// -------------------------------
// Seating( seatingId:id, seatingPid:pid, pathDone == true
// seatingRightSeat:rightSeat seatingRightGuestName:rightGuestName )
// -------------------------------
final Pattern seatingPattern = new Pattern(1, this.seatingType);
setFieldDeclaration(seatingPattern, "id", "seatingId");
setFieldDeclaration(seatingPattern, "pid", "seatingPid");
seatingPattern.addConstraint(getLiteralConstraint(seatingPattern, "pathDone", true));
setFieldDeclaration(seatingPattern, "rightSeat", "seatingRightSeat");
setFieldDeclaration(seatingPattern, "rightGuestName", "seatingRightGuestName");
rule.addPattern(seatingPattern);
final Declaration seatingIdDeclaration = rule.getDeclaration("seatingId");
final Declaration seatingPidDeclaration = rule.getDeclaration("seatingPid");
final Declaration seatingRightGuestNameDeclaration = rule.getDeclaration("seatingRightGuestName");
final Declaration seatingRightSeatDeclaration = rule.getDeclaration("seatingRightSeat");
// --------------
// Guest( name == seatingRightGuestName, rightGuestSex:sex,
// rightGuestHobby:hobby )
// ---------------
final Pattern rightGuestPattern = new Pattern(2, this.guestType);
rightGuestPattern.addConstraint(getBoundVariableConstraint(rightGuestPattern, "name", seatingRightGuestNameDeclaration, "=="));
setFieldDeclaration(rightGuestPattern, "sex", "rightGuestSex");
setFieldDeclaration(rightGuestPattern, "hobby", "rightGuestHobby");
rule.addPattern(rightGuestPattern);
final Declaration rightGuestSexDeclaration = rule.getDeclaration("rightGuestSex");
final Declaration rightGuestHobbyDeclaration = rule.getDeclaration("rightGuestHobby");
// ----------------
// Guest( leftGuestName:name , sex != rightGuestSex, hobby ==
// rightGuestHobby )
// ----------------
final Pattern leftGuestPattern = new Pattern(3, this.guestType);
setFieldDeclaration(leftGuestPattern, "name", "leftGuestName");
leftGuestPattern.addConstraint(getBoundVariableConstraint(rightGuestPattern, "hobby", rightGuestHobbyDeclaration, "=="));
leftGuestPattern.addConstraint(getBoundVariableConstraint(leftGuestPattern, "sex", rightGuestSexDeclaration, "!="));
rule.addPattern(leftGuestPattern);
final Declaration leftGuestNameDeclaration = rule.getDeclaration("leftGuestName");
// ---------------
// count : Count()
// ---------------
final Pattern count = new Pattern(4, this.countType, "count");
rule.addPattern(count);
final Declaration countDeclaration = rule.getDeclaration("count");
// --------------
// not ( Path( id == seatingId, guestName == leftGuestName) )
// --------------
final Pattern notPathPattern = new Pattern(5, this.pathType);
notPathPattern.addConstraint(getBoundVariableConstraint(notPathPattern, "id", seatingIdDeclaration, "=="));
notPathPattern.addConstraint(getBoundVariableConstraint(notPathPattern, "guestName", leftGuestNameDeclaration, "=="));
final GroupElement notPath = GroupElementFactory.newNotInstance();
notPath.addChild(notPathPattern);
rule.addPattern(notPath);
// ------------
// not ( Chosen( id == seatingId, guestName == leftGuestName, hobby ==
// rightGuestHobby ) )
// ------------
final Pattern notChosenPattern = new Pattern(6, this.chosenType);
notChosenPattern.addConstraint(getBoundVariableConstraint(notChosenPattern, "id", seatingIdDeclaration, "=="));
notChosenPattern.addConstraint(getBoundVariableConstraint(notChosenPattern, "guestName", leftGuestNameDeclaration, "=="));
notChosenPattern.addConstraint(getBoundVariableConstraint(notChosenPattern, "hobby", rightGuestHobbyDeclaration, "=="));
final GroupElement notChosen = GroupElementFactory.newNotInstance();
notChosen.addChild(notChosenPattern);
rule.addPattern(notChosen);
// ------------
// int newSeat = rightSeat + 1;
// drools.assert( new Seating( coung.getValue(), rightSeat,
// rightSeatName, leftGuestName, newSeat, countValue, id, false );
// drools.assert( new Path( countValue, leftGuestName, newSeat );
// drools.assert( new Chosen( id, leftGuestName, rightGuestHobby ) );
//
// System.err.println( "seat " + rightSeat + " " + rightSeatName + " " +
// leftGuestName );
//
// count.setCount( countValue + 1 );
// context.setPath( Context.MAKE_PATH );
// ------------
final Consequence consequence = new Consequence() {
public void evaluate(KnowledgeHelper drools, WorkingMemory workingMemory) throws ConsequenceException {
try {
// MemoryVisitor visitor = new MemoryVisitor( ( InternalWorkingMemory ) workingMemory );
// visitor.visit( workingMemory.getRuleBase() );
RuleImpl rule = drools.getRule();
LeftTuple tuple = (LeftTuple) drools.getTuple();
Context context = (Context) drools.get(contextDeclaration);
Count count = (Count) drools.get(countDeclaration);
int seatId = seatingIdDeclaration.getExtractor().getIntValue((InternalWorkingMemory) workingMemory, tuple.get(seatingIdDeclaration).getObject());
int seatingRightSeat = seatingRightSeatDeclaration.getExtractor().getIntValue((InternalWorkingMemory) workingMemory, tuple.get(seatingRightSeatDeclaration).getObject());
String leftGuestName = (String) drools.get(leftGuestNameDeclaration);
String rightGuestName = (String) drools.get(seatingRightGuestNameDeclaration);
Hobby rightGuestHobby = (Hobby) drools.get(rightGuestHobbyDeclaration);
Seating seating = new Seating(count.getValue(), seatId, false, seatingRightSeat, rightGuestName, seatingRightSeat + 1, leftGuestName);
drools.insert(seating);
Path path = new Path(count.getValue(), seatingRightSeat + 1, leftGuestName);
drools.insert(path);
Chosen chosen = new Chosen(seatId, leftGuestName, rightGuestHobby);
drools.insert(chosen);
count.setValue(count.getValue() + 1);
// if ( count.getValue() == 5 ) {
// drools.retractObject( tuple.getFactHandleForDeclaration( countDeclaration ) );
// } else {
// drools.update( tuple.getFactHandleForDeclaration( countDeclaration ),
// count );
// }
drools.update(tuple.get(countDeclaration), count);
context.setState(Context.MAKE_PATH);
drools.update(tuple.get(contextDeclaration), context);
System.err.println("find seating : " + seating + " : " + path + " : " + chosen);
} catch (Exception e) {
e.printStackTrace();
throw new ConsequenceException(e);
}
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
return "default";
}
};
rule.setConsequence(consequence);
return rule;
}
Aggregations