From 94a92201fa63858978940c2249f540d7ebcf5806 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Wed, 18 Apr 2007 00:06:43 +0000 Subject: [PATCH] Fixed #SWS-62: MTOM support. --- .../springframework/ws/soap/SoapMessage.java | 13 +- .../ws/soap/axiom/AxiomSoapMessage.java | 12 +- .../soap/axiom/AxiomSoapMessageFactory.java | 31 ++-- .../ws/soap/saaj/Saaj11Implementation.java | 74 ++------ .../ws/soap/saaj/Saaj12Implementation.java | 3 +- .../ws/soap/saaj/SaajImplementation.java | 169 +++++------------- .../ws/soap/saaj/SaajSoapMessage.java | 34 ++-- .../ws/soap/saaj/support/SaajUtils.java | 2 +- .../axiom/AxiomSoap11MessageFactoryTest.java | 35 ++++ .../axiom/AxiomSoap12MessageFactoryTest.java | 1 + .../saaj/SaajSoap11MessageFactoryTest.java | 2 + .../AbstractSoap11MessageFactoryTestCase.java | 25 ++- .../AbstractSoap12MessageFactoryTestCase.java | 20 +++ .../ws/soap/soap11/soap11-mtom.bin | Bin 0 -> 25200 bytes .../ws/soap/soap12/soap12-mtom.bin | Bin 0 -> 25210 bytes src/changes/changes.xml | 1 + 16 files changed, 199 insertions(+), 223 deletions(-) create mode 100644 core/src/test/resources/org/springframework/ws/soap/soap11/soap11-mtom.bin create mode 100644 core/src/test/resources/org/springframework/ws/soap/soap12/soap12-mtom.bin diff --git a/core/src/main/java/org/springframework/ws/soap/SoapMessage.java b/core/src/main/java/org/springframework/ws/soap/SoapMessage.java index eb6248f7..b8667513 100644 --- a/core/src/main/java/org/springframework/ws/soap/SoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/SoapMessage.java @@ -34,9 +34,7 @@ import org.springframework.ws.WebServiceMessage; */ public interface SoapMessage extends WebServiceMessage { - /** - * Returns the SoapEnvelope associated with this SoapMessage. - */ + /** Returns the SoapEnvelope associated with this SoapMessage. */ SoapEnvelope getEnvelope() throws SoapEnvelopeException; /** @@ -46,6 +44,13 @@ public interface SoapMessage extends WebServiceMessage { */ String getSoapAction(); + /** + * Sets the SOAP Action for this message. + * + * @param soapAction the SOAP Action. + */ + void setSoapAction(String soapAction); + /** * Returns the SoapBody associated with this SoapMessage. This is a convenience method for * getEnvelope().getBody(). @@ -118,6 +123,4 @@ public interface SoapMessage extends WebServiceMessage { * @see org.springframework.core.io.Resource */ Attachment addAttachment(InputStreamSource inputStreamSource, String contentType); - - void setSoapAction(String soapAction); } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java index 6a403c61..3c52caa7 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java @@ -36,12 +36,12 @@ import org.springframework.util.Assert; import org.springframework.ws.soap.AbstractSoapMessage; import org.springframework.ws.soap.Attachment; import org.springframework.ws.soap.SoapEnvelope; +import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.SoapVersion; import org.springframework.ws.transport.TransportOutputStream; /** - * AXIOM-specific implementation of the SoapMessage interface. Accessed via the - * AxiomSoapMessageContext. + * AXIOM-specific implementation of the {@link SoapMessage} interface. Created via the {@link AxiomSoapMessageFactory}. *

* Note that Axiom does support reading SOAP with Attachments (SwA) messages, but does not support creating them * manually. Hence, the addAttachment methods throw an UnsupportedOperationException. @@ -111,9 +111,7 @@ public class AxiomSoapMessage extends AbstractSoapMessage { this.payloadCaching = payloadCaching; } - /** - * Return the AXIOM SOAPMessage that this AxiomSoapMessage is based on. - */ + /** Return the AXIOM SOAPMessage that this AxiomSoapMessage is based on. */ public final SOAPMessage getAxiomMessage() { return axiomMessage; } @@ -196,9 +194,7 @@ public class AxiomSoapMessage extends AbstractSoapMessage { } } - /** - * Axiom-specific implementation of org.springframework.ws.soap.Attachment - */ + /** Axiom-specific implementation of org.springframework.ws.soap.Attachment */ private static class AxiomAttachment implements Attachment { private final DataHandler dataHandler; diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java index 411423c7..9fdbc670 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java @@ -145,21 +145,18 @@ public class AxiomSoapMessageFactory implements WebServiceMessageFactory, Initia return contentType.indexOf(MULTI_PART_RELATED_CONTENT_TYPE) != -1; } - /** - * Creates an AxiomSoapMessage without attachments. - */ + /** Creates an AxiomSoapMessage without attachments. */ private WebServiceMessage createAxiomSoapMessage(InputStream inputStream, String contentType, String soapAction) throws XMLStreamException { XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream, getCharSetEncoding(contentType)); SOAPFactory soapFactory = getSoapFactory(contentType); - StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(reader, soapFactory, soapFactory.getSoapVersionURI()); + String envelopeNamespace = getSoapEnvelopeNamespace(contentType); + StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(reader, soapFactory, envelopeNamespace); SOAPMessage soapMessage = builder.getSoapMessage(); return new AxiomSoapMessage(soapMessage, soapAction, payloadCaching); } - /** - * Creates an AxiomSoapMessage with attachments. - */ + /** Creates an AxiomSoapMessage with attachments. */ private AxiomSoapMessage createMultiPartAxiomSoapMessage(InputStream inputStream, String contentType, String soapAction) throws XMLStreamException { @@ -171,13 +168,14 @@ public class AxiomSoapMessageFactory implements WebServiceMessageFactory, Initia } XMLStreamReader reader = inputFactory.createXMLStreamReader(attachments.getSOAPPartInputStream(), getCharSetEncoding(attachments.getSOAPPartContentType())); - SOAPFactory soapFactory = getSoapFactory(attachments.getSOAPPartContentType()); StAXSOAPModelBuilder builder = null; + String envelopeNamespace = getSoapEnvelopeNamespace(contentType); if (attachments.getAttachmentSpecType().equals(MTOMConstants.SWA_TYPE)) { - builder = new StAXSOAPModelBuilder(reader, soapFactory, soapFactory.getSoapVersionURI()); + SOAPFactory soapFactory = getSoapFactory(attachments.getSOAPPartContentType()); + builder = new StAXSOAPModelBuilder(reader, soapFactory, envelopeNamespace); } else if (attachments.getAttachmentSpecType().equals(MTOMConstants.MTOM_TYPE)) { - builder = new MTOMStAXSOAPModelBuilder(reader, attachments, soapFactory.getSoapVersionURI()); + builder = new MTOMStAXSOAPModelBuilder(reader, attachments, envelopeNamespace); } return new AxiomSoapMessage(builder.getSoapMessage(), attachments, soapAction, payloadCaching); } @@ -194,6 +192,19 @@ public class AxiomSoapMessageFactory implements WebServiceMessageFactory, Initia } } + private String getSoapEnvelopeNamespace(String contentType) { + if (contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE) != -1) { + return SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI; + } + else if (contentType.indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE) != -1) { + return SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI; + } + else { + throw new AxiomSoapMessageCreationException("Unknown content type '" + contentType + "'"); + } + + } + /** * Returns the character set from the given content type. Mostly copied * diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java index 15bc4a32..df3693ae 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java @@ -126,37 +126,27 @@ public class Saaj11Implementation implements SaajImplementation { return fault; } - /** - * Returns the envelope of the given message. - */ + /** Returns the envelope of the given message. */ public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException { return message.getSOAPPart().getEnvelope(); } - /** - * Returns the header of the given envelope. - */ + /** Returns the header of the given envelope. */ public SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException { return envelope.getHeader(); } - /** - * Returns the body of the given envelope. - */ + /** Returns the body of the given envelope. */ public SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException { return envelope.getBody(); } - /** - * Returns all header elements. - */ + /** Returns all header elements. */ public Iterator examineAllHeaderElements(SOAPHeader header) { return header.getChildElements(); } - /** - * Returns all header elements for which the must understand attribute is true, given the actor or role. - */ + /** Returns all header elements for which the must understand attribute is true, given the actor or role. */ public Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) { List result = new ArrayList(); for (Iterator iterator = header.examineHeaderElements(actorOrRole); iterator.hasNext();) { @@ -168,86 +158,62 @@ public class Saaj11Implementation implements SaajImplementation { return result.iterator(); } - /** - * Returns the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. - */ + /** Returns the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. */ public String getActorOrRole(SOAPHeaderElement headerElement) { return headerElement.getActor(); } - /** - * Sets the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. - */ + /** Sets the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. */ public void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole) { headerElement.setActor(actorOrRole); } - /** - * Gets the must understand attribute for the given header element. - */ + /** Gets the must understand attribute for the given header element. */ public boolean getMustUnderstand(SOAPHeaderElement headerElement) { return headerElement.getMustUnderstand(); } - /** - * Sets the must understand attribute for the given header element. - */ + /** Sets the must understand attribute for the given header element. */ public void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand) { headerElement.setMustUnderstand(mustUnderstand); } - /** - * Returns true if the body has a fault, false otherwise. - */ + /** Returns true if the body has a fault, false otherwise. */ public boolean hasFault(SOAPBody body) { return body.hasFault(); } - /** - * Returns the fault for the given body, if any. - */ + /** Returns the fault for the given body, if any. */ public SOAPFault getFault(SOAPBody body) { return body.getFault(); } - /** - * Returns the actor for the given fault. - */ + /** Returns the actor for the given fault. */ public String getFaultActor(SOAPFault fault) { return fault.getFaultActor(); } - /** - * Sets the actor for the given fault. - */ + /** Sets the actor for the given fault. */ public void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException { fault.setFaultActor(actorOrRole); } - /** - * Returns the fault string for the given fault. - */ + /** Returns the fault string for the given fault. */ public String getFaultString(SOAPFault fault) { return fault.getFaultString(); } - /** - * Returns the fault string language for the given fault. - */ + /** Returns the fault string language for the given fault. */ public Locale getFaultStringLocale(SOAPFault fault) { return Locale.ENGLISH; } - /** - * Returns the fault detail for the given fault. - */ + /** Returns the fault detail for the given fault. */ public Detail getFaultDetail(SOAPFault fault) { return fault.getDetail(); } - /** - * Adds a fault detail for the given fault. - */ + /** Adds a fault detail for the given fault. */ public Detail addFaultDetail(SOAPFault fault) throws SOAPException { return fault.addDetail(); } @@ -256,9 +222,7 @@ public class Saaj11Implementation implements SaajImplementation { detailEntry.addTextNode(text); } - /** - * Returns an iteration over all detail entries. - */ + /** Returns an iteration over all detail entries. */ public Iterator getDetailEntries(Detail detail) { return detail.getDetailEntries(); } @@ -321,7 +285,7 @@ public class Saaj11Implementation implements SaajImplementation { } // - // SOAP 1.2 + // Unsupported // public String getFaultRole(SOAPFault fault) { diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java index a1e191b7..77911604 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java @@ -235,7 +235,7 @@ public class Saaj12Implementation implements SaajImplementation { } // - // SOAP 1.2 + // Unsupported // public String getFaultRole(SOAPFault fault) { @@ -277,4 +277,5 @@ public class Saaj12Implementation implements SaajImplementation { public void setFaultReasonText(SOAPFault fault, Locale locale, String text) { throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); } + } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java index 7f344b41..085584f6 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java @@ -44,215 +44,132 @@ import javax.xml.transform.Source; */ public interface SaajImplementation { - /** - * Returns the name of the given element. - */ + /** Returns the name of the given element. */ QName getName(SOAPElement element); - /** - * Returns the readable Source of the given element. - */ + /** Returns the readable Source of the given element. */ Source getSource(SOAPElement element); - /** - * Returns the writable Result of the given element. - */ + /** Returns the writable Result of the given element. */ Result getResult(SOAPElement element); - /** - * Returns the envelope of the given message. - */ + /** Returns the envelope of the given message. */ SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException; - /** - * Returns the header of the given envelope. - */ + /** Returns the header of the given envelope. */ SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException; - /** - * Returns the body of the given envelope. - */ + /** Returns the body of the given envelope. */ SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException; - /** - * Adds a header element to the given header. - */ + /** Adds a header element to the given header. */ SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException; - /** - * Returns all header elements. - */ + /** Returns all header elements. */ Iterator examineAllHeaderElements(SOAPHeader header); - /** - * Returns all header elements for which the must understand attribute is true, given the actor or role. - */ + /** Returns all header elements for which the must understand attribute is true, given the actor or role. */ Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole); - /** - * Returns the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. - */ + /** Returns the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. */ String getActorOrRole(SOAPHeaderElement headerElement); - /** - * Sets the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. - */ + /** Sets the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. */ void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole); - /** - * Gets the must understand attribute for the given header element. - */ + /** Gets the must understand attribute for the given header element. */ boolean getMustUnderstand(SOAPHeaderElement headerElement); - /** - * Sets the must understand attribute for the given header element. - */ + /** Sets the must understand attribute for the given header element. */ void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand); - /** - * Returns true if the body has a fault, false otherwise. - */ + /** Returns true if the body has a fault, false otherwise. */ boolean hasFault(SOAPBody body); - /** - * Returns the fault for the given body, if any. - */ + /** Returns the fault for the given body, if any. */ SOAPFault getFault(SOAPBody body); - /** - * Adds a fault to the given body. - */ + /** Adds a fault to the given body. */ SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) throws SOAPException; - /** - * Returns the fault code for the given fault. - */ + /** Returns the fault code for the given fault. */ QName getFaultCode(SOAPFault fault); - /** - * Returns the actor for the given fault. - */ + /** Returns the actor for the given fault. */ String getFaultActor(SOAPFault fault); - /** - * Sets the actor for the given fault. - */ + /** Sets the actor for the given fault. */ void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException; - /** - * Returns the fault string for the given fault. - */ + /** Returns the fault string for the given fault. */ String getFaultString(SOAPFault fault); - /** - * Returns the fault string language for the given fault. - */ + /** Returns the fault string language for the given fault. */ Locale getFaultStringLocale(SOAPFault fault); - /** - * Adds a detail entry to the given detail. - */ + /** Adds a detail entry to the given detail. */ DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException; - /** - * Returns the fault detail for the given fault. - */ + /** Returns the fault detail for the given fault. */ Detail getFaultDetail(SOAPFault fault); - /** - * Adds a fault detail for the given fault. - */ + /** Adds a fault detail for the given fault. */ Detail addFaultDetail(SOAPFault fault) throws SOAPException; void addTextNode(DetailEntry detailEntry, String text) throws SOAPException; - /** - * Returns an iteration over all detail entries. - */ + /** Returns an iteration over all detail entries. */ Iterator getDetailEntries(Detail detail); - /** - * Returns the first child element of the given body. - */ + /** Returns the first child element of the given body. */ SOAPElement getFirstBodyElement(SOAPBody body); - /** - * Removes the contents (i.e. children) of the element. - */ + /** Removes the contents (i.e. children) of the element. */ void removeContents(SOAPElement element); - /** - * Writes the given message to the given stream. - */ + /** Writes the given message to the given stream. */ void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException; - /** - * Returns the MIME headers of the message. - */ + /** Returns the MIME headers of the message. */ MimeHeaders getMimeHeaders(SOAPMessage message); - /** - * Returns an iteration over all attachments in the message. - */ + /** Returns an iteration over all attachments in the message. */ Iterator getAttachments(SOAPMessage message); - /** - * Returns an iteration over all attachments in the message with the given headers. - */ + /** Returns an iteration over all attachments in the message with the given headers. */ Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders); - /** - * Adds an attachment to the given message. - */ + /** Adds an attachment to the given message. */ AttachmentPart addAttachmentPart(SOAPMessage message, DataSource dataSource); - /** - * Adds a not understood header element to the given header. - */ + /** Adds a not understood header element to the given header. */ SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) throws SOAPException; - /** - * Adds a upgrade header element to the given header. - */ + /** Adds a upgrade header element to the given header. */ SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris) throws SOAPException; - /** - * Returns the fault role. - */ + /** Returns the fault role. */ String getFaultRole(SOAPFault fault); - /** - * Sets the fault role. - */ + /** Sets the fault role. */ void setFaultRole(SOAPFault fault, String role) throws SOAPException; - /** - * Returns the fault sub code. - */ + /** Returns the fault sub code. */ Iterator getFaultSubcodes(SOAPFault fault); - /** - * Adds a fault sub code. - */ + /** Adds a fault sub code. */ void appendFaultSubcode(SOAPFault fault, QName subcode) throws SOAPException; - /** - * Returns the fault node. - */ + /** Returns the fault node. */ String getFaultNode(SOAPFault fault); - /** - * Sets the fault node. - */ + /** Sets the fault node. */ void setFaultNode(SOAPFault fault, String uri) throws SOAPException; - /** - * Returns the fault reason text. - */ + /** Returns the fault reason text. */ String getFaultReasonText(SOAPFault fault, Locale locale) throws SOAPException; - /** - * Sets the fault reason text. - */ + /** Sets the fault reason text. */ void setFaultReasonText(SOAPFault fault, Locale locale, String text) throws SOAPException; + } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java index 172d8e85..987858ca 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java @@ -36,18 +36,20 @@ import org.springframework.ws.soap.AbstractSoapMessage; import org.springframework.ws.soap.Attachment; import org.springframework.ws.soap.AttachmentException; import org.springframework.ws.soap.SoapEnvelope; +import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.saaj.support.SaajUtils; /** - * SAAJ-specific implementation of the SoapMessage interface. Accessed via the - * SaajSoapMessageContext. + * SAAJ-specific implementation of the {@link SoapMessage} interface. Created via the {@link SaajSoapMessageFactory}. * * @author Arjen Poutsma * @see javax.xml.soap.SOAPMessage */ public class SaajSoapMessage extends AbstractSoapMessage { - private static final String SOAP_ACTION_HEADER = "SOAPAction"; + private static final String MIME_HEADER_SOAP_ACTION = "SOAPAction"; + + private static final String MIME_HEADER_CONTENT_ID = "Content-Id"; private SOAPMessage saajMessage; @@ -63,16 +65,12 @@ public class SaajSoapMessage extends AbstractSoapMessage { saajMessage = soapMessage; } - /** - * Return the SAAJ SOAPMessage that this SaajSoapMessage is based on. - */ + /** Return the SAAJ SOAPMessage that this SaajSoapMessage is based on. */ public SOAPMessage getSaajMessage() { return saajMessage; } - /** - * Sets the SAAJ SOAPMessage that this SaajSoapMessage is based on. - */ + /** Sets the SAAJ SOAPMessage that this SaajSoapMessage is based on. */ public void setSaajMessage(SOAPMessage soapMessage) { Assert.notNull(soapMessage, "soapMessage must not be null"); saajMessage = soapMessage; @@ -93,13 +91,13 @@ public class SaajSoapMessage extends AbstractSoapMessage { public String getSoapAction() { MimeHeaders mimeHeaders = getImplementation().getMimeHeaders(getSaajMessage()); - String[] values = mimeHeaders.getHeader(SOAP_ACTION_HEADER); + String[] values = mimeHeaders.getHeader(MIME_HEADER_SOAP_ACTION); return ObjectUtils.isEmpty(values) ? null : values[0]; } public void setSoapAction(String soapAction) { MimeHeaders mimeHeaders = getImplementation().getMimeHeaders(getSaajMessage()); - mimeHeaders.setHeader(SOAP_ACTION_HEADER, soapAction); + mimeHeaders.setHeader(MIME_HEADER_SOAP_ACTION, soapAction); } public void writeTo(OutputStream outputStream) throws IOException { @@ -118,16 +116,20 @@ public class SaajSoapMessage extends AbstractSoapMessage { } public Attachment getAttachment(String contentId) { + Assert.hasLength(contentId, "contentId must not be empty"); MimeHeaders mimeHeaders = new MimeHeaders(); - mimeHeaders.addHeader("Content-Id", contentId); + mimeHeaders.setHeader(MIME_HEADER_CONTENT_ID, contentId); Iterator iterator = getImplementation().getAttachment(getSaajMessage(), mimeHeaders); + if (!iterator.hasNext()) { + // try to prefix it with an MTOM-specific < and > + mimeHeaders.setHeader(MIME_HEADER_CONTENT_ID, "<" + contentId + ">"); + iterator = getImplementation().getAttachment(getSaajMessage(), mimeHeaders); + } if (!iterator.hasNext()) { return null; } - else { - AttachmentPart saajAttachment = (AttachmentPart) iterator.next(); - return new SaajAttachment(saajAttachment); - } + AttachmentPart saajAttachment = (AttachmentPart) iterator.next(); + return new SaajAttachment(saajAttachment); } public Attachment addAttachment(File file) throws AttachmentException { diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java index b3bc484d..fe6d6586 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java @@ -105,7 +105,7 @@ public abstract class SaajUtils { /** * Converts a javax.xml.namespace.QName to a javax.xml.soap.Name. A - * SOAPEnvelope is required to create the name. + * SOAPElement is required to create the name. * * @param qName the QName to convert * @param resolveElement a SOAPElement used to resolve namespaces to prefixes diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java index f5e76458..146ebd2b 100644 --- a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java +++ b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java @@ -27,4 +27,39 @@ public class AxiomSoap11MessageFactoryTest extends AbstractSoap11MessageFactoryT return factory; } +/* + public void testCreateMtom() throws Exception { + SOAP11Factory factory = new SOAP11Factory(); + SOAPEnvelope envelope = factory.getDefaultEnvelope(); + + OMNamespace namespace = factory.createOMNamespace("http://springframework.org/spring-ws/mtom", "sws"); + OMElement element = factory.createOMElement("image", namespace); + envelope.getBody().addChild(element); + DataHandler dataHandler = new javax.activation.DataHandler(new FileDataSource("/Users/arjen/spring-ws/src/site/resources/images/spring-ws.png")); + + //create an OMText node with the above DataHandler and set optimized to true + OMText textData = factory.createOMText(dataHandler, true); + + element.addChild(textData); + + OMOutputFormat format = new OMOutputFormat(); + format.setDoOptimize(true); + format.setSOAP11(true); + format.setCharSetEncoding("UTF-8"); + assertTrue(format.isOptimized()); + OutputStream os = new BufferedOutputStream(new FileOutputStream( + "/Users/arjen/Projects/Spring/spring-ws/core/src/test/resources/org/springframework/ws/soap/soap11/soap11-mtom.bin")); + try { + envelope.serialize(os, format); + } finally { + os.close(); + } + + + + + } +*/ + + } \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java index d3f4b51a..104044ab 100644 --- a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java +++ b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java @@ -34,4 +34,5 @@ public class AxiomSoap12MessageFactoryTest extends AbstractSoap12MessageFactoryT // Axiom does not support SwA with SOAP 1.2 } + } diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java index 0893b5b1..9dc64e38 100644 --- a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java +++ b/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java @@ -30,4 +30,6 @@ public class SaajSoap11MessageFactoryTest extends AbstractSoap11MessageFactoryTe factory.afterPropertiesSet(); return factory; } + + } \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java index 64324912..0678814e 100644 --- a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java @@ -17,6 +17,7 @@ package org.springframework.ws.soap.soap11; import java.io.InputStream; +import java.util.Iterator; import java.util.Properties; import org.springframework.ws.WebServiceMessage; @@ -51,7 +52,7 @@ public abstract class AbstractSoap11MessageFactoryTestCase extends AbstractSoapM assertEquals("Invalid soap action", soapAction, soapMessage.getSoapAction()); } - public void testCreateSoapMessageAttachment() throws Exception { + public void testCreateSoapMessageSwA() throws Exception { InputStream is = AbstractSoap11MessageFactoryTestCase.class.getResourceAsStream("soap11-attachment.bin"); Properties headers = new Properties(); headers.setProperty("Content-Type", @@ -62,8 +63,30 @@ public abstract class AbstractSoap11MessageFactoryTestCase extends AbstractSoapM assertTrue("Not a SoapMessage", message instanceof SoapMessage); SoapMessage soapMessage = (SoapMessage) message; assertEquals("Invalid soap version", SoapVersion.SOAP_11, soapMessage.getVersion()); + Iterator iter = soapMessage.getAttachments(); + assertTrue("No attachments read", iter.hasNext()); Attachment attachment = soapMessage.getAttachment("interface21"); assertNotNull("No attachment read", attachment); + assertEquals("Invalid content id", "interface21", attachment.getId()); + } + + public void testCreateSoapMessageMtom() throws Exception { + InputStream is = AbstractSoap11MessageFactoryTestCase.class.getResourceAsStream("soap11-mtom.bin"); + Properties headers = new Properties(); + headers.setProperty("Content-Type", "multipart/related;" + "start-info=\"text/xml\";" + + "type=\"application/xop+xml\";" + "start=\"<0.urn:uuid:492264AB42E57108E01176731445508@apache.org>\";" + + "boundary=\"MIMEBoundaryurn_uuid_492264AB42E57108E01176731445507\""); + TransportInputStream tis = new MockTransportInputStream(is, headers); + + WebServiceMessage message = messageFactory.createWebServiceMessage(tis); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_11, soapMessage.getVersion()); + Iterator iter = soapMessage.getAttachments(); + assertTrue("No attachments read", iter.hasNext()); + + Attachment attachment = soapMessage.getAttachment("1.urn:uuid:492264AB42E57108E01176731445504@apache.org"); + assertNotNull("No attachment read", attachment); } diff --git a/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java index 1935e3b1..f3a6e4a1 100644 --- a/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java @@ -17,6 +17,7 @@ package org.springframework.ws.soap.soap12; import java.io.InputStream; +import java.util.Iterator; import java.util.Properties; import org.springframework.ws.WebServiceMessage; @@ -63,5 +64,24 @@ public abstract class AbstractSoap12MessageFactoryTestCase extends AbstractSoapM assertNotNull("No attachment read", attachment); } + public void testCreateSoapMessageMtom() throws Exception { + InputStream is = AbstractSoap12MessageFactoryTestCase.class.getResourceAsStream("soap12-mtom.bin"); + Properties headers = new Properties(); + headers.setProperty("Content-Type", "multipart/related;" + "start-info=\"application/soap+xml\";" + + "type=\"application/xop+xml\";" + "start=\"<0.urn:uuid:40864869929B855F971176851454456@apache.org>\";" + + "boundary=\"MIMEBoundaryurn_uuid_40864869929B855F971176851454455\""); + TransportInputStream tis = new MockTransportInputStream(is, headers); + + WebServiceMessage message = messageFactory.createWebServiceMessage(tis); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_12, soapMessage.getVersion()); + Iterator iter = soapMessage.getAttachments(); + assertTrue("No attachments read", iter.hasNext()); + + Attachment attachment = soapMessage.getAttachment("1.urn:uuid:40864869929B855F971176851454452@apache.org"); + assertNotNull("No attachment read", attachment); + } + } diff --git a/core/src/test/resources/org/springframework/ws/soap/soap11/soap11-mtom.bin b/core/src/test/resources/org/springframework/ws/soap/soap11/soap11-mtom.bin new file mode 100644 index 0000000000000000000000000000000000000000..cec137acd86ce8786a10fbef68981bd473a85bf3 GIT binary patch literal 25200 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 + MTOM support Added XPathExpressionFactoryBean, for injection of XPath expressions Default message factory for WebServiceTemplate