+1 to fixing this and adding appropriate test cases. alex
On Thu, Feb 19, 2009 at 6:29 AM, Milinda Pathirage < [email protected]> wrote: > When handling SOAP Header parts in WSDL message, following methods are used > from SoapMessageConverter.java. > > public void createSoapHeaders(SOAPEnvelope soapEnv, List<SOAPHeader> > headerDefs, Message msgdef, Map<String,Node> headers) throws AxisFault > > private void handleSoapHeaderDef(SOAPEnvelope soapEnv, SOAPHeader > headerdef, > Message msgdef, Map<String, Node> headers) throws AxisFault > > Due to some issue with org.apache.ode.bpel.iapi.Message logic > getHeaderParts > method returns a empty map. So even though there header parts in your WSDL, > ODE will not send requests to external services with header and not send > SOAP headers in response message. > > Even though there are no value in headers map, there is header parts > corresponding to headerDefs inside bpel Message. I have experienced that > when there header parts in input and output messages of WSDL operations. > > We get the DOM Element for those headerDefs by using message.getPart > method. > I think it's better to pass bpel.iapi.Message to createSoapHeaders, and > handleSoapHeaderDef methods and implement those method as follows. > > public void createSoapHeaders(SOAPEnvelope soapEnv, List<SOAPHeader> > headerDefs, Message msgdef, org.apache.ode.bpel.iapi.Message message) > throws > AxisFault { > for (SOAPHeader sh : headerDefs) handleSoapHeaderDef(soapEnv, sh, > msgdef, message); > > org.apache.axiom.soap.SOAPHeader soaphdr = soapEnv.getHeader(); > if (soaphdr == null) soaphdr = > _soapFactory.createSOAPHeader(soapEnv); > > SOAPHeaderBlock soapHeaderBlock = null; > for (Element headerElmt : message.getHeaderParts().values()) { > if (soaphdr.getFirstChildWithName(new > QName(headerElmt.getNamespaceURI(), headerElmt.getLocalName())) == null) { > OMElement omElement = OMUtils.toOM(headerElmt, > _soapFactory); > soapHeaderBlock = > _soapFactory.createSOAPHeaderBlock(omElement.getQName().getLocalPart(), > omElement.getNamespace()); > for (Iterator iter = omElement.getChildren(); > iter.hasNext();) { > soapHeaderBlock.addChild((OMNode) iter.next()); > } > soaphdr.addChild(soapHeaderBlock); > } > } > > } > > @SuppressWarnings("unchecked") > private void handleSoapHeaderDef(SOAPEnvelope soapEnv, SOAPHeader > headerdef, Message msgdef, org.apache.ode.bpel.iapi.Message message) 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 (message.getHeaderParts().size() > 0) > if (payloadMessageHeader) > srcPartEl = > message.getHeaderParts().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){ > if(message.getPart(headerdef.getPart()) != null){ > srcPartEl = message.getPart(headerdef.getPart()); > }else{ > 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()); > } > > I have tested above code with SOAP headers in BPEL messagesand without SOAP > headers. If you guys are ok with this fix I can commit ot both trunk and > 1.X > branch. > > Also there is a typo in createSoapResponse method. > > if (message.getHeaderParts().size() > 0 || getSOAPHeaders(bo).size() > 0) > createSoapHeaders(soapEnv, getSOAPHeaders(bo), > op.getInput().getMessage(), message.getHeaderParts()); > > the above must change to > > if (message.getHeaderParts().size() > 0 || getSOAPHeaders(bo).size() > 0) > createSoapHeaders(soapEnv, getSOAPHeaders(bo), > op.getOutput().getMessage(), message); > > > > Thanks, > Milinda > > -- > http://mpathirage.com > http://wso2.org "Oxygen for Web Service Developers" > http://wsaxc.blogspot.com "Web Services With Axis2/C" >
