package org.jbpm.sim.tutorial; import java.util.HashMap; import java.util.Iterator; import org.dom4j.Element; import org.jbpm.sim.def.JbpmSimulationExperiment; import org.jbpm.sim.def.JbpmSimulationScenario; import org.jbpm.sim.exe.ExperimentReader; import org.jbpm.sim.report.ExperimentReport; import org.jbpm.sim.report.jasper.ScenarioComparisionReport; import org.xml.sax.InputSource; /** * Simple example demonstrating how to overwrite the ExperimentReader * to instrument it to gnerate multiple scenarios based on some * more or less sophisticated algorithm. * * This example uses a very poor one, which just provides staffing strategies * with the given pool sizes (this is done in the super class) * pool sizes + 1 and pool sizes + 2 (these are added here) * * @author ruecker * */ public class StaffingExperimentReader extends ExperimentReader { private long addCount = 2; /** * flag to avoid endless loop */ private boolean afterScenarioReadActive = false; public StaffingExperimentReader(InputSource inputSource) { super(inputSource); } public StaffingExperimentReader(String experimentXml) { super(experimentXml); } protected void afterScenarioRead(JbpmSimulationScenario scenario, Element scenarioElement, Element baseScenarioElement) { if (afterScenarioReadActive) return; afterScenarioReadActive = true; HashMap pools = new HashMap(); HashMap costs = new HashMap(); Iterator poolElementIter = scenarioElement.elementIterator("resource-pool"); while (poolElementIter.hasNext()) { Element resourcePoolElement = (Element) poolElementIter.next(); String poolName = resourcePoolElement.attributeValue("name"); String poolSizeText = resourcePoolElement.attributeValue("pool-size"); Integer poolSize = new Integer(poolSizeText); pools.put(poolName, poolSize); costs.put(poolName, readCostPerTimeUnit(resourcePoolElement)); } // add more scenarios with more people // (so the provided people count is the lower limit) for (int add = 1; add <= addCount; add++) { JbpmSimulationScenario generatedScenario = readScenario(scenarioElement, baseScenarioElement); generatedScenario.changeName(scenario.getName() + "+" + add); for (Iterator iterator = pools.keySet().iterator(); iterator.hasNext();) { String name = (String) iterator.next(); Integer size = (Integer) pools.get(name); size = new Integer(size.intValue() + add); generatedScenario.addResourcePool(name, size, (Double)costs.get(name)); } addScenario(generatedScenario); } afterScenarioReadActive = false; } protected void beforeScenarioRead(JbpmSimulationScenario scenario, Element scenarioElement, Element baseScenarioElement) { } public static void main(String[] args) { String experimentConf = "/org/jbpm/sim/tutorial/business//simulationExperiment.xml"; StaffingExperimentReader reader = new StaffingExperimentReader( new InputSource(StaffingExperimentReader.class.getResourceAsStream(experimentConf))); JbpmSimulationExperiment experiment = reader.readExperiment(); experiment.setWriteDesmojHtmlOutput(true); experiment.setRememberEndedProcessInstances(false); experiment.run(); // can take some time ExperimentReport report = experiment.getReport(); ScenarioComparisionReport r = new ScenarioComparisionReport(report); r.show(); } }