-/* Copyright (c) 2009 Peter Troshin\r
+/* Copyright (c) 2011 Peter Troshin\r
* \r
- * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0 \r
+ * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0 \r
* \r
* This library is free software; you can redistribute it and/or modify it under the terms of the\r
* Apache License version 2 as published by the Apache Software Foundation\r
import java.io.ByteArrayInputStream;\r
import java.io.Closeable;\r
import java.io.IOException;\r
+import java.io.PrintWriter;\r
+import java.net.ConnectException;\r
import java.util.Arrays;\r
import java.util.List;\r
\r
import javax.xml.ws.WebServiceException;\r
\r
+import org.apache.log4j.Logger;\r
+\r
+import compbio.data.msa.JABAService;\r
+import compbio.data.msa.Metadata;\r
import compbio.data.msa.MsaWS;\r
+import compbio.data.msa.SequenceAnnotation;\r
import compbio.data.sequence.Alignment;\r
import compbio.data.sequence.FastaSequence;\r
+import compbio.data.sequence.ScoreManager;\r
import compbio.data.sequence.SequenceUtil;\r
import compbio.metadata.JobStatus;\r
-import compbio.metadata.JobSubmissionException;\r
import compbio.metadata.Limit;\r
import compbio.metadata.LimitsManager;\r
+import compbio.metadata.Option;\r
import compbio.metadata.Preset;\r
import compbio.metadata.PresetManager;\r
-import compbio.metadata.ResultNotAvailableException;\r
import compbio.metadata.RunnerConfig;\r
import compbio.metadata.UnsupportedRuntimeException;\r
-import compbio.metadata.WrongParameterException;\r
+import compbio.util.FileUtil;\r
+import compbio.util.Util;\r
\r
/**\r
* Class for testing web services\r
*/\r
public class WSTester {\r
\r
+ private static Logger log = Logger.getLogger(WSTester.class);\r
/**\r
* Sequences to be used as input for all WS\r
*/\r
- static final String fastaInput = ">Foobar\n"\r
- + "MTADGPRELLQLRAAVRHRPQDFVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAVARLGRVRWTQQRHAEAAVLLQQASDAAPEHPGIALWLGHALEDAGQAEAAAAAYTRAHQLLPEEPYITAQLLNWRRRLCDWRALDVLSAQVRAAVAQGVGAVEPFAFLSEDASAAEQLACARTRAQAIAASVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKA"\r
- + "\n>Barbar\n"\r
- + "ASDAAPEHPGIALWLHALEDAGQAEAAAAYTRAHQLLPEEPYITAQLLNAVAQGVGAVEPFAFLSEDASAAESVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKAVALASDPAALTALHARVDVLRRESGVFEMDGFADDFGALLQALARRHGWLGI"\r
- + "\n>Foofriend\n"\r
- + "MTADGPRELLQLRAAVRHRPQDVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAVARLGRVRWTQQRHAEAAVLLQQASDAAPEHPGIALWLGHALEDHQLLPEEPYITAQLDVLSAQVRAAVAQGVGAVEPFAFLSEDASAAEQLACARTRAQAIAASVRPLAPTRVRSKGPLRVGFVSNGFGAHPTGLLTVALFEALQRRQPDLQMHLFATSGDDGSTLRTRLAQASTLHDVTALGHLATAKHIRHHGIDLLFDLRGWGGGGRPEVFALRPAPVQVNWLAYPGTSGAPWMDYVLGDAFALPPALEPFYSEHVLRLQGAFQPSDTSRVVAEPPSRTQCGLPEQGVVLCCFNNSYKLNPQSMARMLAVLREVPDSVLWLLSGPGEADARLRAFAHAQGVDAQRLVFMPKLPHPQYLARYRHADLFLDTHPYNAHTTASDALWTGCPVLTTPGETFAARVAGSLNHHLGLDEMNVADDAAFVAKAVALASDPAALTALHARVDVLRRESI\n";\r
+ static final String fastaInput = ">Foo\n"\r
+ + "MTADGPRELLQLRAAVRHRPQDFVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAV"\r
+ + "\n>Bar\n"\r
+ + "ASDAAPEHPGIALWLHALEDAGQAEAAAAYTRAHQLLPEEPYITAQLLNAVA";\r
+\r
+ static final String fastaAlignment = ">Foo\r\n"\r
+ + "MTADGPRELLQLRAAVRHRPQDFVAWLMLADAELGMGDTTAGEMAVQRGLALHPGHPEAV--------\r\n"\r
+ + ">Bar\r\n"\r
+ + "ASDAAPEH------------PGIALWLHALE-DAGQAEAAA---AYTRAHQLLPEEPYITAQLLNAVA\r\n"\r
+ + "";\r
\r
static final List<FastaSequence> seqs = loadSeqs();\r
\r
private static final String FAILED = "FAILED";\r
private static final String OK = "OK";\r
\r
+ private static final String UNSUPPORTED = "UNSUPPORTED";\r
+\r
/**\r
* Converting input to a form accepted by WS\r
* \r
* @return List of FastaSequence records\r
*/\r
- static List<FastaSequence> loadSeqs() {\r
+ private static List<FastaSequence> loadSeqs() {\r
try {\r
return SequenceUtil.readFasta(new ByteArrayInputStream(fastaInput\r
.getBytes()));\r
}\r
\r
/**\r
+ * Converting input to a form accepted by WS\r
+ * \r
+ * @return List of FastaSequence records\r
+ */\r
+ private static List<FastaSequence> loadAlignment() {\r
+ try {\r
+ return SequenceUtil.readFasta(new ByteArrayInputStream(\r
+ fastaAlignment.getBytes()));\r
+ } catch (IOException ignored) {\r
+ // Should not happen as a source is not a external stream\r
+ ignored.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private final PrintWriter writer;\r
+ private final String hostname;\r
+\r
+ /**\r
+ * Construct an instance of JABAWS tester\r
+ * \r
+ * @param hostname\r
+ * - fully qualified host and context name of JABAWS e.g.\r
+ * http://nanna.cluster.lifesci.dundee.ac.uk:8080/jaba\r
+ * @param writer\r
+ * a PrintWriter instance to writer test log to.\r
+ */\r
+ public WSTester(String hostname, PrintWriter writer) {\r
+ if (Util.isEmpty(hostname)) {\r
+ throw new NullPointerException("Hostname must be provided!");\r
+ }\r
+ this.hostname = hostname;\r
+ this.writer = writer;\r
+ }\r
+\r
+ /**\r
* Prints usage\r
*/\r
static void printUsage() {\r
* list of the Preset\r
* @throws UnsupportedRuntimeException\r
*/\r
- static <T> boolean presetAlign(MsaWS<T> msaws, List<Preset<T>> presets)\r
+ private <T> boolean presetAlign(MsaWS<T> msaws, List<Preset<T>> presets)\r
throws UnsupportedRuntimeException {\r
boolean succeed = false;\r
for (Preset<T> preset : presets) {\r
- System.out.print("Aligning with preset '" + preset.getName()\r
- + "'... ");\r
+ writer.print("Aligning with preset '" + preset.getName() + "'... ");\r
Alignment al = null;\r
try {\r
String taskId = msaws.presetAlign(seqs, preset);\r
al = msaws.getResult(taskId);\r
if (al != null) {\r
- System.out.println(OK);\r
+ writer.println(OK);\r
}\r
succeed = true;\r
- } catch (UnsupportedRuntimeException e) {\r
- System.out.println(FAILED);\r
- // If executable is not supported than none of the presets are\r
- // going to work\r
- throw new UnsupportedRuntimeException(e);\r
- } catch (JobSubmissionException e) {\r
- // TODO custom message\r
- System.out.println(FAILED);\r
- System.out.println();\r
- e.printStackTrace();\r
- continue;\r
- } catch (WrongParameterException e) {\r
- // TODO custom message\r
- System.out.println(FAILED);\r
- System.out.println();\r
- e.printStackTrace();\r
- continue;\r
- } catch (ResultNotAvailableException e) {\r
- // TODO custom message\r
- System.out.println(FAILED);\r
- System.out.println();\r
- e.printStackTrace();\r
+ } catch (Exception e) {\r
+ if (e instanceof UnsupportedRuntimeException) {\r
+ // If executable is not supported than none of the presets\r
+ // are\r
+ // going to work\r
+ throw (UnsupportedRuntimeException) e;\r
+ } else {\r
+ reportException(e);\r
+ }\r
continue;\r
}\r
}\r
return succeed;\r
}\r
\r
+ private <T> boolean testMsaWS(MsaWS<T> msaws) throws Exception {\r
+ assert msaws != null;\r
+\r
+ boolean succeed = testDefaultAlignment(msaws);\r
+ // If exception above is thrown than the tests below is not run\r
+\r
+ PresetManager<T> pmanager = msaws.getPresets();\r
+ if (pmanager != null && pmanager.getPresets().size() > 0) {\r
+ writer.println("Testing alignment with presets:");\r
+ List<Preset<T>> plist = pmanager.getPresets();\r
+ succeed = !succeed ? presetAlign(msaws, plist) : succeed;\r
+ }\r
+ testMetadata(msaws);\r
+ return succeed;\r
+ }\r
/**\r
* Call most of web services functions and check the output\r
* \r
* the web service is not functional. e.g. when native\r
* executable does not exists for a server platform\r
*/\r
- static <T> boolean checkService(MsaWS<T> msaws)\r
- throws UnsupportedRuntimeException {\r
+ @SuppressWarnings("unchecked")\r
+ private <T> boolean checkService(JABAService wservice, Services service) {\r
+ try {\r
+ if (wservice == null) {\r
+ throw new NullPointerException(\r
+ "JABAService instance must be provided!");\r
+ }\r
\r
- boolean succeed = testDefaultAlignment(msaws);\r
+ if (wservice instanceof MsaWS) {\r
+ return testMsaWS((MsaWS<T>) wservice);\r
+ } else if (wservice instanceof SequenceAnnotation) {\r
+ return testSequenceAnnotationWS(\r
+ (SequenceAnnotation<T>) wservice, service);\r
+ } else {\r
+ throw new UnsupportedOperationException("The service: "\r
+ + wservice.getClass() + " is not supported! ");\r
+ }\r
+ } catch (Exception e) {\r
+ reportException(e);\r
+ return false;\r
+ }\r
+ }\r
\r
- // If exception above is thrown than the tests below is not run\r
+ private <T> boolean testSequenceAnnotationWS(\r
+ SequenceAnnotation<T> wservice, Services service) throws Exception {\r
+ writer.print("Calling analyse.........");\r
\r
- PresetManager<T> pmanager = msaws.getPresets();\r
- if (pmanager != null && pmanager.getPresets().size() > 0) {\r
- System.out.println("Testing alignment with presets:");\r
- List<Preset<T>> plist = pmanager.getPresets();\r
- succeed = !succeed ? presetAlign(msaws, plist) : succeed;\r
+ List<FastaSequence> input = loadSeqs();\r
+ if (service == Services.AAConWS) {\r
+ input = loadAlignment();\r
+ }\r
+ boolean success = testDefaultAnalyse(input, wservice, null, null);\r
+\r
+ PresetManager<T> presetman = wservice.getPresets();\r
+ if (presetman != null) {\r
+ List<Preset<T>> presets = presetman.getPresets();\r
+ if (presets != null && !presets.isEmpty()) {\r
+ Preset<T> preset = presets.get(0);\r
+ writer.print("Calling analyse with Preset.........");\r
+ success = testDefaultAnalyse(input, wservice, preset, null);\r
+ }\r
}\r
+ testMetadata(wservice);\r
+ return success;\r
+ }\r
\r
- System.out.print("Querying presets...");\r
+ private <T> boolean testDefaultAnalyse(List<FastaSequence> fastalist,\r
+ SequenceAnnotation<T> wsproxy, Preset<T> preset,\r
+ List<Option<T>> customOptions) throws Exception {\r
\r
+ ScoreManager scores = null;\r
+\r
+ String jobId = null;\r
+ if (customOptions != null) {\r
+ jobId = wsproxy.customAnalize(fastalist, customOptions);\r
+ } else if (preset != null) {\r
+ jobId = wsproxy.presetAnalize(fastalist, preset);\r
+ } else {\r
+ jobId = wsproxy.analize(fastalist);\r
+ }\r
+ Thread.sleep(1000);\r
+ scores = wsproxy.getAnnotation(jobId);\r
+ if (scores != null) {\r
+ writer.println(OK);\r
+ }\r
+\r
+ return scores != null;\r
+ }\r
+\r
+ private void reportException(Exception e) {\r
+ writer.println(FAILED);\r
+ writer.println("Exception while waiting for results. "\r
+ + "Exception details are below:");\r
+ writer.println(e.getLocalizedMessage());\r
+ e.printStackTrace(writer);\r
+ }\r
+\r
+ private <T> void testMetadata(Metadata<T> msaws)\r
+ throws UnsupportedRuntimeException {\r
+\r
+ writer.print("Querying presets...");\r
+ PresetManager<T> pmanager = msaws.getPresets();\r
if (pmanager != null && pmanager.getPresets().size() > 0) {\r
- System.out.println(OK);\r
+ writer.println(OK);\r
} else {\r
- System.out.println("UNSUPPORTED");\r
+ writer.println(UNSUPPORTED);\r
}\r
\r
- System.out.print("Querying Parameters...");\r
+ writer.print("Querying Parameters...");\r
RunnerConfig<T> options = msaws.getRunnerOptions();\r
if (options != null && options.getArguments().size() > 0) {\r
- System.out.println(OK);\r
+ writer.println(OK);\r
} else {\r
- System.out.println(FAILED);\r
- succeed = false;\r
+ writer.println(UNSUPPORTED);\r
}\r
\r
- System.out.print("Querying Limits...");\r
+ writer.print("Querying Limits...");\r
LimitsManager<T> limits = msaws.getLimits();\r
if (limits != null && limits.getLimits().size() > 0) {\r
- System.out.println(OK);\r
+ writer.println(OK);\r
+ // writer.println("Limits details: \n" + limits.toString());\r
} else {\r
- System.out.println("UNSUPPORTED");\r
+ writer.println(UNSUPPORTED);\r
}\r
\r
- System.out.print("Querying Local Engine Limits...");\r
+ writer.print("Querying Local Engine Limits...");\r
Limit<T> localLimit = msaws\r
.getLimit(PresetManager.LOCAL_ENGINE_LIMIT_PRESET);\r
if (localLimit != null) {\r
- System.out.println(OK);\r
+ writer.println(OK);\r
} else {\r
- System.out.println("UNSUPPORTED");\r
+ writer.println(UNSUPPORTED);\r
}\r
- return succeed;\r
}\r
\r
/**\r
* @param msaws\r
* @throws UnsupportedRuntimeException\r
*/\r
- static <T> boolean testDefaultAlignment(MsaWS<T> msaws)\r
- throws UnsupportedRuntimeException {\r
- System.out.print("Testing alignment with default parameters:");\r
+ private <T> boolean testDefaultAlignment(MsaWS<T> msaws) throws Exception {\r
+ writer.print("Testing alignment with default parameters:");\r
Alignment al = null;\r
boolean succeed = false;\r
- try {\r
- String taskId = msaws.align(seqs);\r
- System.out.print("\nQuerying job status...");\r
- JobStatus status = msaws.getJobStatus(taskId);\r
- while (status != JobStatus.FINISHED) {\r
- Thread.sleep(1000);\r
- status = msaws.getJobStatus(taskId);\r
- }\r
- System.out.println(OK);\r
- System.out.print("Retrieving results...");\r
- al = msaws.getResult(taskId);\r
- succeed = true;\r
- } catch (ResultNotAvailableException e) {\r
- System.out.println(FAILED);\r
- e.printStackTrace();\r
- } catch (JobSubmissionException e) {\r
- System.out.println(FAILED);\r
- System.out.println();\r
- e.printStackTrace();\r
- } catch (InterruptedException e) {\r
- System.out.println(FAILED);\r
- System.out.println();\r
- e.printStackTrace();\r
+\r
+ String taskId = msaws.align(seqs);\r
+ writer.print("\nQuerying job status...");\r
+ JobStatus status = msaws.getJobStatus(taskId);\r
+ while (status != JobStatus.FINISHED) {\r
+ Thread.sleep(1000);\r
+ status = msaws.getJobStatus(taskId);\r
}\r
+ writer.println(OK);\r
+ writer.print("Retrieving results...");\r
+ al = msaws.getResult(taskId);\r
+ succeed = true;\r
if (al != null) {\r
- System.out.println(OK);\r
+ writer.println(OK);\r
}\r
return succeed;\r
}\r
-\r
- /**\r
- * Connect to a WS using the host and the service name\r
- * \r
- * @param <T>\r
- * @param host\r
- * @param service\r
- * @return\r
- */\r
- static <T> MsaWS<T> connect(String host, Services service) {\r
- MsaWS<T> msaws = null;\r
- try {\r
- System.out.print("Connecting to service " + service + " on " + host\r
- + " ... ");\r
- msaws = (MsaWS<T>) Jws2Client.connect(host, service);\r
- System.out.println(OK);\r
- } catch (WebServiceException e) {\r
- System.out.println(FAILED);\r
- }\r
- return msaws;\r
- }\r
-\r
/**\r
* Test JWS2 web services\r
* \r
public static <T> void main(String[] args) throws IOException {\r
\r
if (args == null || args.length < 1) {\r
- printUsage();\r
+ WSTester.printUsage();\r
System.exit(0);\r
}\r
String host = CmdHelper.getHost(args);\r
String serviceName = CmdHelper.getServiceName(args);\r
if (!Jws2Client.validURL(host)) {\r
- System.out\r
+ System.err\r
.println("<host_and_context> parameter is not provided or is incorrect!");\r
System.exit(1);\r
}\r
- boolean succeed = false;\r
- MsaWS<T> msaws = null;\r
+ WSTester tester = new WSTester(host, new PrintWriter(System.out, true));\r
+\r
if (serviceName != null) {\r
Services service = Services.getService(serviceName);\r
if (service == null) {\r
- System.out.println("Service '" + serviceName\r
+ tester.writer.println("Service '" + serviceName\r
+ "' is not supported. Valid values are: "\r
+ Arrays.toString(Services.values()));\r
- System.out.println();\r
+ tester.writer.println();\r
printUsage();\r
System.exit(1);\r
}\r
-\r
- msaws = connect(host, service);\r
- if (msaws == null) {\r
- System.exit(1);\r
- }\r
- try {\r
- succeed = checkService(msaws);\r
- } catch (UnsupportedRuntimeException ignored) {\r
- System.exit(1);\r
- } finally {\r
- ((Closeable) msaws).close();\r
- }\r
- reportResults(service, succeed);\r
+ tester.checkService(service);\r
System.exit(0);\r
}\r
\r
- System.out\r
+ tester.writer\r
.println("<ServiceName> is not provided checking all known services...");\r
\r
for (Services serv : Services.values()) {\r
- System.out.println();\r
- msaws = connect(host, serv);\r
- if (msaws == null) {\r
- continue;\r
- }\r
- try {\r
- succeed = checkService(msaws);\r
- } catch (UnsupportedRuntimeException ignored) {\r
- System.out.println("Service " + serv + " IS NOT FUNCTIONAL");\r
- continue;\r
- } finally {\r
- ((Closeable) msaws).close();\r
- }\r
- reportResults(serv, succeed);\r
+ tester.writer.println();\r
+ tester.checkService(serv);\r
}\r
\r
}\r
\r
- private static void reportResults(Services serv, boolean succeed) {\r
+ /**\r
+ * Test JABA web service\r
+ * \r
+ * @param service\r
+ * the service to test\r
+ * @return true if the service works as expected, false otherwise\r
+ * @throws WebServiceException\r
+ * @throws ConnectException\r
+ */\r
+ public boolean checkService(Services service) throws ConnectException,\r
+ WebServiceException {\r
+ JABAService ws = Jws2Client.connect(hostname, service);\r
+ if (ws == null) {\r
+ writer.println("Cannot estabilish the connection to host "\r
+ + hostname + " with service " + service.toString());\r
+ return false;\r
+ }\r
+ boolean succeed = false;\r
+ try {\r
+ writer.println("Checking service " + service.toString());\r
+ succeed = checkService(ws, service);\r
+ } finally {\r
+ FileUtil.closeSilently(((Closeable) ws));\r
+ }\r
+ reportResults(service, succeed);\r
+ return succeed;\r
+ }\r
+\r
+ private void reportResults(Services serv, boolean succeed) {\r
if (succeed) {\r
- System.out.println("Check is completed. The Service " + serv\r
- + " IS WORKING");\r
+ writer.println("Check is completed. The Service " + serv\r
+ + " IS WORKING\n");\r
} else {\r
- System.out.println("Check is completed. The Service " + serv\r
- + " HAS SOME PROBLEMS");\r
+ writer.println("Check is aborted. The Service " + serv\r
+ + " HAS SOME PROBLEMS\n");\r
}\r
}\r
}\r