String rpcWrapperElementName = partnerRoleMessageExchange.getOperationName()
+ "Response";
OMElement rpcWrapperElement = omSOAPBody.getFirstChildWithName(
new QName(soapBodyDefinition.getNamespaceURI(), rpcWrapperElementName));
if (rpcWrapperElement == null) {
throw new BPELFault("Message body doesn't contain expected part wrapper: " +
new QName(soapBodyDefinition.getNamespaceURI(), rpcWrapperElementName));
}
// In RPC the body element is the operation name, wrapping parts. Order doesn't
// really matter as far as we're concerned. All we need to do is copy the soap:body
// children, since doc-lit rpc looks the same in ode and soap.
for (Part partDef : messageBodyParts) {
OMElement omPartElement = rpcWrapperElement.getFirstChildWithName(
new QName(null, partDef.getName()));
if (omPartElement == null) {
throw new BPELFault("SOAP body doesn't contain required part: " +
new QName(null, partDef.getName()));
}
messageToODE.setPart(omPartElement.getLocalName(), OMUtils.toDOM(omPartElement));
}
} else {
// In doc-literal style, we expect the elements in the body to correspond (in order)
// to the parts defined in the binding. All the parts should be element-typed,
// otherwise it is a mess.
Iterator<OMElement> omParts = omSOAPBody.getChildElements();
for (Part partDef : messageBodyParts) {
if (!omParts.hasNext()) {
throw new BPELFault("SOAP body doesn't contain required part.");
}
OMElement omPart = omParts.next();
if (partDef.getElementName() == null) {
throw new BPELFault("Binding defines non element document list parts.");
}
if (!omPart.getQName().equals(partDef.getElementName())) {
throw new BPELFault("Unexpected element in SOAP body: " + omPart.getQName());
}
Document doc = DOMUtils.newDocument();
Element domPart = doc.createElementNS(null, partDef.getName());
domPart.appendChild(doc.importNode(OMUtils.toDOM(omPart), true));
messageToODE.setPart(partDef.getName(), domPart);