From aff494f75a0cb60d0acff59b479418ee2d84f779 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Sat, 20 Oct 2007 14:02:19 +0000 Subject: [PATCH] SWS-208 --- .../ws/soap/axiom/AxiomSoapMessage.java | 16 ++++++++++++---- .../ws/soap/saaj/Saaj11Implementation.java | 5 +++-- .../ws/soap/saaj/Saaj12Implementation.java | 5 +++-- .../ws/soap/saaj/Saaj13Implementation.java | 7 ++++--- .../ws/soap/saaj/SaajSoapMessage.java | 15 ++++++++++++++- .../ws/soap/saaj/SaajSoapMessageFactory.java | 8 ++++---- .../ws/soap/saaj/support/SaajUtils.java | 5 +++-- .../ws/soap/AbstractSoapMessageTestCase.java | 6 +++--- .../soap11/AbstractSoap11MessageTestCase.java | 2 +- 9 files changed, 47 insertions(+), 22 deletions(-) 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 09a5cc10..9dc17f41 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 @@ -33,6 +33,7 @@ import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPMessage; import org.apache.axiom.soap.SOAPProcessingException; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import org.springframework.ws.mime.Attachment; import org.springframework.ws.soap.AbstractSoapMessage; import org.springframework.ws.soap.SoapEnvelope; @@ -74,7 +75,7 @@ public class AxiomSoapMessage extends AbstractSoapMessage { axiomMessage = axiomFactory.createSOAPMessage(soapEnvelope, soapEnvelope.getBuilder()); attachments = new Attachments(); payloadCaching = true; - soapAction = ""; + soapAction = "\"\""; } /** @@ -105,6 +106,9 @@ public class AxiomSoapMessage extends AbstractSoapMessage { axiomMessage = soapMessage; axiomFactory = (SOAPFactory) soapMessage.getSOAPEnvelope().getOMFactory(); this.attachments = attachments; + if (!StringUtils.hasLength(soapAction)) { + soapAction = "\"\""; + } this.soapAction = soapAction; this.payloadCaching = payloadCaching; } @@ -132,11 +136,15 @@ public class AxiomSoapMessage extends AbstractSoapMessage { public void setSoapAction(String soapAction) { if (soapAction == null) { - this.soapAction = ""; + soapAction = ""; } - else { - this.soapAction = soapAction; + if (!soapAction.startsWith("\"")) { + soapAction = "\"" + soapAction; } + if (!soapAction.endsWith("\"")) { + soapAction = soapAction + "\""; + } + this.soapAction = soapAction; } public boolean isXopPackage() { 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 959f7188..1a2c3c81 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 @@ -49,6 +49,7 @@ import org.springframework.ws.soap.SoapVersion; import org.springframework.ws.soap.saaj.support.SaajContentHandler; import org.springframework.ws.soap.saaj.support.SaajUtils; import org.springframework.ws.soap.saaj.support.SaajXmlReader; +import org.springframework.ws.transport.TransportConstants; import org.springframework.ws.transport.TransportOutputStream; import org.springframework.xml.namespace.QNameUtils; import org.xml.sax.InputSource; @@ -284,8 +285,8 @@ public class Saaj11Implementation implements SaajImplementation { TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream; // some SAAJ implementations (Axis 1) do not have a Content-Type header by default MimeHeaders headers = message.getMimeHeaders(); - if (ObjectUtils.isEmpty(headers.getHeader("Content-Type"))) { - headers.addHeader("Content-Type", SoapVersion.SOAP_11.getContentType()); + if (ObjectUtils.isEmpty(headers.getHeader(TransportConstants.HEADER_CONTENT_TYPE))) { + headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType()); if (message.saveRequired()) { message.saveChanges(); } 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 7be0af0c..aa0809c2 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 @@ -46,6 +46,7 @@ import javax.xml.transform.dom.DOMSource; import org.springframework.util.ObjectUtils; import org.springframework.ws.soap.SoapVersion; import org.springframework.ws.soap.saaj.support.SaajUtils; +import org.springframework.ws.transport.TransportConstants; import org.springframework.ws.transport.TransportOutputStream; /** @@ -235,8 +236,8 @@ public class Saaj12Implementation implements SaajImplementation { TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream; // some SAAJ implementations (Axis 1) do not have a Content-Type header by default MimeHeaders headers = message.getMimeHeaders(); - if (ObjectUtils.isEmpty(headers.getHeader("Content-Type"))) { - headers.addHeader("Content-Type", SoapVersion.SOAP_11.getContentType()); + if (ObjectUtils.isEmpty(headers.getHeader(TransportConstants.HEADER_CONTENT_TYPE))) { + headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType()); if (message.saveRequired()) { message.saveChanges(); } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java index b47fa77c..4ce321b1 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java @@ -43,6 +43,7 @@ import javax.xml.transform.dom.DOMSource; import org.springframework.util.ObjectUtils; import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.transport.TransportConstants; import org.springframework.ws.transport.TransportOutputStream; /** @@ -262,14 +263,14 @@ public class Saaj13Implementation implements SaajImplementation { TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream; // some SAAJ implementations (Axis 1) do not have a Content-Type header by default MimeHeaders headers = message.getMimeHeaders(); - if (ObjectUtils.isEmpty(headers.getHeader("Content-Type"))) { + if (ObjectUtils.isEmpty(headers.getHeader(TransportConstants.HEADER_CONTENT_TYPE))) { SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); if (envelope.getElementQName().getNamespaceURI() .equals(SoapVersion.SOAP_11.getEnvelopeNamespaceUri())) { - headers.addHeader("Content-Type", SoapVersion.SOAP_11.getContentType()); + headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType()); } else { - headers.addHeader("Content-Type", SoapVersion.SOAP_12.getContentType()); + headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_12.getContentType()); } if (message.saveRequired()) { message.saveChanges(); 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 b5f6c3bf..f09d575a 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 @@ -62,6 +62,10 @@ public class SaajSoapMessage extends AbstractSoapMessage { */ public SaajSoapMessage(SOAPMessage soapMessage) { Assert.notNull(soapMessage, "soapMessage must not be null"); + MimeHeaders headers = getImplementation().getMimeHeaders(soapMessage); + if (ObjectUtils.isEmpty(headers.getHeader(TransportConstants.HEADER_SOAP_ACTION))) { + headers.addHeader(TransportConstants.HEADER_SOAP_ACTION, "\"\""); + } saajMessage = soapMessage; } @@ -92,11 +96,20 @@ public class SaajSoapMessage extends AbstractSoapMessage { public String getSoapAction() { MimeHeaders mimeHeaders = getImplementation().getMimeHeaders(getSaajMessage()); String[] values = mimeHeaders.getHeader(TransportConstants.HEADER_SOAP_ACTION); - return ObjectUtils.isEmpty(values) ? null : values[0]; + return ObjectUtils.isEmpty(values) ? "" : values[0]; } public void setSoapAction(String soapAction) { + if (soapAction == null) { + soapAction = ""; + } MimeHeaders mimeHeaders = getImplementation().getMimeHeaders(getSaajMessage()); + if (!soapAction.startsWith("\"")) { + soapAction = "\"" + soapAction; + } + if (!soapAction.endsWith("\"")) { + soapAction = soapAction + "\""; + } mimeHeaders.setHeader(TransportConstants.HEADER_SOAP_ACTION, soapAction); } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java index 16100fea..6acedc5c 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java @@ -34,6 +34,7 @@ import org.springframework.ws.soap.SoapMessageCreationException; import org.springframework.ws.soap.SoapMessageFactory; import org.springframework.ws.soap.SoapVersion; import org.springframework.ws.soap.saaj.support.SaajUtils; +import org.springframework.ws.transport.TransportConstants; import org.springframework.ws.transport.TransportInputStream; /** @@ -57,8 +58,6 @@ public class SaajSoapMessageFactory implements SoapMessageFactory, InitializingB private String messageFactoryProtocol; - private static final String CONTENT_TYPE = "Content-Type"; - /** Default, empty constructor. */ public SaajSoapMessageFactory() { } @@ -166,10 +165,11 @@ public class SaajSoapMessageFactory implements SoapMessageFactory, InitializingB catch (SOAPException ex) { // SAAJ 1.3 RI has a issue with handling multipart XOP content types which contain "startinfo" rather than // "start-info", so let's try and do something about it - String contentType = StringUtils.arrayToCommaDelimitedString(mimeHeaders.getHeader(CONTENT_TYPE)); + String contentType = StringUtils + .arrayToCommaDelimitedString(mimeHeaders.getHeader(TransportConstants.HEADER_CONTENT_TYPE)); if (contentType.indexOf("startinfo") != -1) { contentType = contentType.replace("startinfo", "start-info"); - mimeHeaders.setHeader(CONTENT_TYPE, contentType); + mimeHeaders.setHeader(TransportConstants.HEADER_CONTENT_TYPE, contentType); try { return new SaajSoapMessage(messageFactory.createMessage(mimeHeaders, inputStream)); } 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 fcf98800..1527650e 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 @@ -33,6 +33,7 @@ import org.springframework.core.io.Resource; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; +import org.springframework.ws.transport.TransportConstants; import org.springframework.xml.namespace.QNameUtils; import org.w3c.dom.Element; @@ -216,8 +217,8 @@ public abstract class SaajUtils { InputStream is = resource.getInputStream(); try { MimeHeaders mimeHeaders = new MimeHeaders(); - mimeHeaders.addHeader("Content-Type", "text/xml"); - mimeHeaders.addHeader("Content-Length", Long.toString(resource.getFile().length())); + mimeHeaders.addHeader(TransportConstants.HEADER_CONTENT_TYPE, "text/xml"); + mimeHeaders.addHeader(TransportConstants.HEADER_CONTENT_LENGTH, Long.toString(resource.getFile().length())); return messageFactory.createMessage(mimeHeaders, is); } finally { diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageTestCase.java index 9cf94fd7..065c174b 100644 --- a/core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageTestCase.java @@ -45,9 +45,9 @@ public abstract class AbstractSoapMessageTestCase extends AbstractMimeMessageTes } public void testSoapAction() throws Exception { - String soapAction = "SoapAction"; - soapMessage.setSoapAction(soapAction); - assertEquals("Invalid SOAP Action", soapAction, soapMessage.getSoapAction()); + assertEquals("Invalid default SOAP Action", "\"\"", soapMessage.getSoapAction()); + soapMessage.setSoapAction("SoapAction"); + assertEquals("Invalid SOAP Action", "\"SoapAction\"", soapMessage.getSoapAction()); } protected abstract Resource[] getSoapSchemas(); diff --git a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java index 74069b8d..7769083f 100644 --- a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java @@ -48,7 +48,7 @@ public abstract class AbstractSoap11MessageTestCase extends AbstractSoapMessageT String contentType = (String) tos.getHeaders().get("Content-Type"); assertTrue("Invalid Content-Type set", contentType.indexOf(SoapVersion.SOAP_11.getContentType()) != -1); String resultSoapAction = (String) tos.getHeaders().get("SOAPAction"); - assertEquals("Invalid soap action", soapAction, resultSoapAction); + assertEquals("Invalid soap action", "\"" + soapAction + "\"", resultSoapAction); } public void testWriteToTransportResponseAttachment() throws Exception {