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

    perl516-perl-Locale-Maketext-1.22-19.el6.centos.alt.noarch.rpm

    perl516-perl-Locale-Maketext-1.22-19.el6.centos.alt.noarch.rpm

    MATLAB仿真平台下的含碳捕集与垃圾焚烧虚拟电厂的协同优化调度策略研究:电转气技术下的能源利用与需求响应管理,MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度 关键词:碳捕集 电厂

    MATLAB仿真平台下的含碳捕集与垃圾焚烧虚拟电厂的协同优化调度策略研究:电转气技术下的能源利用与需求响应管理,MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度 关键词:碳捕集 电厂 需求响应 优化调度 电转气协同调度 参考文档:《计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度》完全复现 仿真平台:MATLAB+CPLEX 主要内容:代码主要做的是一个计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度问题,基本调度框架是碳捕集电厂–电转气–燃气机组协同利用框架,碳捕集的 CO2 可作为电转气原料, 生成的天然气则供应给燃气机组; 并通过联合调度将碳捕集能耗和烟气处理能耗进行负荷转移以平抑可再生能源波动,使得风电 光伏实现间接可调度而被灵活利用,代码采用的是非智能算法求解,因为本文问题复杂智能算法难以求解,故使用的是yalmip+cplex求解器完成求解 这段代码是一个关于电转气协同的含碳捕集与垃圾焚烧电厂优化调度的程序。下面我将对程序进行详细分析。 首先,程序开始时进行了一些初始化的操作,包括清空命令窗口、清除变量和关闭所有图形窗口。 然后,定义了一系列的参数,这

    温州市乡镇边界,shp格式

    shp格式,可直接导入arcgis使用

    snappy-1.1.0-3.el7.x64-86.rpm.tar.gz

    1、文件内容:snappy-1.1.0-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/snappy-1.1.0-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    perl516-perl-libs-5.16.3-19.el6.centos.alt.x86_64.rpm

    perl516-perl-libs-5.16.3-19.el6.centos.alt.x86_64.rpm

    si-units-0.6.5-1.el7.x64-86.rpm.tar.gz

    1、文件内容:si-units-0.6.5-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/si-units-0.6.5-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    svrcore-devel-4.1.3-2.el7.x64-86.rpm.tar.gz

    1、文件内容:svrcore-devel-4.1.3-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/svrcore-devel-4.1.3-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    宠物管理系统(源码+数据库+论文+ppt)java开发ssm框架javaweb,可做计算机毕业设计或课程设计

    宠物管理系统(源码+数据库+论文+ppt)java开发ssm框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 整个网上宠物管理系统的设计与实现,主要实现的功能有以下几点: (1)前台用户:首页、宠物用品、宠物商店、宠物领养、宠物挂失、论坛信息、宠物资讯、个人中心、后台管理、购物车、客服咨询 (2)管理员:首页、个人中心、宠物分类管理、商品分类管理、宠物用品管理、宠物商店管理、宠物领养管理、用户管理、宠物寄存管理、用户领养管理、宠物挂失管理、论坛管理、管理员管理、系统管理、订单管理等功能; 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。

    一个功能强大的图表生成工具,支持多种图表类型和数据可视化

    ## 功能特点 1. 数据导入 - 支持Excel文件 - 支持CSV文件 - 数据预览 - 自动识别列 2. 图表类型 - 折线图 - 柱状图 - 饼图 - 散点图 - 箱线图 - 热力图 3. 图表设置 - 自定义标题 - 主题选择 - 轴标签设置 - 样式调整 4. 其他功能 - 实时预览 - 高清导出 - 多种格式 - 简单操作

    perl516-perl-DBI-1.630-4.el6.centos.alt.x86_64.rpm

    perl516-perl-DBI-1.630-4.el6.centos.alt.x86_64.rpm

    strace-4.24-7.el7-9.x64-86.rpm.tar.gz

    1、文件内容:strace-4.24-7.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/strace-4.24-7.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    sos-3.9-5.el7.centos.12.x64-86.rpm.tar.gz

    1、文件内容:sos-3.9-5.el7.centos.12.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/sos-3.9-5.el7.centos.12.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    srp-daemon-22.4-6.el7-9.x64-86.rpm.tar.gz

    1、文件内容:srp_daemon-22.4-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/srp_daemon-22.4-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    supermin5-devel-5.1.19-1.el7.x64-86.rpm.tar.gz

    1、文件内容:supermin5-devel-5.1.19-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/supermin5-devel-5.1.19-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    国土变更小飞机工具分享

    找到image文件扫一扫获取授权

    一个将 Ollama 与 Flask 框架结合的 Python 源码

    一个将 Ollama 与 Flask 框架结合的 Python 源码,创建一个 Web 服务,用户可以通过浏览器或其他工具向该服务发送请求,调用 Ollama 模型生成文本。

    perl516-perl-DateTime-1.06-3.el6.centos.alt.x86_64.rpm

    perl516-perl-DateTime-1.06-3.el6.centos.alt.x86_64.rpm

    Python IDE PyCharm的多平台安装指南和技术应用入门

    内容概要:本文档详细介绍了如何在不同操作系统(Windows、macOS 和 Linux)上安装 PyCharm这一集成开发环境(IDE)。文档不仅讲解了具体的下载渠道以及步骤指引——涵盖社区版和专业版的选择,而且还引导用户进行首次配置,包括外观定制、键盘布局选定以及必要的组件启用,并指出在首次使用的各个阶段可能会遇到的关键事项,像是授权激活。此外,也提到了在启动过程中,针对不同平台的一些特定注意事项,例如在 Mac 中的安全性和隐私设置、Linux 下基于命令行的解压缩与启动方法。 适合人群:初次接触 Python 编程或有意向使用 PyCharm 提高生产力的程序员,尤其是对 PyCharm 不太熟悉的技术新手。 使用场景及目标:为希望使用 PyCharm 开发 Python程序的学生或专业人士提供详尽的操作指南,使其能够顺利完成安装,并熟悉 IDE 的基本特性及高级特性的初步认识,从而快速着手实际项目的开发。 阅读建议:用户可以按自己的操作系统直接跳转相关章节,逐步依照文档步骤来进行安装与配置。同时关注每段文字末提到的独特提醒项以保证顺利地使用 IDE 进行编码工作。对于计划长期使用 PyCharm 的用户来说,还可以探索更多高级插件以满足自身开发需求。

Global site tag (gtag.js) - Google Analytics