X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=webservices%2Fcompbio%2Fws%2Fclient%2FJws2Client.java;h=3c62c290e940789f4cf6c02da8ee5f222c73b535;hb=5f8278b40ae7ded9d08d1940bb71d261abca658f;hp=62aa38384c3f5472b4f9a7d23575f22ed290ce20;hpb=a17f3c38045ca4509dc891722ea98143005119f6;p=jabaws.git diff --git a/webservices/compbio/ws/client/Jws2Client.java b/webservices/compbio/ws/client/Jws2Client.java index 62aa383..3c62c29 100644 --- a/webservices/compbio/ws/client/Jws2Client.java +++ b/webservices/compbio/ws/client/Jws2Client.java @@ -1,6 +1,6 @@ -/* Copyright (c) 2009 Peter Troshin +/* Copyright (c) 2011 Peter Troshin * - * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0 + * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0 * * This library is free software; you can redistribute it and/or modify it under the terms of the * Apache License version 2 as published by the Apache Software Foundation @@ -18,41 +18,38 @@ package compbio.ws.client; -import static compbio.ws.client.Constraints.hostkey; import static compbio.ws.client.Constraints.inputkey; -import static compbio.ws.client.Constraints.limitList; import static compbio.ws.client.Constraints.outputkey; import static compbio.ws.client.Constraints.paramFile; -import static compbio.ws.client.Constraints.paramList; -import static compbio.ws.client.Constraints.presetList; -import static compbio.ws.client.Constraints.presetkey; -import static compbio.ws.client.Constraints.pseparator; -import static compbio.ws.client.Constraints.servicekey; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.Writer; +import java.net.ConnectException; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; -import java.util.HashSet; +import java.util.Collections; import java.util.List; -import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.WebServiceException; import compbio.data.msa.JABAService; import compbio.data.msa.Metadata; import compbio.data.msa.MsaWS; +import compbio.data.msa.RegistryWS; import compbio.data.msa.SequenceAnnotation; import compbio.data.sequence.Alignment; import compbio.data.sequence.FastaSequence; -import compbio.data.sequence.Score; +import compbio.data.sequence.ScoreManager; import compbio.data.sequence.SequenceUtil; import compbio.data.sequence.UnknownFileFormatException; import compbio.metadata.JobSubmissionException; @@ -60,6 +57,7 @@ import compbio.metadata.Option; import compbio.metadata.Preset; import compbio.metadata.ResultNotAvailableException; import compbio.metadata.WrongParameterException; +import compbio.util.FileUtil; /** * A command line client for JAva Bioinformatics Analysis Web Services @@ -76,12 +74,6 @@ public class Jws2Client { private static final Logger log = Logger.getLogger(Jws2Client.class .getCanonicalName()); - // JABAWS version 1.0 service name - static final String QUALIFIED_SERVICE_NAME = "http://msa.data.compbio/01/01/2010/"; - - // JABAWS version 2.0 service name - static final String V2_QUALIFIED_SERVICE_NAME = "http://msa.data.compbio/01/12/2010/"; - /** * Attempt to construct the URL object from the string * @@ -114,26 +106,40 @@ public class Jws2Client { String hostname = CmdHelper.getHost(cmd); if (hostname == null) { - System.out.println("Host name is not provided!"); + System.err.println("Host name is not provided!"); printUsage(1); } if (!validURL(hostname)) { - System.out.println("Host name is not valid!"); + System.err.println("Host name is not valid!"); printUsage(1); } + // Just list available services and quit + boolean listServices = CmdHelper.listServices(cmd); + if (listServices) { + listServices(hostname); + System.exit(0); + } + String serviceName = CmdHelper.getServiceName(cmd); if (serviceName == null) { - System.out.println("Service name is no provided!"); + System.err.println("Service name is no provided!"); printUsage(1); } Services service = Services.getService(serviceName); if (service == null) { - System.out.println("Service " + serviceName - + " is no supported! Valid values are: " + System.err.println("Service " + serviceName + + " is no recognized! Valid values are: " + Arrays.toString(Services.values())); printUsage(1); } + // Test service and quit + boolean testService = CmdHelper.testService(cmd); + if (testService) { + testService(hostname, service, new PrintWriter(System.out, true)); + System.exit(0); + } + File inputFile = IOHelper.getFile(cmd, inputkey, true); File outFile = IOHelper.getFile(cmd, outputkey, false); File parametersFile = IOHelper.getFile(cmd, paramFile, true); @@ -152,25 +158,25 @@ public class Jws2Client { } Alignment alignment = null; if (inputFile != null) { - OutputStream outStream = null; + Writer writer = null; if (outFile != null) { - outStream = IOHelper.getOutStream(outFile); + writer = IOHelper.getWriter(outFile); } else { // this stream is going to be closed later which is fine as // std.out will not be - outStream = System.out; + writer = new PrintWriter(System.out, true); } - if (service == Services.AAConWS) { - Map> result = analize(inputFile, + if (service.getServiceType() == SequenceAnnotation.class) { + ScoreManager result = analize(inputFile, ((SequenceAnnotation) msaws), preset, customOptions); - IOHelper.writeOut(outStream, result); + + IOHelper.writeOut(writer, result); } else { alignment = align(inputFile, (MsaWS) msaws, preset, customOptions); - IOHelper.writeOut(outStream, alignment); + IOHelper.writeOut(writer, alignment); } - - // stream is closed in the method no need to close it here + writer.close(); } boolean listParameters = CmdHelper.listParameters(cmd); @@ -189,6 +195,50 @@ public class Jws2Client { ((Closeable) msaws).close(); log.fine("Disconnected successfully!"); } + + /** + * Asks registry to test the service on the host hostname + * + * @param hostname + * @param service + * @param writer + * @throws ConnectException + * @throws WebServiceException + */ + public static void testService(String hostname, Services service, + PrintWriter writer) throws ConnectException, WebServiceException { + RegistryWS registry = connectToRegistry(hostname); + if (registry != null) { + String message = registry.testService(service); + writer.println("Service " + service + " testing results: "); + writer.println(message); + FileUtil.closeSilently(((Closeable) registry)); + } + writer.flush(); + } + + public static Set getServices(String hostname) + throws WebServiceException, ConnectException { + RegistryWS registry = connectToRegistry(hostname); + Set services = Collections.EMPTY_SET; + if (registry != null) { + services = registry.getSupportedServices(); + FileUtil.closeSilently(((Closeable) registry)); + } + return services; + } + + private static void listServices(String hostname) + throws WebServiceException, IOException { + Set services = Jws2Client.getServices(hostname); + if (!services.isEmpty()) { + System.out.println("Supported services are: " + + Services.toString(services)); + } else { + System.out.println("Failed to connect to the registry! "); + } + } + /** * Calculate conservation for sequences loaded from the file * @@ -203,15 +253,12 @@ public class Jws2Client { * @return Set the conservation scores * @throws UnknownFileFormatException */ - Map> analize(File file, + static ScoreManager analize(List fastalist, SequenceAnnotation wsproxy, Preset preset, List> customOptions) { - List fastalist = null; - Map> scores = null; + ScoreManager scores = null; try { - fastalist = SequenceUtil.openInputStream(file.getAbsolutePath()); - String jobId = null; if (customOptions != null && preset != null) { System.out @@ -224,15 +271,10 @@ public class Jws2Client { } else { jobId = wsproxy.analize(fastalist); } + System.out.println("\n\ncalling analise........."); Thread.sleep(1000); scores = wsproxy.getAnnotation(jobId); - } catch (IOException e) { - System.err - .println("Exception while reading the input file. " - + "Check that the input file contains a list of fasta formatted sequences! " - + "Exception details are below:"); - e.printStackTrace(); } catch (JobSubmissionException e) { System.err .println("Exception while submitting job to a web server. " @@ -242,14 +284,49 @@ public class Jws2Client { System.err.println("Exception while waiting for results. " + "Exception details are below:"); e.printStackTrace(); - } catch (InterruptedException ignored) { + } catch (InterruptedException e) { // ignore and propagate an interruption Thread.currentThread().interrupt(); + System.err.println("Exception while waiting for results. " + + "Exception details are below:"); + e.printStackTrace(); } catch (WrongParameterException e) { System.err .println("Exception while parsing the web method input parameters. " + "Exception details are below:"); e.printStackTrace(); + } + return scores; + + } + + /** + * Calculate conservation for sequences loaded from the file + * + * @param wsproxy + * a web service proxy + * @param file + * the file to read the results from + * @param preset + * Preset to use optional + * @param customOptions + * the list of options + * @return Set the conservation scores + * @throws IOException + * @throws UnknownFileFormatException + */ + static ScoreManager analize(File file, SequenceAnnotation wsproxy, + Preset preset, List> customOptions) { + List fastalist = null; + try { + fastalist = SequenceUtil.openInputStream(file.getAbsolutePath()); + assert !fastalist.isEmpty() : "Input is empty!"; + } catch (IOException e) { + System.err + .println("Exception while reading the input file. " + + "Check that the input file contains a list of fasta formatted sequences! " + + "Exception details are below:"); + e.printStackTrace(); } catch (UnknownFileFormatException e) { System.err .println("Exception while attempting to read the input file " @@ -257,21 +334,25 @@ public class Jws2Client { System.out.println(e.getMessage()); e.printStackTrace(); } - return scores; + return analize(fastalist, wsproxy, preset, customOptions); } - /** - * Connects to a web service by the host and the service name + * Connects to a web service by the host and the service name web service + * type * - * @param T - * web service type * @param host + * the fully qualified name of JABAWS server including JABAWS + * context name e.g + * http://nanna.cluster.lifesci.dundee.ac.uk:8080/jaba * @param service - * @return MsaWS + * the name of the JABAWS service to connect to + * @return JABAService * @throws WebServiceException + * @throws ConnectException + * if fails to connect to the service on the host */ public static JABAService connect(String host, Services service) - throws WebServiceException { + throws WebServiceException, ConnectException { URL url = null; log.log(Level.FINE, "Attempting to connect..."); try { @@ -282,15 +363,20 @@ public class Jws2Client { } Service serv = null; try { - serv = service.getService(url, QUALIFIED_SERVICE_NAME); + serv = service.getService(url, JABAService.SERVICE_NAMESPACE); } catch (WebServiceException wse) { - System.out.println("Conecting to JABAWS version 2 service"); + System.out.println("Connecting to JABAWS version 2 service"); if (isV2service(wse)) { - serv = service.getService(url, V2_QUALIFIED_SERVICE_NAME); + serv = service + .getService(url, JABAService.V2_SERVICE_NAMESPACE); } } + if (serv == null) { + throw new ConnectException("Could not connect to " + url + + " the server is down?"); + } JABAService serviceIF = service.getInterface(serv); - log.log(Level.FINE, "Connected successfully!"); + log.log(Level.INFO, "Connected successfully!"); return serviceIF; } @@ -299,7 +385,8 @@ public class Jws2Client { String message = wse.getMessage(); int idx = message.indexOf("not a valid service"); if (idx > 0) { - if (message.substring(idx).contains(V2_QUALIFIED_SERVICE_NAME)) { + if (message.substring(idx).contains( + JABAService.V2_SERVICE_NAMESPACE)) { return true; } } @@ -307,6 +394,48 @@ public class Jws2Client { } /** + * Get a connection of JABAWS registry + * + * @param host + * the fully qualified name of JABAWS server including JABAWS + * context name e.g + * http://nanna.cluster.lifesci.dundee.ac.uk:8080/jaba + * @return compbio.data.msa.RegistryWS - instance of a RegistryWS web + * service + * @throws WebServiceException + * @throws ConnectException + */ + public static compbio.data.msa.RegistryWS connectToRegistry(String host) + throws WebServiceException, ConnectException { + URL url = null; + String service = "RegistryWS"; + log.log(Level.FINE, "Attempting to connect..."); + + try { + url = new URL(host + "/" + service + "?wsdl"); + } catch (MalformedURLException e) { + e.printStackTrace(); + // ignore as the host name is already verified + } + QName qname = new QName(JABAService.V2_SERVICE_NAMESPACE, service); + Service serv = Service.create(url, qname); + + if (serv == null) { + throw new ConnectException("Could not connect to " + url + + " the server is down?"); + } + + QName portName = new QName(serv.getServiceName().getNamespaceURI(), + service + "Port"); + compbio.data.msa.RegistryWS serviceIF = serv.getPort(portName, + compbio.data.msa.RegistryWS.class); + + log.log(Level.INFO, "Connected to " + service + " successfully!"); + + return serviceIF; + } + + /** * Align sequences from the file using MsaWS * * @param @@ -342,6 +471,7 @@ public class Jws2Client { } else { jobId = msaws.align(fastalist); } + System.out.println("\n\ncalling align........."); Thread.sleep(1000); alignment = msaws.getResult(jobId); @@ -383,52 +513,13 @@ public class Jws2Client { * @param exitStatus */ static void printUsage(int exitStatus) { - System.out.println(); - System.out.println("Usage: " + hostkey - + pseparator + "host_and_context " + servicekey + pseparator - + "serviceName ACTION [OPTIONS] "); - System.out.println(); - System.out - .println(hostkey - + pseparator - + " - a full URL to the JWS2 web server including context path e.g. http://10.31.1.159:8080/ws"); - System.out.println(servicekey + pseparator + " - one of " - + Arrays.toString(Services.values())); - System.out.println(); - System.out.println("ACTIONS: "); - System.out - .println(inputkey - + pseparator - + " - full path to fasta formatted sequence file, from which to align sequences"); - System.out.println(paramList - + " - lists parameters supported by web service"); - System.out.println(presetList - + " - lists presets supported by web service"); - System.out.println(limitList + " - lists web services limits"); - System.out - .println("Please note that if input file is specified other actions are ignored"); - - System.out.println(); - System.out.println("OPTIONS (only for use with -i action):"); - - System.out.println(presetkey + pseparator - + " - name of the preset to use"); - System.out - .println(outputkey - + pseparator - + " - full path to the file where to write an alignment"); - System.out - .println("-f= - the name of the file with the list of parameters to use."); - System.out - .println("Please note that -r and -f options cannot be used together. " - + "Alignment is done with either preset or a parameters from the file, but not both!"); - + System.out.println(Constraints.help_text); System.exit(exitStatus); } /** * Starts command line client, if no parameter are supported print help. Two - * parameters are required for successfull call the JWS2 host name and a + * parameters are required for successful call the JWS2 host name and a * service name. * * @param args @@ -468,7 +559,7 @@ public class Jws2Client { printUsage(1); } if (args.length < 2) { - System.out.println("Host and service names are required!"); + System.err.println("Host and service names are required!"); printUsage(1); }