package rocks.inspectit.ui.rcp.editor.graph.plot.datasolver.impl;
import java.util.HashMap;
import java.util.Map;
import rocks.inspectit.ui.rcp.editor.graph.plot.datasolver.AbstractPlotDataSolver;
import rocks.inspectit.ui.rcp.editor.graph.plot.datasolver.PlotDataSolver;
/**
* Factory to access the implementation of the {@link AbstractPlotDataSolver}.
*
* @author Marius Oehler
*
*/
public final class PlotDataSolverFactory {
/**
* Holds the singleton instance of each {@link AbstractPlotDataSolver} implementation.
*/
private Map<PlotDataSolver, AbstractPlotDataSolver> dataSolverMap;
/**
* Hidden default constructor.
*/
private PlotDataSolverFactory() {
dataSolverMap = new HashMap<>();
}
/**
* Returns a {@link AbstractPlotDataSolver} implementation of the given {@link EPlotDataSolver}.
* There is only one instance of each dataSolver which is stored in the {@link #dataSolverMap}.
* If there is no instance of the desired implementation, a new one is created and stored in the
* map.
*
* @param dataSolver
* desired {@link AbstractPlotDataSolver}
* @return {@link AbstractPlotDataSolver} implementation
*/
private AbstractPlotDataSolver getDataSolverInstance(PlotDataSolver dataSolver) {
if (!dataSolverMap.containsKey(dataSolver)) {
try {
AbstractPlotDataSolver plotDataSolver = dataSolver.getDataSolverImplementation().newInstance();
dataSolverMap.put(dataSolver, plotDataSolver);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return dataSolverMap.get(dataSolver);
}
/**
* Singleton instance.
*/
private static PlotDataSolverFactory singleton;
/**
* Returns the singleton. If there is no instance of this class, it will be created.
*
* @return singleton of this class.
*/
private static PlotDataSolverFactory instance() {
if (null == singleton) {
createSingleton();
}
return singleton;
}
/**
* Creates the {@link PlotDataSolverFactory} singleton.
*/
private static synchronized void createSingleton() {
if (null == singleton) {
singleton = new PlotDataSolverFactory();
}
}
/**
* Returns an implementation of {@link AbstractPlotDataSolver} which is represented by the given
* {@link EPlotDataSolver} enum.
*
* @param dataSolver
* desired {@link AbstractPlotDataSolver}
* @return {@link AbstractPlotDataSolver} implementation
*/
public static AbstractPlotDataSolver getDataSolver(PlotDataSolver dataSolver) {
return instance().getDataSolverInstance(dataSolver);
}
/**
* Returns the default implementation of the {@link AbstractPlotDataSolver} interface. Equals to
* a call of the {@link #getDataSolver(EPlotDataSolver)} method with parameter
* {@link EPlotDataSolver#DEFAULT}.
*
* @return default {@link AbstractPlotDataSolver} implementation
*/
public static AbstractPlotDataSolver getDefaultDataSolver() {
return getDataSolver(PlotDataSolver.DEFAULT);
}
}