diff --git a/build.gradle b/build.gradle
index 4e3bcc40..76e03c69 100644
--- a/build.gradle
+++ b/build.gradle
@@ -232,7 +232,7 @@ project('spring-ws-security') {
optional("org.apache.ws.security:wss4j:1.6.5")
// SOAP
- provided("com.sun.xml.messaging.saaj:saaj-impl:1.3.19")
+ provided("com.sun.xml.messaging.saaj:saaj-impl:1.3.19") // required for XWSS
optional("org.apache.ws.commons.axiom:axiom-api:$axiomVersion")
optional("org.apache.ws.commons.axiom:axiom-impl:$axiomVersion") {
exclude group: 'org.codehaus.woodstox', module: 'wstx-asl'
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java
deleted file mode 100644
index b5365e8c..00000000
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.Detail;
-import javax.xml.soap.DetailEntry;
-import javax.xml.soap.MimeHeader;
-import javax.xml.soap.MimeHeaders;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPEnvelope;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.soap.SOAPHeaderElement;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.SAXSource;
-
-import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
-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;
-
-/**
- * SAAJ 1.1 specific implementation of the SaajImplementation interface.
- *
- * @author Arjen Poutsma
- * @since 1.0.0
- */
-class Saaj11Implementation extends SaajImplementation {
-
- private static final Saaj11Implementation INSTANCE = new Saaj11Implementation();
-
- private Saaj11Implementation() {
- }
-
- public static Saaj11Implementation getInstance() {
- return INSTANCE;
- }
-
- @Override
- public QName getName(SOAPElement element) {
- return SaajUtils.toQName(element.getElementName());
- }
-
- @Override
- public Source getSource(SOAPElement element) {
- return new SAXSource(new SaajXmlReader(element), new InputSource());
- }
-
- @Override
- public Result getResult(SOAPElement element) {
- return new SAXResult(new SaajContentHandler(element));
- }
-
- @Override
- public String getText(SOAPElement element) {
- return element.getValue();
- }
-
- @Override
- public void setText(SOAPElement element, String content) throws SOAPException {
- element.addTextNode(content);
- }
-
- @Override
- public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException {
- Name attributeName = SaajUtils.toName(name, element);
- element.addAttribute(attributeName, value);
- }
-
- @Override
- public void removeAttribute(SOAPElement element, QName name) throws SOAPException {
- Name attributeName = SaajUtils.toName(name, element);
- element.removeAttribute(attributeName);
- }
-
- @Override
- public String getAttributeValue(SOAPElement element, QName name) throws SOAPException {
- Name attributeName = SaajUtils.toName(name, element);
- return element.getAttributeValue(attributeName);
- }
-
- @Override
- public Iterator getAllAttributes(SOAPElement element) {
- List results = new ArrayList();
- for (Iterator> iterator = element.getAllAttributes(); iterator.hasNext();) {
- Name attributeName = (Name) iterator.next();
- results.add(SaajUtils.toQName(attributeName));
- }
- return results.iterator();
- }
-
- @Override
- public QName getFaultCode(SOAPFault fault) {
- String code = fault.getFaultCode();
- int idx = code.indexOf(':');
- if (idx != -1) {
- String prefix = code.substring(0, idx);
- String namespace = fault.getNamespaceURI(prefix);
- if (StringUtils.hasLength(namespace)) {
- return QNameUtils.createQName(namespace, code.substring(idx + 1), prefix);
- }
- }
- return new QName(code);
- }
-
- public boolean isSoap11(SOAPElement element) {
- return true;
- }
-
- @Override
- public DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException {
- Name detailEntryName = SaajUtils.toName(name, detail);
- return detail.addDetailEntry(detailEntryName);
- }
-
- @Override
- public SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException {
- Name saajName = SaajUtils.toName(name, header);
- return header.addHeaderElement(saajName);
- }
-
- @Override
- public SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) throws SOAPException {
- SOAPFault fault = body.addFault();
- if (StringUtils.hasLength(faultCode.getNamespaceURI()) &&
- StringUtils.hasLength(QNameUtils.getPrefix(faultCode))) {
- fault.addNamespaceDeclaration(faultCode.getPrefix(), faultCode.getNamespaceURI());
- fault.setFaultCode(faultCode.getPrefix() + ":" + faultCode.getLocalPart());
- }
- else if (faultCode.getNamespaceURI().equals(body.getElementName().getURI())) {
- fault.setFaultCode(body.getElementName().getPrefix() + ":" + faultCode.getLocalPart());
- }
- else {
- fault.setFaultCode(faultCode.getLocalPart());
- }
- fault.setFaultString(faultString);
- return fault;
- }
-
- /** Returns the envelope of the given message. */
- @Override
- public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException {
- return message.getSOAPPart().getEnvelope();
- }
-
- /** Returns the header of the given envelope. */
- @Override
- public SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException {
- return envelope.getHeader();
- }
-
- /** Returns the body of the given envelope. */
- @Override
- public SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException {
- return envelope.getBody();
- }
-
- /** Returns all header elements. */
- @Override
- @SuppressWarnings("unchecked")
- public Iterator examineAllHeaderElements(SOAPHeader header) {
- List result = new ArrayList();
- for (Iterator> iterator = header.getChildElements(); iterator.hasNext();) {
- Object o = iterator.next();
- if (o instanceof SOAPHeaderElement) {
- result.add((SOAPHeaderElement) o);
- }
- }
- return result.iterator();
- }
-
- /** Returns all header elements for which the must understand attribute is true, given the actor or role. */
- @Override
- public Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) {
- List result = new ArrayList();
- for (Iterator> iterator = header.examineHeaderElements(actorOrRole); iterator.hasNext();) {
- SOAPHeaderElement headerElement = (SOAPHeaderElement) iterator.next();
- if (headerElement.getMustUnderstand()) {
- result.add(headerElement);
- }
- }
- return result.iterator();
- }
-
- /** Returns the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. */
- @Override
- 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. */
- @Override
- public void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole) {
- headerElement.setActor(actorOrRole);
- }
-
- /** Gets the must understand attribute for the given header element. */
- @Override
- public boolean getMustUnderstand(SOAPHeaderElement headerElement) {
- return headerElement.getMustUnderstand();
- }
-
- /** Sets the must understand attribute for the given header element. */
- @Override
- public void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand) {
- headerElement.setMustUnderstand(mustUnderstand);
- }
-
- /** Returns true if the body has a fault, false otherwise. */
- @Override
- public boolean hasFault(SOAPBody body) {
- return body.hasFault();
- }
-
- /** Returns the fault for the given body, if any. */
- @Override
- public SOAPFault getFault(SOAPBody body) {
- return body.getFault();
- }
-
- /** Returns the actor for the given fault. */
- @Override
- public String getFaultActor(SOAPFault fault) {
- return fault.getFaultActor();
- }
-
- /** Sets the actor for the given fault. */
- @Override
- public void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException {
- fault.setFaultActor(actorOrRole);
- }
-
- /** Returns the fault string for the given fault. */
- @Override
- public String getFaultString(SOAPFault fault) {
- return fault.getFaultString();
- }
-
- /** Returns the fault string language for the given fault. */
- @Override
- public Locale getFaultStringLocale(SOAPFault fault) {
- return Locale.ENGLISH;
- }
-
- /** Returns the fault detail for the given fault. */
- @Override
- public Detail getFaultDetail(SOAPFault fault) {
- return fault.getDetail();
- }
-
- /** Adds a fault detail for the given fault. */
- @Override
- public Detail addFaultDetail(SOAPFault fault) throws SOAPException {
- return fault.addDetail();
- }
-
- @Override
- public void addTextNode(DetailEntry detailEntry, String text) throws SOAPException {
- detailEntry.addTextNode(text);
- }
-
- /** Returns an iteration over all detail entries. */
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getDetailEntries(Detail detail) {
- return detail.getDetailEntries();
- }
-
- @Override
- public SOAPElement getFirstBodyElement(SOAPBody body) {
- for (Iterator> iterator = body.getChildElements(); iterator.hasNext();) {
- Object child = iterator.next();
- if (child instanceof SOAPElement) {
- return (SOAPElement) child;
- }
- }
- return null;
- }
-
- @Override
- public void removeContents(SOAPElement element) {
- for (Iterator> iterator = element.getChildElements(); iterator.hasNext();) {
- iterator.next();
- iterator.remove();
- }
- }
-
- @Override
- @SuppressWarnings("unchecked")
- Iterator getChildElements(SOAPElement element, QName name) throws SOAPException {
- Name elementName = SaajUtils.toName(name, element);
- return element.getChildElements(elementName);
- }
-
- @Override
- void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException {
- element.addNamespaceDeclaration(prefix, namespaceUri);
- }
-
- @Override
- public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException {
- if (message.saveRequired()) {
- message.saveChanges();
- }
- if (outputStream instanceof TransportOutputStream) {
- 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(TransportConstants.HEADER_CONTENT_TYPE))) {
- headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType());
- if (message.saveRequired()) {
- message.saveChanges();
- }
- }
- for (Iterator> iterator = headers.getAllHeaders(); iterator.hasNext();) {
- MimeHeader mimeHeader = (MimeHeader) iterator.next();
- transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue());
- }
- }
- message.writeTo(outputStream);
-
- }
-
- @Override
- public MimeHeaders getMimeHeaders(SOAPMessage message) {
- return message.getMimeHeaders();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getAttachments(SOAPMessage message) {
- return message.getAttachments();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders) {
- return message.getAttachments(mimeHeaders);
- }
-
- @Override
- public AttachmentPart addAttachmentPart(SOAPMessage message, DataHandler dataHandler) {
- AttachmentPart attachmentPart = message.createAttachmentPart(dataHandler);
- message.addAttachmentPart(attachmentPart);
- return attachmentPart;
- }
-
- //
- // Unsupported
- //
-
- @Override
- public String getFaultRole(SOAPFault fault) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public void setFaultRole(SOAPFault fault, String role) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public Iterator getFaultSubcodes(SOAPFault fault) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public void appendFaultSubcode(SOAPFault fault, QName subcode) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public String getFaultNode(SOAPFault fault) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public void setFaultNode(SOAPFault fault, String uri) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public String getFaultReasonText(SOAPFault fault, Locale locale) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
- @Override
- public void setFaultReasonText(SOAPFault fault, Locale locale, String text) {
- throw new UnsupportedOperationException("SAAJ 1.1 does not support SOAP 1.2");
- }
-
-}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java
deleted file mode 100644
index 15d05920..00000000
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.Detail;
-import javax.xml.soap.DetailEntry;
-import javax.xml.soap.MimeHeader;
-import javax.xml.soap.MimeHeaders;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPEnvelope;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.soap.SOAPHeaderElement;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.dom.DOMResult;
-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;
-
-/**
- * SAAJ 1.2 specific implementation of the SaajImplementation interface.
- *
- * @author Arjen Poutsma
- * @since 1.0.0
- */
-class Saaj12Implementation extends SaajImplementation {
-
- private static final Saaj12Implementation INSTANCE = new Saaj12Implementation();
-
- private Saaj12Implementation() {
- }
-
- public static Saaj12Implementation getInstance() {
- return INSTANCE;
- }
-
- @Override
- public QName getName(SOAPElement element) {
- return SaajUtils.toQName(element.getElementName());
- }
-
- @Override
- public QName getFaultCode(SOAPFault fault) {
- return SaajUtils.toQName(fault.getFaultCodeAsName());
- }
-
- public boolean isSoap11(SOAPElement element) {
- return true;
- }
-
- @Override
- public DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException {
- Name detailEntryName = SaajUtils.toName(name, detail);
- return detail.addDetailEntry(detailEntryName);
- }
-
- @Override
- public SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException {
- Name saajName = SaajUtils.toName(name, header);
- return header.addHeaderElement(saajName);
- }
-
- @Override
- public SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) throws SOAPException {
- Name name = SaajUtils.toName(faultCode, body);
- if (locale == null) {
- return body.addFault(name, faultString);
- }
- else {
- return body.addFault(name, faultString, locale);
- }
- }
-
- @Override
- public Source getSource(SOAPElement element) {
- return new DOMSource(element);
- }
-
- @Override
- public Result getResult(SOAPElement element) {
- return new DOMResult(element);
- }
-
- @Override
- public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException {
- Name attributeName = SaajUtils.toName(name, element);
- element.addAttribute(attributeName, value);
- }
-
- @Override
- public void removeAttribute(SOAPElement element, QName name) throws SOAPException {
- Name attributeName = SaajUtils.toName(name, element);
- element.removeAttribute(attributeName);
- }
-
- @Override
- public String getAttributeValue(SOAPElement element, QName name) throws SOAPException {
- Name attributeName = SaajUtils.toName(name, element);
- return element.getAttributeValue(attributeName);
- }
-
- @Override
- public Iterator getAllAttributes(SOAPElement element) {
- List results = new ArrayList();
- for (Iterator> iterator = element.getAllAttributes(); iterator.hasNext();) {
- Name attributeName = (Name) iterator.next();
- results.add(SaajUtils.toQName(attributeName));
- }
- return results.iterator();
- }
-
- @Override
- public String getText(SOAPElement element) {
- return element.getValue();
- }
-
- @Override
- public void setText(SOAPElement element, String content) {
- element.setValue(content);
- }
-
- @Override
- public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException {
- return message.getSOAPPart().getEnvelope();
- }
-
- @Override
- public SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException {
- return envelope.getHeader();
- }
-
- @Override
- public SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException {
- return envelope.getBody();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator examineAllHeaderElements(SOAPHeader header) {
- return header.examineAllHeaderElements();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) {
- return header.examineMustUnderstandHeaderElements(actorOrRole);
- }
-
- @Override
- public String getActorOrRole(SOAPHeaderElement headerElement) {
- return headerElement.getActor();
- }
-
- @Override
- public void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole) {
- headerElement.setActor(actorOrRole);
- }
-
- @Override
- public boolean getMustUnderstand(SOAPHeaderElement headerElement) {
- return headerElement.getMustUnderstand();
- }
-
- @Override
- public void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand) {
- headerElement.setMustUnderstand(mustUnderstand);
- }
-
- @Override
- public boolean hasFault(SOAPBody body) {
- return body.hasFault();
- }
-
- @Override
- public SOAPFault getFault(SOAPBody body) {
- return body.getFault();
- }
-
- @Override
- public String getFaultActor(SOAPFault fault) {
- return fault.getFaultActor();
- }
-
- @Override
- public void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException {
- fault.setFaultActor(actorOrRole);
- }
-
- @Override
- public String getFaultString(SOAPFault fault) {
- return fault.getFaultString();
- }
-
- @Override
- public Locale getFaultStringLocale(SOAPFault fault) {
- return fault.getFaultStringLocale();
- }
-
- @Override
- public Detail getFaultDetail(SOAPFault fault) {
- return fault.getDetail();
- }
-
- @Override
- public Detail addFaultDetail(SOAPFault fault) throws SOAPException {
- return fault.addDetail();
- }
-
- @Override
- public void addTextNode(DetailEntry detailEntry, String text) throws SOAPException {
- detailEntry.addTextNode(text);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getDetailEntries(Detail detail) {
- return detail.getDetailEntries();
- }
-
- @Override
- public SOAPElement getFirstBodyElement(SOAPBody body) {
- for (Iterator> iterator = body.getChildElements(); iterator.hasNext();) {
- Object child = iterator.next();
- if (child instanceof SOAPElement) {
- return (SOAPElement) child;
- }
- }
- return null;
- }
-
- @Override
- public void removeContents(SOAPElement element) {
- element.removeContents();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- Iterator getChildElements(SOAPElement element, QName name) throws SOAPException {
- Name elementName = SaajUtils.toName(name, element);
- return element.getChildElements(elementName);
- }
-
- @Override
- void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException {
- element.addNamespaceDeclaration(prefix, namespaceUri);
- }
-
- @Override
- public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException {
- if (message.saveRequired()) {
- message.saveChanges();
- }
- if (outputStream instanceof TransportOutputStream) {
- 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(TransportConstants.HEADER_CONTENT_TYPE))) {
- headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType());
- if (message.saveRequired()) {
- message.saveChanges();
- }
- }
- for (Iterator> iterator = headers.getAllHeaders(); iterator.hasNext();) {
- MimeHeader mimeHeader = (MimeHeader) iterator.next();
- transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue());
- }
- }
- message.writeTo(outputStream);
-
- }
-
- @Override
- public MimeHeaders getMimeHeaders(SOAPMessage message) {
- return message.getMimeHeaders();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getAttachments(SOAPMessage message) {
- return message.getAttachments();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders) {
- return message.getAttachments(mimeHeaders);
- }
-
- @Override
- public AttachmentPart addAttachmentPart(SOAPMessage message, DataHandler dataHandler) {
- AttachmentPart attachmentPart = message.createAttachmentPart(dataHandler);
- message.addAttachmentPart(attachmentPart);
- return attachmentPart;
- }
-
- //
- // Unsupported
- //
-
- @Override
- public String getFaultRole(SOAPFault fault) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public void setFaultRole(SOAPFault fault, String role) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public Iterator getFaultSubcodes(SOAPFault fault) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public void appendFaultSubcode(SOAPFault fault, QName subcode) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public String getFaultNode(SOAPFault fault) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public void setFaultNode(SOAPFault fault, String uri) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public String getFaultReasonText(SOAPFault fault, Locale locale) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
- @Override
- public void setFaultReasonText(SOAPFault fault, Locale locale, String text) {
- throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
- }
-
-}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java
deleted file mode 100644
index 8d42a077..00000000
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.Locale;
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.Detail;
-import javax.xml.soap.DetailEntry;
-import javax.xml.soap.MimeHeader;
-import javax.xml.soap.MimeHeaders;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPConstants;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPEnvelope;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.soap.SOAPHeaderElement;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.dom.DOMResult;
-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;
-
-/**
- * SAAJ 1.3 specific implementation of the SaajImplementation interface.
- *
- * @author Arjen Poutsma
- * @since 1.0.0
- */
-class Saaj13Implementation extends SaajImplementation {
-
- private static final Saaj13Implementation INSTANCE = new Saaj13Implementation();
-
- private Saaj13Implementation() {
- }
-
- public static Saaj13Implementation getInstance() {
- return INSTANCE;
- }
-
- @Override
- public QName getName(SOAPElement element) {
- return element.getElementQName();
- }
-
- @Override
- public QName getFaultCode(SOAPFault fault) {
- return fault.getFaultCodeAsQName();
- }
-
- public boolean isSoap11(SOAPElement element) {
- return SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE.equals(element.getNamespaceURI());
- }
-
- @Override
- public DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException {
- return detail.addDetailEntry(name);
- }
-
- @Override
- public SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException {
- return header.addHeaderElement(name);
- }
-
- @Override
- public String getFaultRole(SOAPFault fault) {
- return fault.getFaultRole();
- }
-
- @Override
- public void setFaultRole(SOAPFault fault, String role) throws SOAPException {
- fault.setFaultRole(role);
- }
-
- @Override
- public SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) throws SOAPException {
- return header.addNotUnderstoodHeaderElement(name);
- }
-
- @Override
- public SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris)
- throws SOAPException {
- return header.addUpgradeHeaderElement(supportedSoapUris);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getFaultSubcodes(SOAPFault fault) {
- return fault.getFaultSubcodes();
- }
-
- @Override
- public void appendFaultSubcode(SOAPFault fault, QName subcode) throws SOAPException {
- fault.appendFaultSubcode(subcode);
- }
-
- @Override
- public String getFaultNode(SOAPFault fault) {
- return fault.getFaultNode();
- }
-
- @Override
- public void setFaultNode(SOAPFault fault, String uri) throws SOAPException {
- fault.setFaultNode(uri);
- }
-
- @Override
- public String getFaultReasonText(SOAPFault fault, Locale locale) throws SOAPException {
- return fault.getFaultReasonText(locale);
- }
-
- @Override
- public void setFaultReasonText(SOAPFault fault, Locale locale, String text) throws SOAPException {
- fault.addFaultReasonText(text, locale);
- }
-
- @Override
- public SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) throws SOAPException {
- if (locale == null) {
- return body.addFault(faultCode, faultString);
- }
- else {
- return body.addFault(faultCode, faultString, locale);
- }
- }
-
- @Override
- public Source getSource(SOAPElement element) {
- return new DOMSource(element);
- }
-
- @Override
- public Result getResult(SOAPElement element) {
- return new DOMResult(element);
- }
-
- @Override
- public String getText(SOAPElement element) {
- return element.getValue();
- }
-
- @Override
- public void setText(SOAPElement element, String content) {
- element.setValue(content);
- }
-
- @Override
- public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException {
- element.addAttribute(name, value);
- }
-
- @Override
- public void removeAttribute(SOAPElement element, QName name) throws SOAPException {
- element.removeAttribute(name);
- }
-
- @Override
- public String getAttributeValue(SOAPElement element, QName name) throws SOAPException {
- return element.getAttributeValue(name);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getAllAttributes(SOAPElement element) {
- return element.getAllAttributesAsQNames();
- }
-
- @Override
- public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException {
- return message.getSOAPPart().getEnvelope();
- }
-
- @Override
- public SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException {
- return envelope.getHeader();
- }
-
- @Override
- public SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException {
- return envelope.getBody();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator examineAllHeaderElements(SOAPHeader header) {
- return header.examineAllHeaderElements();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) {
- return header.examineMustUnderstandHeaderElements(actorOrRole);
- }
-
- @Override
- public String getActorOrRole(SOAPHeaderElement headerElement) {
- return headerElement.getActor();
- }
-
- @Override
- public void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole) {
- headerElement.setActor(actorOrRole);
- }
-
- @Override
- public boolean getMustUnderstand(SOAPHeaderElement headerElement) {
- return headerElement.getMustUnderstand();
- }
-
- @Override
- public void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand) {
- headerElement.setMustUnderstand(mustUnderstand);
- }
-
- @Override
- public boolean hasFault(SOAPBody body) {
- return body.hasFault();
- }
-
- @Override
- public SOAPFault getFault(SOAPBody body) {
- return body.getFault();
- }
-
- @Override
- public String getFaultActor(SOAPFault fault) {
- return fault.getFaultActor();
- }
-
- @Override
- public void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException {
- fault.setFaultActor(actorOrRole);
- }
-
- @Override
- public String getFaultString(SOAPFault fault) {
- return fault.getFaultString();
- }
-
- @Override
- public Locale getFaultStringLocale(SOAPFault fault) {
- return fault.getFaultStringLocale();
- }
-
- @Override
- public Detail getFaultDetail(SOAPFault fault) {
- return fault.getDetail();
- }
-
- @Override
- public Detail addFaultDetail(SOAPFault fault) throws SOAPException {
- return fault.addDetail();
- }
-
- @Override
- public void addTextNode(DetailEntry detailEntry, String text) throws SOAPException {
- detailEntry.addTextNode(text);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getDetailEntries(Detail detail) {
- return detail.getDetailEntries();
- }
-
- @Override
- public SOAPElement getFirstBodyElement(SOAPBody body) {
- for (Iterator> iterator = body.getChildElements(); iterator.hasNext();) {
- Object child = iterator.next();
- if (child instanceof SOAPElement) {
- return (SOAPElement) child;
- }
- }
- return null;
- }
-
- @Override
- public void removeContents(SOAPElement element) {
- element.removeContents();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- Iterator getChildElements(SOAPElement element, QName name) throws SOAPException {
- return element.getChildElements(name);
- }
-
- @Override
- void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException {
- element.addNamespaceDeclaration(prefix, namespaceUri);
- }
-
- @Override
- public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException {
- if (message.saveRequired()) {
- message.saveChanges();
- }
- if (outputStream instanceof TransportOutputStream) {
- 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(TransportConstants.HEADER_CONTENT_TYPE))) {
- SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
- if (envelope.getElementQName().getNamespaceURI()
- .equals(SoapVersion.SOAP_11.getEnvelopeNamespaceUri())) {
- headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType());
- }
- else {
- headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_12.getContentType());
- }
- if (message.saveRequired()) {
- message.saveChanges();
- }
- }
- for (Iterator> iterator = headers.getAllHeaders(); iterator.hasNext();) {
- MimeHeader mimeHeader = (MimeHeader) iterator.next();
- transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue());
- }
- }
- message.writeTo(outputStream);
-
- }
-
- @Override
- public MimeHeaders getMimeHeaders(SOAPMessage message) {
- return message.getMimeHeaders();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getAttachments(SOAPMessage message) {
- return message.getAttachments();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders) {
- return message.getAttachments(mimeHeaders);
- }
-
- @Override
- public AttachmentPart addAttachmentPart(SOAPMessage message, DataHandler dataHandler) {
- AttachmentPart attachmentPart = message.createAttachmentPart(dataHandler);
- message.addAttachmentPart(attachmentPart);
- return attachmentPart;
- }
-}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java
deleted file mode 100644
index 25ef4379..00000000
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.Locale;
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.Detail;
-import javax.xml.soap.DetailEntry;
-import javax.xml.soap.MimeHeaders;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPEnvelope;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.soap.SOAPHeaderElement;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-
-/**
- * Forms a bridge between the SOAP class hierarchy and a specific version of SAAJ.
- *
- * @author Arjen Poutsma
- * @since 1.0.0
- */
-abstract class SaajImplementation {
-
- /*
- * SOAPElement
- */
-
- /** Returns the name of the given element. */
- abstract QName getName(SOAPElement element);
-
- /** Returns the readable Source of the given element. */
- abstract Source getSource(SOAPElement element);
-
- /** Returns the writable Result of the given element. */
- abstract Result getResult(SOAPElement element);
-
- /** Returns the text of the given element */
- abstract String getText(SOAPElement element);
-
- /** Returns the text of the given element */
- abstract void setText(SOAPElement element, String content) throws SOAPException;
-
- /** Adds an attribute to the specified element. */
- abstract void addAttribute(SOAPElement element, QName name, String value) throws SOAPException;
-
- /** Removes an attribute from the specified element. */
- abstract void removeAttribute(SOAPElement element, QName name) throws SOAPException;
-
- /** Returns the attribute value * */
- abstract String getAttributeValue(SOAPElement element, QName name) throws SOAPException;
-
- /** Returns all attributes as an iterator of QNames. * */
- abstract Iterator getAllAttributes(SOAPElement element);
-
- /** Removes the contents (i.e. children) of the element. */
- abstract void removeContents(SOAPElement element);
-
- /** Returns an iterator over all the child elements with the specified name. */
- abstract Iterator getChildElements(SOAPElement element, QName name) throws SOAPException;
-
- /** Declares a namespace. */
- abstract void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException;
-
- /*
- * SOAPMessage
- */
-
- /** Returns the envelope of the given message. */
- abstract SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException;
-
- /** Writes the given message to the given stream. */
- abstract void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException;
-
- /** Returns the MIME headers of the message. */
- abstract MimeHeaders getMimeHeaders(SOAPMessage message);
-
- /** Returns an iteration over all attachments in the message. */
- abstract Iterator getAttachments(SOAPMessage message);
-
- /** Returns an iteration over all attachments in the message with the given headers. */
- abstract Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders);
-
- /** Adds an attachment to the given message. */
- abstract AttachmentPart addAttachmentPart(SOAPMessage message, DataHandler dataHandler);
-
- /*
- * SOAPEnvelope
- */
-
- /** Returns the header of the given envelope. */
- abstract SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException;
-
- /** Returns the body of the given envelope. */
- abstract SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException;
-
- /*
- * SOAPHeader
- */
-
- /** Adds a header element to the given header. */
- abstract SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException;
-
- /** Returns all header elements. */
- abstract Iterator examineAllHeaderElements(SOAPHeader header);
-
- /** Returns all header elements for which the must understand attribute is true, given the actor or role. */
- abstract Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole);
-
- /** Adds a not understood header element to the given header. */
- abstract SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) throws SOAPException;
-
- /** Adds a upgrade header element to the given header. */
- abstract SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris)
- throws SOAPException;
-
- /*
- * SOAPHeaderElement
- */
-
- /** Returns the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. */
- abstract String getActorOrRole(SOAPHeaderElement headerElement);
-
- /** Sets the SOAP 1.1 actor or SOAP 1.2 role attribute for the given header element. */
- abstract void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole);
-
- /** Gets the must understand attribute for the given header element. */
- abstract boolean getMustUnderstand(SOAPHeaderElement headerElement);
-
- /** Sets the must understand attribute for the given header element. */
- abstract void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand);
-
- /*
- * SOAPBody
- */
-
- /** Returns true if the body has a fault, false otherwise. */
- abstract boolean hasFault(SOAPBody body);
-
- /** Returns the fault for the given body, if any. */
- abstract SOAPFault getFault(SOAPBody body);
-
- /** Adds a fault to the given body. */
- abstract SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) throws SOAPException;
-
- /** Returns the first child element of the given body. */
- abstract SOAPElement getFirstBodyElement(SOAPBody body);
-
- /*
- * SOAPFault
- */
-
- /** Returns the fault code for the given fault. */
- abstract QName getFaultCode(SOAPFault fault);
-
- /** Returns the actor for the given fault. */
- abstract String getFaultActor(SOAPFault fault);
-
- /** Sets the actor for the given fault. */
- abstract void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException;
-
- /** Returns the fault string for the given fault. */
- abstract String getFaultString(SOAPFault fault);
-
- /** Returns the fault string language for the given fault. */
- abstract Locale getFaultStringLocale(SOAPFault fault);
-
- /** Returns the fault detail for the given fault. */
- abstract Detail getFaultDetail(SOAPFault fault);
-
- /** Adds a fault detail for the given fault. */
- abstract Detail addFaultDetail(SOAPFault fault) throws SOAPException;
-
- /** Returns the fault role. */
- abstract String getFaultRole(SOAPFault fault);
-
- /** Sets the fault role. */
- abstract void setFaultRole(SOAPFault fault, String role) throws SOAPException;
-
- /** Returns the fault sub code. */
- abstract Iterator getFaultSubcodes(SOAPFault fault);
-
- /** Adds a fault sub code. */
- abstract void appendFaultSubcode(SOAPFault fault, QName subcode) throws SOAPException;
-
- /** Returns the fault node. */
- abstract String getFaultNode(SOAPFault fault);
-
- /** Sets the fault node. */
- abstract void setFaultNode(SOAPFault fault, String uri) throws SOAPException;
-
- /** Returns the fault reason text. */
- abstract String getFaultReasonText(SOAPFault fault, Locale locale) throws SOAPException;
-
- /** Sets the fault reason text. */
- abstract void setFaultReasonText(SOAPFault fault, Locale locale, String text) throws SOAPException;
-
- /*
- * Detail
- */
-
- /** Adds a detail entry to the given detail. */
- abstract DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException;
-
- /** Returns an iteration over all detail entries. */
- abstract Iterator getDetailEntries(Detail detail);
-
- /*
- * DetailEntry
- */
-
- /** Adds a text node to the given detail entry. */
- abstract void addTextNode(DetailEntry detailEntry, String text) throws SOAPException;
-}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Body.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Body.java
index c7e95c81..cecfce09 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Body.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Body.java
@@ -43,7 +43,7 @@ class SaajSoap11Body extends SaajSoapBody implements Soap11Body {
}
public Soap11Fault getFault() {
- SOAPFault fault = getImplementation().getFault(getSaajBody());
+ SOAPFault fault = getSaajBody().getFault();
return fault != null ? new SaajSoap11Fault(fault) : null;
}
@@ -56,9 +56,16 @@ class SaajSoap11Body extends SaajSoapBody implements Soap11Body {
faultStringLocale = null;
}
try {
- getImplementation().removeContents(getSaajBody());
- SOAPFault saajFault =
- getImplementation().addFault(getSaajBody(), faultCode, faultString, faultStringLocale);
+ getSaajBody().removeContents();
+ SOAPBody body = getSaajBody();
+ SOAPFault result;
+ if (faultStringLocale == null) {
+ result = body.addFault(faultCode, faultString);
+ }
+ else {
+ result = body.addFault(faultCode, faultString, faultStringLocale);
+ }
+ SOAPFault saajFault = result;
return new SaajSoap11Fault(saajFault);
}
catch (SOAPException ex) {
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Fault.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Fault.java
index db63c589..bed10345 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Fault.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Fault.java
@@ -35,12 +35,12 @@ class SaajSoap11Fault extends SaajSoapFault implements Soap11Fault {
}
public String getFaultActorOrRole() {
- return getImplementation().getFaultActor(getSaajFault());
+ return getSaajFault().getFaultActor();
}
public void setFaultActorOrRole(String faultActor) {
try {
- getImplementation().setFaultActor(getSaajFault(), faultActor);
+ getSaajFault().setFaultActor(faultActor);
}
catch (SOAPException ex) {
throw new SaajSoapFaultException(ex);
@@ -48,10 +48,10 @@ class SaajSoap11Fault extends SaajSoapFault implements Soap11Fault {
}
public String getFaultStringOrReason() {
- return getImplementation().getFaultString(getSaajFault());
+ return getSaajFault().getFaultString();
}
public Locale getFaultStringLocale() {
- return getImplementation().getFaultStringLocale(getSaajFault());
+ return getSaajFault().getFaultStringLocale();
}
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Header.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Header.java
index cc07069f..860ddb45 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Header.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Header.java
@@ -42,7 +42,7 @@ class SaajSoap11Header extends SaajSoapHeader implements Soap11Header {
public Iterator examineHeaderElementsToProcess(String[] actors) {
List result = new ArrayList();
- Iterator iterator = getImplementation().examineAllHeaderElements(getSaajHeader());
+ Iterator iterator = getSaajHeader().examineAllHeaderElements();
while (iterator.hasNext()) {
SOAPHeaderElement saajHeaderElement = iterator.next();
String headerActor = saajHeaderElement.getActor();
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Body.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Body.java
index ea188847..76553e7c 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Body.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Body.java
@@ -40,7 +40,7 @@ class SaajSoap12Body extends SaajSoapBody implements Soap12Body {
}
public Soap12Fault getFault() {
- SOAPFault fault = getImplementation().getFault(getSaajBody());
+ SOAPFault fault = getSaajBody().getFault();
return fault != null ? new SaajSoap12Fault(fault) : null;
}
@@ -75,9 +75,16 @@ class SaajSoap12Body extends SaajSoapBody implements Soap12Body {
Assert.hasLength(faultCode.getLocalPart(), "faultCode's localPart cannot be empty");
Assert.hasLength(faultCode.getNamespaceURI(), "faultCode's namespaceUri cannot be empty");
try {
- getImplementation().removeContents(getSaajBody());
- SOAPFault saajFault =
- getImplementation().addFault(getSaajBody(), faultCode, faultString, faultStringLocale);
+ getSaajBody().removeContents();
+ SOAPBody body = getSaajBody();
+ SOAPFault result;
+ if (faultStringLocale == null) {
+ result = body.addFault(faultCode, faultString);
+ }
+ else {
+ result = body.addFault(faultCode, faultString, faultStringLocale);
+ }
+ SOAPFault saajFault = result;
return new SaajSoap12Fault(saajFault);
}
catch (SOAPException ex) {
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Fault.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Fault.java
index 76065d57..4bc90447 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Fault.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Fault.java
@@ -35,12 +35,12 @@ class SaajSoap12Fault extends SaajSoapFault implements Soap12Fault {
}
public String getFaultActorOrRole() {
- return getImplementation().getFaultRole(getSaajFault());
+ return getSaajFault().getFaultRole();
}
public void setFaultActorOrRole(String faultRole) {
try {
- getImplementation().setFaultRole(getSaajFault(), faultRole);
+ getSaajFault().setFaultRole(faultRole);
}
catch (SOAPException ex) {
throw new SaajSoapFaultException(ex);
@@ -48,12 +48,12 @@ class SaajSoap12Fault extends SaajSoapFault implements Soap12Fault {
}
public Iterator getFaultSubcodes() {
- return getImplementation().getFaultSubcodes(getSaajFault());
+ return getSaajFault().getFaultSubcodes();
}
public void addFaultSubcode(QName subcode) {
try {
- getImplementation().appendFaultSubcode(getSaajFault(), subcode);
+ getSaajFault().appendFaultSubcode(subcode);
}
catch (SOAPException ex) {
throw new SaajSoapFaultException(ex);
@@ -61,12 +61,12 @@ class SaajSoap12Fault extends SaajSoapFault implements Soap12Fault {
}
public String getFaultNode() {
- return getImplementation().getFaultNode(getSaajFault());
+ return getSaajFault().getFaultNode();
}
public void setFaultNode(String uri) {
try {
- getImplementation().setFaultNode(getSaajFault(), uri);
+ getSaajFault().setFaultNode(uri);
}
catch (SOAPException ex) {
throw new SaajSoapFaultException(ex);
@@ -76,7 +76,7 @@ class SaajSoap12Fault extends SaajSoapFault implements Soap12Fault {
public void setFaultReasonText(Locale locale, String text) {
try {
- getImplementation().setFaultReasonText(getSaajFault(), locale, text);
+ getSaajFault().addFaultReasonText(text, locale);
}
catch (SOAPException ex) {
throw new SaajSoapFaultException(ex);
@@ -86,7 +86,7 @@ class SaajSoap12Fault extends SaajSoapFault implements Soap12Fault {
public String getFaultReasonText(Locale locale) {
try {
- return getImplementation().getFaultReasonText(getSaajFault(), locale);
+ return getSaajFault().getFaultReasonText(locale);
}
catch (SOAPException ex) {
throw new SaajSoapFaultException(ex);
@@ -94,6 +94,6 @@ class SaajSoap12Fault extends SaajSoapFault implements Soap12Fault {
}
public String getFaultStringOrReason() {
- return getImplementation().getFaultString(getSaajFault());
+ return getSaajFault().getFaultString();
}
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Header.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Header.java
index 53864992..669e1cb4 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Header.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Header.java
@@ -45,8 +45,8 @@ class SaajSoap12Header extends SaajSoapHeader implements Soap12Header {
public SoapHeaderElement addNotUnderstoodHeaderElement(QName headerName) {
try {
- SOAPHeaderElement headerElement =
- getImplementation().addNotUnderstoodHeaderElement(getSaajHeader(), headerName);
+ SOAPHeaderElement headerElement =
+ getSaajHeader().addNotUnderstoodHeaderElement(headerName);
return new SaajSoapHeaderElement(headerElement);
}
catch (SOAPException ex) {
@@ -56,8 +56,8 @@ class SaajSoap12Header extends SaajSoapHeader implements Soap12Header {
public SoapHeaderElement addUpgradeHeaderElement(String[] supportedSoapUris) {
try {
- SOAPHeaderElement headerElement =
- getImplementation().addUpgradeHeaderElement(getSaajHeader(), supportedSoapUris);
+ SOAPHeaderElement headerElement =
+ getSaajHeader().addUpgradeHeaderElement(supportedSoapUris);
return new SaajSoapHeaderElement(headerElement);
}
catch (SOAPException ex) {
@@ -68,7 +68,7 @@ class SaajSoap12Header extends SaajSoapHeader implements Soap12Header {
public Iterator examineHeaderElementsToProcess(String[] roles, boolean isUltimateDestination)
throws SoapHeaderException {
List result = new ArrayList();
- Iterator iterator = getImplementation().examineAllHeaderElements(getSaajHeader());
+ Iterator iterator = getSaajHeader().examineAllHeaderElements();
while (iterator.hasNext()) {
SOAPHeaderElement saajHeaderElement = iterator.next();
String headerRole = saajHeaderElement.getRole();
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBody.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBody.java
index da422ef2..3d3e8cc9 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBody.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBody.java
@@ -20,8 +20,11 @@ import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
import org.springframework.ws.soap.SoapBody;
+import org.springframework.ws.soap.saaj.support.SaajUtils;
/**
* SAAJ-specific abstract base class of the SoapBody interface. Wraps a {@link javax.xml.soap.SOAPBody}.
@@ -35,18 +38,21 @@ abstract class SaajSoapBody extends SaajSoapElement implements SoapBod
super(body);
}
+ @Override
public Source getPayloadSource() {
- SOAPElement bodyElement = getImplementation().getFirstBodyElement(getSaajBody());
- return bodyElement == null ? null : getImplementation().getSource(bodyElement);
+ SOAPElement bodyElement = SaajUtils.getFirstBodyElement(getSaajBody());
+ return bodyElement != null ? new DOMSource(bodyElement) : null;
}
+ @Override
public Result getPayloadResult() {
- getImplementation().removeContents(getSaajBody());
- return getImplementation().getResult(getSaajBody());
+ getSaajBody().removeContents();
+ return new DOMResult(getSaajBody());
}
+ @Override
public boolean hasFault() {
- return getImplementation().hasFault(getSaajBody());
+ return getSaajBody().hasFault();
}
protected SOAPBody getSaajBody() {
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java
index 2d6fe739..73a4d848 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java
@@ -21,10 +21,10 @@ import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
import org.springframework.util.Assert;
import org.springframework.ws.soap.SoapElement;
-import org.springframework.ws.soap.saaj.support.SaajUtils;
/**
* SAAJ-specific implementation of the SoapElement interface. Wraps a {@link javax.xml.soap.SOAPElement}.
@@ -36,55 +36,51 @@ class SaajSoapElement implements SoapElement {
private final T element;
- private SaajImplementation implementation;
-
SaajSoapElement(T element) {
Assert.notNull(element, "element must not be null");
this.element = element;
}
+ @Override
public Source getSource() {
- return getImplementation().getSource(element);
+ return new DOMSource(element);
}
+ @Override
public QName getName() {
- return getImplementation().getName(element);
+ return element.getElementQName();
}
+ @Override
public void addAttribute(QName name, String value) {
try {
- getImplementation().addAttribute(element, name, value);
+ element.addAttribute(name, value);
}
catch (SOAPException ex) {
throw new SaajSoapElementException(ex);
}
}
+ @Override
public void removeAttribute(QName name) {
- try {
- getImplementation().removeAttribute(element, name);
- }
- catch (SOAPException ex) {
- throw new SaajSoapElementException(ex);
- }
+ element.removeAttribute(name);
}
+ @Override
public String getAttributeValue(QName name) {
- try {
- return getImplementation().getAttributeValue(element, name);
- }
- catch (SOAPException ex) {
- throw new SaajSoapElementException(ex);
- }
+ return element.getAttributeValue(name);
}
+ @Override
+ @SuppressWarnings("unchecked")
public Iterator getAllAttributes() {
- return getImplementation().getAllAttributes(element);
+ return element.getAllAttributesAsQNames();
}
+ @Override
public void addNamespaceDeclaration(String prefix, String namespaceUri) {
try {
- getImplementation().addNamespaceDeclaration(element, prefix, namespaceUri);
+ element.addNamespaceDeclaration(prefix, namespaceUri);
}
catch (SOAPException ex) {
throw new SaajSoapElementException(ex);
@@ -95,21 +91,4 @@ class SaajSoapElement implements SoapElement {
return element;
}
- protected final SaajImplementation getImplementation() {
- if (implementation == null) {
- if (SaajUtils.getSaajVersion(element) == SaajUtils.SAAJ_13) {
- implementation = Saaj13Implementation.getInstance();
- }
- else if (SaajUtils.getSaajVersion(element) == SaajUtils.SAAJ_12) {
- implementation = Saaj12Implementation.getInstance();
- }
- else if (SaajUtils.getSaajVersion(element) == SaajUtils.SAAJ_11) {
- implementation = Saaj11Implementation.getInstance();
- }
- else {
- throw new IllegalStateException("Could not find SAAJ on the classpath");
- }
- }
- return implementation;
- }
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapEnvelope.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapEnvelope.java
index 158056d6..5295477a 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapEnvelope.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapEnvelope.java
@@ -49,8 +49,8 @@ class SaajSoapEnvelope extends SaajSoapElement implements SoapEnve
public SoapBody getBody() {
if (body == null) {
try {
- SOAPBody saajBody = getImplementation().getBody(getSaajEnvelope());
- if (getImplementation().getName(saajBody).getNamespaceURI()
+ SOAPBody saajBody = getSaajEnvelope().getBody();
+ if (saajBody.getElementQName().getNamespaceURI()
.equals(SoapVersion.SOAP_11.getEnvelopeNamespaceUri())) {
body = new SaajSoap11Body(saajBody, langAttributeOnSoap11FaultString);
}
@@ -68,9 +68,9 @@ class SaajSoapEnvelope extends SaajSoapElement implements SoapEnve
public SoapHeader getHeader() {
if (header == null) {
try {
- SOAPHeader saajHeader = getImplementation().getHeader(getSaajEnvelope());
+ SOAPHeader saajHeader = getSaajEnvelope().getHeader();
if (saajHeader != null) {
- if (getImplementation().getName(saajHeader).getNamespaceURI()
+ if (saajHeader.getElementQName().getNamespaceURI()
.equals(SoapVersion.SOAP_11.getEnvelopeNamespaceUri())) {
header = new SaajSoap11Header(saajHeader);
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFault.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFault.java
index a0557fec..405e1b99 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFault.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFault.java
@@ -36,22 +36,25 @@ abstract class SaajSoapFault extends SaajSoapElement implements SoapF
super(fault);
}
+ @Override
public QName getFaultCode() {
- return getImplementation().getFaultCode(getSaajFault());
+ return getSaajFault().getFaultCodeAsQName();
}
protected SOAPFault getSaajFault() {
return getSaajElement();
}
+ @Override
public SoapFaultDetail getFaultDetail() {
- Detail saajDetail = getImplementation().getFaultDetail(getSaajFault());
- return saajDetail == null ? null : new SaajSoapFaultDetail(saajDetail);
+ Detail saajDetail = getSaajFault().getDetail();
+ return saajDetail != null ? new SaajSoapFaultDetail(saajDetail) : null;
}
+ @Override
public SoapFaultDetail addFaultDetail() {
try {
- Detail saajDetail = getImplementation().addFaultDetail(getSaajFault());
+ Detail saajDetail = getSaajFault().addDetail();
return new SaajSoapFaultDetail(saajDetail);
}
catch (SOAPException ex) {
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetail.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetail.java
index a847a86d..971ab178 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetail.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetail.java
@@ -23,6 +23,7 @@ import javax.xml.soap.DetailEntry;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFaultElement;
import javax.xml.transform.Result;
+import javax.xml.transform.dom.DOMResult;
import org.springframework.util.Assert;
import org.springframework.ws.soap.SoapFaultDetail;
@@ -42,12 +43,12 @@ class SaajSoapFaultDetail extends SaajSoapElement implements S
}
public Result getResult() {
- return getImplementation().getResult(getSaajDetail());
+ return new DOMResult(getSaajDetail());
}
public SoapFaultDetailElement addFaultDetailElement(QName name) {
try {
- DetailEntry detailEntry = getImplementation().addDetailEntry(getSaajDetail(), name);
+ DetailEntry detailEntry = getSaajDetail().addDetailEntry(name);
return new SaajSoapFaultDetailElement(detailEntry);
}
catch (SOAPException ex) {
@@ -56,7 +57,7 @@ class SaajSoapFaultDetail extends SaajSoapElement implements S
}
public Iterator getDetailEntries() {
- Iterator iterator = getImplementation().getDetailEntries(getSaajDetail());
+ Iterator iterator = getSaajDetail().getDetailEntries();
return new SaajSoapFaultDetailElementIterator(iterator);
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetailElement.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetailElement.java
index 35af79fc..3d4b082c 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetailElement.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetailElement.java
@@ -19,6 +19,7 @@ package org.springframework.ws.soap.saaj;
import javax.xml.soap.DetailEntry;
import javax.xml.soap.SOAPException;
import javax.xml.transform.Result;
+import javax.xml.transform.dom.DOMResult;
import org.springframework.ws.soap.SoapFaultDetailElement;
@@ -36,12 +37,12 @@ class SaajSoapFaultDetailElement extends SaajSoapElement implements
}
public Result getResult() {
- return getImplementation().getResult(getSaajDetailEntry());
+ return new DOMResult(getSaajDetailEntry());
}
public void addText(String text) {
try {
- getImplementation().addTextNode(getSaajDetailEntry(), text);
+ getSaajDetailEntry().addTextNode(text);
}
catch (SOAPException ex) {
throw new SaajSoapFaultException(ex);
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java
index bea30637..9731bf2e 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java
@@ -23,6 +23,7 @@ import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.transform.Result;
+import javax.xml.transform.dom.DOMResult;
import org.springframework.util.Assert;
import org.springframework.ws.soap.SoapHeader;
@@ -41,30 +42,32 @@ abstract class SaajSoapHeader extends SaajSoapElement implements Soa
super(header);
}
+ @Override
+ @SuppressWarnings("unchecked")
public Iterator examineAllHeaderElements() throws SoapHeaderException {
- Iterator iterator = getImplementation().examineAllHeaderElements(getSaajHeader());
+ Iterator iterator = getSaajHeader().examineAllHeaderElements();
return new SaajSoapHeaderElementIterator(iterator);
}
+ @Override
@SuppressWarnings("unchecked")
public Iterator examineHeaderElements(QName name) throws SoapHeaderException {
- try {
- Iterator iterator = getImplementation().getChildElements(getSaajHeader(), name);
- return new SaajSoapHeaderElementIterator(iterator);
- }
- catch (SOAPException ex) {
- throw new SaajSoapHeaderException(ex);
- }
+ Iterator iterator = getSaajHeader().getChildElements(name);
+ return new SaajSoapHeaderElementIterator(iterator);
}
+ @Override
+ @SuppressWarnings("unchecked")
public Iterator examineMustUnderstandHeaderElements(String actorOrRole) throws SoapHeaderException {
- Iterator iterator = getImplementation().examineMustUnderstandHeaderElements(getSaajHeader(), actorOrRole);
+ Iterator iterator =
+ getSaajHeader().examineMustUnderstandHeaderElements(actorOrRole);
return new SaajSoapHeaderElementIterator(iterator);
}
+ @Override
public SoapHeaderElement addHeaderElement(QName name) throws SoapHeaderException {
try {
- SOAPHeaderElement headerElement = getImplementation().addHeaderElement(getSaajHeader(), name);
+ SOAPHeaderElement headerElement = getSaajHeader().addHeaderElement(name);
return new SaajSoapHeaderElement(headerElement);
}
catch (SOAPException ex) {
@@ -72,25 +75,23 @@ abstract class SaajSoapHeader extends SaajSoapElement implements Soa
}
}
+ @SuppressWarnings("unchecked")
+ @Override
public void removeHeaderElement(QName name) throws SoapHeaderException {
- try {
- Iterator iterator = getImplementation().getChildElements(getSaajHeader(), name);
- if (iterator.hasNext()) {
- SOAPElement element = iterator.next();
- element.detachNode();
- }
- }
- catch (SOAPException ex) {
- throw new SaajSoapHeaderException(ex);
- }
+ Iterator iterator = getSaajHeader().getChildElements(name);
+ if (iterator.hasNext()) {
+ SOAPElement element = iterator.next();
+ element.detachNode();
+ }
}
protected SOAPHeader getSaajHeader() {
return getSaajElement();
}
+ @Override
public Result getResult() {
- return getImplementation().getResult(getSaajHeader());
+ return new DOMResult(getSaajHeader());
}
protected static class SaajSoapHeaderElementIterator implements Iterator {
@@ -102,15 +103,18 @@ abstract class SaajSoapHeader extends SaajSoapElement implements Soa
this.iterator = iterator;
}
+ @Override
public boolean hasNext() {
return iterator.hasNext();
}
+ @Override
public SoapHeaderElement next() {
SOAPHeaderElement saajHeaderElement = iterator.next();
return new SaajSoapHeaderElement(saajHeaderElement);
}
+ @Override
public void remove() {
iterator.remove();
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeaderElement.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeaderElement.java
index 85c1c573..272cb53a 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeaderElement.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeaderElement.java
@@ -16,9 +16,9 @@
package org.springframework.ws.soap.saaj;
-import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.transform.Result;
+import javax.xml.transform.dom.DOMResult;
import org.springframework.ws.soap.SoapHeaderElement;
import org.springframework.ws.soap.SoapHeaderException;
@@ -36,41 +36,43 @@ class SaajSoapHeaderElement extends SaajSoapElement implement
super(headerElement);
}
+ @Override
public Result getResult() throws SoapHeaderException {
- return getImplementation().getResult(getSaajElement());
+ return new DOMResult(getSaajElement());
}
+ @Override
public String getActorOrRole() throws SoapHeaderException {
- return getImplementation().getActorOrRole(getSaajHeaderElement());
+ return getSaajHeaderElement().getActor();
}
+ @Override
public void setActorOrRole(String actorOrRole) throws SoapHeaderException {
- getImplementation().setActorOrRole(getSaajHeaderElement(), actorOrRole);
+ getSaajHeaderElement().setActor(actorOrRole);
}
+ @Override
public boolean getMustUnderstand() throws SoapHeaderException {
- return getImplementation().getMustUnderstand(getSaajHeaderElement());
+ return getSaajHeaderElement().getMustUnderstand();
}
+ @Override
public void setMustUnderstand(boolean mustUnderstand) throws SoapHeaderException {
- getImplementation().setMustUnderstand(getSaajHeaderElement(), mustUnderstand);
+ getSaajHeaderElement().setMustUnderstand(mustUnderstand);
}
+ @Override
public String getText() {
- return getImplementation().getText(getSaajHeaderElement());
+ return getSaajHeaderElement().getValue();
}
+ @Override
public void setText(String content) {
- try {
- getImplementation().setText(getSaajHeaderElement(), content);
- }
- catch (SOAPException ex) {
- throw new SaajSoapHeaderException(ex);
- }
+ getSaajHeaderElement().setValue(content);
}
protected SOAPHeaderElement getSaajHeaderElement() {
- return (SOAPHeaderElement) getSaajElement();
+ return getSaajElement();
}
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java
index 5984404d..c3f34dc2 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java
@@ -24,6 +24,7 @@ import java.util.Iterator;
import javax.activation.DataHandler;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MessageFactory;
+import javax.xml.soap.MimeHeader;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
@@ -32,6 +33,12 @@ import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
+
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.ws.mime.Attachment;
@@ -43,12 +50,7 @@ import org.springframework.ws.soap.SoapVersion;
import org.springframework.ws.soap.saaj.support.SaajUtils;
import org.springframework.ws.soap.support.SoapUtils;
import org.springframework.ws.transport.TransportConstants;
-
-import org.w3c.dom.DOMImplementation;
-import org.w3c.dom.Document;
-import org.w3c.dom.ls.DOMImplementationLS;
-import org.w3c.dom.ls.LSOutput;
-import org.w3c.dom.ls.LSSerializer;
+import org.springframework.ws.transport.TransportOutputStream;
/**
* SAAJ-specific implementation of the {@link SoapMessage} interface. Created via the {@link SaajSoapMessageFactory},
@@ -70,8 +72,6 @@ public class SaajSoapMessage extends AbstractSoapMessage {
private final boolean langAttributeOnSoap11FaultString;
- private SaajImplementation implementation;
-
/**
* Create a new SaajSoapMessage based on the given SAAJ SOAPMessage.
*
@@ -114,7 +114,7 @@ public class SaajSoapMessage extends AbstractSoapMessage {
Assert.notNull(soapMessage, "soapMessage must not be null");
saajMessage = soapMessage;
this.langAttributeOnSoap11FaultString = langAttributeOnSoap11FaultString;
- MimeHeaders headers = getImplementation().getMimeHeaders(soapMessage);
+ MimeHeaders headers = soapMessage.getMimeHeaders();
if (ObjectUtils.isEmpty(headers.getHeader(TransportConstants.HEADER_SOAP_ACTION))) {
headers.addHeader(TransportConstants.HEADER_SOAP_ACTION, "\"\"");
}
@@ -133,10 +133,11 @@ public class SaajSoapMessage extends AbstractSoapMessage {
envelope = null;
}
+ @Override
public SoapEnvelope getEnvelope() {
if (envelope == null) {
try {
- SOAPEnvelope saajEnvelope = getImplementation().getEnvelope(getSaajMessage());
+ SOAPEnvelope saajEnvelope = getSaajMessage().getSOAPPart().getEnvelope();
envelope = new SaajSoapEnvelope(saajEnvelope, langAttributeOnSoap11FaultString);
}
catch (SOAPException ex) {
@@ -146,8 +147,9 @@ public class SaajSoapMessage extends AbstractSoapMessage {
return envelope;
}
+ @Override
public String getSoapAction() {
- MimeHeaders mimeHeaders = getImplementation().getMimeHeaders(getSaajMessage());
+ MimeHeaders mimeHeaders = getSaajMessage().getMimeHeaders();
if (SoapVersion.SOAP_11 == getVersion()) {
String[] actions = mimeHeaders.getHeader(TransportConstants.HEADER_SOAP_ACTION);
return ObjectUtils.isEmpty(actions) ? TransportConstants.EMPTY_SOAP_ACTION : actions[0];
@@ -162,8 +164,9 @@ public class SaajSoapMessage extends AbstractSoapMessage {
}
}
+ @Override
public void setSoapAction(String soapAction) {
- MimeHeaders mimeHeaders = getImplementation().getMimeHeaders(getSaajMessage());
+ MimeHeaders mimeHeaders = getSaajMessage().getMimeHeaders();
soapAction = SoapUtils.escapeAction(soapAction);
if (SoapVersion.SOAP_11 == getVersion()) {
mimeHeaders.setHeader(TransportConstants.HEADER_SOAP_ACTION, soapAction);
@@ -190,6 +193,7 @@ public class SaajSoapMessage extends AbstractSoapMessage {
}
+ @Override
public Document getDocument() {
Assert.state(messageFactory != null, "Could find message factory to use");
// return saajSoapMessage.getSaajMessage().getSOAPPart(); // does not work, see SWS-345
@@ -209,6 +213,7 @@ public class SaajSoapMessage extends AbstractSoapMessage {
}
}
+ @Override
public void setDocument(Document document) {
if (saajMessage.getSOAPPart() != document) {
Assert.state(messageFactory != null, "Could find message factory to use");
@@ -238,14 +243,44 @@ public class SaajSoapMessage extends AbstractSoapMessage {
}
}
+ @Override
public void writeTo(OutputStream outputStream) throws IOException {
- MimeHeaders mimeHeaders = getImplementation().getMimeHeaders(getSaajMessage());
+ MimeHeaders mimeHeaders = getSaajMessage().getMimeHeaders();
if (ObjectUtils.isEmpty(mimeHeaders.getHeader(TransportConstants.HEADER_ACCEPT))) {
mimeHeaders.setHeader(TransportConstants.HEADER_ACCEPT, getVersion().getContentType());
}
try {
- getImplementation().writeTo(getSaajMessage(), outputStream);
- outputStream.flush();
+ SOAPMessage message = getSaajMessage();
+ if (message.saveRequired()) {
+ message.saveChanges();
+ }
+ if (outputStream instanceof TransportOutputStream) {
+ 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(TransportConstants.HEADER_CONTENT_TYPE))) {
+ SOAPEnvelope envelope1 = message.getSOAPPart().getEnvelope();
+ if (envelope1.getElementQName().getNamespaceURI()
+ .equals(SoapVersion.SOAP_11.getEnvelopeNamespaceUri())) {
+ headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType());
+ }
+ else {
+ headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_12.getContentType());
+ }
+ if (message.saveRequired()) {
+ message.saveChanges();
+ }
+ }
+ for (Iterator> iterator = headers.getAllHeaders(); iterator.hasNext();) {
+ MimeHeader mimeHeader = (MimeHeader) iterator.next();
+ transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue());
+ }
+ }
+ message.writeTo(outputStream);
+
+ outputStream.flush();
}
catch (SOAPException ex) {
throw new SaajSoapMessageException("Could not write message to OutputStream: " + ex.getMessage(), ex);
@@ -261,12 +296,13 @@ public class SaajSoapMessage extends AbstractSoapMessage {
}
}
+ @Override
public boolean isXopPackage() {
if (getSaajVersion() >= SaajUtils.SAAJ_13) {
SOAPPart saajPart = saajMessage.getSOAPPart();
String[] contentTypes = saajPart.getMimeHeader(TransportConstants.HEADER_CONTENT_TYPE);
for (String contentType : contentTypes) {
- if (contentType.indexOf(CONTENT_TYPE_XOP) != -1) {
+ if (contentType.contains(CONTENT_TYPE_XOP)) {
return true;
}
}
@@ -274,6 +310,7 @@ public class SaajSoapMessage extends AbstractSoapMessage {
return false;
}
+ @Override
public boolean convertToXopPackage() {
if (getSaajVersion() >= SaajUtils.SAAJ_13) {
convertMessageToXop();
@@ -290,12 +327,8 @@ public class SaajSoapMessage extends AbstractSoapMessage {
String[] oldContentTypes = mimeHeaders.getHeader(TransportConstants.HEADER_CONTENT_TYPE);
String oldContentType =
!ObjectUtils.isEmpty(oldContentTypes) ? oldContentTypes[0] : getVersion().getContentType();
- StringBuilder builder = new StringBuilder(CONTENT_TYPE_XOP);
- builder.append(";type=");
- builder.append('"');
- builder.append(oldContentType);
- builder.append('"');
- mimeHeaders.setHeader(TransportConstants.HEADER_CONTENT_TYPE, builder.toString());
+ mimeHeaders.setHeader(TransportConstants.HEADER_CONTENT_TYPE,
+ CONTENT_TYPE_XOP + ";type=" + '"' + oldContentType + '"');
}
private void convertPartToXop() {
@@ -303,24 +336,24 @@ public class SaajSoapMessage extends AbstractSoapMessage {
String[] oldContentTypes = saajPart.getMimeHeader(TransportConstants.HEADER_CONTENT_TYPE);
String oldContentType =
!ObjectUtils.isEmpty(oldContentTypes) ? oldContentTypes[0] : getVersion().getContentType();
- StringBuilder builder = new StringBuilder(CONTENT_TYPE_XOP);
- builder.append(";type=");
- builder.append('"');
- builder.append(oldContentType);
- builder.append('"');
- saajPart.setMimeHeader(TransportConstants.HEADER_CONTENT_TYPE, builder.toString());
+ saajPart.setMimeHeader(TransportConstants.HEADER_CONTENT_TYPE,
+ CONTENT_TYPE_XOP + ";type=" + '"' + oldContentType + '"');
}
+ @Override
+ @SuppressWarnings("unchecked")
public Iterator getAttachments() throws AttachmentException {
- Iterator iterator = getImplementation().getAttachments(getSaajMessage());
+ Iterator iterator = getSaajMessage().getAttachments();
return new SaajAttachmentIterator(iterator);
}
+ @Override
+ @SuppressWarnings("unchecked")
public Attachment getAttachment(String contentId) {
Assert.hasLength(contentId, "contentId must not be empty");
MimeHeaders mimeHeaders = new MimeHeaders();
mimeHeaders.setHeader(TransportConstants.HEADER_CONTENT_ID, contentId);
- Iterator iterator = getImplementation().getAttachment(getSaajMessage(), mimeHeaders);
+ Iterator iterator = getSaajMessage().getAttachments(mimeHeaders);
if (!iterator.hasNext()) {
return null;
}
@@ -328,45 +361,30 @@ public class SaajSoapMessage extends AbstractSoapMessage {
return new SaajAttachment(saajAttachment);
}
+ @Override
public Attachment addAttachment(String contentId, DataHandler dataHandler) {
Assert.hasLength(contentId, "contentId must not be empty");
Assert.notNull(dataHandler, "dataHandler must not be null");
- AttachmentPart saajAttachment = getImplementation().addAttachmentPart(getSaajMessage(), dataHandler);
- saajAttachment.setContentId(contentId);
- saajAttachment.setMimeHeader(TransportConstants.HEADER_CONTENT_TRANSFER_ENCODING, "binary");
- return new SaajAttachment(saajAttachment);
- }
-
- protected final SaajImplementation getImplementation() {
- if (implementation == null) {
- int saajVersion = getSaajVersion();
- if (saajVersion == SaajUtils.SAAJ_13) {
- implementation = Saaj13Implementation.getInstance();
- }
- else if (saajVersion == SaajUtils.SAAJ_12) {
- implementation = Saaj12Implementation.getInstance();
- }
- else if (saajVersion == SaajUtils.SAAJ_11) {
- implementation = Saaj11Implementation.getInstance();
- }
- else {
- throw new IllegalStateException("Could not find SAAJ on the classpath");
- }
- }
- return implementation;
+ SOAPMessage message = getSaajMessage();
+ AttachmentPart attachmentPart = message.createAttachmentPart(dataHandler);
+ message.addAttachmentPart(attachmentPart);
+ attachmentPart.setContentId(contentId);
+ attachmentPart.setMimeHeader(TransportConstants.HEADER_CONTENT_TRANSFER_ENCODING,
+ "binary");
+ return new SaajAttachment(attachmentPart);
}
public String toString() {
StringBuilder builder = new StringBuilder("SaajSoapMessage");
try {
- SOAPEnvelope envelope = getImplementation().getEnvelope(saajMessage);
+ SOAPEnvelope envelope = saajMessage.getSOAPPart().getEnvelope();
if (envelope != null) {
- SOAPBody body = getImplementation().getBody(envelope);
+ SOAPBody body = envelope.getBody();
if (body != null) {
- SOAPElement bodyElement = getImplementation().getFirstBodyElement(body);
+ SOAPElement bodyElement = SaajUtils.getFirstBodyElement(body);
if (bodyElement != null) {
builder.append(' ');
- builder.append(getImplementation().getName(bodyElement));
+ builder.append(bodyElement.getElementQName());
}
}
}
@@ -385,15 +403,18 @@ public class SaajSoapMessage extends AbstractSoapMessage {
this.saajIterator = saajIterator;
}
+ @Override
public boolean hasNext() {
return saajIterator.hasNext();
}
+ @Override
public Attachment next() {
AttachmentPart saajAttachment = saajIterator.next();
return new SaajAttachment(saajAttachment);
}
+ @Override
public void remove() {
saajIterator.remove();
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java
index eb73a833..df76c00a 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java
@@ -29,6 +29,10 @@ import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xml.sax.SAXParseException;
+
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -40,10 +44,6 @@ import org.springframework.ws.soap.saaj.support.SaajUtils;
import org.springframework.ws.transport.TransportConstants;
import org.springframework.ws.transport.TransportInputStream;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.xml.sax.SAXParseException;
-
/**
* SAAJ-specific implementation of the {@link org.springframework.ws.WebServiceMessageFactory WebServiceMessageFactory}.
* Wraps a SAAJ {@link MessageFactory}. This factory will use SAAJ 1.3 when found, or fall back to SAAJ 1.2 or even
@@ -182,6 +182,7 @@ public class SaajSoapMessageFactory implements SoapMessageFactory, InitializingB
try {
inputStream = checkForUtf8ByteOrderMark(inputStream);
SOAPMessage saajMessage = messageFactory.createMessage(mimeHeaders, inputStream);
+ saajMessage.getSOAPPart().getEnvelope();
postProcess(saajMessage);
return new SaajSoapMessage(saajMessage, langAttributeOnSoap11FaultString, messageFactory);
}
@@ -203,14 +204,14 @@ public class SaajSoapMessageFactory implements SoapMessageFactory, InitializingB
// fall-through
}
}
- throw new SoapMessageCreationException("Could not create message from InputStream: " + ex.getMessage(), ex);
- } catch (SaajSoapEnvelopeException ex) {
- SAXParseException parseException = getSAXParseException(ex);
- if (parseException != null) {
- throw new InvalidXmlException("Could not parse XML", parseException);
- } else {
- throw ex;
- }
+ SAXParseException parseException = getSAXParseException(ex);
+ if (parseException != null) {
+ throw new InvalidXmlException("Could not parse XML", parseException);
+ } else {
+ throw new SoapMessageCreationException(
+ "Could not create message from InputStream: " + ex.getMessage(),
+ ex);
+ }
}
}
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java
index a74a7ba5..4735a51b 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java
@@ -18,16 +18,12 @@ package org.springframework.ws.soap.saaj.support;
import java.io.IOException;
import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.Name;
-import javax.xml.soap.SOAPConstants;
+import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
@@ -35,15 +31,10 @@ import javax.xml.soap.SOAPMessage;
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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.w3c.dom.Element;
-
/**
* Collection of generic utility methods to work with SAAJ. Includes conversion from SAAJ {@link Name} objects to {@link
* QName}s and vice-versa, and SAAJ version checking.
@@ -55,88 +46,19 @@ import org.w3c.dom.Element;
*/
public abstract class SaajUtils {
- // The exception message thrown by WebLogic 9
- private static final String WEBLOGIC_9_SAAJ_EXCEPTION_MESSAGE = "This class does not support SAAJ 1.1";
-
- private static final Log logger = LogFactory.getLog(SaajUtils.class);
-
public static final int SAAJ_11 = 0;
public static final int SAAJ_12 = 1;
public static final int SAAJ_13 = 2;
- private static final String SAAJ_13_CLASS_NAME = "javax.xml.soap.SAAJMetaFactory";
-
- // Maps SOAPElement class names to Integer SAAJ versions (SAAJ_11, SAAJ_12, SAAJ_13)
- private static final Map saajVersions = new ConcurrentHashMap();
-
- private static int saajVersion = SAAJ_12;
-
- static {
- if (isSaaj13()) {
- saajVersion = SAAJ_13;
- }
- else if (isSaaj12()) {
- saajVersion = SAAJ_12;
- }
- else {
- saajVersion = SAAJ_11;
- }
- }
-
- private static boolean isSaaj13() {
- try {
- ClassUtils.forName(SAAJ_13_CLASS_NAME, SaajUtils.class.getClassLoader());
- MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
- return true;
- }
- catch (ClassNotFoundException ex) {
- return false;
- }
- catch (NoSuchMethodError ex) {
- return false;
- }
- catch (SOAPException ex) {
- return false;
- }
- }
-
- /**
- * Checks whether we can find a SAAJ 1.2 implementation, being aware of the broken WebLogic 9 SAAJ implementation.
- *
- * WebLogic 9 does implement SAAJ 1.2, but throws UnsupportedOperationExceptions when a SAAJ 1.2 method is called.
- */
- private static boolean isSaaj12() {
- if (Element.class.isAssignableFrom(SOAPElement.class)) {
- // see if we are dealing with WebLogic 9
- try {
- MessageFactory messageFactory = MessageFactory.newInstance();
- SOAPMessage message = messageFactory.createMessage();
- try {
- message.getSOAPBody();
- return true;
- }
- catch (UnsupportedOperationException ex) {
- return false;
- }
- }
- catch (SOAPException e) {
- return false;
- }
- }
- else {
- return false;
- }
- }
+ private static int saajVersion = SAAJ_13;
/**
* Gets the SAAJ version.
+ * Returns {@link #SAAJ_13} as of Spring-WS 2.2.
*
* @return a code comparable to the SAAJ_XX codes in this class
- * @see #SAAJ_11
- * @see #SAAJ_12
- * @see #SAAJ_13
*/
public static int getSaajVersion() {
return saajVersion;
@@ -144,6 +66,7 @@ public abstract class SaajUtils {
/**
* Gets the SAAJ version for the specified {@link SOAPMessage}.
+ * Returns {@link #SAAJ_13} as of Spring-WS 2.2.
*
* @return a code comparable to the SAAJ_XX codes in this class
* @see #SAAJ_11
@@ -158,6 +81,7 @@ public abstract class SaajUtils {
/**
* Gets the SAAJ version for the specified {@link javax.xml.soap.SOAPElement}.
+ * Returns {@link #SAAJ_13} as of Spring-WS 2.2.
*
* @return a code comparable to the SAAJ_XX codes in this class
* @see #SAAJ_11
@@ -165,86 +89,10 @@ public abstract class SaajUtils {
* @see #SAAJ_13
*/
public static int getSaajVersion(SOAPElement soapElement) {
- Assert.notNull(soapElement, "'soapElement' must not be null");
- String soapElementClassName = soapElement.getClass().getName();
- Integer saajVersion = saajVersions.get(soapElementClassName);
- if (saajVersion == null) {
- if (isSaaj12(soapElement)) {
- if (isSaaj13(soapElement)) {
- saajVersion = SAAJ_13;
- }
- else {
- saajVersion = SAAJ_12;
- }
- } else {
- saajVersion = SAAJ_11;
- }
- saajVersions.put(soapElementClassName, saajVersion);
- if (logger.isTraceEnabled()) {
- logger.trace("SOAPElement [" + soapElement.getClass().getName() + "] implements " +
- getSaajVersionString(saajVersion));
- }
- }
- return saajVersion;
+ return SAAJ_13;
}
- private static boolean isSaaj13(SOAPElement soapElement) {
- try {
- Method m = soapElement.getClass().getMethod("getElementQName", new Class[0]);
- // we might be using the SAAJ 1.3 API, while the impl is 1.2
- // let's see if the method is not abstract
- if (Modifier.isAbstract(m.getModifiers())) {
- logger.warn("Detected SAAJ API version 1.3, while implementation provides version 1.2. " +
- "Please replace the SAAJ API jar with a version that corresponds to your runtime" +
- " implementation (which might be provided by your app server).");
- return false;
- }
- else {
- return true;
- }
- }
- catch (NoSuchMethodException e) {
- // getElementQName not found
- return false;
- }
- }
-
- /**
- * Checks whether we can find a SAAJ 1.2 implementation, being aware of the broken WebLogic 9 SAAJ implementation.
- *
- * WebLogic 9 does implement SAAJ 1.2, but throws UnsupportedOperationExceptions when a SAAJ 1.2 method is called.
- */
- private static boolean isSaaj12(SOAPElement soapElement) {
- try {
- Method m = soapElement.getClass().getMethod("getPrefix", new Class[0]);
- // we might be using the SAAJ 1.2 API, while the impl is 1.1
- // let's see if the method is not abstract
- if (Modifier.isAbstract(m.getModifiers())) {
- logger.warn("Detected SAAJ API version 1.2, while implementation provides version 1.1. " +
- "Please replace the SAAJ API jar with a version that corresponds to your runtime " +
- "implementation (which might be provided by your app server).");
- return false;
- }
- else {
- soapElement.getPrefix();
- return true;
- }
- }
- catch (NoSuchMethodException e) {
- // getPrefix not found
- return false;
- }
- catch (UnsupportedOperationException ex) {
- // getPrefix results in UOE, let's see if we're dealing with WL 9
- if (WEBLOGIC_9_SAAJ_EXCEPTION_MESSAGE.equals(ex.getMessage())) {
- return false;
- } else {
- throw ex;
- }
- }
- }
-
- /**
+ /**
* Returns the SAAJ version as a String. The returned string will be "SAAJ 1.3", "SAAJ
* 1.2", or "SAAJ 1.1".
*
@@ -364,4 +212,18 @@ public abstract class SaajUtils {
while (element != null);
return null;
}
+
+ /**
+ * Returns the first child element of the given body.
+ */
+ public static SOAPElement getFirstBodyElement(SOAPBody body) {
+ for (Iterator iterator = body.getChildElements(); iterator.hasNext(); ) {
+ Object child = iterator.next();
+ if (child instanceof SOAPElement) {
+ return (SOAPElement) child;
+ }
+ }
+ return null;
+ }
+
}
diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/AbstractSaajImplementationTestCase.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/AbstractSaajImplementationTestCase.java
deleted file mode 100644
index a08c4190..00000000
--- a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/AbstractSaajImplementationTestCase.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-import java.io.ByteArrayOutputStream;
-import java.util.Iterator;
-import java.util.Locale;
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.Detail;
-import javax.xml.soap.DetailEntry;
-import javax.xml.soap.MessageFactory;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPEnvelope;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.soap.SOAPHeaderElement;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-
-import org.springframework.ws.soap.SoapVersion;
-import org.springframework.xml.transform.StringResult;
-import org.springframework.xml.transform.StringSource;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
-
-public abstract class AbstractSaajImplementationTestCase {
-
- private SaajImplementation implementation;
-
- private SOAPMessage message;
-
- private SOAPEnvelope envelope;
-
- private SOAPBody body;
-
- private SOAPHeader header;
-
- @Before
- public final void setUp() throws Exception {
- implementation = createSaajImplementation();
- MessageFactory messageFactory = MessageFactory.newInstance();
- message = messageFactory.createMessage();
- envelope = message.getSOAPPart().getEnvelope();
- body = envelope.getBody();
- header = envelope.getHeader();
- }
-
- protected abstract SaajImplementation createSaajImplementation();
-
- @Test
- public void testGetName() throws Exception {
- QName name = implementation.getName(message.getSOAPPart().getEnvelope());
- Assert.assertEquals("Invalid name", SoapVersion.SOAP_11.getEnvelopeName(), name);
- }
-
- @Test
- public void testGetSource() throws Exception {
- Source source = implementation.getSource(message.getSOAPPart().getEnvelope().getBody());
- Assert.assertNotNull("No source returned", source);
- Transformer transformer = TransformerFactory.newInstance().newTransformer();
- StringResult result = new StringResult();
- transformer.transform(source, result);
- assertXMLEqual("", result.toString());
- }
-
- @Test
- public void testGetResult() throws Exception {
- Source source = new StringSource("");
- Transformer transformer = TransformerFactory.newInstance().newTransformer();
- transformer.transform(source, implementation.getResult(message.getSOAPPart().getEnvelope().getBody()));
- }
-
- @Test
- public void testGetEnvelope() throws Exception {
- SOAPEnvelope envelope = implementation.getEnvelope(message);
- Assert.assertEquals("Invalid envelope", message.getSOAPPart().getEnvelope(), envelope);
- }
-
- @Test
- public void testGetHeader() throws Exception {
- SOAPHeader header = implementation.getHeader(message.getSOAPPart().getEnvelope());
- Assert.assertEquals("Invalid header", message.getSOAPPart().getEnvelope().getHeader(), header);
- }
-
- @Test
- public void testGetBody() throws Exception {
- SOAPBody body = implementation.getBody(message.getSOAPPart().getEnvelope());
- Assert.assertEquals("Invalid body", message.getSOAPPart().getEnvelope().getBody(), body);
- }
-
- @Test
- public void testExampleAllHeaderElements() throws Exception {
- Iterator iterator = implementation.examineAllHeaderElements(header);
- Assert.assertFalse("Header elements present", iterator.hasNext());
- createHeaderElement();
- iterator = implementation.examineAllHeaderElements(header);
- Assert.assertTrue("No header elements present", iterator.hasNext());
- }
-
- @Test
- public void testExampleMustUnderstandHeaderElements() throws Exception {
- SOAPHeaderElement headerElement = createHeaderElement();
- headerElement.setMustUnderstand(true);
- Iterator iterator = implementation.examineAllHeaderElements(header);
- Assert.assertTrue("No header elements present", iterator.hasNext());
- }
-
- @Test
- public void testAddHeaderElement() throws Exception {
- SOAPHeaderElement headerElement = implementation
- .addHeaderElement(header, new QName("http://springframework.org/spring-ws", "Header"));
- Assert.assertNotNull("No header element returned", headerElement);
- Assert.assertEquals("Invalid namespace", "http://springframework.org/spring-ws",
- headerElement.getElementName().getURI());
- Assert.assertEquals("Invalid local name", "Header", headerElement.getElementName().getLocalName());
- }
-
- @Test
- public void testGetActorOrRole() throws Exception {
- SOAPHeaderElement headerElement = createHeaderElement();
- String actor = "http://springframework.org/spring-ws/Actor";
- headerElement.setActor(actor);
- Assert.assertEquals("Invalid actor", actor, implementation.getActorOrRole(headerElement));
- }
-
- private SOAPHeaderElement createHeaderElement() throws SOAPException {
- Name name = envelope.createName("Header", "", "http://springframework.org/spring-ws");
- return header.addHeaderElement(name);
- }
-
- @Test
- public void testSetActorOrRole() throws Exception {
- SOAPHeaderElement headerElement = createHeaderElement();
- String actor = "http://springframework.org/spring-ws/Actor";
- implementation.setActorOrRole(headerElement, actor);
- Assert.assertEquals("Invalid actor", headerElement.getActor(), actor);
- }
-
- @Test
- public void testGetMustUnderstand() throws Exception {
- SOAPHeaderElement headerElement = createHeaderElement();
- headerElement.setMustUnderstand(true);
- Assert.assertTrue("Invalid mustUnderstand", implementation.getMustUnderstand(headerElement));
- }
-
- @Test
- public void testSetMustUnderstand() throws Exception {
- SOAPHeaderElement headerElement = createHeaderElement();
- implementation.setMustUnderstand(headerElement, true);
- Assert.assertTrue("Invalid mustUnderstand", headerElement.getMustUnderstand());
- }
-
- @Test
- public void testHasFault() throws Exception {
- Assert.assertFalse("Body has fault", implementation.hasFault(body));
- body.addFault();
- Assert.assertTrue("Body has no fault", implementation.hasFault(body));
- }
-
- @Test
- public void testGetFault() throws Exception {
- Assert.assertNull("Body has fault", implementation.getFault(body));
- body.addFault();
- Assert.assertNotNull("Body has no fault", implementation.getFault(body));
- }
-
- @Test
- public void testAddFault() throws Exception {
- implementation
- .addFault(body, new QName("http://springframework.org/spring-ws", "Fault"), "Fault", Locale.ENGLISH);
- Assert.assertTrue("No Fault added", body.hasFault());
- }
-
- @Test
- public void testGetFaultCode() throws Exception {
- SOAPFault fault = createFault();
- Assert.assertEquals("Invalid fault code", new QName("http://springframework.org/spring-ws", "Fault"),
- implementation.getFaultCode(fault));
- }
-
- private SOAPFault createFault() throws SOAPException {
- return body.addFault(new QName("http://springframework.org/spring-ws", "Fault"), "Fault", Locale.ENGLISH);
- }
-
- @Test
- public void testGetFaultActor() throws Exception {
- SOAPFault fault = createFault();
- String actor = "http://springframework.org/spring-ws/Actor";
- fault.setFaultActor(actor);
- Assert.assertEquals("Invalid actor", actor, implementation.getFaultActor(fault));
- }
-
- @Test
- public void testSetFaultActor() throws Exception {
- SOAPFault fault = createFault();
- String actor = "http://springframework.org/spring-ws/Actor";
- implementation.setFaultActor(fault, actor);
- Assert.assertEquals("Invalid actor", actor, fault.getFaultActor());
- }
-
- @Test
- public void testGetFaultString() throws Exception {
- SOAPFault fault = createFault();
- String faultString = "FaultString";
- fault.setFaultString(faultString);
- Assert.assertEquals("Invalid fault string", faultString, implementation.getFaultString(fault));
- }
-
- @Test
- public void testGetFaultStringLocale() throws Exception {
- SOAPFault fault = createFault();
- Assert.assertEquals("Invalid fault string", Locale.ENGLISH, implementation.getFaultStringLocale(fault));
- }
-
- @Test
- public void testGetFaultDetail() throws Exception {
- SOAPFault fault = createFault();
- Assert.assertNull("Fault Detail returned", implementation.getFaultDetail(fault));
- fault.addDetail();
- Assert.assertNotNull("No Fault Detail returned", implementation.getFaultDetail(fault));
- }
-
- @Test
- public void testAddFaultDetail() throws Exception {
- SOAPFault fault = createFault();
- Detail detail = implementation.addFaultDetail(fault);
- Assert.assertEquals("Invalid fault detail", fault.getDetail(), detail);
- }
-
- @Test
- public void testAddDetailEntry() throws Exception {
- SOAPFault fault = createFault();
- Detail detail = fault.addDetail();
- DetailEntry detailEntry =
- implementation.addDetailEntry(detail, new QName("http://springframework.org/spring-ws", "DetailEntry"));
- Assert.assertNotNull("No detail entry", detailEntry);
- Iterator> iterator = detail.getDetailEntries();
- Assert.assertTrue("No detail entry", iterator.hasNext());
- Assert.assertEquals("Invalid detail entry", detailEntry, iterator.next());
- }
-
- @Test
- public void testAddTextNode() throws Exception {
- SOAPFault fault = createFault();
- Detail detail = fault.addDetail();
- Name name = envelope.createName("DetailEntry", "", "http://springframework.org/spring-ws");
- DetailEntry detailEntry = detail.addDetailEntry(name);
- implementation.addTextNode(detailEntry, "text");
- Assert.assertEquals("Invalid text", "text", detailEntry.getValue());
- }
-
- @Test
- public void testGetDetailEntries() throws Exception {
- SOAPFault fault = createFault();
- Detail detail = fault.addDetail();
- Iterator iterator = implementation.getDetailEntries(detail);
- Assert.assertFalse("Detail entries found", iterator.hasNext());
- Name name = envelope.createName("DetailEntry", "", "http://springframework.org/spring-ws");
- DetailEntry detailEntry = detail.addDetailEntry(name);
- iterator = implementation.getDetailEntries(detail);
- Assert.assertTrue("No detail entries found", iterator.hasNext());
- Assert.assertEquals("Invalid detail entry found", detailEntry, iterator.next());
- Assert.assertFalse("Detail entries found", iterator.hasNext());
- }
-
- @Test
- public void testWriteTo() throws Exception {
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- implementation.writeTo(message, os);
- Assert.assertTrue("Nothing written", os.toByteArray().length > 0);
- }
-
- @Test
- public void testGetAttachments() throws Exception {
- Iterator iterator = implementation.getAttachments(message);
- Assert.assertFalse("Message has attachments", iterator.hasNext());
- AttachmentPart attachmentPart = message.createAttachmentPart();
- message.addAttachmentPart(attachmentPart);
- iterator = implementation.getAttachments(message);
- Assert.assertTrue("Message has no attachments", iterator.hasNext());
- Assert.assertEquals("Invalid attachment part", attachmentPart, iterator.next());
- }
-
- @Test
- public void testAddAttachmentPart() throws Exception {
- DataHandler dataHandler = new DataHandler("data", "text/plain");
- AttachmentPart attachmentPart = implementation.addAttachmentPart(message, dataHandler);
- Assert.assertNotNull("No attachment part", attachmentPart);
- }
-
- @Test
- public void testRemoveContents() throws Exception {
- body.addBodyElement(new QName("foo", "bar"));
-
- Assert.assertTrue("Body has child nodes", body.hasChildNodes());
- implementation.removeContents(message.getSOAPBody());
- Assert.assertFalse("Body has child nodes", body.hasChildNodes());
- }
-
-}
\ No newline at end of file
diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj11ImplementationTest.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj11ImplementationTest.java
deleted file mode 100644
index 15bd8c93..00000000
--- a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj11ImplementationTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-public class Saaj11ImplementationTest extends AbstractSaajImplementationTestCase {
-
- @Override
- protected SaajImplementation createSaajImplementation() {
- return Saaj11Implementation.getInstance();
- }
-
- @Override
- public void testGetFaultCode() throws Exception {
- }
-
- @Override
- public void testGetFaultStringLocale() throws Exception {
- }
-
- @Override
- public void testAddFault() throws Exception {
- }
-}
diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj12ImplementationTest.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj12ImplementationTest.java
deleted file mode 100644
index d42eb162..00000000
--- a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj12ImplementationTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-public class Saaj12ImplementationTest extends AbstractSaajImplementationTestCase {
-
- @Override
- protected SaajImplementation createSaajImplementation() {
- return Saaj12Implementation.getInstance();
- }
-
-}
\ No newline at end of file
diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj13ImplementationTest.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj13ImplementationTest.java
deleted file mode 100644
index 716091b4..00000000
--- a/spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj13ImplementationTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2005-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.ws.soap.saaj;
-
-public class Saaj13ImplementationTest extends AbstractSaajImplementationTestCase {
-
- @Override
- protected SaajImplementation createSaajImplementation() {
- return Saaj13Implementation.getInstance();
- }
-
-}
diff --git a/src/reference/docbook/what-is-spring-ws.xml b/src/reference/docbook/what-is-spring-ws.xml
index e6850d56..1dc1589b 100644
--- a/src/reference/docbook/what-is-spring-ws.xml
+++ b/src/reference/docbook/what-is-spring-ws.xml
@@ -78,8 +78,8 @@
Runtime environment
- Spring Web Services requires a standard Java 1.5 Runtime Environment. Java 1.6 is also supported.
- Spring-WS also requires Spring 3.0 or higher.
+ Spring Web Services requires a standard Java 1.6 Runtime Environment. Java 1.7 and 1.8 are also supported.
+ Spring-WS also requires Spring 3.2 or higher.
Spring-WS consists of a number of modules, which are described in the remainder of this section.