⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soapeventhandler.java

📁 Sequoia ERP是一个真正的企业级开源ERP解决方案。它提供的模块包括:电子商务应用(e-commerce), POS系统(point of sales),知识管理,存货与仓库管理
💻 JAVA
字号:
/* * $Id: SOAPEventHandler.java 5462 2005-08-05 18:35:48Z jonesde $ * * Copyright (c) 2001-2003 The Open For Business Project - www.ofbiz.org * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */package org.ofbiz.webapp.event;import java.io.IOException;import java.io.Writer;import java.io.OutputStream;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletContext;import javax.xml.soap.SOAPException;import javax.wsdl.WSDLException;import org.ofbiz.base.util.Debug;import org.ofbiz.base.util.UtilMisc;import org.ofbiz.base.util.UtilXml;import org.ofbiz.service.GenericServiceException;import org.ofbiz.service.LocalDispatcher;import org.ofbiz.service.ModelService;import org.ofbiz.service.DispatchContext;import org.ofbiz.webapp.control.RequestHandler;import org.apache.axis.AxisFault;import org.apache.axis.Constants;import org.apache.axis.Message;import org.apache.axis.MessageContext;import org.apache.axis.message.RPCElement;import org.apache.axis.message.RPCParam;import org.apache.axis.message.SOAPEnvelope;import org.apache.axis.server.AxisServer;import org.apache.log4j.Category;import org.w3c.dom.Document;/** * SOAPEventHandler - SOAP Event Handler implementation * * @author     <a href="mailto:jaz@ofbiz.org">Andy Zeneski</a>  * @author     <a href="mailto:">Andy Chen</a> * @author     <a href="mailto:jonesde@ofbiz.org">David E. Jones</a> * @version    $Rev: 5462 $ * @since      2.0 */public class SOAPEventHandler implements EventHandler {    public static final String module = SOAPEventHandler.class.getName();    public static Category category = Category.getInstance(SOAPEventHandler.class.getName());    /**     * @see org.ofbiz.webapp.event.EventHandler#init(javax.servlet.ServletContext)     */    public void init(ServletContext context) throws EventHandlerException {    }        /** Invoke the web event     *@param eventPath The path or location of this event     *@param eventMethod The method to invoke     *@param request The servlet request object     *@param response The servlet response object     *@return String Result code     *@throws EventHandlerException     */    public String invoke(String eventPath, String eventMethod, HttpServletRequest request, HttpServletResponse response) throws EventHandlerException {        LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");        AxisServer axisServer;        // first check for WSDL request        String wsdlReq = request.getParameter("wsdl");        if (wsdlReq == null) {            wsdlReq = request.getParameter("WSDL");        }        if (wsdlReq != null) {            String serviceName = RequestHandler.getNextPageUri(request.getPathInfo());            DispatchContext dctx = dispatcher.getDispatchContext();            String locationUri = this.getLocationURI(request);            if (serviceName != null) {                Document wsdl = null;                try {                    wsdl = dctx.getWSDL(serviceName, locationUri);                } catch (GenericServiceException e) {                    serviceName = null;                } catch (WSDLException e) {                    sendError(response, "Unable to obtain WSDL");                    throw new EventHandlerException("Unable to obtain WSDL", e);                }                if (wsdl != null) {                    try {                        OutputStream os = response.getOutputStream();                        response.setContentType("text/xml");                        UtilXml.writeXmlDocument(os, wsdl);                        response.flushBuffer();                    } catch (IOException e) {                        throw new EventHandlerException(e);                    }                    return null;                } else {                    sendError(response, "Unable to obtain WSDL");                    throw new EventHandlerException("Unable to obtain WSDL");                }            }            if (serviceName == null) {                try {                    Writer writer = response.getWriter();                    StringBuffer sb = new StringBuffer();                    sb.append("<html><head><title>OFBiz SOAP/1.1 Services</title></head>");                    sb.append("<body>No such service.").append("<p>Services:<ul>");                    Iterator i = dctx.getAllServiceNames().iterator();                    while (i.hasNext()) {                        String scvName = (String) i.next();                        ModelService model = dctx.getModelService(scvName);                        if (model.export) {                            sb.append("<li><a href=\"").append(locationUri).append("/").append(model.name).append("?wsdl\">");                            sb.append(model.name).append("</a></li>");                        }                    }                    sb.append("</ul></p></body></html>");                    writer.write(sb.toString());                    writer.flush();                    return null;                } catch (Exception e) {                    sendError(response, "Unable to obtain WSDL");                    throw new EventHandlerException("Unable to obtain WSDL");                }            }        }        // not a wsdl request; invoke the service        try {            axisServer = AxisServer.getServer(UtilMisc.toMap("name", "OFBiz/Axis Server", "provider", null));                            } catch (AxisFault e) {            sendError(response, e);            throw new EventHandlerException("Problems with the AXIS server", e);        }        MessageContext mctx = new MessageContext(axisServer);        // get the SOAP message        Message msg = null;        try {            msg = new Message(request.getInputStream(), false,                        request.getHeader("Content-Type"), request.getHeader("Content-Location"));        } catch (IOException ioe) {            sendError(response, "Problem processing the service");            throw new EventHandlerException("Cannot read the input stream", ioe);        }        if (msg == null) {            sendError(response, "No message");            throw new EventHandlerException("SOAP Message is null");        }        mctx.setRequestMessage(msg);        // new envelopes        SOAPEnvelope resEnv = new SOAPEnvelope();        SOAPEnvelope reqEnv = null;        // get the service name and parameters        try {            reqEnv = (SOAPEnvelope) msg.getSOAPPart().getEnvelope();                            } catch (SOAPException e) {            sendError(response, "Problem processing the service");            throw new EventHandlerException("Cannot get the envelope", e);        }                List bodies = null;        try {            bodies = reqEnv.getBodyElements();        } catch (AxisFault e) {            sendError(response, e);            throw new EventHandlerException(e.getMessage(), e);        }        Debug.logVerbose("[Processing]: SOAP Event", module);        // each is a different service call        Iterator i = bodies.iterator();        while (i.hasNext()) {            Object o = i.next();            if (o instanceof RPCElement) {                RPCElement body = (RPCElement) o;                String serviceName = body.getMethodName();                List params = null;                try {                    params = body.getParams();                } catch (Exception e) {                    sendError(response, e);                    throw new EventHandlerException(e.getMessage(), e);                }                Map serviceContext = new HashMap();                Iterator p = params.iterator();                while (p.hasNext()) {                    RPCParam param = (RPCParam) p.next();                    if (Debug.verboseOn()) Debug.logVerbose("[Reading Param]: " + param.getName(), module);                    serviceContext.put(param.getName(), param.getObjectValue());                }                try {                    // verify the service is exported for remote execution and invoke it                    ModelService model = dispatcher.getDispatchContext().getModelService(serviceName);                    if (model != null && model.export) {                        Map result = dispatcher.runSync(serviceName, serviceContext);                        Debug.logVerbose("[EventHandler] : Service invoked", module);                        RPCElement resBody = new RPCElement(serviceName + "Response");                        resBody.setPrefix(body.getPrefix());                        resBody.setNamespaceURI(body.getNamespaceURI());                        Set keySet = result.keySet();                        Iterator ri = keySet.iterator();                        while (ri.hasNext()) {                            Object key = ri.next();                            RPCParam par = new RPCParam(((String) key), result.get(key));                            resBody.addParam(par);                        }                        resEnv.addBodyElement(resBody);                        resEnv.setEncodingStyle(Constants.URI_LITERAL_ENC);                    } else {                        sendError(response, "Requested service not available");                        throw new EventHandlerException("Service is not exported");                    }                } catch (GenericServiceException e) {                    sendError(response, "Problem processing the service");                    throw new EventHandlerException(e.getMessage(), e);                } catch (javax.xml.soap.SOAPException e) {                    sendError(response, "Problem processing the service");                    throw new EventHandlerException(e.getMessage(), e);                }            }        }        // setup the response        Debug.logVerbose("[EventHandler] : Setting up response message", module);        msg = new Message(resEnv);        mctx.setResponseMessage(msg);        if (msg == null) {            sendError(response, "No response message available");            throw new EventHandlerException("No response message available");        }        try {                        response.setContentType(msg.getContentType(Constants.DEFAULT_SOAP_VERSION));               response.setContentLength(Integer.parseInt(Long.toString(msg.getContentLength())));                                         } catch (AxisFault e) {            sendError(response, e);            throw new EventHandlerException(e.getMessage(), e);        }        try {            msg.writeTo(response.getOutputStream());            response.flushBuffer();        } catch (IOException e) {            throw new EventHandlerException("Cannot write to the output stream");        } catch (SOAPException e) {            throw new EventHandlerException("Cannot write message to the output stream");        }        Debug.logVerbose("[EventHandler] : Message sent to requester", module);        return null;    }    private void sendError(HttpServletResponse res, Object obj) throws EventHandlerException {        Message msg = new Message(obj);        try {            res.setContentType(msg.getContentType(Constants.DEFAULT_SOAP_VERSION));            res.setContentLength(Integer.parseInt(Long.toString(msg.getContentLength())));            msg.writeTo(res.getOutputStream());                                    res.flushBuffer();        } catch (Exception e) {            throw new EventHandlerException(e.getMessage(), e);        }    }    private String getLocationURI(HttpServletRequest request) {        StringBuffer uri = new StringBuffer();        uri.append(request.getScheme());        uri.append("://");        uri.append(request.getServerName());        if (request.getServerPort() != 80 && request.getServerPort() != 443) {            uri.append(":");            uri.append(request.getServerPort());        }        uri.append(request.getContextPath());        uri.append(request.getServletPath());        String reqInfo = RequestHandler.getRequestUri(request.getPathInfo());        if (!reqInfo.startsWith("/")) {            reqInfo = "/" + reqInfo;        }        uri.append(reqInfo);        return uri.toString();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -