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