JAL-1601 Implement JPred4 client and discoverer
[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   JPred4WSClient(JPredClient client)
27   {
28     this.client = client;
29   }
30
31   @Override
32   public String getUrl()
33   {
34     return client.getURL().toString();
35   }
36
37   @Override
38   public String getClientName()
39   {
40     return "jpred4";
41   }
42
43   @Override
44   public WebServiceJobHandle submit(List<SequenceI> sequences,
45       List<ArgumentI> args, Credentials credentials) throws IOException
46   {
47     var input = FileFormat.Fasta
48         .getWriter(null)
49         .print(sequences.toArray(SequenceI[]::new), false);
50     JPredRequest request = JPredRequest
51         .newBuilder()
52         .mode(JPredRequest.Mode.MSA)
53         .format(JPredRequest.Format.FASTA)
54         .input(input)
55         .build();
56     var jobId = client.submit(request);
57     return new WebServiceJobHandle(getClientName(), "jpred4", getUrl(), jobId);
58   }
59
60   @Override
61   public JobStatus getStatus(WebServiceJobHandle job) throws IOException
62   {
63     var status = client.getStatus(job.getJobId());
64     switch (status)
65     {
66     case RUNNING:
67       return JobStatus.RUNNING;
68     case FINISHED:
69       return JobStatus.COMPLETED;
70     case NO_JOB:
71       return JobStatus.SERVER_ERROR;
72     case MALFORMED:
73       return JobStatus.INVALID;
74     case NOT_EXIST:
75       return JobStatus.SERVER_ERROR;
76     default:
77       return JobStatus.UNKNOWN;
78     }
79   }
80
81   @Override
82   public String getLog(WebServiceJobHandle job) throws IOException
83   {
84     var stream = client.getResultStream(job.getJobId(), ResultTypes.LOG);
85     // FIXME: potential OOM
86     return new String(stream.readAllBytes());
87   }
88
89   @Override
90   public String getErrorLog(WebServiceJobHandle job) throws IOException
91   {
92     return "";
93   }
94
95   @Override
96   public void cancel(WebServiceJobHandle job)
97       throws IOException, UnsupportedOperationException
98   {
99     
100   }
101   
102   @Override
103   public AlignFile getAlignmentFile(WebServiceJobHandle job) throws IOException
104   {
105     var url = client.getResultURL(job.getJobId(), ResultTypes.PSIBLAST_ALIGN);
106     return new FastaFile(url.toString(), DataSourceType.URL);
107   }
108   
109   @Override
110   public JPredFile getPredictionFile(WebServiceJobHandle job) throws IOException
111   {
112     var url = client.getResultURL(job.getJobId(), ResultTypes.CONCISE);
113     return new JPredFile(url.toString(), DataSourceType.URL);
114   }
115 }