/* * Copyright (c) NASK, NCSC * * This file is part of HoneySpider Network 2.1. * * This is a free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package pl.nask.hsn2.activiti; import java.util.Arrays; import java.util.List; import org.activiti.engine.impl.bpmn.behavior.ParallelGatewayActivityBehavior; import org.activiti.engine.impl.pvm.ProcessDefinitionBuilder; import org.activiti.engine.impl.pvm.PvmProcessDefinition; import org.activiti.engine.impl.pvm.PvmProcessInstance; import org.testng.Assert; import org.testng.annotations.Test; import pl.nask.hsn2.activiti.behavior.TransientParallelGatewayBehavior; import pl.nask.hsn2.framework.suppressor.SingleThreadTasksSuppressor; import pl.nask.hsn2.framework.workflow.hwl.Parallel; import pl.nask.hsn2.framework.workflow.hwl.ProcessDefinition; import pl.nask.hsn2.framework.workflow.hwl.Service; import pl.nask.hsn2.suppressor.JobSuppressorHelperImpl; import pl.nask.hsn2.workflow.engine.ExecutionWrapper; @Test public class StaticParallelTest extends AbstractActivitiTest { public void threeFlows() { ProcessDefinitionBuilder builder = pvmFactory.newProcessDefinitionBuilder(); ParallelGatewayActivityBehavior forkBehavior = new TransientParallelGatewayBehavior(); pvmFactory.addStart(builder, "fork"); builder .createActivity("fork") .behavior(forkBehavior ) .transition("flow1") .transition("flow2") .transition("flow3") .endActivity(); builder.createActivity("flow1") .behavior(new PvmApiExampleTest.EmptyActivitiBehavior()) .transition("join") .endActivity(); builder.createActivity("flow2") .behavior(new PvmApiExampleTest.EmptyActivitiBehavior()) .transition("join") .endActivity(); builder.createActivity("flow3") .behavior(new PvmApiExampleTest.EmptyActivitiBehavior()) .transition("join") .endActivity(); builder.createActivity("join") .transition("end") .behavior(new TransientParallelGatewayBehavior()) .endActivity(); pvmFactory.addEnd(builder); PvmProcessDefinition pd = builder.buildProcessDefinition(); PvmProcessInstance pi = pd.createProcessInstance(); pi.start(); assertActive(pi, 3); signalAllActiveExecutions(pi); assertProcessState(pi, "end"); Assert.assertTrue(pi.isEnded()); } public void twoFlows() { ProcessDefinitionBuilder builder = pvmFactory.newProcessDefinitionBuilder(); ParallelGatewayActivityBehavior forkBehavior = new TransientParallelGatewayBehavior(); pvmFactory.addStart(builder, "fork"); builder .createActivity("fork") .behavior(forkBehavior ) .transition("leftFlow") .transition("rightFlow") .endActivity(); builder.createActivity("leftFlow") .behavior(new PvmApiExampleTest.EmptyActivitiBehavior()) .transition("join") .endActivity(); builder.createActivity("rightFlow") .behavior(new PvmApiExampleTest.EmptyActivitiBehavior()) .transition("join") .endActivity(); builder.createActivity("join") .transition("end") .behavior(new TransientParallelGatewayBehavior()) .endActivity(); pvmFactory.addEnd(builder); PvmProcessDefinition pd = builder.buildProcessDefinition(); PvmProcessInstance pi = pd.createProcessInstance(); pi.start(); assertActive(pi, 2); signalAllActiveExecutions(pi); assertProcessState(pi, "end"); Assert.assertTrue(pi.isEnded()); } private PvmProcessDefinition createHwlProcessDef() { Parallel p = new Parallel(); p.addThread(new Service("service1")); p.addThread(new Service("service2")); ProcessDefinition def = new ProcessDefinition("main"); def.addExecutionPoint(p); ActivitiWorkflowBuilder builder = new ActivitiWorkflowBuilder(pvmFactory.behaviourFactory); builder.buildWorkflow("wf", Arrays.asList(def)); List<PvmProcessDefinition> definitions = builder.getRegistry().getDefinitions(); Assert.assertEquals(definitions.size(), 1); return definitions.get(0); } public void hwlTwoFlows() { PvmProcessDefinition pdef = createHwlProcessDef(); PvmProcessInstance instance = pdef.createProcessInstance(); ExecutionWrapper wrapper = new ExecutionWrapper(instance); JobSuppressorHelperImpl jobSuppressorHelper = new JobSuppressorHelperImpl(1, 100, new SingleThreadTasksSuppressor(true)); wrapper.initProcessState(1, jobSuppressorHelper); instance.start(); instance.signal("resume", null); // two executions should be found assertActive(instance, 2); signalAllActiveExecutions(instance); assertEnded(instance); } public void testMultipleInstancesPerformance() { PvmProcessDefinition pdef = createHwlProcessDef(); super.testMultipleInstancesPerformance("THREADS", pdef); } }