package com.plectix.simulator.simulator.api.steps;
import java.io.IOException;
import java.util.List;
import com.plectix.simulator.parser.KappaFile;
import com.plectix.simulator.parser.KappaFileReader;
import com.plectix.simulator.parser.SimulationDataFormatException;
import com.plectix.simulator.parser.abstractmodel.reader.RulesParagraphReader;
import com.plectix.simulator.parser.builders.RuleBuilder;
import com.plectix.simulator.parser.util.AgentFactory;
import com.plectix.simulator.simulator.KappaSystem;
import com.plectix.simulator.simulator.SimulationArguments;
import com.plectix.simulator.simulator.SimulationData;
import com.plectix.simulator.simulator.api.OperationType;
import com.plectix.simulator.simulator.api.SimulatorState;
import com.plectix.simulator.staticanalysis.Rule;
import com.plectix.simulator.staticanalysis.contactmap.ContactMapMode;
public class KappaFileLoadingOperation extends AbstractOperation<KappaFile> {
private final SimulationData simulationData;
private String kappaFileId;
private char[] charKappaInput;
public KappaFileLoadingOperation(SimulationData simulationData, String kappaFileId) {
super(simulationData, OperationType.KAPPA_FILE_LOADING);
this.simulationData = simulationData;
this.kappaFileId = kappaFileId;
simulationData.getSimulationArguments().setInputFileName(kappaFileId);
}
public KappaFileLoadingOperation(SimulationData simulationData, char[] inputCharArray) {
super(simulationData, OperationType.KAPPA_FILE_LOADING);
this.simulationData = simulationData;
simulationData.getSimulationArguments().setInputCharArray(inputCharArray);
charKappaInput = inputCharArray;
}
public KappaFileLoadingOperation(SimulationData simulationData) {
super(simulationData, OperationType.KAPPA_FILE_LOADING);
this.simulationData = simulationData;
this.kappaFileId = simulationData.getSimulationArguments().getInputFileName();
this.charKappaInput = simulationData.getSimulationArguments().getInputCharArray();
}
protected KappaFile performDry() throws RuntimeException,
SimulationDataFormatException, IOException {
SimulationArguments simulationArguments = simulationData.getSimulationArguments();
if (!simulationData.argumentsInitialized()) {
throw new RuntimeException(
"Simulator Arguments must be set before reading the simulation file!");
}
KappaSystem kappaSystem = simulationData.getKappaSystem();
// simulationData.getClock().resetBar();
kappaSystem.getObservables().setOcamlStyleObsName(
simulationArguments.isOcamlStyleNameingInUse());
kappaSystem.getObservables().setUnifiedTimeSeriesOutput(
simulationArguments.isUnifiedTimeSeriesOutput());
if (simulationArguments.getSnapshotsTimeString() != null) {
simulationData.setSnapshotTime(simulationArguments
.getSnapshotsTimeString());
}
KappaFileReader kappaFileReader = null;
if (kappaFileId != null) {
kappaFileReader = new KappaFileReader(kappaFileId, true);
} else if (charKappaInput != null){
kappaFileReader = new KappaFileReader(charKappaInput);
} else {
throw new NoKappaInputException();
}
if (simulationArguments.getFocusFilename() != null) {
this.setFocusOn(simulationArguments.getFocusFilename());
} else {
kappaSystem.getContactMap().setMode(ContactMapMode.SEMANTIC);
}
KappaFile kappaFile = kappaFileReader.parse();
simulationData.setKappaInput(kappaFile);
if (kappaFileId != null) {
simulationData.getKappaSystem().getState().setLatestLoadedFileName(kappaFileId);
}
return kappaFile;
}
private final void setFocusOn(String fileNameFocusOn) throws IOException,
SimulationDataFormatException {
KappaSystem kappaSystem = simulationData.getKappaSystem();
SimulationArguments simulationArguments = simulationData
.getSimulationArguments();
KappaFileReader kappaFileReader = new KappaFileReader(fileNameFocusOn,
true);
KappaFile kappaFile = kappaFileReader.parse();
List<Rule> ruleList = (new RuleBuilder(new KappaSystem(simulationData)))
.build(new RulesParagraphReader(simulationArguments,
new AgentFactory(false)).readComponent(kappaFile
.getRules()), null);
kappaSystem.getContactMap().setSimulationData(kappaSystem);
if (ruleList != null && !ruleList.isEmpty()) {
kappaSystem.getContactMap().setFocusRule(ruleList.get(0));
kappaSystem.getContactMap().setMode(ContactMapMode.FOCUS_ON_AGENT_OR_RULE);
} else {
kappaSystem.getContactMap().setFocusRule(null);
}
}
@Override
protected boolean noNeedToPerform() {
SimulatorState state = simulationData.getKappaSystem().getState();
String latestFile = state.getLatestLoadedFileName();
if (latestFile == null) {
return false;
}
return simulationData.getKappaInput() != null
&& state.getLatestLoadedFileName().equals(simulationData.getSimulationArguments().getInputFileName());
}
@Override
protected KappaFile retrievePreparedResult() {
return simulationData.getKappaInput();
}
}