package org.drools.integrationtests; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.Collection; import java.util.Properties; import junit.framework.TestCase; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseConfiguration; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderConfiguration; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.builder.conf.DefaultDialectOption; import org.drools.compiler.DroolsParserException; import org.drools.conf.SequentialOption; import org.drools.conf.ShareAlphaNodesOption; import org.drools.conf.ShareBetaNodesOption; import org.drools.definition.KnowledgePackage; import org.drools.io.ResourceFactory; import org.drools.runtime.StatefulKnowledgeSession; public class FailureOnRemovalTest extends TestCase { private static final String LS = System.getProperty( "line.separator" ); private static final String PACKAGE = "failure_on_removal"; private static final String RULE_1 = "rule_1"; private static final String RULE_2 = "rule_2"; private static final String RULE_3 = "rule_3"; private static final boolean SHARE_BETA_NODES = true; private static final boolean NOT_SHARE_BETA_NODES = false; public void testWithBetaNodeSharing() throws Exception { runTest( SHARE_BETA_NODES ); } public void testWithoutBetaNodeSharing() throws Exception { runTest( NOT_SHARE_BETA_NODES ); } private void runTest(boolean shareBetaNodes) throws Exception { KnowledgeBase kbase = createKnowledgeBase( shareBetaNodes ); Collection<KnowledgePackage> rule1 = compileRule( RULE_1 ); kbase.addKnowledgePackages( rule1 ); // we need to add at least two rules. Test will not fail with only one rule. Collection<KnowledgePackage> rule2 = compileRule( RULE_2 ); kbase.addKnowledgePackages( rule2 ); kbase.removeRule( PACKAGE, RULE_1 ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); int fired = ksession.fireAllRules(); ksession.dispose(); assertEquals( 1, fired ); Collection<KnowledgePackage> rule3 = compileRule( RULE_3 ); kbase.addKnowledgePackages( rule3 ); } private Collection<KnowledgePackage> compileRule(String name) throws DroolsParserException, IOException { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( createKnowledgeBuilderConfiguration() ); String drl = getDrl( name ); Reader drlReader = new StringReader( drl ); kbuilder.add( ResourceFactory.newReaderResource( drlReader ), ResourceType.DRL ); assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() ); return kbuilder.getKnowledgePackages(); } private KnowledgeBuilderConfiguration createKnowledgeBuilderConfiguration() { Properties properties = new Properties(); properties.setProperty( "drools.dialect.java.compiler", "JANINO" ); KnowledgeBuilderConfiguration kconf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( properties, getClass().getClassLoader() ); kconf.setOption( DefaultDialectOption.get( "java" ) ); return kconf; } private KnowledgeBase createKnowledgeBase(boolean shareBetaNodes) { KnowledgeBaseConfiguration ruleBaseConfiguration = createKnowledgeBaseConfiguration( shareBetaNodes ); return KnowledgeBaseFactory.newKnowledgeBase( ruleBaseConfiguration ); } private KnowledgeBaseConfiguration createKnowledgeBaseConfiguration(boolean shareBetaNodes) { KnowledgeBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kconf.setOption( SequentialOption.NO ); kconf.setOption( ShareAlphaNodesOption.YES ); kconf.setOption( shareBetaNodes ? ShareBetaNodesOption.YES : ShareBetaNodesOption.NO ); return kconf; } private String getDrl(String name) { return new StringBuffer( "package " ).append( PACKAGE ).append( LS ).append( "rule '" ).append( name ).append( '\'' ).append( LS ).append( "when" ).append( LS ).append( "eval (true)" ).append( LS ).append( "then" ).append( LS ).append( "end" ).append( LS ).toString(); } }