Refactored client class to accomodate new WS interface and reduce the complexity
[jabaws.git] / webservices / compbio / ws / client / WSTester.java
1 /* Copyright (c) 2009 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 \r
19 package compbio.ws.client;\r
20 \r
21 import static compbio.ws.client.Constraints.hostkey;\r
22 import static compbio.ws.client.Constraints.pseparator;\r
23 import static compbio.ws.client.Constraints.servicekey;\r
24 \r
25 import java.io.ByteArrayInputStream;\r
26 import java.io.Closeable;\r
27 import java.io.IOException;\r
28 import java.util.Arrays;\r
29 import java.util.List;\r
30 \r
31 import javax.xml.ws.WebServiceException;\r
32 \r
33 import compbio.data.msa.MsaWS;\r
34 import compbio.data.sequence.Alignment;\r
35 import compbio.data.sequence.FastaSequence;\r
36 import compbio.data.sequence.SequenceUtil;\r
37 import compbio.metadata.JobStatus;\r
38 import compbio.metadata.JobSubmissionException;\r
39 import compbio.metadata.Limit;\r
40 import compbio.metadata.LimitsManager;\r
41 import compbio.metadata.Preset;\r
42 import compbio.metadata.PresetManager;\r
43 import compbio.metadata.ResultNotAvailableException;\r
44 import compbio.metadata.RunnerConfig;\r
45 import compbio.metadata.UnsupportedRuntimeException;\r
46 import compbio.metadata.WrongParameterException;\r
47 \r
48 /**\r
49  * Class for testing web services\r
50  * \r
51  * @author pvtroshin\r
52  * \r
53  * @version 1.0 February 2010\r
54  */\r
55 public class WSTester {\r
56 \r
57         /**\r
58          * Sequences to be used as input for all WS\r
59          */\r
60         static final String fastaInput = ">Foobar\n"\r
61                         + "MTADGPRELLQLRAAVRHRPQDFVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAVARLGRVRWTQQRHAEAAVLLQQASDAAPEHPGIALWLGHALEDAGQAEAAAAAYTRAHQLLPEEPYITAQLLNWRRRLCDWRALDVLSAQVRAAVAQGVGAVEPFAFLSEDASAAEQLACARTRAQAIAASVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKA"\r
62                         + "\n>Barbar\n"\r
63                         + "ASDAAPEHPGIALWLHALEDAGQAEAAAAYTRAHQLLPEEPYITAQLLNAVAQGVGAVEPFAFLSEDASAAESVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKAVALASDPAALTALHARVDVLRRESGVFEMDGFADDFGALLQALARRHGWLGI"\r
64                         + "\n>Foofriend\n"\r
65                         + "MTADGPRELLQLRAAVRHRPQDVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAVARLGRVRWTQQRHAEAAVLLQQASDAAPEHPGIALWLGHALEDHQLLPEEPYITAQLDVLSAQVRAAVAQGVGAVEPFAFLSEDASAAEQLACARTRAQAIAASVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKAVALASDPAALTALHARVDVLRRESI\n";\r
66 \r
67         static final List<FastaSequence> seqs = loadSeqs();\r
68 \r
69         private static final String FAILED = "FAILED";\r
70         private static final String OK = "OK";\r
71 \r
72         /**\r
73          * Converting input to a form accepted by WS\r
74          * \r
75          * @return List of FastaSequence records\r
76          */\r
77         static List<FastaSequence> loadSeqs() {\r
78                 try {\r
79                         return SequenceUtil.readFasta(new ByteArrayInputStream(fastaInput\r
80                                         .getBytes()));\r
81                 } catch (IOException ignored) {\r
82                         // Should not happen as a source is not a external stream\r
83                         ignored.printStackTrace();\r
84                 }\r
85                 return null;\r
86         }\r
87 \r
88         /**\r
89          * Prints usage\r
90          */\r
91         static void printUsage() {\r
92                 System.out.println("Usage: <Class or Jar file name> " + hostkey\r
93                                 + pseparator + "host_and_context " + "<" + servicekey\r
94                                 + pseparator + "serviceName>");\r
95                 System.out.println();\r
96                 System.out\r
97                                 .println(hostkey\r
98                                                 + pseparator\r
99                                                 + "<host_and_context> - a full URL to the JABAWS web server including context path e.g. http://10.31.1.159:8080/ws");\r
100                 System.out\r
101                                 .println(servicekey\r
102                                                 + pseparator\r
103                                                 + "<ServiceName> - optional if unspecified all services are tested otherwise one of "\r
104                                                 + Arrays.toString(Services.values()));\r
105                 System.out.println();\r
106 \r
107         }\r
108 \r
109         /**\r
110          * Calls alignment with preset\r
111          * \r
112          * @param <T>\r
113          * @param msaws\r
114          * @param presets\r
115          *            list of the Preset\r
116          * @throws UnsupportedRuntimeException\r
117          */\r
118         static <T> boolean presetAlign(MsaWS<T> msaws, List<Preset<T>> presets)\r
119                         throws UnsupportedRuntimeException {\r
120                 boolean succeed = false;\r
121                 for (Preset<T> preset : presets) {\r
122                         System.out.print("Aligning with preset '" + preset.getName()\r
123                                         + "'... ");\r
124                         Alignment al = null;\r
125                         try {\r
126                                 String taskId = msaws.presetAlign(seqs, preset);\r
127                                 al = msaws.getResult(taskId);\r
128                                 if (al != null) {\r
129                                         System.out.println(OK);\r
130                                 }\r
131                                 succeed = true;\r
132                         } catch (UnsupportedRuntimeException e) {\r
133                                 System.out.println(FAILED);\r
134                                 // If executable is not supported than none of the presets are\r
135                                 // going to work\r
136                                 throw new UnsupportedRuntimeException(e);\r
137                         } catch (JobSubmissionException e) {\r
138                                 // TODO custom message\r
139                                 System.out.println(FAILED);\r
140                                 System.out.println();\r
141                                 e.printStackTrace();\r
142                                 continue;\r
143                         } catch (WrongParameterException e) {\r
144                                 // TODO custom message\r
145                                 System.out.println(FAILED);\r
146                                 System.out.println();\r
147                                 e.printStackTrace();\r
148                                 continue;\r
149                         } catch (ResultNotAvailableException e) {\r
150                                 // TODO custom message\r
151                                 System.out.println(FAILED);\r
152                                 System.out.println();\r
153                                 e.printStackTrace();\r
154                                 continue;\r
155                         }\r
156                 }\r
157                 return succeed;\r
158         }\r
159 \r
160         /**\r
161          * Call most of web services functions and check the output\r
162          * \r
163          * @param <T>\r
164          *            web service type\r
165          * @param msaws\r
166          * @throws UnsupportedRuntimeException\r
167          *             is thrown if the connection to a web service was made, but\r
168          *             the web service is not functional. e.g. when native\r
169          *             executable does not exists for a server platform\r
170          */\r
171         static <T> boolean checkService(MsaWS<T> msaws)\r
172                         throws UnsupportedRuntimeException {\r
173 \r
174                 boolean succeed = testDefaultAlignment(msaws);\r
175 \r
176                 // If exception above is thrown than the tests below is not run\r
177 \r
178                 PresetManager<T> pmanager = msaws.getPresets();\r
179                 if (pmanager != null && pmanager.getPresets().size() > 0) {\r
180                         System.out.println("Testing alignment with presets:");\r
181                         List<Preset<T>> plist = pmanager.getPresets();\r
182                         succeed = !succeed ? presetAlign(msaws, plist) : succeed;\r
183                 }\r
184 \r
185                 System.out.print("Querying presets...");\r
186 \r
187                 if (pmanager != null && pmanager.getPresets().size() > 0) {\r
188                         System.out.println(OK);\r
189                 } else {\r
190                         System.out.println("UNSUPPORTED");\r
191                 }\r
192 \r
193                 System.out.print("Querying Parameters...");\r
194                 RunnerConfig<T> options = msaws.getRunnerOptions();\r
195                 if (options != null && options.getArguments().size() > 0) {\r
196                         System.out.println(OK);\r
197                 } else {\r
198                         System.out.println(FAILED);\r
199                         succeed = false;\r
200                 }\r
201 \r
202                 System.out.print("Querying Limits...");\r
203                 LimitsManager<T> limits = msaws.getLimits();\r
204                 if (limits != null && limits.getLimits().size() > 0) {\r
205                         System.out.println(OK);\r
206                 } else {\r
207                         System.out.println("UNSUPPORTED");\r
208                 }\r
209 \r
210                 System.out.print("Querying Local Engine Limits...");\r
211                 Limit<T> localLimit = msaws\r
212                                 .getLimit(PresetManager.LOCAL_ENGINE_LIMIT_PRESET);\r
213                 if (localLimit != null) {\r
214                         System.out.println(OK);\r
215                 } else {\r
216                         System.out.println("UNSUPPORTED");\r
217                 }\r
218                 return succeed;\r
219         }\r
220 \r
221         /**\r
222          * Align using default settings\r
223          * \r
224          * @param <T>\r
225          * @param msaws\r
226          * @throws UnsupportedRuntimeException\r
227          */\r
228         static <T> boolean testDefaultAlignment(MsaWS<T> msaws)\r
229                         throws UnsupportedRuntimeException {\r
230                 System.out.print("Testing alignment with default parameters:");\r
231                 Alignment al = null;\r
232                 boolean succeed = false;\r
233                 try {\r
234                         String taskId = msaws.align(seqs);\r
235                         System.out.print("\nQuerying job status...");\r
236                         JobStatus status = msaws.getJobStatus(taskId);\r
237                         while (status != JobStatus.FINISHED) {\r
238                                 Thread.sleep(1000);\r
239                                 status = msaws.getJobStatus(taskId);\r
240                         }\r
241                         System.out.println(OK);\r
242                         System.out.print("Retrieving results...");\r
243                         al = msaws.getResult(taskId);\r
244                         succeed = true;\r
245                 } catch (ResultNotAvailableException e) {\r
246                         System.out.println(FAILED);\r
247                         e.printStackTrace();\r
248                 } catch (JobSubmissionException e) {\r
249                         System.out.println(FAILED);\r
250                         System.out.println();\r
251                         e.printStackTrace();\r
252                 } catch (InterruptedException e) {\r
253                         System.out.println(FAILED);\r
254                         System.out.println();\r
255                         e.printStackTrace();\r
256                 }\r
257                 if (al != null) {\r
258                         System.out.println(OK);\r
259                 }\r
260                 return succeed;\r
261         }\r
262 \r
263         /**\r
264          * Connect to a WS using the host and the service name\r
265          * \r
266          * @param <T>\r
267          * @param host\r
268          * @param service\r
269          * @return\r
270          */\r
271         static <T> MsaWS<T> connect(String host, Services service) {\r
272                 MsaWS<T> msaws = null;\r
273                 try {\r
274                         System.out.print("Connecting to service " + service + " on " + host\r
275                                         + " ... ");\r
276                         msaws = (MsaWS<T>) Jws2Client.connect(host, service);\r
277                         System.out.println(OK);\r
278                 } catch (WebServiceException e) {\r
279                         System.out.println(FAILED);\r
280                 }\r
281                 return msaws;\r
282         }\r
283 \r
284         /**\r
285          * Test JWS2 web services\r
286          * \r
287          * @param <T>\r
288          *            web service type\r
289          * @param args\r
290          *            -h=<Your web application server host name, port and JWS2\r
291          *            context path>\r
292          * \r
293          *            -s=<ServiceName> which is optional. If service name is not\r
294          *            provided then all known JWS2 web services are tested\r
295          * @throws IOException\r
296          */\r
297         public static <T> void main(String[] args) throws IOException {\r
298 \r
299                 if (args == null || args.length < 1) {\r
300                         printUsage();\r
301                         System.exit(0);\r
302                 }\r
303                 String host = CmdHelper.getHost(args);\r
304                 String serviceName = CmdHelper.getServiceName(args);\r
305                 if (!Jws2Client.validURL(host)) {\r
306                         System.out\r
307                                         .println("<host_and_context> parameter is not provided or is incorrect!");\r
308                         System.exit(1);\r
309                 }\r
310                 boolean succeed = false;\r
311                 MsaWS<T> msaws = null;\r
312                 if (serviceName != null) {\r
313                         Services service = Services.getService(serviceName);\r
314                         if (service == null) {\r
315                                 System.out.println("Service '" + serviceName\r
316                                                 + "' is not supported. Valid values are: "\r
317                                                 + Arrays.toString(Services.values()));\r
318                                 System.out.println();\r
319                                 printUsage();\r
320                                 System.exit(1);\r
321                         }\r
322 \r
323                         msaws = connect(host, service);\r
324                         if (msaws == null) {\r
325                                 System.exit(1);\r
326                         }\r
327                         try {\r
328                                 succeed = checkService(msaws);\r
329                         } catch (UnsupportedRuntimeException ignored) {\r
330                                 System.exit(1);\r
331                         } finally {\r
332                                 ((Closeable) msaws).close();\r
333                         }\r
334                         reportResults(service, succeed);\r
335                         System.exit(0);\r
336                 }\r
337 \r
338                 System.out\r
339                                 .println("<ServiceName> is not provided checking all known services...");\r
340 \r
341                 for (Services serv : Services.values()) {\r
342                         System.out.println();\r
343                         msaws = connect(host, serv);\r
344                         if (msaws == null) {\r
345                                 continue;\r
346                         }\r
347                         try {\r
348                                 succeed = checkService(msaws);\r
349                         } catch (UnsupportedRuntimeException ignored) {\r
350                                 System.out.println("Service " + serv + " IS NOT FUNCTIONAL");\r
351                                 continue;\r
352                         } finally {\r
353                                 ((Closeable) msaws).close();\r
354                         }\r
355                         reportResults(serv, succeed);\r
356                 }\r
357 \r
358         }\r
359 \r
360         private static void reportResults(Services serv, boolean succeed) {\r
361                 if (succeed) {\r
362                         System.out.println("Check is completed. The Service " + serv\r
363                                         + " IS WORKING");\r
364                 } else {\r
365                         System.out.println("Check is completed. The Service " + serv\r
366                                         + " HAS SOME PROBLEMS");\r
367                 }\r
368         }\r
369 }\r