JAL-2068 deleting user-defined annotation removes the worker
[jalview.git] / src / jalview / workers / AlignCalcManager.java
index 1063706..9ec6a1c 100644 (file)
@@ -37,8 +37,8 @@ public class AlignCalcManager implements AlignCalcManagerI
   private volatile List<AlignCalcWorkerI> restartable = Collections
           .synchronizedList(new ArrayList<AlignCalcWorkerI>());
 
-  private volatile List<Class> blackList = Collections
-          .synchronizedList(new ArrayList<Class>());
+  private volatile List<AlignCalcWorkerI> blackList = Collections
+          .synchronizedList(new ArrayList<AlignCalcWorkerI>());
 
   /**
    * global record of calculations in progress
@@ -167,30 +167,31 @@ public class AlignCalcManager implements AlignCalcManagerI
   }
 
   @Override
-  public void workerCannotRun(AlignCalcWorkerI worker)
+  public void disableWorker(AlignCalcWorkerI worker)
   {
     synchronized (blackList)
     {
-      blackList.add(worker.getClass());
+      blackList.add(worker);
     }
   }
 
-  public boolean isBlackListed(Class workerType)
+  public boolean isBlackListed(AlignCalcWorkerI worker)
   {
     synchronized (blackList)
     {
-      return blackList.contains(workerType);
+      return blackList.contains(worker);
     }
   }
 
   @Override
   public void startWorker(AlignCalcWorkerI worker)
   {
-    // System.err.println("Starting "+worker.getClass());
-    // new Exception("").printStackTrace();
-    Thread tw = new Thread(worker);
-    tw.setName(worker.getClass().toString());
-    tw.start();
+    if (!isBlackListed(worker))
+    {
+      Thread tw = new Thread(worker);
+      tw.setName(worker.getClass().toString());
+      tw.start();
+    }
   }
 
   @Override
@@ -328,14 +329,11 @@ public class AlignCalcManager implements AlignCalcManagerI
   }
 
   @Override
-  public void workerMayRun(AlignCalcWorkerI worker)
+  public void enableWorker(AlignCalcWorkerI worker)
   {
     synchronized (blackList)
     {
-      if (blackList.contains(worker.getClass()))
-      {
-        blackList.remove(worker.getClass());
-      }
+      blackList.remove(worker);
     }
   }
 
@@ -382,4 +380,37 @@ public class AlignCalcManager implements AlignCalcManagerI
      * else { System.err.println("Pending exists for " + workerClass); } }
      */
   }
+
+  /**
+   * Deletes the worker that update the given annotation, provided it is marked
+   * as deletable.
+   */
+  @Override
+  public void removeWorkerForAnnotation(AlignmentAnnotation ann)
+  {
+    /*
+     * first just find those to remove (to avoid
+     * ConcurrentModificationException)
+     */
+    List<AlignCalcWorkerI> toRemove = new ArrayList<AlignCalcWorkerI>();
+    for (AlignCalcWorkerI worker : restartable)
+    {
+      if (worker.involves(ann))
+      {
+        if (worker.isDeletable())
+        {
+          toRemove.add(worker);
+        }
+      }
+    }
+
+    /*
+     * remove all references to the workers
+     */
+    for (AlignCalcWorkerI worker : toRemove)
+    {
+      restartable.remove(worker);
+      blackList.remove(worker);
+    }
+  }
 }