package org.drools.integrationtests; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; import org.drools.FactHandle; import org.drools.RuleBase; import org.drools.RuleBaseConfiguration; import org.drools.RuleBaseFactory; import org.drools.StatefulSession; import org.drools.WorkingMemory; import org.drools.common.DefaultAgenda; import org.drools.compiler.PackageBuilder; import org.drools.compiler.PackageBuilder.PackageMergeException; import org.drools.event.ActivationCancelledEvent; import org.drools.event.AgendaEventListener; import org.drools.event.DefaultAgendaEventListener; import org.drools.rule.Package; import org.drools.runtime.process.ProcessInstance; public class ProcessFlowControlTest extends TestCase { protected RuleBase getRuleBase() throws Exception { return RuleBaseFactory.newRuleBase( RuleBase.RETEOO, null ); } protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception { return RuleBaseFactory.newRuleBase( RuleBase.RETEOO, config ); } public void testRuleFlowConstraintDialects() throws Exception { final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ConstraintDialects.rfm" ) ) ); System.err.print( builder.getErrors() ); assertEquals( 0, builder.getErrors().getErrors().length ); RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage( builder.getPackage() ); ruleBase = SerializationHelper.serializeObject( ruleBase ); StatefulSession session = ruleBase.newStatefulSession(); List inList = new ArrayList(); List outList = new ArrayList(); session.setGlobal( "inList", inList ); session.setGlobal( "outList", outList ); inList.add( 1 ); inList.add( 3 ); inList.add( 6 ); inList.add( 25 ); FactHandle handle = session.insert( inList ); session.startProcess( "ConstraintDialects" ); assertEquals( 4, outList.size() ); assertEquals( "MVELCodeConstraint was here", outList.get( 0 ) ); assertEquals( "JavaCodeConstraint was here", outList.get( 1 ) ); assertEquals( "MVELRuleConstraint was here", outList.get( 2 ) ); assertEquals( "JavaRuleConstraint was here", outList.get( 3 ) ); outList.clear(); inList.remove( new Integer( 1 ) ); session.update( handle, inList ); session.startProcess( "ConstraintDialects" ); assertEquals( 3, outList.size() ); assertEquals( "JavaCodeConstraint was here", outList.get( 0 ) ); assertEquals( "MVELRuleConstraint was here", outList.get( 1 ) ); assertEquals( "JavaRuleConstraint was here", outList.get( 2 ) ); outList.clear(); inList.remove( new Integer( 6 ) ); session.update( handle, inList ); session.startProcess( "ConstraintDialects" ); assertEquals( 2, outList.size() ); assertEquals( "JavaCodeConstraint was here", outList.get( 0 ) ); assertEquals( "JavaRuleConstraint was here", outList.get( 1 ) ); outList.clear(); inList.remove( new Integer( 3 ) ); session.update( handle, inList ); session.startProcess( "ConstraintDialects" ); assertEquals( 1, outList.size() ); assertEquals( "JavaRuleConstraint was here", outList.get( 0 ) ); outList.clear(); inList.remove( new Integer( 25 ) ); session.update( handle, inList ); try { session.startProcess( "ConstraintDialects" ); fail( "This should have thrown an exception" ); } catch ( Exception e ) { } } public void testRuleFlow() throws Exception { final PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) ); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) ); final Package pkg = builder.getPackage(); RuleBase ruleBase = getRuleBase(); ruleBase.addPackage( pkg ); ruleBase = SerializationHelper.serializeObject( ruleBase ); final WorkingMemory workingMemory = ruleBase.newStatefulSession(); final List list = new ArrayList(); workingMemory.setGlobal( "list", list ); workingMemory.fireAllRules(); assertEquals( 0, list.size() ); final ProcessInstance processInstance = workingMemory.startProcess( "0" ); assertEquals( ProcessInstance.STATE_ACTIVE, processInstance.getState() ); workingMemory.fireAllRules(); assertEquals( 4, list.size() ); assertEquals( "Rule1", list.get( 0 ) ); assertEquals( "Rule3", list.get( 1 ) ); assertEquals( "Rule2", list.get( 2 ) ); assertEquals( "Rule4", list.get( 3 ) ); assertEquals( ProcessInstance.STATE_COMPLETED, processInstance.getState() ); } public void testRuleFlowUpgrade() throws Exception { final PackageBuilder builder = new PackageBuilder(); // Set the system property so that automatic conversion can happen System.setProperty( "drools.ruleflow.port", "true" ); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) ); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow40.rfm" ) ) ); final Package pkg = builder.getPackage(); RuleBase ruleBase = getRuleBase(); ruleBase.addPackage( pkg ); ruleBase = SerializationHelper.serializeObject( ruleBase ); final WorkingMemory workingMemory = ruleBase.newStatefulSession(); final List list = new ArrayList(); workingMemory.setGlobal( "list", list ); workingMemory.fireAllRules(); assertEquals( 0, list.size() ); final ProcessInstance processInstance = workingMemory.startProcess( "0" ); assertEquals( ProcessInstance.STATE_ACTIVE, processInstance.getState() ); workingMemory.fireAllRules(); assertEquals( 4, list.size() ); assertEquals( "Rule1", list.get( 0 ) ); assertEquals( "Rule3", list.get( 1 ) ); assertEquals( "Rule2", list.get( 2 ) ); assertEquals( "Rule4", list.get( 3 ) ); assertEquals( ProcessInstance.STATE_COMPLETED, processInstance.getState() ); // Reset the system property so that automatic conversion should not happen System.setProperty( "drools.ruleflow.port", "false" ); } public void testRuleFlowClear() throws Exception { final PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_ruleflowClear.drl" ) ) ); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ruleflowClear.rfm" ) ) ); final Package pkg = builder.getPackage(); RuleBase ruleBase = getRuleBase(); ruleBase.addPackage( pkg ); ruleBase = SerializationHelper.serializeObject( ruleBase ); final WorkingMemory workingMemory = ruleBase.newStatefulSession(); final List list = new ArrayList(); workingMemory.setGlobal( "list", list ); final List activations = new ArrayList(); AgendaEventListener listener = new DefaultAgendaEventListener() { public void activationCancelled(ActivationCancelledEvent event, WorkingMemory workingMemory) { activations.add( event.getActivation() ); } }; workingMemory.addEventListener( listener ); DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda(); assertEquals( 0, agenda.getRuleFlowGroup( "flowgroup-1" ).size() ); // We need to call fireAllRules here to get the InitialFact into the system, to the eval(true)'s kick in workingMemory.fireAllRules(); // Now we have 4 in the RuleFlow, but not yet in the agenda assertEquals( 4, agenda.getRuleFlowGroup( "flowgroup-1" ).size() ); // Check they aren't in the Agenda assertEquals( 0, agenda.getAgendaGroup( "MAIN" ).size() ); // Start the process, which shoudl populate the Agenda final ProcessInstance processInstance = workingMemory.startProcess( "ruleFlowClear" ); assertEquals( 4, agenda.getAgendaGroup( "MAIN" ).size() ); // Check we have 0 activation cancellation events assertEquals( 0, activations.size() ); workingMemory.getAgenda().clearAndCancelRuleFlowGroup( "flowgroup-1" ); // Check the AgendaGroup and RuleFlowGroup are now empty assertEquals( 0, agenda.getAgendaGroup( "MAIN" ).size() ); assertEquals( 0, agenda.getRuleFlowGroup( "flowgroup-1" ).size() ); // Check we have four activation cancellation events assertEquals( 4, activations.size() ); } public void testRuleFlowInPackage() throws Exception { final PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) ); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) ); final Package pkg = builder.getPackage(); RuleBase ruleBase = getRuleBase(); ruleBase.addPackage( pkg ); ruleBase = SerializationHelper.serializeObject( ruleBase ); final WorkingMemory workingMemory = ruleBase.newStatefulSession(); final List list = new ArrayList(); workingMemory.setGlobal( "list", list ); workingMemory.fireAllRules(); assertEquals( 0, list.size() ); final ProcessInstance processInstance = workingMemory.startProcess( "0" ); assertEquals( ProcessInstance.STATE_ACTIVE, processInstance.getState() ); workingMemory.fireAllRules(); assertEquals( 4, list.size() ); assertEquals( "Rule1", list.get( 0 ) ); assertEquals( "Rule3", list.get( 1 ) ); assertEquals( "Rule2", list.get( 2 ) ); assertEquals( "Rule4", list.get( 3 ) ); assertEquals( ProcessInstance.STATE_COMPLETED, processInstance.getState() ); } public void testLoadingRuleFlowInPackage1() throws Exception { // adding ruleflow before adding package final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) ); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) ); builder.getPackage(); } public void testLoadingRuleFlowInPackage2() throws Exception { // only adding ruleflow final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) ); builder.getPackage(); } public void testLoadingRuleFlowInPackage3() throws Exception { // only adding ruleflow without any generated rules final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) ); builder.getPackage(); } public void FIXME_testLoadingRuleFlowInPackage4() throws Exception { // adding ruleflows of different package final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) ); try { builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) ); throw new Exception( "An exception should have been thrown." ); } catch ( PackageMergeException e ) { // do nothing } } public void FIXME_testLoadingRuleFlowInPackage5() throws Exception { // adding ruleflow of different package than rules final PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) ); try { builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) ); throw new Exception( "An exception should have been thrown." ); } catch ( PackageMergeException e ) { // do nothing } } public void FIXME_testLoadingRuleFlowInPackage6() throws Exception { // adding rules of different package than ruleflow final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) ); try { builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) ); throw new Exception( "An exception should have been thrown." ); } catch ( PackageMergeException e ) { // do nothing } } public void testRuleFlowActionDialects() throws Exception { final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ActionDialects.rfm" ) ) ); RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage( builder.getPackage() ); ruleBase = SerializationHelper.serializeObject( ruleBase ); StatefulSession session = ruleBase.newStatefulSession(); List list = new ArrayList(); session.setGlobal( "list", list ); session.startProcess( "ActionDialects" ); assertEquals( 2, list.size() ); assertEquals( "mvel was here", list.get( 0 ) ); assertEquals( "java was here", list.get( 1 ) ); } public void testLoadingRuleFlowInPackage7() throws Exception { // loading a ruleflow with errors final PackageBuilder builder = new PackageBuilder(); builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "error_ruleflow.rfm" ) ) ); assertEquals( 1, builder.getErrors().getErrors().length ); } }