final FactHandle h = workingMemory.insert( c2 );
workingMemory.insert( c3 );
workingMemory.fireAllRules();
// Check logical Insertions where made for c2 and c3
list = IteratorToList.convert( workingMemory.iterateObjects( new ClassObjectFilter( Person.class) ) );
assertEquals( 2,
list.size() );
assertFalse( list.contains( new Person( c1.getType() ) ) );
assertTrue( list.contains( new Person( c2.getType() ) ) );
assertTrue( list.contains( new Person( c3.getType() ) ) );
// this rule will make a logical assertion for c1 too
final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_LogicalInsertionsDynamicRule2.drl" ) );
builder = new PackageBuilder();
builder.addPackageFromDrl( reader );
final Package pkg2 = builder.getPackage();
ruleBase.addPackage( pkg2 );
workingMemory.fireAllRules();
// check all now have just one logical assertion each
list = IteratorToList.convert( workingMemory.iterateObjects( new ClassObjectFilter( Person.class) ) );
assertEquals( 3,
list.size() );
assertTrue( list.contains( new Person( c1.getType() ) ) );
assertTrue( list.contains( new Person( c2.getType() ) ) );
assertTrue( list.contains( new Person( c3.getType() ) ) );
// check the packages are correctly populated
assertEquals( "org.drools.test",
ruleBase.getPackages()[0].getName() );
assertEquals( "org.drools.test2",
ruleBase.getPackages()[1].getName() );
assertEquals( "rule1",
ruleBase.getPackages()[0].getRules()[0].getName() );
assertEquals( "rule2",
ruleBase.getPackages()[1].getRules()[0].getName() );
// now remove the first rule
if ( reteooRuleBase != null ) {
reteooRuleBase.removeRule( ruleBase.getPackages()[0].getName(),
ruleBase.getPackages()[0].getRules()[0].getName() );
// } else if ( leapsRuleBase != null ) {
// leapsRuleBase.removeRule( ruleBase.getPackages()[0].getName(),
// ruleBase.getPackages()[0].getRules()[0].getName() );
}
// Check the rule was correctly remove
assertEquals( 0,
ruleBase.getPackages()[0].getRules().length );
assertEquals( 1,
ruleBase.getPackages()[1].getRules().length );
assertEquals( "org.drools.test2",
ruleBase.getPackages()[1].getName() );
assertEquals( "rule2",
ruleBase.getPackages()[1].getRules()[0].getName() );
list = IteratorToList.convert( workingMemory.iterateObjects( new ClassObjectFilter( Person.class) ) );
assertEquals( "removal of the rule should result in retraction of c3's logical assertion",
2,
list.size() );
assertTrue( "c1's logical assertion should not be retracted",
list.contains( new Person( c1.getType() ) ) );
assertTrue( "c2's logical assertion should not be retracted",
list.contains( new Person( c2.getType() ) ) );
assertFalse( "c3's logical assertion should be retracted",
list.contains( new Person( c3.getType() ) ) );
c2.setPrice( 3 );
workingMemory.update( h,
c2 );
list = IteratorToList.convert( workingMemory.iterateObjects( new ClassObjectFilter( Person.class) ) );
assertEquals( "c2 now has a higher price, its logical assertion should be cancelled",
1,
list.size() );
assertFalse( "The logical assertion cor c2 should have been retracted",
list.contains( new Person( c2.getType() ) ) );
assertTrue( "The logical assertion for c1 should exist",
list.contains( new Person( c1.getType() ) ) );
if ( reteooRuleBase != null ) {
reteooRuleBase.removeRule( ruleBase.getPackages()[1].getName(),
ruleBase.getPackages()[1].getRules()[0].getName() );
// } else if ( leapsRuleBase != null ) {
// leapsRuleBase.removeRule( ruleBase.getPackages()[1].getName(),
// ruleBase.getPackages()[1].getRules()[0].getName() );
}
assertEquals( 0,
ruleBase.getPackages()[0].getRules().length );
assertEquals( 0,
ruleBase.getPackages()[1].getRules().length );
list = IteratorToList.convert( workingMemory.iterateObjects( new ClassObjectFilter( Person.class) ) );
assertEquals( 0,
list.size() );
}