private List<MessagePartInfo> handleMimePart( MIMEPart mpart, List<MessagePartInfo> attParts, MessageInfo msg, BindingMessageInfo bmsg, List<MessagePartInfo> bodyParts, List<MessagePartInfo> messageParts) { if (mpart.getExtensibilityElements().size() < 1) { throw new RuntimeException("MIMEPart should at least contain one element!"); } String partName = null; for (Object content : mpart.getExtensibilityElements()) { if (content instanceof MIMEContent) { MIMEContent mc = (MIMEContent) content; partName = mc.getPart(); if (attParts == null) { attParts = new LinkedList<MessagePartInfo>(); } if (StringUtils.isEmpty(partName)) { throw new RuntimeException( "Problem with WSDL: mime content element in operation " + bmsg.getBindingOperation().getName().getLocalPart() + " does not specify a part."); } MessagePartInfo mpi = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), partName)); mpi.setProperty(Message.CONTENT_TYPE, mc.getType()); attParts.add(mpi); // Attachments shouldn't be part of the body message bmsg.getMessageParts().remove(mpi); } else if (SOAPBindingUtil.isSOAPBody(content)) { SoapBody sb = SOAPBindingUtil.getSoapBody(content); if (sb.getParts() != null && sb.getParts().size() == 1) { partName = (String) sb.getParts().get(0); } // We can have a list of empty part names here. if (partName != null) { addSoapBodyPart(msg, bodyParts, partName); } } else if (SOAPBindingUtil.isSOAPHeader(content)) { SoapHeader header = SOAPBindingUtil.getSoapHeader(content); SoapHeaderInfo headerInfo = new SoapHeaderInfo(); headerInfo.setUse(header.getUse()); if (StringUtils.isEmpty(header.getPart())) { throw new RuntimeException( "Problem with WSDL: soap:header element in operation " + bmsg.getBindingOperation().getName().getLocalPart() + " does not specify a part."); } MessagePartInfo mpi = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header.getPart())); if (mpi != null && header.getMessage() != null && !mpi.getMessageInfo().getName().equals(header.getMessage())) { mpi = null; // out of band, let's find it for (MessagePartInfo mpi2 : msg.getOutOfBandParts()) { if (mpi2.getName().getLocalPart().equals(header.getPart()) && mpi2.getMessageInfo().getName().equals(header.getMessage())) { mpi = mpi2; } } } if (mpi != null) { headerInfo.setPart(mpi); messageParts.remove(mpi); bmsg.getMessageParts().remove(mpi); bmsg.addExtensor(headerInfo); } } } return attParts; }
private void initializeMessage( SoapBindingInfo bi, BindingOperationInfo boi, BindingMessageInfo bmsg) { MessageInfo msg = bmsg.getMessageInfo(); List<MessagePartInfo> messageParts = new ArrayList<MessagePartInfo>(); messageParts.addAll(msg.getMessageParts()); List<SoapHeader> headers = SOAPBindingUtil.getSoapHeaders(bmsg.getExtensors(ExtensibilityElement.class)); if (headers != null) { for (SoapHeader header : headers) { SoapHeaderInfo headerInfo = new SoapHeaderInfo(); headerInfo.setUse(header.getUse()); if (StringUtils.isEmpty(header.getPart())) { throw new RuntimeException( "Problem with WSDL: soap:header element in operation " + boi.getName().getLocalPart() + " does not specify a part."); } MessagePartInfo part = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header.getPart())); if (part != null && header.getMessage() != null && !part.getMessageInfo().getName().equals(header.getMessage())) { part = null; // out of band, let's find it for (MessagePartInfo mpi : msg.getOutOfBandParts()) { if (mpi.getName().getLocalPart().equals(header.getPart()) && mpi.getMessageInfo().getName().equals(header.getMessage())) { part = mpi; } } } if (part != null) { headerInfo.setPart(part); messageParts.remove(part); bmsg.addExtensor(headerInfo); } } // Exclude the header parts from the message part list. bmsg.setMessageParts(messageParts); } SoapBodyInfo bodyInfo = new SoapBodyInfo(); SoapBody soapBody = SOAPBindingUtil.getSoapBody(bmsg.getExtensors(ExtensibilityElement.class)); List<?> parts = null; if (soapBody == null) { MIMEMultipartRelated mmr = bmsg.getExtensor(MIMEMultipartRelated.class); if (mmr != null) { parts = mmr.getMIMEParts(); } } else { bmsg.addExtensor(soapBody); bodyInfo.setUse(soapBody.getUse()); parts = soapBody.getParts(); } // Initialize the body parts. List<MessagePartInfo> attParts = null; if (parts != null) { List<MessagePartInfo> bodyParts = new ArrayList<MessagePartInfo>(); for (Iterator<?> itr = parts.iterator(); itr.hasNext(); ) { Object part = itr.next(); if (part instanceof MIMEPart) { MIMEPart mpart = (MIMEPart) part; attParts = handleMimePart(mpart, attParts, msg, bmsg, bodyParts, messageParts); } else { addSoapBodyPart(msg, bodyParts, (String) part); } } bodyInfo.setParts(bodyParts); bodyInfo.setAttachments(attParts); } else { bodyInfo.setParts(messageParts); } bmsg.addExtensor(bodyInfo); }