package com.plectix.simulator.simulator.api.steps; import java.util.LinkedHashSet; import java.util.Set; import com.plectix.simulator.simulator.SimulationClock; import com.plectix.simulator.simulator.SimulationData; import com.plectix.simulator.simulator.api.OperationType; import com.plectix.simulator.util.PlxTimer; import com.plectix.simulator.util.Info.InfoType; @SuppressWarnings("serial") public abstract class AbstractOperation<E> { private final OperationType type; final SimulationData simulationData; private static Set<OperationType> silentSteps = new LinkedHashSet<OperationType>() {{ add(OperationType.DUMP_HELP); add(OperationType.DUMP_VERSION); add(OperationType.SIMULATOR_INITIALIZATION); }}; protected AbstractOperation(SimulationData simulationData, OperationType type) { this.type = type; this.simulationData = simulationData; } public OperationType getType() { return type; } protected E perform() throws Exception { if (simulationData != null && !this.isSilent()) { PlxTimer initializationTimer = new PlxTimer(); initializationTimer.startTimer(); E result = this.performDry(); SimulationClock.stopTimer(simulationData, InfoType.OUTPUT, initializationTimer, "-" + type + ":"); return result; } else { return this.performDry(); } } private boolean isSilent() { return silentSteps.contains(this.getType()); } protected abstract E performDry() throws Exception; protected abstract boolean noNeedToPerform(); /** * If operation has no need to be performed, then it's resulting data * is already stored somewhere. This method searches for it */ protected abstract E retrievePreparedResult() throws Exception; }