`
小嘴冰凉
  • 浏览: 457020 次
  • 性别: 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字节码...

    (175797816)华南理工大学信号与系统Signal and Systems期末考试试卷及答案

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

    深圳建设施工项目安全生产奖惩管理制度.docx

    深圳建设施工项目安全生产奖惩管理制度

    离散数学课后题答案+sdut往年试卷+复习提纲资料

    离散数学课后题答案+sdut往年试卷+复习提纲资料

    自考04741计算机网络原理真题及答案及课件

    04741计算机网络原理 2018(尚德).pdf 13年试题(2套).pdf 2015年10月自考计算机网络原理04741试题及答案解析.docx 2021年4月自考04741计算机网络原理真题及答案.docx 2021年4月自考04741计算机网络原理试卷.bak.docx 计算机网络原理 课后题答案 全 李全龙版 自考04741.zip.zip 计算机网络原理课件 计算机网络原理课件.rar

    C++实现rpc,全程手写

    C++实现rpc,全程手写

    前端拿到的列表数据里id都一样的处理办法.txt

    前端拿到的列表数据里id都一样的处理办法.txt

    最新仿720云全景制作源码-krpano仿720云全景网站源码 新增微信支付+打赏+场景红包

    最新仿720云全景制作源码|krpano仿720云全景网站源码(新增微信支付+打赏+场景红包等)是一款基于php+mysql开发制作的全景在线制作网站源码,包含全景图片,全景视频等。数据存储全部存于OSS云端或本地,源码完全开源可自行二次开发。 环境要求:PHP5.5.X+MYSQL5.6.X+伪静态 熟悉linux系统推荐使用LAMP,web服务器最好使用apache,不要使用nginx(发布大全景图需要时间可能需要20多分钟, nginx超时机制不好控制)。 Windows系统推荐使用phpstudy。Liunx推荐宝塔控制面板apache 前端为HTML5开发,自适应手机版! 1、支持VR虚拟现实、全景视频、环物全景、说一说、点赞评论、重力感应、智能视频嵌入、场景切换热点、加载进度条、 地图导航、光晕flash特效、物体全景嵌入、场景自播、场景解说、雷达导航等业内前沿功能。 2、支持windows、Linux、Mac、安卓、IOS等几乎所有的系统观看。支持CDN图片转存,极大的减轻的服务器流量费用。 3、支持用户权限分配。方便会员制收费。

    YOLO算法-可乐罐子数据集-336张图像带标签-可乐.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> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    环境监测系统源代码全套技术资料.zip

    环境监测系统源代码全套技术资料.zip

    【编码解码】基于matlab罗利衰落信道编解码器设计【含Matlab源码 9930期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    四轮转向系统横摆角速度控制simulink仿真模型,利用滑模控制算法,基于八自由度车辆模型,控制有比较好的效果,附参考说明

    四轮转向系统横摆角速度控制simulink仿真模型,利用滑模控制算法,基于八自由度车辆模型,控制有比较好的效果,附参考说明。

    YOLO算法-工作场所安全隐患数据集-859张图像带标签-倒下的工人-配备个人防护装备的工人-无个人防护装备的工人-火.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> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    自学考试02331数据结构试题及答案2021-2022

    02142数据结构导论历年真题及答案(2012-2018共13套).rar 02331数据结构历年真题共267页2009.10-2019.4.rar 24数据结构201704_8.pdf 25数据结构201710_10.pdf 26数据结构201804_11.pdf 27数据结构201810_9.pdf 全国2021年04月高等教育自学考试02331数据结构试题及答案.docx 全国2022年04月高等教育自学考试02331数据结构试题及答案.docx 数据结构-课件.rar 第l六讲.ppt 第一讲.ppt 第七讲.ppt 第三讲.ppt 第九讲.ppt 第二讲.ppt 第五讲.ppt 第八讲.ppt 第四讲.ppt

    验收确认单表格.docx

    验收确认单表格.docx

    内存搜索工具(易).rar

    内存搜索工具(易).rar

    饮食管理系统项目源代码全套技术资料.zip

    饮食管理系统项目源代码全套技术资料.zip

    计算机视觉项目:Swin-Transformer 【tiny、small、base】模型实现的图像识别项目:番茄病害图像分类

    【项目简介】 代码主干网络采用Swin-Transformer 家族系列,包括【tiny、small、base】三种模型。pretrained和freeze_layers参数为是否采用官方预训练模型和是否仅训练分类头。为了做对比消融试验,优化器采用了Adam和SGD、AdamW三种。损失函数采用多类别的交叉熵、学习率优化策略采用cos余弦退火算法 【评估网络】 评估的指标采用loss和准确率(accuracy),分别会在训练集和验证集上进行评估、输出、绘制曲线图像。同时会在训练集、验证集进行一系列评估,包含混淆矩阵、recall、precision、F1 score等等曲线图像,以及recall、precision、F1 score、特异度的输出信息等等。 【具体各类别的指标在json文件中查看】 【如果想要更换数据集训练,参考readme文件】 【本项目为8种番茄病害图片(约4k张数据),包含数据集和标签,可以一键运行】

    (177121232)windows电脑下载OpenHarmony鸿蒙命令行工具hdc-std

    windows电脑下载OpenHarmony鸿蒙命令行工具hdc_std。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

Global site tag (gtag.js) - Google Analytics