JAL-1601 Patch JPred4 service tests.
[jalview.git] / src / jalview / ws2 / client / jpred4 / JPred4WSClient.java
1 package jalview.ws2.client.jpred4;
2
3 import java.io.IOException;
4 import java.util.List;
5
6 import jalview.datamodel.SequenceI;
7 import jalview.io.AlignFile;
8 import jalview.io.DataSourceType;
9 import jalview.io.FastaFile;
10 import jalview.io.FileFormat;
11 import jalview.io.FormatAdapter;
12 import jalview.io.JPredFile;
13 import jalview.ws.params.ArgumentI;
14 import jalview.ws2.api.Credentials;
15 import jalview.ws2.api.JobStatus;
16 import jalview.ws2.api.WebServiceJobHandle;
17 import jalview.ws2.client.api.SecStructPredWebServiceClientI;
18 import uk.ac.dundee.compbio.jpred.JPredClient;
19 import uk.ac.dundee.compbio.jpred.JPredRequest;
20 import uk.ac.dundee.compbio.jpred.ResultTypes;
21
22 public class JPred4WSClient implements SecStructPredWebServiceClientI
23 {
24   final JPredClient client;
25
26   private final JPredRequest.Mode mode;
27
28   private final JPredRequest.Format format;
29
30   JPred4WSClient(JPredClient client, boolean msaMode)
31   {
32     this.mode = msaMode ? JPredRequest.Mode.MSA : JPredRequest.Mode.SINGLE;
33     this.format = msaMode ? JPredRequest.Format.FASTA : JPredRequest.Format.SEQ;
34     this.client = client;
35   }
36
37   @Override
38   public String getUrl()
39   {
40     return client.getURL().toString();
41   }
42
43   @Override
44   public String getClientName()
45   {
46     return "jpred4";
47   }
48
49   @Override
50   public WebServiceJobHandle submit(List<SequenceI> sequences,
51       List<ArgumentI> args, Credentials credentials) throws IOException
52   {
53     var input = mode == JPredRequest.Mode.MSA
54         ? FileFormat.Fasta
55             .getWriter(null)
56             .print(sequences.toArray(new SequenceI[sequences.size()]), false)
57         : sequences.get(0).getSequenceAsString();
58
59     JPredRequest request = JPredRequest
60         .newBuilder()
61         .mode(mode)
62         .format(format)
63         .input(input)
64         .build();
65     var jobId = client.submit(request);
66     return new WebServiceJobHandle(getClientName(), "jpred4", getUrl(), jobId);
67   }
68
69   @Override
70   public JobStatus getStatus(WebServiceJobHandle job) throws IOException
71   {
72     var status = client.getStatus(job.getJobId());
73     switch (status)
74     {
75     case PENDING:
76       return JobStatus.QUEUED;
77     case RUNNING:
78       return JobStatus.RUNNING;
79     case FINISHED:
80       return JobStatus.COMPLETED;
81     case NO_JOB:
82       return JobStatus.SERVER_ERROR;
83     case MALFORMED:
84       return JobStatus.INVALID;
85     case NOT_EXIST:
86       return JobStatus.SERVER_ERROR;
87     default:
88       return JobStatus.UNKNOWN;
89     }
90   }
91
92   @Override
93   public String getLog(WebServiceJobHandle job) throws IOException
94   {
95     var stream = client.getResultStream(job.getJobId(), ResultTypes.LOG);
96     // FIXME: potential OOM
97     return new String(stream.readAllBytes());
98   }
99
100   @Override
101   public String getErrorLog(WebServiceJobHandle job) throws IOException
102   {
103     return "";
104   }
105
106   @Override
107   public void cancel(WebServiceJobHandle job)
108       throws IOException, UnsupportedOperationException
109   {
110
111   }
112
113   @Override
114   public AlignFile getAlignmentFile(WebServiceJobHandle job) throws IOException
115   {
116     var url = client.getResultURL(job.getJobId(), ResultTypes.PSIBLAST_ALIGN);
117     return new FastaFile(url.toString(), DataSourceType.URL);
118   }
119
120   @Override
121   public JPredFile getPredictionFile(WebServiceJobHandle job) throws IOException
122   {
123     var url = client.getResultURL(job.getJobId(), ResultTypes.CONCISE);
124     return new JPredFile(url.toString(), DataSourceType.URL);
125   }
126 }