package com.plectix.simulator.ruleapplication; import java.util.List; import org.apache.commons.cli.ParseException; import org.junit.After; import org.junit.Before; import com.plectix.simulator.DirectoryTestsRunner; import com.plectix.simulator.SimulatorTestOptions; import com.plectix.simulator.io.SimulationDataReader; import com.plectix.simulator.simulationclasses.injections.Injection; import com.plectix.simulator.simulator.KappaSystem; import com.plectix.simulator.simulator.SimulationData; import com.plectix.simulator.simulator.Simulator; import com.plectix.simulator.simulator.SimulatorCommandLine; import com.plectix.simulator.simulator.ThreadLocalData; import com.plectix.simulator.simulator.options.SimulatorFlagOption; import com.plectix.simulator.staticanalysis.Rule; import com.plectix.simulator.staticanalysis.Site; import com.plectix.simulator.staticanalysis.stories.storage.StoryStorageException; import com.plectix.simulator.util.SimulatorRenewer; import com.plectix.simulator.util.Info.InfoType; import com.plectix.simulator.util.io.PlxLogger; public class InitTestAction extends DirectoryTestsRunner { private Simulator simulator; private static final PlxLogger LOGGER = ThreadLocalData .getLogger(InitTestAction.class); private double currentTime = 0.; private Rule activeRule; private static int iterationNumber = 0; private static int iterationsLimit = 70; private final String filePath; private final Integer operationMode; public InitTestAction(String testFilePath, Integer opMode) { this.filePath = testFilePath; this.operationMode = opMode; } private static SimulatorTestOptions prepareTestArgs(String filePath, Integer opMode) { SimulatorTestOptions options = new SimulatorTestOptions(); options.append(SimulatorFlagOption.ALLOW_INCOMPLETE_SUBSTANCE); options.append(SimulatorFlagOption.DEBUG_INIT); options.append(SimulatorFlagOption.NO_MAPS); options.appendSimulation(filePath); options.appendOperationMode(opMode); return options; } @Before public void init() throws Exception { simulator = new Simulator(); SimulationData simulationData = simulator.getSimulationData(); SimulatorCommandLine commandLine = null; try { commandLine = prepareTestArgs(filePath, operationMode).toCommandLine(); } catch (ParseException e) { e.printStackTrace(); throw new IllegalArgumentException(e); } simulationData.setSimulationArguments(InfoType.OUTPUT, commandLine .getSimulationArguments()); (new SimulationDataReader(simulationData)).readAndCompile(); simulationData.getKappaSystem().initialize(); // run(); } @Override public void reset(String filePath, Integer opMode) throws Exception { SimulatorCommandLine commandLine = null; try { commandLine = prepareTestArgs(filePath, opMode).toCommandLine(); } catch (ParseException e) { e.printStackTrace(); throw new IllegalArgumentException(e); } simulator.getSimulationData().setSimulationArguments(InfoType.OUTPUT, commandLine.getSimulationArguments()); SimulatorRenewer.renew(simulator); } @After public void teardown() throws Exception { if (iterationNumber != iterationsLimit) { reset(filePath, operationMode); } } protected List<Injection> run() { KappaSystem kappaSystem = simulator.getSimulationData() .getKappaSystem(); kappaSystem.updateRuleActivities(); activeRule = kappaSystem.getRandomRule(); if (activeRule == null) { System.exit(0); } if (LOGGER.isDebugEnabled()) LOGGER.debug("Rule: " + activeRule.getName()); List<Injection> injectionsList = kappaSystem .chooseInjectionsForRuleApplication(activeRule); currentTime += simulator.getSimulationData().getKappaSystem() .getTimeValue(); // apply(injectionsList); return injectionsList; } protected void apply(List<Injection> injectionsList) throws StoryStorageException { if (!isClash(injectionsList)) { // negative update if (LOGGER.isDebugEnabled()) LOGGER.debug("negative update"); activeRule.applyRule(injectionsList, simulator.getSimulationData()); } else { if (LOGGER.isDebugEnabled()) LOGGER.debug("Clash"); } } private boolean isClash(List<Injection> injections) { if (injections.size() == 2) { for (Site siteCC1 : injections.get(0).getSiteList()) for (Site siteCC2 : injections.get(1).getSiteList()) if (siteCC1.getParentAgent().getId() == siteCC2 .getParentAgent().getId()) return true; } return false; } @Override public String getPrefixFileName() { return null; } public Rule getActiveRule() { return activeRule; } public SimulationData getSimulationData() { return simulator.getSimulationData(); } }