package com.plectix.simulator.simulator.api.steps; import java.util.LinkedHashMap; import java.util.Map; 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; public class OperationManager { private Map<OperationType, AbstractOperation<?>> defaultOperations = new LinkedHashMap<OperationType, AbstractOperation<?>>(); private final SimulationData simulationData; private boolean retryGettingKappaInput = true; public OperationManager(KappaSystem kappaSystem) { this.simulationData = kappaSystem.getSimulationData(); defaultOperations.put(OperationType.KAPPA_FILE_COMPILATION, new KappaFileCompilationOperation(this.simulationData)); defaultOperations.put(OperationType.KAPPA_MODEL_BUILDING, new KappaModelBuildingOperation(simulationData)); defaultOperations.put(OperationType.INITIALIZATION, new SolutionInitializationOperation(this.simulationData)); defaultOperations.put(OperationType.SUBVIEWS, new SubviewsComputationOperation(kappaSystem)); defaultOperations.put(OperationType.LOCAL_VIEWS, new LocalViewsComputationOperation(this.simulationData)); } private void retryKappaInputLoading() { if (!retryGettingKappaInput) { return; } else { retryGettingKappaInput = false; } SimulationArguments args = simulationData.getSimulationArguments(); if (args.getInputFileName() != null) { defaultOperations.put(OperationType.KAPPA_FILE_LOADING, new KappaFileLoadingOperation(simulationData, args.getInputFileName())); } else if (args.getInputCharArray() != null) { defaultOperations.put(OperationType.KAPPA_FILE_LOADING, new KappaFileLoadingOperation(simulationData, args.getInputCharArray())); } else { // if kappa input cannot be found (i.e. simulator is not properly fed with arguments) we report error if (defaultOperations.get(OperationType.KAPPA_FILE_LOADING) == null) { defaultOperations.put(OperationType.KAPPA_FILE_LOADING, new ReportErrorOperation("Kappa input was not set")); } // we'll keep refreshing until success. retryGettingKappaInput = true; } } public <E> E perform(AbstractOperation<E> operation) throws Exception { if (operation.getType() == OperationType.KAPPA_MODEL_BUILDING) { retryKappaInputLoading(); } if (operation.noNeedToPerform()) { return operation.retrievePreparedResult(); } OperationType previousNecessaryOperation = operation.getType().getNecessaryOperation(); if (previousNecessaryOperation != null) { this.perform(defaultOperations.get(previousNecessaryOperation)); } return operation.perform(); } }