1 /* Copyright (c) 2009 Peter Troshin
\r
3 * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0
\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
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
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
15 * Any republication or derived work distributed in source code form
\r
16 * must include this copyright and license notice.
\r
19 package compbio.ws.client;
\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
27 import javax.xml.ws.WebServiceException;
\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
45 * Class for testing web services
\r
49 * @version 1.0 February 2010
\r
51 public class WSTester {
\r
54 * Sequences to be used as input for all WS
\r
56 static final String fastaInput = ">Foobar\n"
\r
57 + "MTADGPRELLQLRAAVRHRPQDFVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAVARLGRVRWTQQRHAEAAVLLQQASDAAPEHPGIALWLGHALEDAGQAEAAAAAYTRAHQLLPEEPYITAQLLNWRRRLCDWRALDVLSAQVRAAVAQGVGAVEPFAFLSEDASAAEQLACARTRAQAIAASVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKA"
\r
59 + "ASDAAPEHPGIALWLHALEDAGQAEAAAAYTRAHQLLPEEPYITAQLLNAVAQGVGAVEPFAFLSEDASAAESVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKAVALASDPAALTALHARVDVLRRESGVFEMDGFADDFGALLQALARRHGWLGI"
\r
61 + "MTADGPRELLQLRAAVRHRPQDVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAVARLGRVRWTQQRHAEAAVLLQQASDAAPEHPGIALWLGHALEDHQLLPEEPYITAQLDVLSAQVRAAVAQGVGAVEPFAFLSEDASAAEQLACARTRAQAIAASVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKAVALASDPAALTALHARVDVLRRESI\n";
\r
63 static final List<FastaSequence> seqs = loadSeqs();
\r
65 private static final String FAILED = "FAILED";
\r
66 private static final String OK = "OK";
\r
69 * Converting input to a form accepted by WS
\r
71 * @return List of FastaSequence records
\r
73 static List<FastaSequence> loadSeqs() {
\r
75 return SequenceUtil.readFasta(new ByteArrayInputStream(fastaInput
\r
77 } catch (IOException ignored) {
\r
78 // Should not happen as a source is not a external stream
\r
79 ignored.printStackTrace();
\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
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
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
107 * Calls alignment with preset
\r
112 * list of the Preset
\r
113 * @throws UnsupportedRuntimeException
\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
121 Alignment al = null;
\r
123 String taskId = msaws.presetAlign(seqs, preset);
\r
124 al = msaws.getResult(taskId);
\r
126 System.out.println(OK);
\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
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
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
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
158 * Call most of web services functions and check the output
\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
168 static <T> boolean checkService(MsaWS<T> msaws)
\r
169 throws UnsupportedRuntimeException {
\r
171 boolean succeed = testDefaultAlignment(msaws);
\r
173 // If exception above is thrown than the tests below is not run
\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
182 System.out.print("Querying presets...");
\r
184 if (pmanager != null && pmanager.getPresets().size() > 0) {
\r
185 System.out.println(OK);
\r
187 System.out.println("UNSUPPORTED");
\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
195 System.out.println(FAILED);
\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
204 System.out.println("UNSUPPORTED");
\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
213 System.out.println("UNSUPPORTED");
\r
219 * Align using default settings
\r
223 * @throws UnsupportedRuntimeException
\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
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
238 System.out.println(OK);
\r
239 System.out.print("Retrieving results...");
\r
240 al = msaws.getResult(taskId);
\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
255 System.out.println(OK);
\r
261 * Connect to a WS using the host and the service name
\r
268 static <T> MsaWS<T> connect(String host, Services service) {
\r
269 MsaWS<T> msaws = null;
\r
271 System.out.print("Connecting to service " + service + " on " + host
\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
282 * Test JWS2 web services
\r
287 * -h=<Your web application server host name, port and JWS2
\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
294 public static <T> void main(String[] args) throws IOException {
\r
296 if (args == null || args.length < 1) {
\r
300 String host = Jws2Client.getHost(args);
\r
301 String serviceName = Jws2Client.getServiceName(args);
\r
302 if (!Jws2Client.validURL(host)) {
\r
304 .println("<host_and_context> parameter is not provided or is incorrect!");
\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
320 msaws = connect(host, service);
\r
321 if (msaws == null) {
\r
325 succeed = checkService(msaws);
\r
326 } catch (UnsupportedRuntimeException ignored) {
\r
329 ((Closeable) msaws).close();
\r
331 reportResults(service, succeed);
\r
336 .println("<ServiceName> is not provided checking all known services...");
\r
338 for (Services serv : Services.values()) {
\r
339 System.out.println();
\r
340 msaws = connect(host, serv);
\r
341 if (msaws == null) {
\r
345 succeed = checkService(msaws);
\r
346 } catch (UnsupportedRuntimeException ignored) {
\r
347 System.out.println("Service " + serv + " IS NOT FUNCTIONAL");
\r
350 ((Closeable) msaws).close();
\r
352 reportResults(serv, succeed);
\r
357 private static void reportResults(Services serv, boolean succeed) {
\r
359 System.out.println("Check is completed. The Service " + serv
\r
362 System.out.println("Check is completed. The Service " + serv
\r
363 + " HAS SOME PROBLEMS");
\r