package com.plectix.simulator.controller;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicLong;
import com.plectix.simulator.simulator.SimulationData;
import com.plectix.simulator.simulator.api.steps.DumpHelpOperation;
import com.plectix.simulator.simulator.api.steps.NoKappaInputException;
import com.plectix.simulator.simulator.api.steps.OperationManager;
import com.plectix.simulator.util.Info.InfoType;
//**********************************************************************************************************
/**
*
* @author ecemis
*/
public class SimulatorCallable implements Callable<SimulatorResultsData> {
private static AtomicLong SIMULATOR_CALLABLE_COUNT = new AtomicLong(0);
private long id = SIMULATOR_CALLABLE_COUNT.getAndIncrement();
private SimulatorInterface simulator = null;
private SimulatorCallableListener listener = null;
private SimulatorInputData simulatorInputData = null;
//**********************************************************************************************************
/**
* Creates a SimulatorCallable
* @param simulatorInputData
*/
public SimulatorCallable(SimulatorInterface simulatorInterface,
SimulatorInputData simulatorInputData,
SimulatorCallableListener simulatorCallableListener) {
if (simulatorInterface == null || simulatorInputData == null) {
throw new RuntimeException("Unexpected null objects");
}
this.simulator = simulatorInterface;
this.listener = simulatorCallableListener;
this.simulatorInputData = simulatorInputData;
}
//**********************************************************************************************************
/**
*
*/
public SimulatorResultsData call() throws Exception {
SimulatorCallableExitReport simulatorExitReport = simulator.getSimulatorResultsData().getSimulatorExitReport();
try {
simulatorExitReport.setStartTimestamp(System.currentTimeMillis());
simulator.run(simulatorInputData);
} catch (NoKappaInputException e) {
SimulationData simulationData = simulator.getSimulationData();
simulationData.addInfo(InfoType.WARNING, e.getMessage());
OperationManager manager = simulationData.getKappaSystem().getOperationManager();
manager.perform(new DumpHelpOperation(simulationData));
} catch (Exception e) {
e.printStackTrace();
simulatorExitReport.setException(e);
simulator.cleanUpAfterException(e);
} catch (OutOfMemoryError outOfMemoryError) {
outOfMemoryError.printStackTrace();
simulatorExitReport.setException(new Exception(outOfMemoryError));
System.err.println("Caught an OutOfMemoryError!");
} finally {
simulatorExitReport.setEndTimestamp(System.currentTimeMillis());
simulatorExitReport.setSimulatorCallableId(id);
if (listener != null) {
listener.finished(this);
}
}
return simulator.getSimulatorResultsData();
}
//**********************************************************************************************************
//
// GETTERS AND SETTERS
//
//
public final long getId() {
return id;
}
public final SimulatorInterface getSimulator() {
return simulator;
}
public final SimulatorResultsData getSimulatorResultsData() {
return simulator.getSimulatorResultsData();
}
public final SimulatorCallableExitReport getSimulatorExitReport() {
return simulator.getSimulatorResultsData().getSimulatorExitReport();
}
}