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

📄 soapmessageconverter.java

📁 bpel执行引擎用来执行bpel业务流程
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements.  See the NOTICE file * distributed with this work for additional information * regarding copyright ownership.  The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License.  You may obtain a copy of the License at * *    http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied.  See the License for the * specific language governing permissions and limitations * under the License. */package org.apache.ode.axis2.util;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.List;import org.w3c.dom.Document;import javax.wsdl.Binding;import javax.wsdl.BindingInput;import javax.wsdl.BindingOperation;import javax.wsdl.BindingOutput;import javax.wsdl.Definition;import javax.wsdl.Fault;import javax.wsdl.Input;import javax.wsdl.Message;import javax.wsdl.Operation;import javax.wsdl.Part;import javax.wsdl.Port;import javax.wsdl.Service;import javax.wsdl.extensions.ElementExtensible;import javax.wsdl.extensions.soap.SOAPBinding;import javax.wsdl.extensions.soap.SOAPBody;import javax.wsdl.extensions.soap.SOAPHeader;import javax.wsdl.extensions.soap.SOAPOperation;import javax.xml.namespace.QName;import java.util.*;import org.apache.axiom.om.OMAbstractFactory;import org.apache.axiom.om.OMElement;import org.apache.axiom.om.OMNode;import org.apache.axiom.soap.SOAPEnvelope;import org.apache.axiom.soap.SOAPFactory;import org.apache.axiom.soap.SOAPFault;import org.apache.axiom.soap.SOAPFaultCode;import org.apache.axiom.soap.SOAPFaultDetail;import org.apache.axiom.soap.SOAPFaultReason;import org.apache.axis2.AxisFault;import org.apache.axis2.context.MessageContext;import org.apache.axis2.namespace.Constants;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.ode.axis2.OdeFault;import org.apache.ode.il.OMUtils;import org.apache.ode.utils.DOMUtils;import org.apache.ode.utils.Namespaces;import org.apache.ode.utils.wsdl.Messages;import org.apache.ode.utils.wsdl.WsdlUtils;import org.apache.ode.utils.stl.CollectionsX;import org.w3c.dom.Element;/** * SOAP/ODE Message converter. Uses WSDL binding information to convert the protocol-neutral ODE representation into a SOAP * representation and vice versa. */public class SoapMessageConverter {    private static final Messages __msgs = Messages.getMessages(Messages.class);    private static final Log __log = LogFactory.getLog(SoapMessageConverter.class);    SOAPFactory _soapFactory;    Definition _def;    QName _serviceName;    String _portName;    Service _serviceDef;    Binding _binding;    Port _port;    boolean _isRPC;    private SOAPBinding _soapBinding;    public SoapMessageConverter(Definition def, QName serviceName, String portName) throws AxisFault {        if (def == null)            throw new NullPointerException("No WSDL definition was found for service "                    + serviceName + " and port " + portName);        _def = def;        _serviceName = serviceName;        _portName = portName;        _serviceDef = _def.getService(serviceName);        if (_serviceDef == null)            throw new OdeFault(__msgs.msgServiceDefinitionNotFound(serviceName));        _port = _serviceDef.getPort(portName);        if (_port == null)            throw new OdeFault(__msgs.msgPortDefinitionNotFound(serviceName, portName));        _binding = _port.getBinding();        if (_binding == null)            throw new OdeFault(__msgs.msgBindingNotFound(portName));        try {            if (!WsdlUtils.useSOAPBinding(_port)) {                throw new OdeFault(__msgs.msgNoSOAPBindingForPort(_portName));            }            _soapBinding = (SOAPBinding) WsdlUtils.getBindingExtension(_port);        } catch (IllegalArgumentException iae) {            throw new OdeFault(iae);        }        String style = _soapBinding.getStyle();        _isRPC = style != null && style.equals("rpc");        if (_soapBinding.getElementType().getNamespaceURI().equals(Constants.URI_WSDL11_SOAP)) {        	_soapFactory = OMAbstractFactory.getSOAP11Factory();        } else if (_soapBinding.getElementType().getNamespaceURI().equals(Constants.URI_WSDL12_SOAP)) {        	_soapFactory = OMAbstractFactory.getSOAP12Factory();        } else {        	throw new IllegalStateException("Unsupported SOAP binding: " + _soapBinding.getElementType());        }    }    @SuppressWarnings("unchecked")    public void createSoapRequest(MessageContext msgCtx, org.apache.ode.bpel.iapi.Message message, Operation op) throws AxisFault {        if (op == null)            throw new NullPointerException("Null operation");        // The message can be null if the input message has no part        if (op.getInput().getMessage().getParts().size() > 0 && message == null)            throw new NullPointerException("Null message.");        if (msgCtx == null)            throw new NullPointerException("Null msgCtx");        BindingOperation bop = _binding.getBindingOperation(op.getName(), null, null);        if (bop == null)            throw new OdeFault(__msgs.msgBindingOperationNotFound(_serviceName, _portName, op.getName()));        BindingInput bi = bop.getBindingInput();        if (bi == null)            throw new OdeFault(__msgs.msgBindingInputNotFound(_serviceName, _portName, op.getName()));        SOAPEnvelope soapEnv = msgCtx.getEnvelope();        if (soapEnv == null) {            soapEnv = _soapFactory.getDefaultEnvelope();            msgCtx.setEnvelope(soapEnv);        }        createSoapHeaders(soapEnv, getSOAPHeaders(bi), op.getInput().getMessage(), message.getHeaderParts());        SOAPBody soapBody = getSOAPBody(bi);        if (soapBody != null) {            org.apache.axiom.soap.SOAPBody sb = soapEnv.getBody() == null ? _soapFactory.createSOAPBody(soapEnv) : soapEnv.getBody();            createSoapBody(sb, soapBody, op.getInput().getMessage(), message.getMessage(), op.getName());        }    }    public void createSoapResponse(MessageContext msgCtx, org.apache.ode.bpel.iapi.Message message, Operation op) throws AxisFault {        if (op == null)            throw new NullPointerException("Null operation");        if (message == null)            throw new NullPointerException("Null message.");        if (msgCtx == null)            throw new NullPointerException("Null msgCtx");        BindingOperation bop = _binding.getBindingOperation(op.getName(),null,null);        if (bop == null)            throw new OdeFault(__msgs.msgBindingOperationNotFound(_serviceName, _portName, op.getName()));        BindingOutput bo = bop.getBindingOutput();        if (bo == null)            throw new OdeFault(__msgs.msgBindingOutputNotFound(_serviceName, _portName, op.getName()));        SOAPEnvelope soapEnv = msgCtx.getEnvelope();        if (soapEnv == null) {            soapEnv = _soapFactory.getDefaultEnvelope();            msgCtx.setEnvelope(soapEnv);        }        if (message.getHeaderParts().size() > 0 || getSOAPHeaders(bo).size() > 0)            createSoapHeaders(soapEnv, getSOAPHeaders(bo), op.getInput().getMessage(), message.getHeaderParts());        SOAPBody soapBody = getSOAPBody(bo);        if (soapBody != null) {            org.apache.axiom.soap.SOAPBody sb = soapEnv.getBody() == null ? _soapFactory.createSOAPBody(soapEnv) : soapEnv.getBody();            createSoapBody(sb, soapBody, op.getOutput().getMessage(), message.getMessage(), op.getName() + "Response");        }    }    public void createSoapHeaders(SOAPEnvelope soapEnv, List<SOAPHeader> headerDefs, Message msgdef, Map<String,Element> headers) throws AxisFault {        for (SOAPHeader sh : headerDefs) handleSoapHeaderDef(soapEnv, sh, msgdef, headers);        org.apache.axiom.soap.SOAPHeader soaphdr = soapEnv.getHeader();        if (soaphdr == null) soaphdr = _soapFactory.createSOAPHeader(soapEnv);        for (Element headerElmt : headers.values())            if (soaphdr.getFirstChildWithName(new QName(headerElmt.getNamespaceURI(), headerElmt.getLocalName())) == null)                soaphdr.addChild(OMUtils.toOM(headerElmt, _soapFactory));    }    @SuppressWarnings("unchecked")    private void handleSoapHeaderDef(SOAPEnvelope soapEnv, SOAPHeader headerdef, Message msgdef, Map<String,Element> headers) throws AxisFault {        boolean payloadMessageHeader = headerdef.getMessage() == null || headerdef.getMessage().equals(msgdef.getQName());        if (headerdef.getPart() == null) return;        if (payloadMessageHeader && msgdef.getPart(headerdef.getPart()) == null)            throw new OdeFault(__msgs.msgSoapHeaderReferencesUnkownPart(headerdef.getPart()));        Element srcPartEl = null;        if (headers.size() > 0)            if (payloadMessageHeader)                srcPartEl = headers.get(headerdef.getPart());        // We don't complain about missing header data unless they are part of the message payload. This is        // because AXIS may be providing these headers.        if (srcPartEl == null && payloadMessageHeader)            throw new OdeFault(__msgs.msgOdeMessageMissingRequiredPart(headerdef.getPart()));        if (srcPartEl == null) return;        org.apache.axiom.soap.SOAPHeader soaphdr = soapEnv.getHeader();        if (soaphdr == null) {            soaphdr = _soapFactory.createSOAPHeader(soapEnv);        }        OMElement omPart = OMUtils.toOM(srcPartEl, _soapFactory);        for (Iterator<OMNode> i = omPart.getChildren(); i.hasNext();)            soaphdr.addChild(i.next());    }    public SOAPFault createSoapFault(Element message, QName faultName, Operation op) throws AxisFault {        OMElement detail = buildSoapDetail(message, faultName, op);        SOAPFault fault = _soapFactory.createSOAPFault();        SOAPFaultCode code = _soapFactory.createSOAPFaultCode(fault);        code.setText(new QName(Namespaces.SOAP_ENV_NS, "Server"));        SOAPFaultReason reason = _soapFactory.createSOAPFaultReason(fault);        reason.setText(faultName);        SOAPFaultDetail soapDetail = _soapFactory.createSOAPFaultDetail(fault);        if (detail != null)            soapDetail.addDetailEntry(detail);        return fault;    }    private OMElement buildSoapDetail(Element message, QName faultName, Operation op) throws AxisFault {        if (faultName.getNamespaceURI() == null)            return toFaultDetail(faultName, message);        Fault f = op.getFault(faultName.getLocalPart());        if (f == null)

⌨️ 快捷键说明

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