Java doc and package infos from JWS" branch. Also rethink of MSAWS interface in light...
[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 JABAWS 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