JAL-3878 Move status precedence list to JobStatus class
[jalview.git] / src / jalview / ws2 / actions / AbstractPollableTask.java
index d1db921..bf58b13 100644 (file)
@@ -10,6 +10,8 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import jalview.bin.Cache;
+import jalview.util.ArrayUtils;
+import jalview.util.MathUtils;
 import jalview.ws.params.ArgumentI;
 import jalview.ws2.actions.api.TaskEventListener;
 import jalview.ws2.actions.api.TaskI;
@@ -36,6 +38,8 @@ import static java.lang.String.format;
  */
 public abstract class AbstractPollableTask<T extends BaseJob, R> implements TaskI<R>
 {
+  private final long uid = MathUtils.getUID();
+
   protected final WebServiceClientI client;
 
   protected final List<ArgumentI> args;
@@ -61,6 +65,11 @@ public abstract class AbstractPollableTask<T extends BaseJob, R> implements Task
     this.eventHandler = new TaskEventSupport<R>(this, eventListener);
   }
 
+  public long getUid()
+  {
+    return uid;
+  }
+
   /**
    * Start the task using provided scheduled executor service. It creates a
    * polling loop running at set intervals.
@@ -206,56 +215,18 @@ public abstract class AbstractPollableTask<T extends BaseJob, R> implements Task
    */
   private void updateGlobalStatus()
   {
-    JobStatus newStatus = taskStatus;
-    int currentPrecedence = getPrecedenceOf(newStatus);
+    int precedence = -1;
     for (BaseJob job : jobs)
     {
       JobStatus status = job.getStatus();
-      int jobPrecedence = getPrecedenceOf(status);
-      if (currentPrecedence < jobPrecedence)
-      {
-        currentPrecedence = jobPrecedence;
-        newStatus = status;
-      }
+      int jobPrecedence = ArrayUtils.indexOf(JobStatus.statusPrecedence, status);
+      if (precedence < jobPrecedence)
+        precedence = jobPrecedence;
     }
-    setStatus(newStatus);
-  }
-
-  /**
-   * A precedence order of job statuses used to compute the overall task status.
-   */
-  private static JobStatus[] statusPrecedence = {
-      JobStatus.INVALID, // all must be invalid for task to be invalid
-      JobStatus.COMPLETED, // all but invalid must be completed for task to be
-                           // completed
-      JobStatus.UNKNOWN, // unknown prevents successful completion but not
-                         // running or failure
-      JobStatus.READY,
-      JobStatus.SUBMITTED,
-      JobStatus.QUEUED,
-      JobStatus.RUNNING,
-      JobStatus.CANCELLED, // if any is terminated unsuccessfully, the task is
-                           // failed
-      JobStatus.FAILED,
-      JobStatus.SERVER_ERROR
-  };
-
-  /**
-   * @param status
-   *          status to find the precedence of
-   * @return precedence of the status
-   */
-  private static int getPrecedenceOf(JobStatus status)
-  {
-    final int len = statusPrecedence.length;
-    for (int i = 0; i < len; i++)
+    if (precedence >= 0)
     {
-      if (statusPrecedence[i] == status)
-      {
-        return i;
-      }
+      setStatus(JobStatus.statusPrecedence[precedence]);
     }
-    return -1;
   }
 
   @Override