1 16 package samples.client; 17 18 import org.apache.axis.Constants; 19 import org.apache.axis.utils.XMLUtils; 20 import org.apache.axis.encoding.ser.SimpleDeserializer; 21 import org.apache.axis.encoding.ser.ElementSerializerFactory; 22 import org.apache.axis.encoding.ser.ElementDeserializerFactory; 23 import org.apache.axis.encoding.ser.ElementDeserializer; 24 import org.apache.axis.wsdl.gen.Parser; 25 import org.apache.axis.wsdl.symbolTable.BaseType; 26 import org.apache.axis.wsdl.symbolTable.BindingEntry; 27 import org.apache.axis.wsdl.symbolTable.Parameter; 28 import org.apache.axis.wsdl.symbolTable.Parameters; 29 import org.apache.axis.wsdl.symbolTable.ServiceEntry; 30 import org.apache.axis.wsdl.symbolTable.SymTabEntry; 31 import org.apache.axis.wsdl.symbolTable.SymbolTable; 32 import org.apache.axis.wsdl.symbolTable.TypeEntry; 33 import org.w3c.dom.Element ; 34 35 import javax.wsdl.Binding; 36 import javax.wsdl.Operation; 37 import javax.wsdl.Port; 38 import javax.wsdl.Service; 39 import javax.wsdl.extensions.soap.SOAPAddress; 40 import javax.xml.namespace.QName ; 41 import javax.xml.rpc.Call ; 42 import javax.xml.rpc.encoding.Deserializer ; 43 import javax.xml.rpc.encoding.DeserializerFactory ; 44 import java.util.HashMap ; 45 import java.util.Iterator ; 46 import java.util.List ; 47 import java.util.Map ; 48 import java.util.Vector ; 49 50 58 public class DynamicInvoker { 59 60 61 private Parser wsdlParser = null; 62 63 70 public DynamicInvoker(String wsdlURL) throws Exception { 71 wsdlParser = new Parser(); 73 System.out.println("Reading WSDL document from '" + wsdlURL + "'"); 74 wsdlParser.run(wsdlURL); 75 } 76 77 80 private static void usage() { 81 System.err.println( 82 "Usage: java " + DynamicInvoker.class.getName() + " wsdlLocation " 83 + "operationName[(portName)] " 84 + "[argument1 ...]"); 85 System.exit(1); 86 } 87 88 95 public static void main(String [] args) throws Exception { 96 if (args.length < 2) { 97 usage(); 98 } 99 String wsdlLocation = (args.length > 0) 100 ? args[0] 101 : null; 102 String operationName = (args.length > 1) 103 ? args[1] 104 : null; 105 String portName = null; 106 try { 107 portName = operationName.substring(operationName.indexOf("(") + 1, 108 operationName.indexOf(")")); 109 operationName = operationName.substring(0, operationName.indexOf("(")); 110 } catch (Exception ignored) { 111 } 112 113 DynamicInvoker invoker = new DynamicInvoker(wsdlLocation); 114 HashMap map = invoker.invokeMethod(operationName, portName, args); 115 116 for (Iterator it = map.entrySet().iterator(); it.hasNext();) { 117 Map.Entry entry = (Map.Entry ) it.next(); 118 String key = (String ) entry.getKey(); 119 Object value = entry.getValue(); 120 if (value instanceof Element ) { 121 System.out.println("====== " + key + " ======"); 122 XMLUtils.ElementToStream((Element ) value, System.out); 123 System.out.println("========================="); 124 } else { 125 System.out.println(key + "=" + value); 126 } 127 } 128 System.out.println("\nDone!"); 129 } 130 131 145 public HashMap invokeMethod( 146 String operationName, String portName, String [] args) 147 throws Exception { 148 String serviceNS = null; 149 String serviceName = null; 150 String operationQName = null; 151 152 System.out.println("Preparing Axis dynamic invocation"); 153 Service service = selectService(serviceNS, serviceName); 154 Operation operation = null; 155 org.apache.axis.client.Service dpf = new org.apache.axis.client.Service(wsdlParser, service.getQName()); 156 157 Vector inputs = new Vector (); 158 Port port = selectPort(service.getPorts(), portName); 159 if (portName == null) { 160 portName = port.getName(); 161 } 162 Binding binding = port.getBinding(); 163 Call call = dpf.createCall(QName.valueOf(portName), 164 QName.valueOf(operationName)); 165 ((org.apache.axis.client.Call)call).setTimeout(new Integer (15*1000)); 166 ((org.apache.axis.client.Call)call).setProperty(ElementDeserializer.DESERIALIZE_CURRENT_ELEMENT, Boolean.TRUE); 167 168 Vector outNames = new Vector (); 170 171 Vector inNames = new Vector (); 173 Vector inTypes = new Vector (); 174 SymbolTable symbolTable = wsdlParser.getSymbolTable(); 175 BindingEntry bEntry = 176 symbolTable.getBindingEntry(binding.getQName()); 177 Parameters parameters = null; 178 Iterator i = bEntry.getParameters().keySet().iterator(); 179 180 while (i.hasNext()) { 181 Operation o = (Operation) i.next(); 182 if (o.getName().equals(operationName)) { 183 operation = o; 184 parameters = (Parameters) bEntry.getParameters().get(o); 185 break; 186 } 187 } 188 if ((operation == null) || (parameters == null)) { 189 throw new RuntimeException (operationName + " was not found."); 190 } 191 192 for (int j = 0; j < parameters.list.size(); ++j) { 194 Parameter p = (Parameter) parameters.list.get(j); 195 196 if (p.getMode() == 1) { inNames.add(p.getQName().getLocalPart()); 198 inTypes.add(p); 199 } else if (p.getMode() == 2) { outNames.add(p.getQName().getLocalPart()); 201 } else if (p.getMode() == 3) { inNames.add(p.getQName().getLocalPart()); 203 inTypes.add(p); 204 outNames.add(p.getQName().getLocalPart()); 205 } 206 } 207 208 if (parameters.returnParam != null) { 210 211 if(!parameters.returnParam.getType().isBaseType()) { 212 ((org.apache.axis.client.Call)call).registerTypeMapping(org.w3c.dom.Element .class, parameters.returnParam.getType().getQName(), 213 new ElementSerializerFactory(), 214 new ElementDeserializerFactory()); 215 } 216 217 QName returnType = org.apache.axis.wsdl.toJava.Utils.getXSIType( 219 parameters.returnParam); 220 QName returnQName = parameters.returnParam.getQName(); 221 222 outNames.add(returnQName.getLocalPart()); 223 } 224 225 if (inNames.size() != args.length - 2) 226 throw new RuntimeException ("Need " + inNames.size() + " arguments!!!"); 227 228 for (int pos = 0; pos < inNames.size(); ++pos) { 229 String arg = args[pos + 2]; 230 Parameter p = (Parameter) inTypes.get(pos); 231 inputs.add(getParamData((org.apache.axis.client.Call) call, p, arg)); 232 } 233 System.out.println("Executing operation " + operationName + " with parameters:"); 234 for (int j = 0; j < inputs.size(); j++) { 235 System.out.println(inNames.get(j) + "=" + inputs.get(j)); 236 } 237 Object ret = call.invoke(inputs.toArray()); 238 Map outputs = call.getOutputParams(); 239 HashMap map = new HashMap (); 240 241 for (int pos = 0; pos < outNames.size(); ++pos) { 242 String name = (String ) outNames.get(pos); 243 Object value = outputs.get(name); 244 245 if ((value == null) && (pos == 0)) { 246 map.put(name, ret); 247 } else { 248 map.put(name, value); 249 } 250 } 251 return map; 252 } 253 254 260 private Object getParamData(org.apache.axis.client.Call c, Parameter p, String arg) throws Exception { 261 QName paramType = org.apache.axis.wsdl.toJava.Utils.getXSIType(p); 263 264 TypeEntry type = p.getType(); 265 if (type instanceof BaseType && ((BaseType) type).isBaseType()) { 266 DeserializerFactory factory = c.getTypeMapping().getDeserializer(paramType); 267 Deserializer deserializer = factory.getDeserializerAs(Constants.AXIS_SAX); 268 if (deserializer instanceof SimpleDeserializer) { 269 return ((SimpleDeserializer)deserializer).makeValue(arg); 270 } 271 } 272 throw new RuntimeException ("not know how to convert '" + arg 273 + "' into " + c); 274 } 275 276 287 public Service selectService(String serviceNS, String serviceName) 288 throws Exception { 289 QName serviceQName = (((serviceNS != null) 290 && (serviceName != null)) 291 ? new QName (serviceNS, serviceName) 292 : null); 293 ServiceEntry serviceEntry = (ServiceEntry) getSymTabEntry(serviceQName, 294 ServiceEntry.class); 295 return serviceEntry.getService(); 296 } 297 298 306 public SymTabEntry getSymTabEntry(QName qname, Class cls) { 307 HashMap map = wsdlParser.getSymbolTable().getHashMap(); 308 Iterator iterator = map.entrySet().iterator(); 309 310 while (iterator.hasNext()) { 311 Map.Entry entry = (Map.Entry ) iterator.next(); 312 QName key = (QName ) entry.getKey(); 313 Vector v = (Vector ) entry.getValue(); 314 315 if ((qname == null) || qname.equals(qname)) { 316 for (int i = 0; i < v.size(); ++i) { 317 SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i); 318 319 if (cls.isInstance(symTabEntry)) { 320 return symTabEntry; 321 } 322 } 323 } 324 } 325 return null; 326 } 327 328 338 public Port selectPort(Map ports, String portName) throws Exception { 339 Iterator valueIterator = ports.keySet().iterator(); 340 while (valueIterator.hasNext()) { 341 String name = (String ) valueIterator.next(); 342 343 if ((portName == null) || (portName.length() == 0)) { 344 Port port = (Port) ports.get(name); 345 List list = port.getExtensibilityElements(); 346 347 for (int i = 0; (list != null) && (i < list.size()); i++) { 348 Object obj = list.get(i); 349 if (obj instanceof SOAPAddress) { 350 return port; 351 } 352 } 353 } else if ((name != null) && name.equals(portName)) { 354 return (Port) ports.get(name); 355 } 356 } 357 return null; 358 } 359 } 360 361 | Popular Tags |