Introduced new AlignCalcWorker/manager interface.
authorjprocter <jprocter@compbio.dundee.ac.uk>
Wed, 19 Oct 2011 17:17:25 +0000 (18:17 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 21 Oct 2011 14:53:23 +0000 (15:53 +0100)
src/jalview/api/AlignCalcManagerI.java [new file with mode: 0644]
src/jalview/api/AlignCalcWorkerI.java [new file with mode: 0644]
src/jalview/workers/AlignCalcManager.java [new file with mode: 0644]
src/jalview/workers/AlignCalcWorker.java [new file with mode: 0644]

diff --git a/src/jalview/api/AlignCalcManagerI.java b/src/jalview/api/AlignCalcManagerI.java
new file mode 100644 (file)
index 0000000..2c406a2
--- /dev/null
@@ -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 (file)
index 0000000..63e7bf9
--- /dev/null
@@ -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 (file)
index 0000000..473e31b
--- /dev/null
@@ -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<Class> blackList=new ArrayList<Class>();
+  /**
+   * global record of calculations in progress
+   */
+  private static Hashtable<Class,AlignCalcWorkerI> inProgress=new Hashtable<Class,AlignCalcWorkerI>();
+  /**
+   * record of calculations pending or in progress in the current context
+   */
+  private Map<Class,List<AlignCalcWorkerI>> updating=new Hashtable<Class,List<AlignCalcWorkerI>>();
+  
+  @Override
+  public void notifyStart(AlignCalcWorkerI worker)
+  {
+    List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
+    if (upd==null)
+    {
+      updating.put(worker.getClass(), upd=new ArrayList<AlignCalcWorkerI>());
+    }
+    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 (file)
index 0000000..41022e5
--- /dev/null
@@ -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;
+    
+  }
+
+
+}