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