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