(JAL-961) methods for checking calculation status
authorjprocter <jprocter@compbio.dundee.ac.uk>
Thu, 27 Oct 2011 11:20:12 +0000 (12:20 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Thu, 27 Oct 2011 11:20:12 +0000 (12:20 +0100)
src/jalview/api/AlignCalcManagerI.java
src/jalview/workers/AlignCalcManager.java

index 2c406a2..e310696 100644 (file)
@@ -21,7 +21,7 @@ public interface AlignCalcManagerI
    * tell manager that worker is now processing data
    * @param worker
    */
-  void notifyWorking(AlignCalcWorkerI worker);
+  boolean notifyWorking(AlignCalcWorkerI worker);
 
 
   /**
@@ -42,4 +42,17 @@ public interface AlignCalcManagerI
    */
   void startWorker(AlignCalcWorkerI worker);
 
+  /**
+   * 
+   * @param worker
+   * @return
+   */
+  boolean isWorking(AlignCalcWorkerI worker);
+
+  /**
+   * if any worker thread is operational, return true!
+   * @return
+   */
+  boolean isWorking();
+
 }
index 473e31b..ef627fa 100644 (file)
@@ -10,49 +10,68 @@ import jalview.api.AlignCalcWorkerI;
 
 public class AlignCalcManager implements AlignCalcManagerI
 {
-  private List<Class> blackList=new ArrayList<Class>();
+  private List<Class> blackList = new ArrayList<Class>();
+
   /**
    * global record of calculations in progress
    */
-  private static Hashtable<Class,AlignCalcWorkerI> inProgress=new Hashtable<Class,AlignCalcWorkerI>();
+  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>>();
-  
+  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)
+    if (upd == null)
     {
-      updating.put(worker.getClass(), upd=new ArrayList<AlignCalcWorkerI>());
+      updating.put(worker.getClass(),
+              upd = new ArrayList<AlignCalcWorkerI>());
     }
-    upd.add(worker);
+    // upd.add(worker);
   }
 
   @Override
-  public boolean alreadyDoing(AlignCalcWorkerI worker)
+  public  synchronized boolean alreadyDoing(AlignCalcWorkerI worker)
   {
     return inProgress.containsKey(worker.getClass());
   }
 
   @Override
-  public void notifyWorking(AlignCalcWorkerI worker)
+  public synchronized boolean notifyWorking(AlignCalcWorkerI worker)
   {
-    // TODO: decide if we should throw exceptions here if multiple workers start to work
-    if (inProgress.get(worker.getClass())!=null)
+    // synchronized (inProgress)
     {
-      System.err.println("Warning: Multiple workers are running of type "+worker.getClass());
+      // TODO: decide if we should throw exceptions here if multiple workers
+      // start to work
+      if (inProgress.get(worker.getClass()) != null)
+      {
+        if (false)
+        {
+          System.err
+                  .println("Warning: Multiple workers are running of type "
+                          + worker.getClass());
+        }
+        return false;
+      }
+      inProgress.put(worker.getClass(), worker);
     }
-    inProgress.put(worker.getClass(), worker);
-    
+    return true;
   }
 
   @Override
-  public void workerComplete(AlignCalcWorkerI worker)
+  public synchronized void workerComplete(AlignCalcWorkerI worker)
   {
-    inProgress.remove(worker);
+    inProgress.remove(worker.getClass());
+    List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
+    if (upd != null)
+    {
+      upd.remove(worker);
+    }
+
   }
 
   @Override
@@ -60,6 +79,7 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     blackList.add(worker.getClass());
   }
+
   public boolean isBlackListed(Class workerType)
   {
     return blackList.contains(workerType);
@@ -70,4 +90,17 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     new Thread(worker).start();
   }
+
+  @Override
+  public synchronized boolean isWorking(AlignCalcWorkerI worker)
+  {
+//    System.err.println("isWorking : worker "+(worker!=null ? worker.getClass():"null")+ " "+hashCode());
+    return worker!=null && inProgress.get(worker.getClass()) == worker;
+  }
+  @Override
+  public boolean isWorking()
+  {
+//    System.err.println("isWorking "+hashCode());
+    return inProgress.size()>0;
+  }
 }