JAL-3807 - Add single sequence capabilities to jws2.JPredClient
[jalview.git] / src / jalview / ws / slivkaws / SlivkaJPredServiceInstance.java
1 package jalview.ws.slivkaws;
2
3 import java.io.IOError;
4 import java.io.IOException;
5 import java.util.List;
6
7 import jalview.datamodel.AlignmentI;
8 import jalview.datamodel.SequenceI;
9 import jalview.io.DataSourceType;
10 import jalview.io.JPredFile;
11 import jalview.ws.api.JPredServiceI;
12 import jalview.ws.api.JobId;
13 import jalview.ws.params.ArgumentI;
14 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
15 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
16 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
17
18 public class SlivkaJPredServiceInstance extends SlivkaWSInstance
19     implements JPredServiceI
20 {
21
22   private class InputFormatParameter implements ArgumentI
23   {
24     String value = "";
25
26     @Override
27     public String getName()
28     {
29       return "format";
30     }
31
32     @Override
33     public String getValue()
34     {
35       return value;
36     }
37
38     @Override
39     public void setValue(String selectedItem)
40     {
41       value = selectedItem;
42     }
43   }
44
45
46   public SlivkaJPredServiceInstance(SlivkaClient client,
47       SlivkaService service, String action)
48   {
49     super(client, service, action);
50     style = ServiceClient.JPREDWSCLIENT;
51   }
52
53   @Override
54   public JobId predict(List<SequenceI> sequences, boolean msa) throws Throwable
55   {
56     // Hack allowing to send both single and msa jobs
57     // until msa and single sequence services are separated.
58     var arg = new InputFormatParameter();
59     arg.setValue(msa ? "fasta" : "seq");
60     return super.submit(sequences, null, List.of(arg));
61   }
62
63   @Override
64   public AlignmentI getAlignment(JobId jobId) throws Exception
65   {
66     List<RemoteFile> files;
67     try {
68       files = client.getJobResults(jobId.getJobId());
69       for (RemoteFile f : files) {
70         var alignment = readAlignment(f);
71         if (alignment != null)
72         {
73           return alignment;
74         }
75       }
76     }
77     catch (IOException e) {
78       throw new IOError(e);
79     }
80     return null;
81   }
82
83   @Override
84   public JPredFile getPrediction(JobId jobId) throws Exception
85   {
86     List<RemoteFile> files = client.getJobResults(jobId.getJobId());
87     for (RemoteFile f : files)
88     {
89       if (f.getLabel().equals("concise"))
90       {
91         return new JPredFile(f.getURL(), DataSourceType.URL);
92       }
93     }
94     return null;
95   }
96 }