📄 soapmessageconverter.java
字号:
/* * 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 + -