algorithms-for-computing-li.../LinearRegressionTool/src/main/java/de/wwwu/awolf/presenter/algorithms/AlgorithmHandler.java

98 lines
3.0 KiB
Java

package de.wwwu.awolf.presenter.algorithms;
import de.wwwu.awolf.model.Line;
import de.wwwu.awolf.presenter.Presenter;
import de.wwwu.awolf.presenter.util.Logging;
import java.util.EnumMap;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import javafx.beans.property.BooleanProperty;
import javax.annotation.Nullable;
public class AlgorithmHandler {
private static AlgorithmHandler instance;
private Map<Algorithm.Type, Algorithm> algorithmMapping;
private AlgorithmHandler() {
//lookup
lookUp();
}
/**
* Singleton getter
*
* @return instance of the singleton
*/
public static AlgorithmHandler getInstance() {
if (instance == null) {
instance = new AlgorithmHandler();
// Default Constructor
}
return instance;
}
@Nullable
public Line runAlgorithmByType(final Algorithm.Type type, final Set<Line> setOfLines,
final BooleanProperty guiFlag) {
if (guiFlag != null) {
guiFlag.setValue(true);
}
//get the instance
Algorithm algorithm = algorithmMapping.get(type);
algorithm.setPresenter(Presenter.getInstance());
algorithm.setInput(setOfLines);
Logging.logDebug("run Algorithm: " + algorithm.getClass().getSimpleName());
//get the executor
ExecutorService executor = Presenter.getInstance().getExecutor();
ExecutorCompletionService<Line> completionService = new ExecutorCompletionService<>(
executor);
completionService.submit(algorithm);
try {
return completionService.take().get();
} catch (InterruptedException e) {
Logging.logError(
"Interrupt Exception while waiting for result of Algorithm: " + algorithm
.getType(), e);
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
Logging.logError(
"Execution Exception while computing the result of Algorithm: " + algorithm
.getType(), e);
} finally {
if (guiFlag != null) {
guiFlag.setValue(false);
}
}
return null;
}
@Nullable
public Line runAlgorithmByType(final Algorithm.Type type, final Set<Line> setOfLines) {
return runAlgorithmByType(type, setOfLines, null);
}
private void lookUp() {
Logging.logDebug("Lookup for Algorithm Classes.");
ServiceLoader<Algorithm> load = ServiceLoader.load(Algorithm.class);
load.reload();
algorithmMapping = new EnumMap<>(Algorithm.Type.class);
load.forEach(algorithm -> {
algorithmMapping.put(algorithm.getType(), algorithm);
Logging.logDebug("Found: " + algorithm.getClass().getSimpleName());
});
}
}