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