Adding registry web service and changes to WStester and JWS2Client code. Bugs in...
[jabaws.git] / webservices / compbio / ws / client / WSTester.java
index 6223de0..05bd0b8 100644 (file)
 \r
 package compbio.ws.client;\r
 \r
+import static compbio.ws.client.Constraints.hostkey;\r
+import static compbio.ws.client.Constraints.pseparator;\r
+import static compbio.ws.client.Constraints.servicekey;\r
+\r
 import java.io.ByteArrayInputStream;\r
 import java.io.Closeable;\r
 import java.io.IOException;\r
+import java.io.PrintWriter;\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
@@ -50,317 +62,427 @@ import compbio.metadata.WrongParameterException;
  */\r
 public class WSTester {\r
 \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
-\r
-    static final List<FastaSequence> seqs = loadSeqs();\r
-\r
-    private static final String FAILED = "FAILED";\r
-    private static final String OK = "OK";\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
-       try {\r
-           return SequenceUtil.readFasta(new ByteArrayInputStream(fastaInput\r
-                   .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
-    /**\r
-     * Prints usage\r
-     */\r
-    static void printUsage() {\r
-       System.out.println("Usage: <Class or Jar file name> "\r
-               + Jws2Client.hostkey + Jws2Client.pseparator\r
-               + "host_and_context " + "<" + Jws2Client.servicekey\r
-               + Jws2Client.pseparator + "serviceName>");\r
-       System.out.println();\r
-       System.out\r
-               .println(Jws2Client.hostkey\r
-                       + Jws2Client.pseparator\r
-                       + "<host_and_context> - a full URL to the JWS2 web server including context path e.g. http://10.31.1.159:8080/ws");\r
-       System.out\r
-               .println(Jws2Client.servicekey\r
-                       + Jws2Client.pseparator\r
-                       + "<ServiceName> - optional if unspecified all services are tested otherwise one of "\r
-                       + Arrays.toString(Services.values()));\r
-       System.out.println();\r
-\r
-    }\r
-\r
-    /**\r
-     * Calls alignment with preset\r
-     * \r
-     * @param <T>\r
-     * @param msaws\r
-     * @param presets\r
-     *            list of the Preset\r
-     * @throws UnsupportedRuntimeException\r
-     */\r
-    static <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
-           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
+       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 = ">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
+               try {\r
+                       return SequenceUtil.readFasta(new ByteArrayInputStream(fastaInput\r
+                                       .getBytes()));\r
+               } catch (IOException ignored) {\r
+                       // Should not happen as a source is not a external stream\r
+                       ignored.printStackTrace();\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
-               continue;\r
-           }\r
+               return null;\r
        }\r
-       return succeed;\r
-    }\r
-\r
-    /**\r
-     * Call most of web services functions and check the output\r
-     * \r
-     * @param <T>\r
-     *            web service type\r
-     * @param msaws\r
-     * @throws UnsupportedRuntimeException\r
-     *             is thrown if the connection to a web service was made, but\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
-\r
-       boolean succeed = testDefaultAlignment(msaws);\r
-\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
-           System.out.println("Testing alignment with presets:");\r
-           List<Preset<T>> plist = pmanager.getPresets();\r
-           succeed = !succeed ? presetAlign(msaws, plist) : succeed;\r
+\r
+       /**\r
+        * Converting input to a form accepted by WS\r
+        * \r
+        * @return List of FastaSequence records\r
+        */\r
+       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
-       System.out.print("Querying presets...");\r
+       private final PrintWriter writer;\r
 \r
-       if (pmanager != null && pmanager.getPresets().size() > 0) {\r
-           System.out.println(OK);\r
-       } else {\r
-           System.out.println("UNSUPPORTED");\r
+       public WSTester(PrintWriter writer) {\r
+               this.writer = writer;\r
        }\r
 \r
-       System.out.print("Querying Parameters...");\r
-       RunnerConfig<T> options = msaws.getRunnerOptions();\r
-       if (options != null && options.getArguments().size() > 0) {\r
-           System.out.println(OK);\r
-       } else {\r
-           System.out.println(FAILED);\r
-           succeed = false;\r
-       }\r
+       /**\r
+        * Prints usage\r
+        */\r
+       void printUsage() {\r
+               writer.println("Usage: <Class or Jar file name> " + hostkey\r
+                               + pseparator + "host_and_context " + "<" + servicekey\r
+                               + pseparator + "serviceName>");\r
+               writer.println();\r
+               writer.println(hostkey\r
+                               + pseparator\r
+                               + "<host_and_context> - a full URL to the JABAWS web server including context path e.g. http://10.31.1.159:8080/ws");\r
+               writer.println(servicekey\r
+                               + pseparator\r
+                               + "<ServiceName> - optional if unspecified all services are tested otherwise one of "\r
+                               + Arrays.toString(Services.values()));\r
+               writer.println();\r
 \r
-       System.out.print("Querying Limits...");\r
-       LimitsManager<T> limits = msaws.getLimits();\r
-       if (limits != null && limits.getLimits().size() > 0) {\r
-           System.out.println(OK);\r
-       } else {\r
-           System.out.println("UNSUPPORTED");\r
        }\r
 \r
-       System.out.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
-       } else {\r
-           System.out.println("UNSUPPORTED");\r
+       /**\r
+        * Calls alignment with preset\r
+        * \r
+        * @param <T>\r
+        * @param msaws\r
+        * @param presets\r
+        *            list of the Preset\r
+        * @throws UnsupportedRuntimeException\r
+        */\r
+       <T> boolean presetAlign(MsaWS<T> msaws, List<Preset<T>> presets)\r
+                       throws UnsupportedRuntimeException {\r
+               boolean succeed = false;\r
+               for (Preset<T> preset : presets) {\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
+                                       writer.println(OK);\r
+                               }\r
+                               succeed = true;\r
+                       } catch (UnsupportedRuntimeException e) {\r
+                               writer.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
+                               writer.println(FAILED);\r
+                               writer.println();\r
+                               writer.println(e.getLocalizedMessage());\r
+                               e.printStackTrace(writer);\r
+                               continue;\r
+                       } catch (WrongParameterException e) {\r
+                               // TODO custom message\r
+                               writer.println(FAILED);\r
+                               writer.println();\r
+                               writer.println(e.getLocalizedMessage());\r
+                               e.printStackTrace(writer);\r
+                               continue;\r
+                       } catch (ResultNotAvailableException e) {\r
+                               // TODO custom message\r
+                               writer.println(FAILED);\r
+                               writer.println();\r
+                               writer.println(e.getLocalizedMessage());\r
+                               e.printStackTrace(writer);\r
+                               continue;\r
+                       }\r
+               }\r
+               return succeed;\r
        }\r
-       return succeed;\r
-    }\r
-\r
-    /**\r
-     * Align using default settings\r
-     * \r
-     * @param <T>\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
-       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
+       private <T> boolean testMsaWS(MsaWS<T> msaws)\r
+                       throws UnsupportedRuntimeException {\r
+\r
+               boolean succeed = testDefaultAlignment(msaws);\r
+\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
-       if (al != null) {\r
-           System.out.println(OK);\r
+       /**\r
+        * Call most of web services functions and check the output\r
+        * \r
+        * @param <T>\r
+        *            web service type\r
+        * @param msaws\r
+        * @throws UnsupportedRuntimeException\r
+        *             is thrown if the connection to a web service was made, but\r
+        *             the web service is not functional. e.g. when native\r
+        *             executable does not exists for a server platform\r
+        */\r
+       @SuppressWarnings("unchecked")\r
+       public <T> boolean checkService(JABAService wservice) {\r
+               try {\r
+                       if (wservice == null) {\r
+                               throw new NullPointerException(\r
+                                               "JABAService instance must be provided!");\r
+                       }\r
+                       if (wservice instanceof MsaWS) {\r
+                               return testMsaWS((MsaWS<T>) wservice);\r
+                       } else if (wservice instanceof SequenceAnnotation) {\r
+                               return testSequenceAnnotationWS((SequenceAnnotation<T>) wservice);\r
+                       } else {\r
+                               throw new UnsupportedOperationException("The service: "\r
+                                               + wservice.getClass() + " is not supported! ");\r
+                       }\r
+               } catch (UnsupportedRuntimeException e) {\r
+                       writer.println(e.getLocalizedMessage());\r
+                       e.printStackTrace(writer);\r
+                       return false;\r
+               }\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 = Jws2Client.connect(host, service);\r
-           System.out.println(OK);\r
-       } catch (WebServiceException e) {\r
-           System.out.println(FAILED);\r
+\r
+       private <T> boolean testSequenceAnnotationWS(SequenceAnnotation<T> wservice)\r
+                       throws UnsupportedRuntimeException {\r
+               boolean success = testDefaultAnalyse(loadAlignment(), wservice, null,\r
+                               null);\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
+                               success = testDefaultAnalyse(loadAlignment(), wservice, preset,\r
+                                               null);\r
+                       }\r
+               }\r
+               testMetadata(wservice);\r
+               return success;\r
        }\r
-       return msaws;\r
-    }\r
-\r
-    /**\r
-     * Test JWS2 web services\r
-     * \r
-     * @param <T>\r
-     *            web service type\r
-     * @param args\r
-     *            -h=<Your web application server host name, port and JWS2\r
-     *            context path>\r
-     * \r
-     *            -s=<ServiceName> which is optional. If service name is not\r
-     *            provided then all known JWS2 web services are tested\r
-     * @throws IOException\r
-     */\r
-    public static <T> void main(String[] args) throws IOException {\r
-\r
-       if (args == null || args.length < 1) {\r
-           printUsage();\r
-           System.exit(0);\r
+\r
+       <T> boolean testDefaultAnalyse(List<FastaSequence> fastalist,\r
+                       SequenceAnnotation<T> wsproxy, Preset<T> preset,\r
+                       List<Option<T>> customOptions) throws UnsupportedRuntimeException {\r
+\r
+               ScoreManager scores = null;\r
+               try {\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
+                       writer.println("\n\ncalling analise.........");\r
+                       Thread.sleep(1000);\r
+                       scores = wsproxy.getAnnotation(jobId);\r
+\r
+               } catch (JobSubmissionException e) {\r
+                       writer.println("Exception while submitting job to a web server. "\r
+                                       + "Exception details are below:");\r
+                       e.printStackTrace(writer);\r
+               } catch (ResultNotAvailableException e) {\r
+                       writer.println("Exception while waiting for results. "\r
+                                       + "Exception details are below:");\r
+                       e.printStackTrace(writer);\r
+               } catch (InterruptedException e) {\r
+                       // ignore and propagate an interruption\r
+                       Thread.currentThread().interrupt();\r
+                       writer.println("Exception while waiting for results. "\r
+                                       + "Exception details are below:");\r
+                       e.printStackTrace(writer);\r
+               } catch (WrongParameterException e) {\r
+                       writer.println("Exception while parsing the web method input parameters. "\r
+                                       + "Exception details are below:");\r
+                       e.printStackTrace(writer);\r
+               }\r
+               return scores != null;\r
        }\r
-       String host = Jws2Client.getHost(args);\r
-       String serviceName = Jws2Client.getServiceName(args);\r
-       if (!Jws2Client.validURL(host)) {\r
-           System.out\r
-                   .println("<host_and_context> parameter is not provided or is incorrect!");\r
-           System.exit(1);\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
+                       writer.println(OK);\r
+               } else {\r
+                       writer.println(UNSUPPORTED);\r
+               }\r
+\r
+               writer.print("Querying Parameters...");\r
+               RunnerConfig<T> options = msaws.getRunnerOptions();\r
+               if (options != null && options.getArguments().size() > 0) {\r
+                       writer.println(OK);\r
+               } else {\r
+                       writer.println(UNSUPPORTED);\r
+               }\r
+\r
+               writer.print("Querying Limits...");\r
+               LimitsManager<T> limits = msaws.getLimits();\r
+               if (limits != null && limits.getLimits().size() > 0) {\r
+                       writer.println(OK);\r
+               } else {\r
+                       writer.println(UNSUPPORTED);\r
+               }\r
+\r
+               writer.print("Querying Local Engine Limits...");\r
+               Limit<T> localLimit = msaws\r
+                               .getLimit(PresetManager.LOCAL_ENGINE_LIMIT_PRESET);\r
+               if (localLimit != null) {\r
+                       writer.println(OK);\r
+               } else {\r
+                       writer.println(UNSUPPORTED);\r
+               }\r
        }\r
-       boolean succeed = false;\r
-       MsaWS<T> msaws = null;\r
-       if (serviceName != null) {\r
-           Services service = Services.getService(serviceName);\r
-           if (service == null) {\r
-               System.out.println("Service '" + serviceName\r
-                       + "' is not supported. Valid values are: "\r
-                       + Arrays.toString(Services.values()));\r
-               System.out.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
-           System.exit(0);\r
+\r
+       /**\r
+        * Align using default settings\r
+        * \r
+        * @param <T>\r
+        * @param msaws\r
+        * @throws UnsupportedRuntimeException\r
+        */\r
+       public <T> boolean testDefaultAlignment(MsaWS<T> msaws)\r
+                       throws UnsupportedRuntimeException {\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
+                       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
+               } catch (ResultNotAvailableException e) {\r
+                       writer.println(FAILED);\r
+                       writer.println(e.getLocalizedMessage());\r
+                       e.printStackTrace(writer);\r
+               } catch (JobSubmissionException e) {\r
+                       writer.println(FAILED);\r
+                       writer.println();\r
+                       writer.println(e.getLocalizedMessage());\r
+                       e.printStackTrace(writer);\r
+               } catch (InterruptedException e) {\r
+                       writer.println(FAILED);\r
+                       writer.println();\r
+                       writer.println(e.getLocalizedMessage());\r
+                       e.printStackTrace(writer);\r
+               }\r
+               if (al != null) {\r
+                       writer.println(OK);\r
+               }\r
+               return succeed;\r
        }\r
 \r
-       System.out\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
+       /**\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
+       <T> JABAService connect(String host, Services service) {\r
+               JABAService jabaservice = null;\r
+               try {\r
+                       writer.print("Connecting to service " + service + " on " + host\r
+                                       + " ... ");\r
+                       jabaservice = Jws2Client.connect(host, service);\r
+                       writer.println(OK);\r
+               } catch (WebServiceException e) {\r
+                       writer.println(FAILED);\r
+                       writer.println(e.getLocalizedMessage());\r
+                       e.printStackTrace(writer);\r
+               }\r
+               return jabaservice;\r
        }\r
 \r
-    }\r
+       /**\r
+        * Test JWS2 web services\r
+        * \r
+        * @param <T>\r
+        *            web service type\r
+        * @param args\r
+        *            -h=<Your web application server host name, port and JWS2\r
+        *            context path>\r
+        * \r
+        *            -s=<ServiceName> which is optional. If service name is not\r
+        *            provided then all known JWS2 web services are tested\r
+        * @throws IOException\r
+        */\r
+       public static <T> void main(String[] args) throws IOException {\r
+               WSTester tester = new WSTester(new PrintWriter(System.out, true));\r
+               if (args == null || args.length < 1) {\r
+                       tester.printUsage();\r
+                       System.exit(0);\r
+               }\r
+               String host = CmdHelper.getHost(args);\r
+               String serviceName = CmdHelper.getServiceName(args);\r
+               if (!Jws2Client.validURL(host)) {\r
+                       tester.writer\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
+               if (serviceName != null) {\r
+                       Services service = Services.getService(serviceName);\r
+                       if (service == null) {\r
+                               tester.writer.println("Service '" + serviceName\r
+                                               + "' is not supported. Valid values are: "\r
+                                               + Arrays.toString(Services.values()));\r
+                               tester.writer.println();\r
+                               tester.printUsage();\r
+                               System.exit(1);\r
+                       }\r
+\r
+                       msaws = (MsaWS<T>) tester.connect(host, service);\r
+                       if (msaws == null) {\r
+                               System.exit(1);\r
+                       }\r
+                       try {\r
+                               succeed = tester.checkService(msaws);\r
+                       } finally {\r
+                               ((Closeable) msaws).close();\r
+                       }\r
+                       // TODO test results printing!\r
+                       tester.reportResults(service, succeed);\r
+                       System.exit(0);\r
+               }\r
+\r
+               tester.writer\r
+                               .println("<ServiceName> is not provided checking all known services...");\r
+\r
+               for (Services serv : Services.values()) {\r
+                       tester.writer.println();\r
+                       msaws = (MsaWS<T>) tester.connect(host, serv);\r
+                       if (msaws == null) {\r
+                               continue;\r
+                       }\r
+                       try {\r
+                               succeed = tester.checkService(msaws);\r
+                       } finally {\r
+                               ((Closeable) msaws).close();\r
+                       }\r
+                       tester.reportResults(serv, succeed);\r
+               }\r
 \r
-    private static void reportResults(Services serv, boolean succeed) {\r
-       if (succeed) {\r
-           System.out.println("Check is completed. The Service " + serv\r
-                   + " IS WORKING");\r
-       } else {\r
-           System.out.println("Check is completed. The Service " + serv\r
-                   + " HAS SOME PROBLEMS");\r
        }\r
-    }\r
+       private void reportResults(Services serv, boolean succeed) {\r
+               if (succeed) {\r
+                       writer.println("Check is completed. The Service " + serv\r
+                                       + " IS WORKING");\r
+               } else {\r
+                       writer.println("Check is completed. The Service " + serv\r
+                                       + " HAS SOME PROBLEMS");\r
+               }\r
+       }\r
 }\r