`
小嘴冰凉
  • 浏览: 457110 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 = "[IN]";
            break;
        case Parameter.INOUT:
            ret = "[IN, OUT]";
            break;
        case Parameter.OUT:
            ret = "[OUT]";
            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);
    }
}
分享到:
评论

相关推荐

    java7_invokedynamic_example

    Java 7引入了一个重要的新特性,即`invokedynamic`指令,这是一项为了提升动态语言在Java平台上的性能而设计的改进。`invokedynamic`是Java虚拟机(JVM)中的一个字节码指令,它允许程序在运行时动态地解析方法调用...

    Java方法句柄1

    最后,`CallSite`的`dynamicInvoker()`方法用于执行`InvokeDynamic`指令,这在测试或动态语言实现中非常有用。 如果你想在字节码级别操作这些概念,如生成或修改字节码,可以使用ASM库。ASM是一个强大的Java字节码...

    YOLO算法-城市电杆数据集-496张图像带标签-电杆.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    (177406840)JAVA图书管理系统毕业设计(源代码+论文).rar

    JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代

    (35734838)信号与系统实验一实验报告

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    YOLO算法-椅子检测故障数据集-300张图像带标签.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    基于小程序的新冠抗原自测平台小程序源代码(java+小程序+mysql+LW).zip

    系统可以提供信息显示和相应服务,其管理新冠抗原自测平台小程序信息,查看新冠抗原自测平台小程序信息,管理新冠抗原自测平台小程序。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7 小程序开发工具:hbuildx/微信开发者工具

    YOLO算法-俯视视角草原绵羊检测数据集-4133张图像带标签-羊.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    (171674830)PYQT5+openCV项目实战:微循环仪图片、视频记录和人工对比软件源码

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    新建 文本文档.docx

    新建 文本文档.docx

    hw06.zip

    hw06

    3. Kafka入门-安装与基本命令

    3. Kafka入门-安装与基本命令

    燃气管道施工资质和特种设备安装改造维修委托函.docx

    燃气管道施工资质和特种设备安装改造维修委托函.docx

    The state of AI 2024.pdf

    AI大模型研究相关报告

    lab02.zip

    lab02

    Unity视频插件AVPro的Win端2.2.3

    仅供学习使用,其他用途请购买正版资源AVPro Video Core Windows Edition 2.2.3 亲测可用的视频播放插件,能丝滑播放透明视频等.

    建设工程消防验收现场指导意见表.docx

    建设工程消防验收现场指导意见表.docx

    MVIMG_20241222_194113.jpg

    MVIMG_20241222_194113.jpg

    五相电机双闭环矢量控制模型-采用邻近四矢量SVPWM-MATLAB-Simulink仿真模型包括: (1)原理说明文档(重要):包括扇区判断、矢量作用时间计算、矢量作用顺序及切时间计算、PWM波的生成

    五相电机双闭环矢量控制模型_采用邻近四矢量SVPWM_MATLAB_Simulink仿真模型包括: (1)原理说明文档(重要):包括扇区判断、矢量作用时间计算、矢量作用顺序及切时间计算、PWM波的生成; (2)输出部分仿真波形及仿真说明文档; (3)完整版仿真模型:包括邻近四矢量SVPWM模型和完整双闭环矢量控制Simulink模型; 资料介绍过程十分详细,零基础手把手教学,资料已经写的很清楚

Global site tag (gtag.js) - Google Analytics