package org.activiti.crystalball.examples.mortages.monitoring;
import org.activiti.crystalball.generator.ProbabilityGraphGenerator;
import org.activiti.crystalball.simulator.SimulationEngine;
import org.activiti.crystalball.simulator.impl.cfg.SimulationEngineConfigurationImpl;
import org.activiti.crystalball.simulator.impl.persistence.entity.ResultEntity;
import org.activiti.crystalball.simulator.result.ResultQuery;
import org.activiti.crystalball.simulator.runtime.SimulationInstance;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* present simulation engine monitoring capabilities
*
*/
public class MonitoringTest {
/**
* How is the probability that timer will expire? and escalation will occure?
* @throws Exception
*/
@Test
public void escalationProbabilityTest() throws Exception {
SimulationEngine simulationEngine= SimulationEngineConfigurationImpl.createStandaloneSimulationEngineConfiguration().buildSimulationEngine();
Calendar c = Calendar.getInstance();
Date start = c.getTime();
c.add(Calendar.HOUR, 3);
Date end = c.getTime();
SimulationInstance simulationInstance = simulationEngine.getRuntimeService()
.startSimulationInstanceByKey("Monitor escalation", "simple simulation to check whether escalation will ocure", (String) null, start, end, 11, 1L,
"/org/activiti/crystalball/examples/monitoring/mortages-monitoring-h2-context.xml");
// wait to finish simulation asynchronously
do {
// wait for simulation end.
Thread.sleep(500);
} while( simulationEngine.getRuntimeService().isRunning(simulationInstance.getId()) );
ResultQuery resultQuery = simulationEngine.getRuntimeService().createResultQuery().simulationInstanceId( simulationInstance.getId() );
List<ResultEntity> resultList = resultQuery.list();
assertEquals(7, resultList.size());
ProbabilityGraphGenerator generator = new ProbabilityGraphGenerator();
generator.generateGraph(simulationEngine.getRuntimeService(), simulationInstance, "mortagedemo-0:1:4", "mortagedemo-0", "activity_exists", System.getProperty("tempDir", "target") + "/monitoringTest.jpg");
}
/**
* Simulation experiment is almost the same as previous one. But ....
* Escalation is implemented as UserTask. In case when escalation is not terminated before process end state is reached.
* Integration constraint violation exception is thrown.
* see http://forums.activiti.org/content/when-opened-timer-simultaneously-process-does-not-know-he-ends-until-time-timer-comes-end
*
* One more good point to use simulation for testing.
*
* @throws InterruptedException
*/
@Test @Ignore()
public void escalationFailureTest() throws InterruptedException {
SimulationEngine simulationEngine= SimulationEngineConfigurationImpl.createStandaloneSimulationEngineConfiguration().buildSimulationEngine();
Calendar c = Calendar.getInstance();
Date start = c.getTime();
c.add(Calendar.HOUR, 3);
Date end = c.getTime();
SimulationInstance simulationInstance = simulationEngine.getRuntimeService()
.startSimulationInstanceByKey("Monitor escalation", "simple simulation to check whether escalation will ocure", (String) null, start, end, 10, 7L,
"/org/activiti/crystalball/examples/monitoring/mortages-monitoring-failure-h2-context.xml");
// wait to finish simulation asynchronously
do {
// wait for simulation end.
Thread.sleep(500);
} while( simulationEngine.getRuntimeService().isRunning(simulationInstance.getId()) );
ResultQuery resultQuery = simulationEngine.getRuntimeService().createResultQuery().simulationInstanceId( simulationInstance.getId() );
List<ResultEntity> resultList = resultQuery.list();
assertEquals(10, resultList.size());
}
}