public void createSoapBody(
      org.apache.axiom.soap.SOAPBody sb,
      SOAPBody soapBody,
      Message msgDef,
      Element message,
      String rpcWrapper)
      throws AxisFault {
    OMElement partHolder =
        isRPC
            ? soapFactory.createOMElement(
                new QName(soapBody.getNamespaceURI(), rpcWrapper, "odens"), sb)
            : sb;
    List<Part> parts = msgDef.getOrderedParts(soapBody.getParts());

    for (Part part : parts) {
      Element srcPartEl = DOMUtils.findChildByName(message, new QName(null, part.getName()));
      if (srcPartEl == null) {
        throw new AxisFault("Missing required part in ODE Message");
      }

      OMElement omPart = OMUtils.toOM(srcPartEl, soapFactory);
      if (isRPC) {
        partHolder.addChild(omPart);
      } else {
        for (Iterator<OMNode> i = omPart.getChildren(); i.hasNext(); ) {
          partHolder.addChild(i.next());
        }
      }
    }
  }
  public Node getPartData(Element message, OMessageVarType.Part part) {
    // borrowed from ASSIGN.evalQuery()
    Node ret = DOMUtils.findChildByName(message, new QName(null, part.name));
    if (part.type instanceof OElementVarType) {
      QName elName = ((OElementVarType) part.type).elementType;
      ret = DOMUtils.findChildByName((Element) ret, elName);
    } else if (part.type == null) {
      // Special case of header parts never referenced in the WSDL def
      if (ret != null
          && ret.getNodeType() == Node.ELEMENT_NODE
          && ((Element) ret).getAttribute("headerPart") != null
          && DOMUtils.getTextContent(ret) == null)
        ret = DOMUtils.getFirstChildElement((Element) ret);
      // The needed part isn't there, dynamically creating it
      if (ret == null) {
        ret = message.getOwnerDocument().createElementNS(null, part.name);
        ((Element) ret).setAttribute("headerPart", "true");
        message.appendChild(ret);
      }
    }

    return ret;
  }