DynamicInvoker
import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.Vector;import javax.wsdl.Binding;import javax.wsdl.Operation;import javax.wsdl.Port;import javax.wsdl.Service;import javax.xml.namespace.QName;import javax.xml.rpc.Call;import javax.xml.rpc.encoding.Deserializer;import javax.xml.rpc.encoding.DeserializerFactory;import org.apache.axis.Constants;import org.apache.axis.encoding.ser.SimpleDeserializer;import org.apache.axis.wsdl.gen.Parser;import org.apache.axis.wsdl.symbolTable.BaseType;import org.apache.axis.wsdl.symbolTable.BindingEntry;import org.apache.axis.wsdl.symbolTable.Parameter;import org.apache.axis.wsdl.symbolTable.Parameters;import org.apache.axis.wsdl.symbolTable.ServiceEntry;import org.apache.axis.wsdl.symbolTable.SymTabEntry;import org.apache.axis.wsdl.symbolTable.SymbolTable;import org.apache.axis.wsdl.symbolTable.TypeEntry;import org.apache.log4j.Logger;/** * Web Service Dynamic Invoker */public class DynamicInvoker {private static Logger logger = Logger.getLogger(DynamicInvoker.class); private Parser wsdlParser = null; private Map services = null; public DynamicInvoker(String wsdlURL) throws Exception { wsdlParser = new Parser(); try{ wsdlParser.run(wsdlURL); }catch(Exception e){ e.printStackTrace(); } services = enumSymTabEntry(ServiceEntry.class); } public Map invoke(String serviceName, String portName, String operationName, Vector parameterValues) throws Exception { logger.info("--------"+serviceName+"-----"+portName+"-----"+operationName+"---------begin-------"); logger.info(parameterValues.toString()); logger.info("--------"+serviceName+"-----"+portName+"-----"+operationName+"---------end-------"); Vector inputs = new Vector(); String returnName = null; ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName); Service service = serviceEntry.getService(); org.apache.axis.client.Service clientService = new org.apache.axis.client.Service( wsdlParser, service.getQName()); Call call = clientService.createCall(QName.valueOf(portName), QName .valueOf(operationName)); ((org.apache.axis.client.Call) call).setTimeout(new Integer(50 * 1000)); BindingEntry bindingEntry = getBindingEntry(serviceName, portName); Operation o = getOperation(bindingEntry, operationName); Parameters parameters = bindingEntry.getParameters(o); if (parameters.returnParam != null) { QName returnType = org.apache.axis.wsdl.toJava.Utils .getXSIType(parameters.returnParam); QName returnQName = parameters.returnParam.getQName(); returnName = returnQName.getLocalPart(); } int size = parameters.list.size(); for (int i = 0; i < size; i++) { Parameter p = (Parameter) parameters.list.get(i); switch (p.getMode()) { case Parameter.IN: inputs.add(getParamData((org.apache.axis.client.Call) call, p, (String) parameterValues.elementAt(i))); break; case Parameter.OUT: break; case Parameter.INOUT: inputs.add(getParamData((org.apache.axis.client.Call) call, p, (String) parameterValues.elementAt(i))); break; } } Object ret = call.invoke(inputs.toArray()); Map outputs = call.getOutputParams(); HashMap map = new HashMap(); if (ret != null && returnName != null) { map.put(returnName, ret); } if (outputs != null) { for (Iterator i = outputs.keySet().iterator(); i.hasNext();) { Object obj = i.next(); String name; Object value; if (obj.getClass().getName().equals("java.lang.String")) { name = (String) obj; } else { name = ((QName) obj).getLocalPart(); } value = outputs.get(obj); map.put(name, value); } } logger.info("--------"+serviceName+"-----"+portName+"-----"+operationName+"---------result begin-------"); logger.info(map.toString()); logger.info("--------"+serviceName+"-----"+portName+"-----"+operationName+"---------result end-------"); return map; } public Vector enumServiceNames() { Vector v = new Vector(); Iterator i = services.keySet().iterator(); while (i.hasNext()) { String s = (String) i.next(); v.addElement(s); } return v; } public Vector enumPortNames(String serviceName) { Vector v = new Vector(); ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName); Map ports = serviceEntry.getService().getPorts(); Iterator i = ports.keySet().iterator(); while (i.hasNext()) { String s = (String) i.next(); v.addElement(s); } return v; } public Vector enumOperationNames(String serviceName, String portName) { Vector v = new Vector(); BindingEntry entry = getBindingEntry(serviceName, portName); Set operations = entry.getOperations(); Iterator i = operations.iterator(); while (i.hasNext()) { Operation o = (Operation) i.next(); String s = o.getName(); v.addElement(s); } return v; } public Parameters enumParameters(String serviceName, String portName, String operationName) { BindingEntry entry = getBindingEntry(serviceName, portName); Operation o = getOperation(entry, operationName); Parameters parameters = entry.getParameters(o); return parameters; } public String getParameterModeString(Parameter p) { String ret = null; switch (p.getMode()) { case Parameter.IN: ret = ""; break; case Parameter.INOUT: ret = ""; break; case Parameter.OUT: ret = ""; break; } return ret; } private BindingEntry getBindingEntry(String serviceName, String portName) { ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName); Port port = serviceEntry.getService().getPort(portName); Binding binding = port.getBinding(); SymbolTable table = wsdlParser.getSymbolTable(); return table.getBindingEntry(binding.getQName()); } private Operation getOperation(BindingEntry entry, String operationName) { Set operations = entry.getOperations(); Iterator i = operations.iterator(); while (i.hasNext()) { Operation o = (Operation) i.next(); if (operationName.equals(o.getName())) { return o; } } return null; } /** * return Map of <QName.getLocalPart, SymTabEntry> */ private Map enumSymTabEntry(Class cls) { HashMap ret = new HashMap(); HashMap map = wsdlParser.getSymbolTable().getHashMap(); Iterator iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); QName key = (QName) entry.getKey(); Vector v = (Vector) entry.getValue(); int size = v.size(); for (int i = 0; i < size; ++i) { SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i); if (cls.isInstance(symTabEntry)) { ret.put(key.getLocalPart(), symTabEntry); } } } return ret; } private Object getParamData(org.apache.axis.client.Call c, Parameter p, String arg) throws Exception { // Get the QName representing the parameter type QName paramType = org.apache.axis.wsdl.toJava.Utils.getXSIType(p); TypeEntry type = p.getType(); if (type instanceof BaseType && ((BaseType) type).isBaseType()) { DeserializerFactory factory = c.getTypeMapping().getDeserializer( paramType); Deserializer deserializer = factory .getDeserializerAs(Constants.AXIS_SAX); if (deserializer instanceof SimpleDeserializer) { return ((SimpleDeserializer) deserializer).makeValue(arg); } } throw new RuntimeException("Can not convert '" + arg + "' into " + c); }}
页:
[1]