Merge branch 'bug/JAL-3807_jpred-with-slivka' into alpha/JAL-3066_Jalview_212_slivka...
[jalview.git] / src / jalview / ws / slivkaws / SlivkaJPredServiceInstance.java
diff --git a/src/jalview/ws/slivkaws/SlivkaJPredServiceInstance.java b/src/jalview/ws/slivkaws/SlivkaJPredServiceInstance.java
new file mode 100644 (file)
index 0000000..462be28
--- /dev/null
@@ -0,0 +1,96 @@
+package jalview.ws.slivkaws;
+
+import java.io.IOError;
+import java.io.IOException;
+import java.util.List;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceI;
+import jalview.io.DataSourceType;
+import jalview.io.JPredFile;
+import jalview.ws.api.JPredServiceI;
+import jalview.ws.api.JobId;
+import jalview.ws.params.ArgumentI;
+import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
+import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
+import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
+
+public class SlivkaJPredServiceInstance extends SlivkaWSInstance
+    implements JPredServiceI
+{
+
+  private class InputFormatParameter implements ArgumentI
+  {
+    String value = "";
+
+    @Override
+    public String getName()
+    {
+      return "format";
+    }
+
+    @Override
+    public String getValue()
+    {
+      return value;
+    }
+
+    @Override
+    public void setValue(String selectedItem)
+    {
+      value = selectedItem;
+    }
+  }
+
+
+  public SlivkaJPredServiceInstance(SlivkaClient client,
+      SlivkaService service, String action)
+  {
+    super(client, service, action);
+    style = ServiceClient.JPREDWSCLIENT;
+  }
+
+  @Override
+  public JobId predict(List<SequenceI> sequences, boolean msa) throws Throwable
+  {
+    // Hack allowing to send both single and msa jobs
+    // until msa and single sequence services are separated.
+    var arg = new InputFormatParameter();
+    arg.setValue(msa ? "fasta" : "seq");
+    return super.submit(sequences, null, List.of(arg));
+  }
+
+  @Override
+  public AlignmentI getAlignment(JobId jobId) throws Exception
+  {
+    List<RemoteFile> files;
+    try {
+      files = client.getJobResults(jobId.getJobId());
+      for (RemoteFile f : files) {
+        var alignment = readAlignment(f);
+        if (alignment != null)
+        {
+          return alignment;
+        }
+      }
+    }
+    catch (IOException e) {
+      throw new IOError(e);
+    }
+    return null;
+  }
+
+  @Override
+  public JPredFile getPrediction(JobId jobId) throws Exception
+  {
+    List<RemoteFile> files = client.getJobResults(jobId.getJobId());
+    for (RemoteFile f : files)
+    {
+      if (f.getLabel().equals("concise"))
+      {
+        return new JPredFile(f.getURL(), DataSourceType.URL);
+      }
+    }
+    return null;
+  }
+}