buildContext);
MockRightTupleSink sink = new MockRightTupleSink();
final RuleImpl rule1 = new RuleImpl("test-rule1");
final RuleTerminalNode node = new RuleTerminalNode(idGenerator.getNextId(),
new MockTupleSource(idGenerator.getNextId()),
rule1,
rule1.getLhs(),
0,
buildContext);
StatefulKnowledgeSessionImpl ksession = (StatefulKnowledgeSessionImpl)kBase.newStatefulKnowledgeSession();
final InternalAgenda agenda = (InternalAgenda) ksession.getAgenda();
final Consequence consequence = new Consequence() {
private static final long serialVersionUID = 510l;
public void evaluate(KnowledgeHelper knowledgeHelper,
WorkingMemory workingMemory) {
LinkedList<LogicalDependency<M>> list = ((DefaultKnowledgeHelper) knowledgeHelper).getpreviousJustified();
if (list != null) {
for (SimpleLogicalDependency dep = (SimpleLogicalDependency ) list.getFirst(); dep != null; dep = ( SimpleLogicalDependency ) dep.getNext() ){
knowledgeHelper.insertLogical( dep.getObject(), dep.getMode() );
}
}
}
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
return "default";
}
};
rule1.setConsequence( consequence );
final DefaultFactHandle handle1 = (DefaultFactHandle) ksession.insert( "o1" );
final RuleTerminalNodeLeftTuple tuple1 = new RuleTerminalNodeLeftTuple( handle1,
node,
true );
final PropagationContext context1 = pctxFactory.createPropagationContext(0, PropagationContext.INSERTION, null, null, new DefaultFactHandle());
// Test single activation for a single logical assertions
node.assertLeftTuple( tuple1,
context1,
ksession );
final String logicalString = new String( "logical" );
InternalFactHandle logicalHandle = (InternalFactHandle) ksession.insert( logicalString,
null,
false,
true,
rule1,
(Activation) tuple1.getObject() );
new RightTuple( logicalHandle,
sink );
context1.setFactHandle( handle1 );
// Retract the tuple and test the logically asserted fact was also deleted
node.retractLeftTuple( tuple1,
context1,
ksession );
ksession.executeQueuedActions();
assertLength( 1,
sink.getRetracted() );
Object[] values = (Object[]) sink.getRetracted().get( 0 );
assertSame( logicalHandle,
((RightTuple) values[0]).getFactHandle() );
// Test single activation for a single logical assertions. This also
// tests that logical assertions live on after the related Activation
// has fired.
node.assertLeftTuple( tuple1,
context1,
ksession );
logicalHandle = (InternalFactHandle) ksession.insert( logicalString,
null,
false,
true,
rule1,
(Activation) tuple1.getObject() );
new RightTuple( logicalHandle,
sink );
agenda.fireNextItem( null, 0, -1 );
node.retractLeftTuple( tuple1,
context1,
ksession );
ksession.executeQueuedActions();