JAL-3878 Add jpred operation and worker to the services.
[jalview.git] / src / jalview / ws2 / slivka / SlivkaWebService.java
index a2d7f20..e2873c1 100644 (file)
@@ -1,39 +1,36 @@
 package jalview.ws2.slivka;
 
+import static java.lang.String.format;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumMap;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
+import java.util.Map;
 
-import jalview.api.AlignViewportI;
+import jalview.api.FeatureColourI;
 import jalview.bin.Cache;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
+import jalview.datamodel.features.FeatureMatcherSetI;
 import jalview.io.AnnotationFile;
 import jalview.io.DataSourceType;
 import jalview.io.FeaturesFile;
 import jalview.io.FileFormat;
-import jalview.io.FileFormatI;
 import jalview.io.FormatAdapter;
 import jalview.io.JPredFile;
-import jalview.ws.gui.WsJob;
 import jalview.ws.params.ArgumentI;
 import jalview.ws.params.ParamDatastoreI;
-import jalview.ws.params.WsParamSetI;
 import jalview.ws.slivkaws.SlivkaDatastore;
-import jalview.ws2.WebServiceI;
-import jalview.ws2.operations.Operation;
 import jalview.ws2.WSJob;
 import jalview.ws2.WSJobStatus;
+import jalview.ws2.WebServiceI;
 import javajs.http.ClientProtocolException;
 import uk.ac.dundee.compbio.slivkaclient.Job;
 import uk.ac.dundee.compbio.slivkaclient.Parameter;
@@ -46,11 +43,11 @@ public class SlivkaWebService implements WebServiceI
   protected final SlivkaClient client;
 
   protected final SlivkaService service;
-  
+
   protected ParamDatastoreI store;
 
   protected static final EnumMap<Job.Status, WSJobStatus> statusMap = new EnumMap<>(
-          Job.Status.class);
+      Job.Status.class);
   {
     statusMap.put(Job.Status.PENDING, WSJobStatus.SUBMITTED);
     statusMap.put(Job.Status.REJECTED, WSJobStatus.INVALID);
@@ -113,7 +110,7 @@ public class SlivkaWebService implements WebServiceI
 
   @Override
   public String submit(List<SequenceI> sequences, List<ArgumentI> args)
-          throws IOException
+      throws IOException
   {
     var request = new uk.ac.dundee.compbio.slivkaclient.JobRequest();
     for (Parameter param : service.getParameters())
@@ -140,8 +137,8 @@ public class SlivkaWebService implements WebServiceI
           break;
         }
         InputStream stream = new ByteArrayInputStream(format.getWriter(null)
-                .print(sequences.toArray(new SequenceI[0]), false)
-                .getBytes());
+            .print(sequences.toArray(new SequenceI[0]), false)
+            .getBytes());
         request.addFile(param.getId(), stream);
       }
     }
@@ -218,8 +215,7 @@ public class SlivkaWebService implements WebServiceI
     return false;
   }
 
-  public AlignmentI getAlignment(WSJob job, List<SequenceI> dataset,
-      AlignViewportI viewport) throws IOException
+  public AlignmentI getAlignment(WSJob job) throws IOException
   {
     Collection<RemoteFile> files;
     var slivkaJob = client.getJob(job.getJobId());
@@ -229,61 +225,63 @@ public class SlivkaWebService implements WebServiceI
       if (f.getMediaType().equals("application/clustal"))
       {
         return new FormatAdapter().readFile(f.getContentUrl().toString(),
-                DataSourceType.URL, FileFormat.Clustal);
+            DataSourceType.URL, FileFormat.Clustal);
       }
       else if (f.getMediaType().equals("application/fasta"))
       {
         return new FormatAdapter().readFile(f.getContentUrl().toString(),
-                DataSourceType.URL, FileFormat.Fasta);
+            DataSourceType.URL, FileFormat.Fasta);
       }
     }
     return null;
   }
 
-  public FeaturesFile getFeaturesFile(WSJob job,
-      List<SequenceI> dataset, AlignViewportI viewport) throws IOException
+  public List<AlignmentAnnotation> attachAnnotations(WSJob job,
+      List<SequenceI> dataset, Map<String, FeatureColourI> featureColours,
+      Map<String, FeatureMatcherSetI> featureFilters) throws IOException
   {
+    RemoteFile annotFile = null;
+    RemoteFile featFile = null;
+
     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);
-      }
+      if (f.getMediaType().equals("application/jalview-annotations"))
+        annotFile = f;
+      else if (f.getMediaType().equals("application/jalview-features"))
+        featFile = f;
     }
-    return null;
-  }
+    Alignment aln = new Alignment(dataset.toArray(new SequenceI[0]));
 
-  public List<AlignmentAnnotation> getAnnotations(WSJob job,
-      List<SequenceI> dataset, AlignViewportI viewport) throws IOException
-  {
-    var slivkaJob = client.getJob(job.getJobId());
-    Collection<RemoteFile> files = slivkaJob.getResults();
-    for (RemoteFile f : files)
+    boolean annotPresent = annotFile != null;
+    if (annotFile != null)
     {
-      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());
-        }
-      }
+      AnnotationFile af = new AnnotationFile();
+      annotPresent = af.readAnnotationFileWithCalcId(
+          aln, service.getId(), annotFile.getContentUrl().toString(),
+          DataSourceType.URL);
     }
-    return null;
+    if (annotPresent)
+      Cache.log.debug(format("Annotation file loaded %s", annotFile));
+    else
+      Cache.log.debug(format("No annotations loaded from %s", annotFile));
+
+    boolean featPresent = featFile != null;
+    if (featFile != null)
+    {
+      FeaturesFile ff = new FeaturesFile(featFile.getContentUrl().toString(),
+          DataSourceType.URL);
+      featPresent = ff.parse(aln, featureColours, true);
+    }
+    if (featPresent)
+      Cache.log.debug(format("Features file loaded %s", featFile));
+    else
+      Cache.log.debug(format("No features loaded from %s", annotFile));
+    return Arrays.asList(aln.getAlignmentAnnotation());
   }
 
-  public JPredFile getPrediction(WSJob job, List<SequenceI> dataset,
-      AlignViewportI viewport) throws IOException
+  public JPredFile getPrediction(WSJob job) throws IOException
   {
     Collection<RemoteFile> files = client.getJob(job.getJobId()).getResults();
     for (RemoteFile f : files)