package org.activiti.crystalball.simulator; /* * #%L * simulator * %% * Copyright (C) 2012 - 2013 crystalball * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import org.activiti.crystalball.diagram.AuditTrailProcessDiagramGenerator; import org.activiti.engine.*; import org.activiti.engine.RuntimeService; import org.activiti.engine.impl.RepositoryServiceImpl; import org.activiti.engine.impl.util.ClockUtil; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; import java.util.*; /** * generate basic process engine state on which simulation is performed * */ public class GenerateProcessEngineState { static String TEMP_DIR; public static void main(String[] args) throws InterruptedException, IOException { TEMP_DIR = args[0]; if (TEMP_DIR == null) TEMP_DIR = "target"; generateLiveDB(); generateBasicEngine(); generatePlaybackOriginal(); } private static void generateBasicEngine() throws InterruptedException { String PROCESS_KEY = "threetasksprocess"; RepositoryService repositoryService; RuntimeService runtimeService; TaskService taskService; IdentityService identityService; ProcessEngine processEngine; String liveDB = TEMP_DIR + "/BasicSimulation"; // delete previous DB instalation and set property to point to the current file File prevDB = new File(liveDB+".h2.db"); String previousLiveDB = System.getProperty("liveDB"); System.setProperty("liveDB", liveDB); if ( prevDB.exists() ) prevDB.delete(); prevDB = null; ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("org/activiti/crystalball/simulator/LiveEngine-context.xml"); repositoryService = appContext.getBean( RepositoryService.class ); runtimeService = appContext.getBean( RuntimeService.class ); taskService = appContext.getBean( TaskService.class ); identityService = appContext.getBean( IdentityService.class ); processEngine = appContext.getBean( ProcessEngine.class); // deploy processes repositoryService.createDeployment() .addClasspathResource("org/activiti/crystalball/simulator/ThreeTasksProcess.bpmn") .deploy(); // init identity service identityService.saveGroup( identityService.newGroup("Group1") ); identityService.saveGroup( identityService.newGroup("Group2") ); identityService.saveUser( identityService.newUser("user1") ); identityService.saveUser( identityService.newUser("user2") ); identityService.createMembership("user1", "Group1"); identityService.createMembership("user2", "Group2"); // start processes Calendar calendar = Calendar.getInstance(); calendar.set(2012, 11, 7, 18, 1, 00); Date dueDateFormal = calendar.getTime(); calendar.set(2012, 11, 7, 18, 1, 30); Date dueDateValue = calendar.getTime(); Map<String, Object> variables = new HashMap<String,Object>(); variables.put("dueDateFormal", dueDateFormal); variables.put("dueDateValue", dueDateValue); for (int i = 0; i < 10; i++) { runtimeService.startProcessInstanceByKey( PROCESS_KEY, "BUSINESS-KEY-" + i, variables); } // put first 5 tasks to the next node List<Task> taskList = taskService.createTaskQuery().taskCandidateUser("user1").list(); for (int i = 0; i < 5; i++) { Task t = taskList.get(i); taskService.claim( t.getId(), "user1" ); } // wait some time to have some data in history Thread.sleep(500); // complete these tasks for (int i = 0; i < 5; i++) { Task t = taskList.get(i); taskService.complete( t.getId() ); } processEngine.close(); appContext.close(); if (previousLiveDB != null) System.setProperty("liveDB", previousLiveDB); else System.setProperty("liveDB", ""); } private static void generateLiveDB() throws InterruptedException { RepositoryService repositoryService; IdentityService identityService; ProcessEngine processEngine; String LIVE_DB = TEMP_DIR + "/live-SimulateBottleneckTest"; String previousLiveDB = System.getProperty("liveDB"); System.setProperty("liveDB", LIVE_DB); // delete previous DB instalation and set property to point to the current file File prevDB = new File(LIVE_DB+".h2.db"); if ( prevDB.exists() ) prevDB.delete(); prevDB = null; ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("org/activiti/crystalball/simulator/LiveEngine-context.xml"); repositoryService = appContext.getBean( RepositoryService.class ); identityService = appContext.getBean( IdentityService.class ); processEngine = appContext.getBean( ProcessEngine.class); // deploy processes repositoryService.createDeployment() .addClasspathResource("org/activiti/crystalball/simulator/ParallelUserTasksProcess.bpmn") .deploy(); // init identity service identityService.saveGroup( identityService.newGroup("Group1") ); identityService.saveGroup( identityService.newGroup("Group2") ); identityService.saveGroup( identityService.newGroup("Group3") ); identityService.saveGroup( identityService.newGroup("Group4") ); identityService.saveUser( identityService.newUser("user1") ); identityService.saveUser( identityService.newUser("user2") ); identityService.saveUser( identityService.newUser("user3") ); identityService.saveUser( identityService.newUser("user4") ); identityService.createMembership("user1", "Group1"); identityService.createMembership("user2", "Group2"); identityService.createMembership("user3", "Group3"); identityService.createMembership("user4", "Group4"); identityService.createUserQuery().list(); processEngine.close(); appContext.close(); if (previousLiveDB != null) System.setProperty("liveDB", previousLiveDB); else System.setProperty("liveDB", ""); } private static void generatePlaybackOriginal() throws InterruptedException, IOException { String PROCESS_KEY = "playback"; RepositoryService repositoryService; RuntimeService runtimeService; TaskService taskService; IdentityService identityService; HistoryService historyService; ProcessEngine processEngine; String liveDB = TEMP_DIR + "/Playback"; // delete previous DB instalation and set property to point to the current file File prevDB = new File(liveDB+".h2.db"); String previousLiveDB = System.getProperty("liveDB"); System.setProperty("liveDB", liveDB); if ( prevDB.exists() ) prevDB.delete(); prevDB = null; ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("org/activiti/crystalball/simulator/LiveEngine-context.xml"); Calendar calendar = Calendar.getInstance(); calendar.set(2013, 01, 25, 14, 30, 00); ClockUtil.setCurrentTime( calendar.getTime()); repositoryService = appContext.getBean( RepositoryService.class ); runtimeService = appContext.getBean( RuntimeService.class ); taskService = appContext.getBean( TaskService.class ); identityService = appContext.getBean( IdentityService.class ); historyService = appContext.getBean( HistoryService.class ); processEngine = appContext.getBean( ProcessEngine.class); // deploy processes repositoryService.createDeployment() .addClasspathResource("org/activiti/crystalball/simulator/Playback.bpmn") .deploy(); // init identity service identityService.saveGroup( identityService.newGroup("Group1") ); identityService.saveUser( identityService.newUser("user1") ); identityService.createMembership("user1", "Group1"); // start processes Map<String, Object> variables2 = new HashMap<String,Object>(); variables2.put("x", 3); Map<String, Object> variables1 = new HashMap<String,Object>(); variables1.put("x", 1); Map<String, Object> variables0 = new HashMap<String,Object>(); variables0.put("x", 0); ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey( PROCESS_KEY, "BUSINESS-KEY-1" , variables0); calendar.add( Calendar.SECOND, 1); ClockUtil.setCurrentTime( calendar.getTime()); ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey( PROCESS_KEY, "BUSINESS-KEY-2" , variables1); calendar.add( Calendar.SECOND, 1); ClockUtil.setCurrentTime( calendar.getTime()); runtimeService.startProcessInstanceByKey( PROCESS_KEY, "BUSINESS-KEY-3" , variables0); // put first 5 tasks to the next node List<Task> taskList = taskService.createTaskQuery().taskCandidateUser("user1").list(); for ( Task t : taskList) { taskService.claim( t.getId(), "user1" ); } // complete these tasks for (Task t : taskList) { // wait some time to have some data in history calendar.add( Calendar.SECOND, 1); ClockUtil.setCurrentTime( calendar.getTime()); // complete task taskService.complete( t.getId(), variables2 ); } // audit trail images generator AuditTrailProcessDiagramGenerator generator = new AuditTrailProcessDiagramGenerator(); generator.setHistoryService(historyService); generator.setRepositoryService((RepositoryServiceImpl) repositoryService); generator.setWriteUpdates(true); Map<String, Object> params = new HashMap<String,Object>(); params.put( AuditTrailProcessDiagramGenerator.PROCESS_INSTANCE_ID, processInstance1.getId()); ImageIO.write( ImageIO.read(generator.generateLayer("png", params)) , "png" , new File( TEMP_DIR+"/playback-auditTrail1.png")); params.clear(); params.put( AuditTrailProcessDiagramGenerator.PROCESS_INSTANCE_ID, processInstance2.getId()); ImageIO.write( ImageIO.read(generator.generateLayer("png", params)) , "png" , new File( TEMP_DIR+"/playback-auditTrail2.png")); processEngine.close(); appContext.close(); if (previousLiveDB != null) System.setProperty("liveDB", previousLiveDB); else System.setProperty("liveDB", ""); } }