JAL-3066 Implement clustaloWS using slivka system.
[jalview.git] / src / jalview / ws / slivkaws / ClustaloWS.java
1 package jalview.ws.slivkaws;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceI;
5 import jalview.gui.WebserviceInfo;
6 import jalview.io.DataSourceType;
7 import jalview.io.FileFormat;
8 import jalview.io.FormatAdapter;
9 import jalview.ws.api.JalviewServiceEndpointProviderI;
10 import jalview.ws.api.JobId;
11 import jalview.ws.api.MultipleSequenceAlignmentI;
12 import jalview.ws.api.ServiceWithParameters;
13 import jalview.ws.gui.WsJob;
14 import jalview.ws.params.ArgumentI;
15 import jalview.ws.params.ParamManager;
16 import jalview.ws.params.WsParamSetI;
17
18 import java.io.ByteArrayInputStream;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.util.EnumMap;
22 import java.util.List;
23
24 import org.apache.http.entity.ContentType;
25
26 import uk.ac.dundee.compbio.slivkaclient.Form;
27 import uk.ac.dundee.compbio.slivkaclient.FormValidationException;
28 import uk.ac.dundee.compbio.slivkaclient.JobState;
29 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
30 import uk.ac.dundee.compbio.slivkaclient.Service;
31 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
32
33 public class ClustaloWS extends ServiceWithParameters
34     implements MultipleSequenceAlignmentI, JalviewServiceEndpointProviderI
35 {
36   private SlivkaClient client;
37   private Service service;
38
39   private EnumMap<JobState, WsJob.JobState> stateMap = new EnumMap<>(JobState.class);
40   {
41     stateMap.put(JobState.PENDING, WsJob.JobState.QUEUED);
42     stateMap.put(JobState.QUEUED, WsJob.JobState.QUEUED);
43     stateMap.put(JobState.RUNNING, WsJob.JobState.RUNNING);
44     stateMap.put(JobState.COMPLETED, WsJob.JobState.FINISHED);
45     stateMap.put(JobState.FAILED, WsJob.JobState.FAILED);
46     stateMap.put(JobState.ERROR, WsJob.JobState.SERVERERROR);
47     stateMap.put(JobState.UNKNOWN, WsJob.JobState.UNKNOWN);
48   }
49
50
51   ClustaloWS(SlivkaClient client)
52   {
53     super("ClustalO", "Alignment", "ClustalO", "foo", "http://foo.foo");
54
55     this.client = client;
56     try
57     {
58       service = client.getService("clustalo");
59     } catch (IOException e)
60     {
61       throw new RuntimeException(e);
62     }
63   }
64
65   @Override
66   public void updateStatus(WsJob job)
67   {
68     try
69     {
70       job.setState(stateMap.get(client.getJobState(job.getJobId())));
71     } catch (IOException e)
72     {
73       throw new RuntimeException(e);
74     }
75   }
76
77   @Override
78   public boolean updateJobProgress(WsJob job)
79   {
80     return false;
81   }
82
83   @Override
84   public boolean handleSubmitError(Throwable _lex, WsJob j, WebserviceInfo wsInfo)
85   {
86     return false;
87   }
88
89   @Override
90   public boolean handleCollectionException(Exception e, WsJob msjob, WebserviceInfo wsInfo)
91   {
92     return false;
93   }
94
95   @Override
96   public JobId align(List<SequenceI> toalign, WsParamSetI parameters, List<ArgumentI> list) throws FormValidationException, IOException
97   {
98     StringBuilder builder = new StringBuilder();
99     for (SequenceI seq : toalign)
100     {
101       builder.append(">").append(seq.getName()).append("\n");
102       builder.append(seq.getSequence()).append("\n\n");
103     }
104     InputStream stream = new ByteArrayInputStream(builder.toString().getBytes());
105     RemoteFile file = client.uploadFile(stream, "input.fasta", ContentType.create("application/fasta"));
106     Form form = service.getForm();
107     form.insert("input", file);
108     String jobUUID = form.submit();
109     return new JobId("clustalo", "clustalo", jobUUID);
110   }
111
112   @Override
113   public AlignmentI getAlignmentFor(JobId jobId)
114   {
115     List<RemoteFile> files;
116     try
117     {
118       files = client.getJobResults(jobId.getJobId());
119       for (RemoteFile f: files) {
120         if (f.getMimeType().equals("application/clustal"))
121         {
122           return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Clustal);
123         }
124       }
125     } catch (IOException e1)
126     {
127       // TODO Auto-generated catch block
128       e1.printStackTrace();
129     }
130     return null;
131   }
132
133   @Override
134   public void initParamStore(ParamManager userParameterStore)
135   {
136
137   }
138
139   @Override
140   public Object getEndpoint()
141   {
142     return this;
143   }
144 }