/web/DRCP/src/org/wix/wsCaller/DynamicInvoker.java

http://drcp.googlecode.com/ · Java · 255 lines · 224 code · 28 blank · 3 comment · 28 complexity · a96b714f0af2bcb6ce5086f03a966880 MD5 · raw file

  1. package org.wix.wsCaller;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. import java.util.Set;
  6. import java.util.Vector;
  7. import javax.wsdl.Binding;
  8. import javax.wsdl.Operation;
  9. import javax.wsdl.Port;
  10. import javax.wsdl.Service;
  11. import javax.xml.namespace.QName;
  12. import javax.xml.rpc.Call;
  13. import javax.xml.rpc.encoding.Deserializer;
  14. import javax.xml.rpc.encoding.DeserializerFactory;
  15. import org.apache.axis.Constants;
  16. import org.apache.axis.encoding.ser.SimpleDeserializer;
  17. import org.apache.axis.wsdl.gen.Parser;
  18. import org.apache.axis.wsdl.symbolTable.BaseType;
  19. import org.apache.axis.wsdl.symbolTable.BindingEntry;
  20. import org.apache.axis.wsdl.symbolTable.Parameter;
  21. import org.apache.axis.wsdl.symbolTable.Parameters;
  22. import org.apache.axis.wsdl.symbolTable.ServiceEntry;
  23. import org.apache.axis.wsdl.symbolTable.SymTabEntry;
  24. import org.apache.axis.wsdl.symbolTable.SymbolTable;
  25. import org.apache.axis.wsdl.symbolTable.TypeEntry;
  26. // Web Service Dynamic Invoker
  27. public class DynamicInvoker {
  28. private Parser wsdlParser = null;
  29. private Map services = null;
  30. public DynamicInvoker(String wsdlURL) throws Exception {
  31. wsdlParser = new Parser();
  32. wsdlParser.run(wsdlURL);
  33. services = enumSymTabEntry(ServiceEntry.class);
  34. }
  35. public Map invoke(String serviceName, String portName,
  36. String operationName, Vector parameterValues) throws Exception {
  37. Vector inputs = new Vector();
  38. String returnName = null;
  39. ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
  40. Service service = serviceEntry.getService();
  41. org.apache.axis.client.Service clientService = new org.apache.axis.client.Service(
  42. wsdlParser, service.getQName());
  43. Call call = clientService.createCall(QName.valueOf(portName), QName
  44. .valueOf(operationName));
  45. ((org.apache.axis.client.Call) call).setTimeout(new Integer(15 * 1000));
  46. BindingEntry bindingEntry = getBindingEntry(serviceName, portName);
  47. Operation o = getOperation(bindingEntry, operationName);
  48. Parameters parameters = bindingEntry.getParameters(o);
  49. if (parameters.returnParam != null) {
  50. QName returnType = org.apache.axis.wsdl.toJava.Utils
  51. .getXSIType(parameters.returnParam);
  52. QName returnQName = parameters.returnParam.getQName();
  53. returnName = returnQName.getLocalPart();
  54. }
  55. int size = parameters.list.size();
  56. for (int i = 0; i < size; i++) {
  57. Parameter p = (Parameter) parameters.list.get(i);
  58. switch (p.getMode()) {
  59. case Parameter.IN:
  60. inputs.add(getParamData((org.apache.axis.client.Call) call, p,
  61. (String) parameterValues.elementAt(i)));
  62. break;
  63. case Parameter.OUT:
  64. break;
  65. case Parameter.INOUT:
  66. inputs.add(getParamData((org.apache.axis.client.Call) call, p,
  67. (String) parameterValues.elementAt(i)));
  68. break;
  69. }
  70. }
  71. Object ret = call.invoke(inputs.toArray());
  72. Map outputs = call.getOutputParams();
  73. HashMap map = new HashMap();
  74. if (ret != null && returnName != null) {
  75. map.put(returnName, ret);
  76. }
  77. if (outputs != null) {
  78. for (Iterator i = outputs.keySet().iterator(); i.hasNext();) {
  79. Object obj = i.next();
  80. String name;
  81. Object value;
  82. if (obj.getClass().getName().equals("java.lang.String")) {
  83. name = (String) obj;
  84. } else {
  85. name = ((QName) obj).getLocalPart();
  86. }
  87. value = outputs.get(obj);
  88. map.put(name, value);
  89. }
  90. }
  91. return map;
  92. }
  93. public Vector enumServiceNames() {
  94. Vector v = new Vector();
  95. Iterator i = services.keySet().iterator();
  96. while (i.hasNext()) {
  97. String s = (String) i.next();
  98. v.addElement(s);
  99. }
  100. return v;
  101. }
  102. public Vector enumPortNames(String serviceName) {
  103. Vector v = new Vector();
  104. ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
  105. Map ports = serviceEntry.getService().getPorts();
  106. Iterator i = ports.keySet().iterator();
  107. while (i.hasNext()) {
  108. String s = (String) i.next();
  109. v.addElement(s);
  110. }
  111. return v;
  112. }
  113. public Vector enumOperationNames(String serviceName, String portName) {
  114. Vector v = new Vector();
  115. BindingEntry entry = getBindingEntry(serviceName, portName);
  116. Set operations = entry.getOperations();
  117. Iterator i = operations.iterator();
  118. while (i.hasNext()) {
  119. Operation o = (Operation) i.next();
  120. String s = o.getName();
  121. v.addElement(s);
  122. }
  123. return v;
  124. }
  125. public Parameters enumParameters(String serviceName, String portName,
  126. String operationName) {
  127. BindingEntry entry = getBindingEntry(serviceName, portName);
  128. Operation o = getOperation(entry, operationName);
  129. Parameters parameters = entry.getParameters(o);
  130. return parameters;
  131. }
  132. public String getParameterModeString(Parameter p) {
  133. String ret = null;
  134. switch (p.getMode()) {
  135. case Parameter.IN:
  136. ret = "[IN]";
  137. break;
  138. case Parameter.INOUT:
  139. ret = "[IN, OUT]";
  140. break;
  141. case Parameter.OUT:
  142. ret = "[OUT]";
  143. break;
  144. }
  145. return ret;
  146. }
  147. private BindingEntry getBindingEntry(String serviceName, String portName) {
  148. ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
  149. Port port = serviceEntry.getService().getPort(portName);
  150. Binding binding = port.getBinding();
  151. SymbolTable table = wsdlParser.getSymbolTable();
  152. return table.getBindingEntry(binding.getQName());
  153. }
  154. private Operation getOperation(BindingEntry entry, String operationName) {
  155. Set operations = entry.getOperations();
  156. Iterator i = operations.iterator();
  157. while (i.hasNext()) {
  158. Operation o = (Operation) i.next();
  159. if (operationName.equals(o.getName())) {
  160. return o;
  161. }
  162. }
  163. return null;
  164. }
  165. // return Map of <QName.getLocalPart, SymTabEntry>
  166. private Map enumSymTabEntry(Class cls) {
  167. HashMap ret = new HashMap();
  168. HashMap map = wsdlParser.getSymbolTable().getHashMap();
  169. Iterator iterator = map.entrySet().iterator();
  170. while (iterator.hasNext()) {
  171. Map.Entry entry = (Map.Entry) iterator.next();
  172. QName key = (QName) entry.getKey();
  173. Vector v = (Vector) entry.getValue();
  174. int size = v.size();
  175. for (int i = 0; i < size; ++i) {
  176. SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i);
  177. if (cls.isInstance(symTabEntry)) {
  178. ret.put(key.getLocalPart(), symTabEntry);
  179. }
  180. }
  181. }
  182. return ret;
  183. }
  184. private Object getParamData(org.apache.axis.client.Call c, Parameter p,
  185. String arg) throws Exception {
  186. // Get the QName representing the parameter type
  187. QName paramType = org.apache.axis.wsdl.toJava.Utils.getXSIType(p);
  188. TypeEntry type = p.getType();
  189. if (type instanceof BaseType && ((BaseType) type).isBaseType()) {
  190. DeserializerFactory factory = c.getTypeMapping().getDeserializer(
  191. paramType);
  192. Deserializer deserializer = factory
  193. .getDeserializerAs(Constants.AXIS_SAX);
  194. if (deserializer instanceof SimpleDeserializer) {
  195. return ((SimpleDeserializer) deserializer).makeValue(arg);
  196. }
  197. }
  198. throw new RuntimeException("not know how to convert '" + arg
  199. + "' into " + c);
  200. }
  201. public static void main(String[] args) {
  202. String location = "http://mercuryhz/ims/ims.asmx?wsdl";
  203. try {
  204. DynamicInvoker invoker = new DynamicInvoker(location);
  205. Vector paramList = new Vector();
  206. paramList.add(new String("hz00260"));
  207. paramList.add(new String("UTs54121b"));
  208. Map returnList = invoker.invoke("ImsWebService","ImsWebServiceSoap","UTADAuthentication",paramList);
  209. for(Iterator i = returnList.keySet().iterator();i.hasNext();)
  210. {
  211. String name = (String) i.next();
  212. Object value = returnList.get(name);
  213. String line;
  214. if (value != null)
  215. {
  216. line = name + "=" + returnList.get(name).toString() + "\n";
  217. }
  218. else
  219. {
  220. line = name + "=(null)\n";
  221. }
  222. System.out.println(line);
  223. }
  224. } catch (Exception e) {
  225. }
  226. }
  227. }