JAL-3878 Add annotation operation and worker to the services.
[jalview.git] / src / jalview / ws2 / slivka / SlivkaWebService.java
index a2d7f20..9078013 100644 (file)
@@ -1,5 +1,6 @@
 package jalview.ws2.slivka;
 
+import static java.lang.String.format;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -10,14 +11,17 @@ import java.util.Collection;
 import java.util.EnumMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 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;
@@ -218,8 +222,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());
@@ -240,60 +243,49 @@ public class SlivkaWebService implements WebServiceI
     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));
 
-  public JPredFile getPrediction(WSJob job, List<SequenceI> dataset,
-      AlignViewportI viewport) throws IOException
-  {
-    Collection<RemoteFile> files = client.getJob(job.getJobId()).getResults();
-    for (RemoteFile f : files)
+    boolean featPresent = featFile != null;
+    if (featFile != null)
     {
-      if (f.getLabel().equals("concise"))
-      {
-        return new JPredFile(f.getContentUrl(), DataSourceType.URL);
-      }
+      FeaturesFile ff = new FeaturesFile(featFile.getContentUrl().toString(),
+          DataSourceType.URL);
+      featPresent = ff.parse(aln, featureColours, true);
     }
-    return null;
+    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());
   }
 
   @Override