First try with MuscleWS
[jalview.git] / src / jalview / ws / MsaWSClient.java
1 package jalview.ws;\r
2 \r
3 import org.apache.axis.client.*;\r
4 import javax.xml.namespace.QName;\r
5 import java.util.*;\r
6 import jalview.datamodel.*;\r
7 import jalview.gui.*;\r
8 import javax.swing.*;\r
9 import java.util.*;\r
10 import java.awt.*;\r
11 import jalview.analysis.AlignSeq;\r
12 import ext.vamsas.*;\r
13 import vamsas.objects.*;\r
14 \r
15 public class MsaWSClient\r
16 {\r
17   int jobsRunning = 0;\r
18   ext.vamsas.MuscleWS server;\r
19   WebserviceInfo wsInfo;\r
20   /**\r
21    * MsaWSClient\r
22    *\r
23    * @param msa SequenceI[]\r
24    */\r
25   public MsaWSClient(SequenceI[] msa)\r
26   {\r
27     wsInfo = new jalview.gui.WebserviceInfo("Muscle Alignment job",\r
28                                 "Edgar, Robert C. (2004), MUSCLE: multiple sequence alignment with high accuracy and high throughput, Nucleic Acids Research 32(5), 1792-97.");\r
29 \r
30 \r
31     wsInfo.setProgressText("Job details\n");\r
32 \r
33 \r
34     MuscleWSServiceLocator loc = new MuscleWSServiceLocator(); // Default\r
35     try {\r
36       this.server = (MuscleWS) loc.getMuscleWS(); // JBPNote will be set from properties\r
37     }\r
38     catch (Exception ex) {\r
39       wsInfo.setProgressText("Serious! MuscleWS Service location failed\nfor URL :"\r
40                      +loc.getMuscleWSAddress()+"\n"+ex.getMessage());\r
41       ex.printStackTrace();\r
42     }\r
43 \r
44     MsaWSThread musclethread = new MsaWSThread(msa);\r
45     wsInfo.setthisService(musclethread);\r
46     musclethread.start();\r
47   }\r
48 \r
49 \r
50   protected class MsaWSThread extends Thread implements WSClientI\r
51   {\r
52     String ServiceName = "MuscleWS";\r
53     public boolean isCancellable()\r
54     {\r
55       return true;\r
56     }\r
57 \r
58     String OutputHeader;\r
59     vamsas.objects.simple.MsaResult result = null;\r
60     vamsas.objects.simple.SequenceSet seqs = new vamsas.objects.simple.\r
61         SequenceSet();\r
62     String jobId;\r
63     int allowedServerExceptions = 3; // thread dies if too many exceptions.\r
64     MsaWSThread(SequenceI[] msa)\r
65     {\r
66       OutputHeader = wsInfo.getProgressText();\r
67       vamsas.objects.simple.Sequence[] seqarray = new vamsas.objects.simple.\r
68           Sequence[msa.length];\r
69       for (int i = 0; i < msa.length; i++)\r
70       {\r
71         seqarray[i] = new vamsas.objects.simple.Sequence();\r
72         seqarray[i].setId(msa[i].getName());\r
73         seqarray[i].setSeq(AlignSeq.extractGaps("-. ", msa[i].getSequence()));\r
74       }\r
75       this.seqs = new vamsas.objects.simple.SequenceSet();\r
76       this.seqs.setSeqs(seqarray);\r
77     }\r
78 \r
79     boolean jobComplete = false;\r
80 \r
81     public void cancelJob() {\r
82       if (!jobComplete) {\r
83         String cancelledMessage="";\r
84         try {\r
85           vamsas.objects.simple.WsJobId cancelledJob = server.cancel(jobId);\r
86           if (cancelledJob.getStatus() == 2)\r
87           {\r
88             // CANCELLED_JOB\r
89             cancelledMessage = "Job cancelled.";\r
90             jobComplete = true;\r
91             jobsRunning--;\r
92             result = null;\r
93           }\r
94           else\r
95           if (cancelledJob.getStatus() == 3)\r
96           {\r
97             // VALID UNSTOPPABLE JOB\r
98             cancelledMessage +=\r
99                 "Server cannot cancel this job. just close the window.\n";\r
100           }\r
101           if (cancelledJob.getJobId() != null)\r
102             cancelledMessage += "[" + cancelledJob.getJobId() + "]";\r
103           cancelledMessage +="\n";\r
104         } catch (Exception exc) {\r
105           cancelledMessage +="\nProblems cancelling the job : Exception received...\n"+exc+"\n";\r
106           exc.printStackTrace();\r
107         }\r
108         wsInfo.setProgressText(OutputHeader + cancelledMessage+"\n");\r
109       }\r
110     }\r
111 \r
112     public void run()\r
113     {\r
114 \r
115       StartJob();\r
116 \r
117       while (!jobComplete && (allowedServerExceptions > 0))\r
118       {\r
119         try\r
120         {\r
121           result = server.getResult(jobId);\r
122 \r
123          if( result.isRunning() )\r
124            wsInfo.setStatus(WebserviceInfo.STATE_RUNNING);\r
125          else if( result.isQueued() )\r
126            wsInfo.setStatus(WebserviceInfo.STATE_QUEUING);\r
127 \r
128           if (result.isFinished())\r
129           {\r
130             parseResult();\r
131             jobComplete = true;\r
132             jobsRunning--;\r
133           }\r
134           else\r
135           {\r
136             wsInfo.setProgressText(OutputHeader + "\n" + result.getStatus());\r
137             if (! (result.isJobFailed() || result.isServerError()))\r
138             {\r
139               Thread.sleep(5000);\r
140               //  System.out.println("I'm alive "+seqid+" "+jobid);\r
141             }\r
142           }\r
143         }\r
144         catch (Exception ex)\r
145         {\r
146           allowedServerExceptions--;\r
147           wsInfo.appendProgressText("\n"+ServiceName+" Server exception!\n" + ex.getMessage());\r
148           ex.printStackTrace();\r
149         }\r
150       }\r
151 \r
152       if (! (result!=null && (result.isJobFailed() || result.isServerError())))\r
153         wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK);\r
154       else\r
155         wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
156     }\r
157 \r
158     void StartJob()\r
159     {\r
160       try\r
161       {\r
162         vamsas.objects.simple.WsJobId jobsubmit = server.align(seqs);\r
163         if (jobsubmit.getStatus()==1) {\r
164           System.out.println(jobId=jobsubmit.getJobId());\r
165         } else {\r
166           throw new Exception(jobsubmit.getJobId());\r
167         }\r
168       }\r
169       catch (Exception e)\r
170       {\r
171         System.out.println(ServiceName + " Client: Failed to submit the prediction\n" +\r
172                            e.toString() + "\n");\r
173         e.printStackTrace();\r
174       }\r
175     }\r
176 \r
177     private void addFloatAnnotations(Alignment al, int[] gapmap, Vector values, String Symname, String Visname, float min, float max, int winLength) {\r
178 \r
179       Annotation[] annotations = new Annotation[al.getWidth()];\r
180       for (int j = 0; j < values.size(); j++)\r
181       {\r
182         float value = Float.parseFloat(values.get(j).toString());\r
183         annotations[gapmap[j]] = new Annotation("", value+"",' ',value);\r
184       }\r
185       al.addAnnotation(new AlignmentAnnotation(Symname, Visname, annotations, min, max, winLength));\r
186     }\r
187     private jalview.datamodel.Sequence[] getVamsasAlignment(vamsas.objects.simple.Alignment valign) {\r
188       vamsas.objects.simple.Sequence[] seqs = valign.getSeqs().getSeqs();\r
189       jalview.datamodel.Sequence[] msa = new jalview.datamodel.Sequence[seqs.length];\r
190       for (int i=0, j=seqs.length; i<j;i++)\r
191         msa[i] = new jalview.datamodel.Sequence(seqs[i].getId(), seqs[i].getSeq());\r
192       return msa;\r
193     }\r
194     void parseResult()\r
195     {\r
196       SequenceI[] seqs=null;\r
197       try {\r
198         // OutputHeader = output.getText();\r
199         if (result.isFailed()) {\r
200           OutputHeader +="Job failed.\n";\r
201         }\r
202         if (result.getStatus()!=null) {\r
203           OutputHeader += "\n"+result.getStatus();\r
204         }\r
205         if (result.getMsa()!=null) {\r
206           OutputHeader += "\nAlignment Object Method Notes\n";\r
207           String lines[] = result.getMsa().getMethod();\r
208           for (int line=0;line<lines.length; line++)\r
209             OutputHeader+=lines[line]+"\n";\r
210 \r
211           // JBPNote The returned files from a webservice could be hidden behind icons in the monitor window that, when clicked, pop up their corresponding data\r
212           seqs = getVamsasAlignment(result.getMsa());\r
213         }\r
214 \r
215         wsInfo.setProgressText(OutputHeader);\r
216         if (seqs!=null) {\r
217           Alignment al;\r
218           al = new Alignment(seqs);\r
219 \r
220           // TODO: JBPNote Should also rename the query sequence sometime...\r
221           AlignFrame af = new AlignFrame(al);\r
222           Desktop.addInternalFrame(af,\r
223                                    ServiceName + " Alignment",\r
224                                    AlignFrame.NEW_WINDOW_WIDTH,\r
225                                    AlignFrame.NEW_WINDOW_HEIGHT);\r
226         }\r
227       }catch(Exception ex){ex.printStackTrace();}\r
228 \r
229     }\r
230 \r
231   }\r
232   }\r
233 \r