Merge branch 'develop' into update_212_Dec_merge_with_21125_chamges
[jalview.git] / src / jalview / ws / slivkaws / SlivkaAnnotationServiceInstance.java
index 4d2c4fb..999951a 100644 (file)
 package jalview.ws.slivkaws;
 
+import jalview.api.FeatureColourI;
+import jalview.bin.Cache;
+import jalview.bin.Console;
+import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.SequenceI;
+import jalview.datamodel.features.FeatureMatcherSetI;
+import jalview.io.AnnotationFile;
+import jalview.io.DataSourceType;
+import jalview.io.FeaturesFile;
+import jalview.util.MessageManager;
 import jalview.ws.api.JobId;
 import jalview.ws.api.SequenceAnnotationServiceI;
-import jalview.ws.gui.AnnotationWsJob;
-import jalview.ws.jws2.SeqAnnotationServiceCalcWorker;
 import jalview.ws.params.ArgumentI;
 import jalview.ws.params.WsParamSetI;
+import jalview.ws.uimodel.AlignAnalysisUIText;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.util.HashMap;
+import java.io.IOError;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
-import uk.ac.dundee.compbio.slivkaclient.FormField;
+import compbio.data.msa.Category;
 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
-import uk.ac.dundee.compbio.slivkaclient.SlivkaForm;
 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
 
 public class SlivkaAnnotationServiceInstance extends SlivkaWSInstance implements SequenceAnnotationServiceI
 {
-  public SlivkaAnnotationServiceInstance(SlivkaClient client, SlivkaService service)
+  public SlivkaAnnotationServiceInstance(SlivkaClient client,
+          SlivkaService service, String category)
   {
-    super(client, service, "Annotations");
+    super(client, service, category);
+    if (category == Category.CATEGORY_CONSERVATION)
+    {
+      /* FIXME: the category name is hardcoded for AACon, names other than
+       * "AAConWS" doesn't work. */
+      setAlignAnalysisUI(new AlignAnalysisUIText(getName(),
+              SlivkaAnnotationServiceInstance.class,
+              "Slivka.AACons", false, true, true, true, true, 2,
+              MessageManager.getString("label.aacon_calculations"),
+              MessageManager.getString("tooltip.aacon_calculations"),
+              MessageManager.getString("label.aacon_settings"),
+              MessageManager.getString("tooltip.aacon_settings")));
+    }
+    style = ServiceClient.SEQUENCEANNOTATIONWSCLIENT;
   }
 
   @Override
   public JobId submitToService(List<SequenceI> seqs, WsParamSetI preset, List<ArgumentI> paramset) throws Throwable
   {
-    StringBuilder builder = new StringBuilder();
-    for (SequenceI seq : seqs)
-    {
-      builder.append(">").append(seq.getName()).append("\n");
-      builder.append(seq.getSequence()).append("\n");
-    }
-    InputStream stream = new ByteArrayInputStream(builder.toString().getBytes());
-    RemoteFile file = client.uploadFile(stream, "input.fasta", "application/fasta");
-    SlivkaForm form = service.getForm();
-    HashMap<String, String> values = new HashMap<>(paramset != null ? paramset.size() : 0);
-    if (paramset != null)
+    return super.submit(seqs, preset, paramset);
+  }
+
+  @Override
+  public List<AlignmentAnnotation> getAnnotationResult(JobId jobId,
+          List<SequenceI> seqs, Map<String, FeatureColourI> featureColours,
+          Map<String, FeatureMatcherSetI> featureFilters) throws Throwable
+  {
+    RemoteFile annotFile = null;
+    RemoteFile featFile = null;
+    try
     {
-      for (ArgumentI arg : paramset)
+      var slivkaJob = client.getJob(jobId.getJobId());
+      Collection<RemoteFile> files = slivkaJob.getResults();
+      for (RemoteFile f : files)
       {
-        values.put(arg.getName(), arg.getValue());
+        if (f.getMediaType().equals("application/jalview-annotations"))
+        {
+          annotFile = f;
+        }
+        else if (f.getMediaType().equals("application/jalview-features"))
+        {
+          featFile = f;
+        }
       }
+    } catch (IOException e)
+    {
+      throw new IOError(e);
     }
-    for (FormField field : form.getFields())
+    Alignment aln = new Alignment(seqs.toArray(new SequenceI[0]));
+    if (annotFile == null
+        || !new AnnotationFile().readAnnotationFileWithCalcId(aln, service.getId(), annotFile.getContentUrl().toString(), DataSourceType.URL))
     {
-      switch (field.getType())
-      {
-      case FILE:
-        form.insert(field.getName(), file);
-        break;
-      case BOOLEAN:
-        String value = values.get(field.getName());
-        form.insert(field.getName(), value != null && !value.isBlank() ? true : false);
-        break;
-      default:
-        form.insert(field.getName(), field.valueOf(values.get(field.getName())));
-      }
+      Console.debug("No annotation from slivka job\n" + annotFile);
     }
-    return new JobId(service.getName(), service.getName(), form.submit());
-  }
-
-  @Override
-  public List<AlignmentAnnotation> getAlignmentAnnotation(AnnotationWsJob running,
-      SeqAnnotationServiceCalcWorker abstractJabaCalcWorker) throws Throwable
-  {
-    // TODO Auto-generated method stub
-    return null;
+    else {
+      Console.debug("Annotation file loaded " + annotFile);
+    }
+    if (featFile == null
+        || !new FeaturesFile(featFile.getContentUrl().toString(), DataSourceType.URL).parse(aln, featureColours, true))
+    {
+      Console.debug("No features from slivka job\n" + featFile);
+    }
+    else {
+      Console.debug("Features feil loaded " + featFile);
+    }
+    return Arrays.asList(aln.getAlignmentAnnotation());
   }
 }