From 60805a2d20a347ef1958a7a5576cda7a186f8a8d Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 19 Oct 2011 18:17:25 +0100 Subject: [PATCH] Introduced new AlignCalcWorker/manager interface. --- src/jalview/api/AlignCalcManagerI.java | 45 ++++++++++++++++++ src/jalview/api/AlignCalcWorkerI.java | 6 +++ src/jalview/workers/AlignCalcManager.java | 73 +++++++++++++++++++++++++++++ src/jalview/workers/AlignCalcWorker.java | 44 +++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 src/jalview/api/AlignCalcManagerI.java create mode 100644 src/jalview/api/AlignCalcWorkerI.java create mode 100644 src/jalview/workers/AlignCalcManager.java create mode 100644 src/jalview/workers/AlignCalcWorker.java diff --git a/src/jalview/api/AlignCalcManagerI.java b/src/jalview/api/AlignCalcManagerI.java new file mode 100644 index 0000000..2c406a2 --- /dev/null +++ b/src/jalview/api/AlignCalcManagerI.java @@ -0,0 +1,45 @@ +package jalview.api; + +public interface AlignCalcManagerI +{ + + + /** + * tell manager that a worker is initialised and has started to run + * @param worker + */ + void notifyStart(AlignCalcWorkerI worker); + + /** + * check if a calculation of this type is already active + * @param worker + * @return + */ + boolean alreadyDoing(AlignCalcWorkerI worker); + + /** + * tell manager that worker is now processing data + * @param worker + */ + void notifyWorking(AlignCalcWorkerI worker); + + + /** + * notify manager that the worker has completed, and results may be ready to collect + * @param worker + */ + void workerComplete(AlignCalcWorkerI worker); + + /** + * indicate that a worker like this cannot run on the platform and shouldn't be started again + * @param worker + */ + void workerCannotRun(AlignCalcWorkerI worker); + + /** + * launch a new worker + * @param worker + */ + void startWorker(AlignCalcWorkerI worker); + +} diff --git a/src/jalview/api/AlignCalcWorkerI.java b/src/jalview/api/AlignCalcWorkerI.java new file mode 100644 index 0000000..63e7bf9 --- /dev/null +++ b/src/jalview/api/AlignCalcWorkerI.java @@ -0,0 +1,6 @@ +package jalview.api; + +public interface AlignCalcWorkerI extends Runnable +{ + +} diff --git a/src/jalview/workers/AlignCalcManager.java b/src/jalview/workers/AlignCalcManager.java new file mode 100644 index 0000000..473e31b --- /dev/null +++ b/src/jalview/workers/AlignCalcManager.java @@ -0,0 +1,73 @@ +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(); + } +} diff --git a/src/jalview/workers/AlignCalcWorker.java b/src/jalview/workers/AlignCalcWorker.java new file mode 100644 index 0000000..41022e5 --- /dev/null +++ b/src/jalview/workers/AlignCalcWorker.java @@ -0,0 +1,44 @@ +/** + * + */ +package jalview.workers; + +import jalview.api.AlignCalcManagerI; +import jalview.api.AlignCalcWorkerI; +import jalview.api.AlignViewportI; +import jalview.api.AlignmentViewPanel; + +/** + * Base class for alignment calculation workers + * @author jimp + * + */ +public abstract class AlignCalcWorker implements AlignCalcWorkerI +{ + /** + * manager and data source for calculations + */ + protected AlignViewportI alignViewport; + protected AlignCalcManagerI calcMan; + protected AlignmentViewPanel ap; + + public AlignCalcWorker(AlignViewportI alignViewport, + AlignmentViewPanel alignPanel) + { + this.alignViewport = alignViewport; + calcMan=alignViewport.getCalcManager(); + ap = alignPanel; + } + protected void abortAndDestroy() + { + if (calcMan!=null) { + calcMan.workerComplete(this); + } + alignViewport=null; + calcMan=null; + ap=null; + + } + + +} -- 1.7.10.2