import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import java.util.Hashtable; import java.util.Iterator; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.rpc.ServiceException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.axis.AxisFault; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; /** * Example webservice client using DCA webservice. This client use the * request/response methods dealing with sequenceML as input and alignmentML as * output. * * @author Jan Krueger * */ public class DCAWSC { private static String server; private static URL wsdl; /** * @param args */ public static void main(String[] args) { try { /* declare addresslocation for service */ //server = "bibiwsserv.techfak.uni-bielefeld.de"; server = "bibiwstest.techfak.uni-bielefeld.de"; /* declare where to find the describing WSDL */ //wsdl = new URL("http://bibiserv.techfak.uni-bielefeld.de/wsdl/DCA.wsdl"); wsdl = new URL("http://bibitest.techfak.uni-bielefeld.de/wsdl/DCA.wsdl"); /* parameter to hashtable */ Hashtable paramshash = parseParameter(args); /* check for file parameter */ if (!paramshash.containsKey("F")) { System.err.println("java " + DCAWSC.class.getSimpleName() + " -F \n" + "\t[-c (dna|rna|dnarna|blosum30|blosum45|blosum62|pam160|pam250|unitcost)]\n" + "\t[-g ] [-a ] [-b 0.0 <= double <= 1.0] [-l 0 <= int <= 100]\n" + "\t[-w 0 <= int] \n [-test]\n" + "See http://bibiserv.techfak.uni-bielefeld.de/dca/webservice.html for a detailed \n" + "explanation of parameter meaning.\n"); System.exit(0); } /* read Document from File */ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder docbuilder = factory.newDocumentBuilder(); Document in = docbuilder.parse(new File((String) paramshash.get("F"))); /* remove file parameter */ paramshash.remove("F"); System.err.println(paramshash); /* if --test is set, start webservice test */ if (paramshash.containsKey("test")) { System.err.println("Start test function"); System.err.println("test(1) : [-c ]"); for (String cost : new String[] { "dna", "rna", "dnarna", "blosum30", "blosum45", "blosum62", "pam160", "pam250", "unitcost" }) { System.err.println("test (1) \"-c " + cost + "\"\t"); System.err.println((callService(in, new Object[] { "c", cost }) != null) ? "=> OK" : " => FAILED"); } System.err.print("test(2) : [-g]\t"); System.err.println((callService(in, new Object[] { "g", new Boolean(true) }) != null) ? "=> OK" : " => FAILED"); System.err.print("test(3) : [-a]\t"); System.err.println((callService(in, new Object[] { "a", new Boolean(true) }) != null) ? "=> OK" : " => FAILED"); System.err.println("test(4) : [-b ]"); for (Double weight : new Double[] { 0.0d, 0.1d, 0.9d, 1.0d }) { System.err.println("test(4) \"-b " + weight + "\"\t"); System.err.println((callService(in, new Object[] { "b", weight }) != null) ? "=> OK" : " => FAILED"); } System.err.println("test(5) : [-l ]"); for (Integer window : new Integer[] { 0, 1, 2, 10, 35, 50, 70 }) { System.err.println("test(5) \"-l " + window + "\"\t"); System.err.println((callService(in, new Object[] { "l", window }) != null) ? "=> OK" : " => FAILED"); } /* otherwise call webservice with given parameter */ } else { System.out.println(callService(in, hashtable2array(paramshash))); } } catch (MalformedURLException e) { System.err.println("failed (" + e.toString() + ")"); System.exit(1); } catch (IOException e) { System.err.println("can't read sequence file " + args[0]); System.exit(1); } catch (ParserConfigurationException e) { System.err.println(e.toString()); } catch (SAXException e) { System.err.println(e.toString()); } } /** * static method parse inputparameter into a Hashtable * * @param String [] - * argument list from cmdline * * @return a Hashtable containing all allowed arguments in a key/value style */ private static Hashtable parseParameter(String args[]) { Hashtable prop = new Hashtable(); prop.put("c", new String()); prop.put("g", new Boolean(true)); prop.put("a", new Boolean(true)); prop.put("b", new Double(0.0)); prop.put("l", new Integer(0)); prop.put("F", new String()); prop.put("test", new Boolean(true)); Hashtable ret = new Hashtable(); String key = ""; for (int i = 0; i < args.length; ++i) { String current = args[i]; /* found key */ if (current.startsWith("-")) { /* remove -- */ key = current.replaceAll("-", ""); /* check - maybe boolean */ if ((key != null) && (prop.get(key) != null)) { Class c = (prop.get(key)).getClass(); if ((c.getName()).equals("java.lang.Boolean")) { ret.put(key, new Boolean(true)); } } } else { /* found value, check if current key exists in prop */ if (prop.get(key) != null) { /* get Class of value */ Class c = (prop.get(key)).getClass(); if ((c.getName()).equals("java.lang.Integer")) { ret.put(key, new Integer(Integer.parseInt(current))); } else if ((c.getName()).equals("java.lang.String")) { ret.put(key, current); } else if ((c.getName()).equals("java.lang.Double")) { ret.put(key, new Double(Double.parseDouble(current))); } } key = null; } } return ret; } /** * convert a Hashtable to an ObjectArray * * @param - * Hashtable * * @return - Objectarray of the Hashtable parameter * */ private static Object[] hashtable2array(Hashtable ht) { Set keys = ht.keySet(); Object ret[] = new Object[keys.size() * 2]; int counter = 0; for (Iterator i = keys.iterator(); i.hasNext();) { Object key = i.next(); ret[counter] = key; counter++; ret[counter] = ht.get(key); counter++; } return ret; } private static String callService(Document in, Object[] paramarray) { try { /* prepare the call (the same for all called methods) */ Service ser = new Service(wsdl, new QName("http://" + server + "/DCA/axis/DCAPort", "DCAImplementationService")); Call call = (Call) ser.createCall(new QName("DCAPort"), "request"); /* call and get id */ String id = (String) call.invoke(new Object[] { in, paramarray }); /* print id on STDOUT */ System.err.println("get id - '" + id + "'"); int statuscode = 601; while ((statuscode > 600) && (statuscode < 700)) { try { Thread.sleep(2500); call = (Call) ser.createCall(new QName("DCAPort"), "response"); // call and get result as DOM Tree(if finished) Document result = (Document) call.invoke(new Object[] { id }); // convert Dom Document to String StreamResult strResult = new StreamResult(new StringWriter()); TransformerFactory tfac = TransformerFactory.newInstance(); Transformer t = tfac.newTransformer(); t.setOutputProperty("encoding", "iso-8859-1"); t.setOutputProperty("indent", "yes"); t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); t.transform(new DOMSource(result.getDocumentElement()), strResult); // and print it to STDOUT // finished statuscode = 600; return (strResult.getWriter().toString()); } catch (InterruptedException e) { System.err.println("process can't sleep!"); return null; } catch (RemoteException e) { // on error WS will throw a soapfault as hobitstatuscode Element root = ((AxisFault) e).lookupFaultDetail(new QName( "http://hobit.sourceforge.net/xsds/hobitStatuscode.xsd", "hobitStatuscode")); if (root == null) { System.err.println("ws remote error (no Hobitstatuscode): " + e.toString()); return null; } String description = root.getLastChild().getFirstChild().getNodeValue(); statuscode = Integer.parseInt(root.getFirstChild().getFirstChild().getNodeValue()); /* print Statusinformation to STDERR */ System.err.println("(" + statuscode + " - " + description + ")"); } catch (TransformerException e) { System.err.println("Document can't tranformed into a String "); return null; } } /* error handling with proper information for the user */ } catch (RemoteException e) { /* on error WS will throw a soapfault as hobitstatuscode */ Element root = ((AxisFault) e).lookupFaultDetail(new QName( "http://hobit.sourceforge.net/xsds/hobitStatuscode.xsd", "hobitStatuscode")); if (root == null) { System.err.println("ws remote error (no Hobitstatuscode): " + e.toString()); return null; } String description = root.getLastChild().getFirstChild().getNodeValue(); String code = root.getFirstChild().getFirstChild().getNodeValue(); System.out.println("Statuscode: " + code); System.out.println("Description: " + description); /* * Using this kind of Webservice there is only one one field for * giving back a error message. When an axception occours, the * client side of Axis will throw an RemoteException which includes * the class name of the thrown exception. There is no way to get * more information like the original stacktrace !!! * System.err.println("ws remote error (" + e.toString() + ")"); */ return null; } catch (ServiceException e) { System.err.println("Service unavailable (" + e.toString() + ")"); return null; } return null; } }