JAL-3070 use object identity equivalence for lists of workers and Cache.log.debug...
[jalview.git] / src / jalview / workers / AlignCalcManager.java
index d52ffe5..1967375 100644 (file)
@@ -22,6 +22,7 @@ package jalview.workers;
 
 import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignCalcWorkerI;
+import jalview.bin.Cache;
 import jalview.datamodel.AlignmentAnnotation;
 
 import java.util.ArrayList;
@@ -68,15 +69,28 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     restartable = Collections
             .synchronizedList(new ArrayList<AlignCalcWorkerI>());
-    blackList = Collections
-            .synchronizedList(new ArrayList<Class<? extends AlignCalcWorkerI>>());
+    blackList = Collections.synchronizedList(
+            new ArrayList<Class<? extends AlignCalcWorkerI>>());
     inProgress = Collections
             .synchronizedList(new ArrayList<AlignCalcWorkerI>());
-    updating = Collections
-            .synchronizedMap(new Hashtable<Class<? extends AlignCalcWorkerI>, List<AlignCalcWorkerI>>());
+    updating = Collections.synchronizedMap(
+            new Hashtable<Class<? extends AlignCalcWorkerI>, List<AlignCalcWorkerI>>());
     canUpdate = new HashSet<>();
   }
 
+  private static boolean listContains(List<AlignCalcWorkerI> upd,
+          AlignCalcWorkerI worker)
+  {
+    // avoid use of 'Contains' in case
+    for (AlignCalcWorkerI _otherworker : upd)
+    {
+      if (_otherworker == upd)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
   @Override
   public void notifyStart(AlignCalcWorkerI worker)
   {
@@ -85,14 +99,21 @@ public class AlignCalcManager implements AlignCalcManagerI
       List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
       if (upd == null)
       {
-        updating.put(
-                worker.getClass(),
-                upd = Collections
-                        .synchronizedList(new ArrayList<AlignCalcWorkerI>()));
+        updating.put(worker.getClass(), upd = Collections
+                .synchronizedList(new ArrayList<AlignCalcWorkerI>()));
       }
       synchronized (upd)
       {
-        upd.add(worker);
+        if (listContains(upd, worker))
+        {
+          Cache.log.debug(
+                    "Ignoring second call to notifyStart for worker "
+                            + worker);
+        }
+        else
+        {
+          upd.add(worker);
+        }
       }
     }
   }
@@ -129,7 +150,7 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     synchronized (inProgress)
     {
-      if (inProgress.contains(worker))
+      if (listContains(inProgress, worker))
       {
         return false; // worker is already working, so ask caller to wait around
       }
@@ -146,7 +167,7 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     synchronized (inProgress)
     {
-      // System.err.println("Worker " + worker + " marked as complete.");
+      Cache.log.debug("Worker " + worker + " marked as complete.");
       inProgress.remove(worker);
       List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
       if (upd != null)
@@ -214,7 +235,7 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     synchronized (restartable)
     {
-      if (!restartable.contains(worker))
+      if (!listContains(restartable, worker))
       {
         restartable.add(worker);
       }
@@ -235,7 +256,8 @@ public class AlignCalcManager implements AlignCalcManagerI
   }
 
   @Override
-  public boolean workingInvolvedWith(AlignmentAnnotation alignmentAnnotation)
+  public boolean workingInvolvedWith(
+          AlignmentAnnotation alignmentAnnotation)
   {
     synchronized (inProgress)
     {