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.generator.AbstractProcessEngineGraphGenerator;
import org.activiti.crystalball.simulator.impl.StartProcessEventHandler;
import org.activiti.crystalball.simulator.impl.persistence.entity.ResultEntity;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.assertTrue;
public class OptimizeBottleneckTest {
protected static final String tempDir = System.getProperty("tempDir", "target");
protected static final String LIVE_DB = tempDir +"/live-SimulateBottleneckTest";
protected static final String PROCESS_KEY = "parallelusertaskprocess";
@Test
public void testUser2OverLoadedWithHelp3() throws Exception {
System.setProperty("liveDB", LIVE_DB);
System.setProperty("_SIM_DB_PATH", tempDir+"/simulationRunDB-SimulateBottleNeck-Overload3-"+Thread.currentThread().getId());
FileUtils.copyFile( new File(LIVE_DB+".h2.db"), new File(tempDir+"/simulationRunDB-SimulateBottleNeck-Overload3-"+Thread.currentThread().getId()+".h2.db"));
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("/org/activiti/crystalball/simulator/SimEngine-simulateBottleneck-h2-context.xml");
ProcessEngine processEngine = (ProcessEngine) appContext.getBean("simProcessEngine");
// increase frequency of process starts to 45 mins (default is 1 hour)
StartProcessEventHandler startProcessEventHandler = appContext.getBean(StartProcessEventHandler.class);
startProcessEventHandler.setPeriod(2700000);
// add User3 to the Group2 to help user2
IdentityService identityService = (IdentityService) appContext.getBean("simIdentityService");
identityService.createMembership("user3", "Group2");
runSimulation(appContext, tempDir + "/OptimizeBottleneckTest3.png", tempDir + "/OptimizeBottleneckTest3-dueDate.png");
processEngine.close();
appContext.close();
File expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest3.png" );
File generated = new File(tempDir + "/OptimizeBottleneckTest3.png");
assertTrue( FileUtils.contentEquals(expected, generated));
expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest3-dueDate.png" );
generated = new File(tempDir + "/OptimizeBottleneckTest3-dueDate.png");
assertTrue( FileUtils.contentEquals(expected, generated));
// delete database file
File f = new File( System.getProperty("_SIM_DB_PATH") +".h2.db");
if ( !f.delete() )
System.err.println("unable to delete file");
}
@Test
public void testUser2OverLoadedWithHelp4() throws Exception {
System.setProperty("liveDB", LIVE_DB);
System.setProperty("_SIM_DB_PATH", tempDir+"/simulationRunDB-SimulateBottleNeck-Overload4-"+Thread.currentThread().getId());
FileUtils.copyFile( new File(LIVE_DB+".h2.db"), new File(tempDir+"/simulationRunDB-SimulateBottleNeck-Overload4-"+Thread.currentThread().getId()+".h2.db"));
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("/org/activiti/crystalball/simulator/SimEngine-simulateBottleneck-h2-context.xml");
ProcessEngine processEngine = (ProcessEngine) appContext.getBean("simProcessEngine");
// increase frequency of process starts to 45 mins (default is 1 hour)
StartProcessEventHandler startProcessEventHandler = appContext.getBean(StartProcessEventHandler.class);
startProcessEventHandler.setPeriod(2700000);
// add user4 to the Group2 to help user2
IdentityService identityService = (IdentityService) appContext.getBean("simIdentityService");
identityService.createMembership("user4", "Group2");
runSimulation(appContext,tempDir + "/OptimizeBottleneckTest4.png", tempDir + "/OptimizeBottleneckTest4-dueDate.png");
processEngine.close();
appContext.close();
File expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest4.png" );
File generated = new File(tempDir + "/OptimizeBottleneckTest4.png");
assertTrue( FileUtils.contentEquals(expected, generated));
expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest4-dueDate.png" );
generated = new File(tempDir + "/OptimizeBottleneckTest4-dueDate.png");
assertTrue( FileUtils.contentEquals(expected, generated));
// delete database file
File f = new File( System.getProperty("_SIM_DB_PATH") +".h2.db");
if ( !f.delete() )
System.err.println("unable to delete file");
}
@Test
public void testUser2OverLoadedWithHelp5() throws Exception {
System.setProperty("liveDB", LIVE_DB);
System.setProperty("_SIM_DB_PATH", tempDir+"/simulationRunDB-SimulateBottleNeck-Overload5-"+Thread.currentThread().getId());
FileUtils.copyFile( new File(LIVE_DB+".h2.db"), new File(tempDir+"/simulationRunDB-SimulateBottleNeck-Overload5-"+Thread.currentThread().getId()+".h2.db"));
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("/org/activiti/crystalball/simulator/SimEngine-simulateBottleneck-h2-context.xml");
ProcessEngine processEngine = (ProcessEngine) appContext.getBean("simProcessEngine");
// increase frequency of process starts to 45 mins (default is 1 hour)
StartProcessEventHandler startProcessEventHandler = appContext.getBean(StartProcessEventHandler.class);
startProcessEventHandler.setPeriod(2700000);
// add new user5 to the Group2 to help user2
IdentityService identityService = (IdentityService) appContext.getBean("simIdentityService");
identityService.saveUser( identityService.newUser("user5") );
identityService.createMembership("user5", "Group2");
runSimulation(appContext,tempDir + "/OptimizeBottleneckTest5.png", tempDir + "/OptimizeBottleneckTest5-dueDate.png");
processEngine.close();
appContext.close();
File expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest5.png" );
File generated = new File(tempDir + "/OptimizeBottleneckTest5.png");
assertTrue( FileUtils.contentEquals(expected, generated));
expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest5-dueDate.png" );
generated = new File(tempDir + "/OptimizeBottleneckTest5-dueDate.png");
assertTrue( FileUtils.contentEquals(expected, generated));
// delete database file
File f = new File( System.getProperty("_SIM_DB_PATH") +".h2.db");
if ( !f.delete() )
System.err.println("unable to delete file");
}
@Test
public void testUser2OverLoadedWithHelp45() throws Exception {
System.setProperty("liveDB", LIVE_DB);
System.setProperty("_SIM_DB_PATH", tempDir+"/simulationRunDB-SimulateBottleNeck-Overload45-"+Thread.currentThread().getId());
FileUtils.copyFile( new File(LIVE_DB+".h2.db"), new File(tempDir+"/simulationRunDB-SimulateBottleNeck-Overload45-"+Thread.currentThread().getId()+".h2.db"));
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("/org/activiti/crystalball/simulator/SimEngine-simulateBottleneck-h2-context.xml");
ProcessEngine processEngine = (ProcessEngine) appContext.getBean("simProcessEngine");
// increase frequency of process starts to 45 mins (default is 1 hour)
StartProcessEventHandler startProcessEventHandler = appContext.getBean(StartProcessEventHandler.class);
startProcessEventHandler.setPeriod(2700000);
// add new user5 to the Group2 to help user2 and to Group4 to help user4
IdentityService identityService = (IdentityService) appContext.getBean("simIdentityService");
identityService.saveUser( identityService.newUser("user5"));
identityService.createMembership("user5", "Group2");
identityService.createMembership("user5", "Group4");
runSimulation(appContext, tempDir + "/OptimizeBottleneckTest45.png", tempDir + "/OptimizeBottleneckTest45-dueDate.png");
processEngine.close();
appContext.close();
File expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest45.png" );
File generated = new File(tempDir + "/OptimizeBottleneckTest45.png");
assertTrue( FileUtils.contentEquals(expected, generated));
expected = new File(System.getProperty("baseDir", ".") + "/src/test/resources/org/activiti/crystalball/simulator/OptimizeBottleneckTest45-dueDate.png" );
generated = new File(tempDir + "/OptimizeBottleneckTest45-dueDate.png");
assertTrue( FileUtils.contentEquals(expected, generated));
// delete database file
File f = new File( System.getProperty("_SIM_DB_PATH") +".h2.db");
if ( !f.delete() )
System.err.println("unable to delete file");
}
/**
* run simulation for 30 days and generate report
*
* @param appContext
* @throws Exception
*/
protected void runSimulation(AbstractApplicationContext appContext, String instancesGeneratedImage, String dueDateGeneratedImage) throws Exception {
SimulationRun simRun = (SimulationRun)appContext.getBean(SimulationRun.class);
Calendar c = Calendar.getInstance();
c.clear();
c.set(2013, 1, 1);
Date startDate = c.getTime();
// add 30 days to start day
c.add( Calendar.DAY_OF_YEAR, 30);
Date finishDate = c.getTime();
// run simulation for 30 days
@SuppressWarnings("unused")
List<ResultEntity> resultEventList = simRun.execute(startDate, finishDate);
RepositoryService simRepositoryService = (RepositoryService) appContext.getBean("simRepositoryService");
String processDefinitionId = simRepositoryService.createProcessDefinitionQuery().processDefinitionKey(PROCESS_KEY).singleResult().getId();
// GENERATE REPORTS
// instances report
AbstractProcessEngineGraphGenerator generator = (AbstractProcessEngineGraphGenerator) appContext.getBean( "reportGenerator");
generator.generateReport(processDefinitionId, startDate, finishDate, instancesGeneratedImage);
// after due date report
generator = (AbstractProcessEngineGraphGenerator) appContext.getBean( "dueDateReportGenerator");
generator.generateReport(processDefinitionId, startDate, finishDate, dueDateGeneratedImage);
}
}