fix NPE when no annotation workers present ...
[jalview.git] / src / jalview / workers / AlignCalcManager.java
index ef627fa..63ba828 100644 (file)
@@ -1,15 +1,19 @@
 package jalview.workers;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
 import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignCalcWorkerI;
+import jalview.datamodel.AlignmentAnnotation;
 
 public class AlignCalcManager implements AlignCalcManagerI
 {
+  private volatile List<AlignCalcWorkerI> restartable = new ArrayList<AlignCalcWorkerI>();
+
   private List<Class> blackList = new ArrayList<Class>();
 
   /**
@@ -31,11 +35,11 @@ public class AlignCalcManager implements AlignCalcManagerI
       updating.put(worker.getClass(),
               upd = new ArrayList<AlignCalcWorkerI>());
     }
-    // upd.add(worker);
+    upd.add(worker);
   }
 
   @Override
-  public  synchronized boolean alreadyDoing(AlignCalcWorkerI worker)
+  public synchronized boolean alreadyDoing(AlignCalcWorkerI worker)
   {
     return inProgress.containsKey(worker.getClass());
   }
@@ -62,6 +66,7 @@ public class AlignCalcManager implements AlignCalcManagerI
     return true;
   }
 
+  private HashSet<AlignCalcWorkerI> canUpdate=new HashSet<AlignCalcWorkerI>();
   @Override
   public synchronized void workerComplete(AlignCalcWorkerI worker)
   {
@@ -70,6 +75,7 @@ public class AlignCalcManager implements AlignCalcManagerI
     if (upd != null)
     {
       upd.remove(worker);
+      canUpdate.add(worker);
     }
 
   }
@@ -94,13 +100,101 @@ public class AlignCalcManager implements AlignCalcManagerI
   @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;
+    // 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;
+    // System.err.println("isWorking "+hashCode());
+    return inProgress.size() > 0;
+  }
+
+  @Override
+  public void registerWorker(AlignCalcWorkerI worker)
+  {
+    if (!restartable.contains(worker))
+    {
+      restartable.add(worker);
+    }
+    startWorker(worker);
+  }
+
+  @Override
+  public void restartWorkers()
+  {
+    for (AlignCalcWorkerI worker : restartable)
+    {
+      startWorker(worker);
+    }
+  }
+
+  @Override
+  public boolean workingInvolvedWith(AlignmentAnnotation alignmentAnnotation)
+  {
+    if (isWorking())
+    {
+      for (List<AlignCalcWorkerI> workers: updating.values())
+      {
+        for (AlignCalcWorkerI worker:workers)
+        if (worker.involves(alignmentAnnotation))
+        {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public void updateAnnotationFor(Class workerClass)
+  {
+    for (AlignCalcWorkerI worker:canUpdate.toArray(new AlignCalcWorkerI[0]))
+    {
+      if (workerClass.equals(worker.getClass()))
+      {
+        worker.updateAnnotation();
+      }
+    }
+  }
+
+  @Override
+  public List<AlignCalcWorkerI> getRegisteredWorkersOfClass(
+          Class workerClass)
+  {
+    List<AlignCalcWorkerI> workingClass=new ArrayList<AlignCalcWorkerI>();
+    for (AlignCalcWorkerI worker:canUpdate.toArray(new AlignCalcWorkerI[0]))
+    {
+      if (workerClass.equals(worker.getClass()))
+      {
+        workingClass.add(worker);
+      }
+    }
+    return (workingClass.size()==0) ? null : workingClass;
+  }
+
+  @Override
+  public boolean startRegisteredWorkersOfClass(Class workerClass)
+  {
+         List<AlignCalcWorkerI> workers=getRegisteredWorkersOfClass(workerClass);
+         if (workers==null)
+         {
+                 return false;
+         }
+         for (AlignCalcWorkerI worker: workers) {
+                 startWorker(worker);
+         }
+         return true;
+  }
+
+  @Override
+  public void workerMayRun(AlignCalcWorkerI worker)
+  {
+    if (blackList.contains(worker.getClass()))
+    {
+      blackList.remove(worker.getClass());
+    }
   }
 }