JAL-3878 Set job status to cancelled on job cancellation.
[jalview.git] / src / jalview / ws2 / slivka / SlivkaWebService.java
index c2ac7b3..5da7be3 100644 (file)
@@ -1,6 +1,7 @@
 package jalview.ws2.slivka;
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -11,10 +12,15 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import jalview.api.AlignViewportI;
 import jalview.bin.Cache;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
+import jalview.io.AnnotationFile;
 import jalview.io.DataSourceType;
+import jalview.io.FeaturesFile;
 import jalview.io.FileFormat;
 import jalview.io.FileFormatI;
 import jalview.io.FormatAdapter;
@@ -47,27 +53,22 @@ public class SlivkaWebService implements WebServiceI
 
   protected int typeFlags = 0;
 
-  protected static final EnumMap<Job.Status, WsJob.JobState> stateMap = new EnumMap<>(
+  protected static final EnumMap<Job.Status, WSJobStatus> statusMap = new EnumMap<>(
           Job.Status.class);
   {
-    stateMap.put(Job.Status.PENDING, WsJob.JobState.QUEUED);
-    stateMap.put(Job.Status.REJECTED, WsJob.JobState.INVALID);
-    stateMap.put(Job.Status.ACCEPTED, WsJob.JobState.QUEUED);
-    stateMap.put(Job.Status.QUEUED, WsJob.JobState.QUEUED);
-    stateMap.put(Job.Status.RUNNING, WsJob.JobState.RUNNING);
-    stateMap.put(Job.Status.COMPLETED, WsJob.JobState.FINISHED);
-    stateMap.put(Job.Status.INTERRUPTED, WsJob.JobState.CANCELLED);
-    stateMap.put(Job.Status.DELETED, WsJob.JobState.CANCELLED);
-    stateMap.put(Job.Status.FAILED, WsJob.JobState.FAILED);
-    stateMap.put(Job.Status.ERROR, WsJob.JobState.SERVERERROR);
-    stateMap.put(Job.Status.UNKNOWN, WsJob.JobState.UNKNOWN);
+    statusMap.put(Job.Status.PENDING, WSJobStatus.SUBMITTED);
+    statusMap.put(Job.Status.REJECTED, WSJobStatus.INVALID);
+    statusMap.put(Job.Status.ACCEPTED, WSJobStatus.QUEUED);
+    statusMap.put(Job.Status.QUEUED, WSJobStatus.QUEUED);
+    statusMap.put(Job.Status.RUNNING, WSJobStatus.RUNNING);
+    statusMap.put(Job.Status.COMPLETED, WSJobStatus.FINISHED);
+    statusMap.put(Job.Status.INTERRUPTED, WSJobStatus.CANCELLED);
+    statusMap.put(Job.Status.DELETED, WSJobStatus.CANCELLED);
+    statusMap.put(Job.Status.FAILED, WSJobStatus.FAILED);
+    statusMap.put(Job.Status.ERROR, WSJobStatus.SERVER_ERROR);
+    statusMap.put(Job.Status.UNKNOWN, WSJobStatus.UNKNOWN);
   }
 
-  protected final Set<WsJob.JobState> failedStates = new HashSet<>(
-          Arrays.asList(WsJob.JobState.INVALID, WsJob.JobState.BROKEN,
-                  WsJob.JobState.FAILED, WsJob.JobState.SERVERERROR,
-                  WsJob.JobState.CANCELLED));
-
   public SlivkaWebService(SlivkaClient client, SlivkaService service)
   {
     this.client = client;
@@ -192,13 +193,30 @@ public class SlivkaWebService implements WebServiceI
   @Override
   public void updateProgress(WSJob job) throws IOException
   {
-    // TODO Auto-generated method stub
-
+    var slivkaJob = client.getJob(job.getJobId());
+    job.setStatus(statusMap.get(slivkaJob.getStatus()));
+    Collection<RemoteFile> files = slivkaJob.getResults();
+    for (RemoteFile f : files)
+    {
+      if (f.getLabel().equals("log"))
+      {
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        f.writeTo(stream);
+        job.setLog(stream.toString("UTF-8"));
+      }
+      else if (f.getLabel().equals("error-log"))
+      {
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        f.writeTo(stream);
+        job.setErrorLog(stream.toString("UTF-8"));
+      }
+    }
   }
 
   @Override
   public void cancel(WSJob job) throws IOException
   {
+    job.setStatus(WSJobStatus.CANCELLED);
     Cache.log.warn("Slivka does not support job cancellation yet.");
   }
 
@@ -220,7 +238,8 @@ public class SlivkaWebService implements WebServiceI
     return false;
   }
 
-  public AlignmentI getAlignment(WSJob job) throws IOException
+  public AlignmentI getAlignment(WSJob job, List<SequenceI> dataset,
+      AlignViewportI viewport) throws IOException
   {
     Collection<RemoteFile> files;
     var slivkaJob = client.getJob(job.getJobId());
@@ -241,6 +260,48 @@ public class SlivkaWebService implements WebServiceI
     return null;
   }
 
+  public FeaturesFile getFeaturesFile(WSJob job,
+      List<SequenceI> dataset, AlignViewportI viewport) throws IOException
+  {
+    var slivkaJob = client.getJob(job.getJobId());
+    Collection<RemoteFile> files = slivkaJob.getResults();
+    for (RemoteFile f : files)
+    {
+      if (f.getMediaType().equals("application/jalview-features"))
+      {
+        return new FeaturesFile(f.getContentUrl().toString(), DataSourceType.URL);
+      }
+    }
+    return null;
+  }
+
+  public List<AlignmentAnnotation> getAnnotationFile(WSJob job,
+      List<SequenceI> dataset, AlignViewportI viewport) throws IOException
+  {
+    var slivkaJob = client.getJob(job.getJobId());
+    Collection<RemoteFile> files = slivkaJob.getResults();
+    for (RemoteFile f : files)
+    {
+      if (f.getMediaType().equals("application/jalview-annotations"))
+      {
+        Alignment aln = new Alignment(dataset.toArray(new SequenceI[0]));
+        AnnotationFile af = new AnnotationFile();
+        boolean valid = af.readAnnotationFileWithCalcId(aln, service.getId(),
+            f.getContentUrl().toString(), DataSourceType.URL);
+        if (valid)
+        {
+          return Arrays.asList(aln.getAlignmentAnnotation());
+        }
+        else
+        {
+          throw new IOException("Unable to read annotations from file " +
+              f.getContentUrl().toString());
+        }
+      }
+    }
+    return null;
+  }
+
   @Override
   public String toString()
   {