package jalview.workers; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; import jalview.api.AlignCalcManagerI; import jalview.api.AlignCalcWorkerI; public class AlignCalcManager implements AlignCalcManagerI { private List blackList=new ArrayList(); /** * global record of calculations in progress */ private static Hashtable inProgress=new Hashtable(); /** * record of calculations pending or in progress in the current context */ private Map> updating=new Hashtable>(); @Override public void notifyStart(AlignCalcWorkerI worker) { List upd = updating.get(worker.getClass()); if (upd==null) { updating.put(worker.getClass(), upd=new ArrayList()); } upd.add(worker); } @Override public boolean alreadyDoing(AlignCalcWorkerI worker) { return inProgress.containsKey(worker.getClass()); } @Override public void notifyWorking(AlignCalcWorkerI worker) { // TODO: decide if we should throw exceptions here if multiple workers start to work if (inProgress.get(worker.getClass())!=null) { System.err.println("Warning: Multiple workers are running of type "+worker.getClass()); } inProgress.put(worker.getClass(), worker); } @Override public void workerComplete(AlignCalcWorkerI worker) { inProgress.remove(worker); } @Override public void workerCannotRun(AlignCalcWorkerI worker) { blackList.add(worker.getClass()); } public boolean isBlackListed(Class workerType) { return blackList.contains(workerType); } @Override public void startWorker(AlignCalcWorkerI worker) { new Thread(worker).start(); } }