From a23de2afd26ddf0b41930f5bb51f2aec31306374 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Fri, 11 Apr 2014 15:31:10 +0200 Subject: [PATCH] Removed SaajImplementation bridge Removed SaajImplementation bridge, since Spring-WS 2.2 requires JDK 1.6 and JDK 1.6 comes with SAAJ 1.3 provided. --- build.gradle | 2 +- .../ws/soap/saaj/Saaj11Implementation.java | 438 ------------------ .../ws/soap/saaj/Saaj12Implementation.java | 382 --------------- .../ws/soap/saaj/Saaj13Implementation.java | 372 --------------- .../ws/soap/saaj/SaajImplementation.java | 237 ---------- .../ws/soap/saaj/SaajSoap11Body.java | 15 +- .../ws/soap/saaj/SaajSoap11Fault.java | 8 +- .../ws/soap/saaj/SaajSoap11Header.java | 2 +- .../ws/soap/saaj/SaajSoap12Body.java | 15 +- .../ws/soap/saaj/SaajSoap12Fault.java | 18 +- .../ws/soap/saaj/SaajSoap12Header.java | 10 +- .../ws/soap/saaj/SaajSoapBody.java | 16 +- .../ws/soap/saaj/SaajSoapElement.java | 53 +-- .../ws/soap/saaj/SaajSoapEnvelope.java | 8 +- .../ws/soap/saaj/SaajSoapFault.java | 11 +- .../ws/soap/saaj/SaajSoapFaultDetail.java | 7 +- .../soap/saaj/SaajSoapFaultDetailElement.java | 5 +- .../ws/soap/saaj/SaajSoapHeader.java | 46 +- .../ws/soap/saaj/SaajSoapHeaderElement.java | 30 +- .../ws/soap/saaj/SaajSoapMessage.java | 135 +++--- .../ws/soap/saaj/SaajSoapMessageFactory.java | 25 +- .../ws/soap/saaj/support/SaajUtils.java | 180 +------ .../AbstractSaajImplementationTestCase.java | 324 ------------- .../soap/saaj/Saaj11ImplementationTest.java | 37 -- .../soap/saaj/Saaj12ImplementationTest.java | 26 -- .../soap/saaj/Saaj13ImplementationTest.java | 26 -- src/reference/docbook/what-is-spring-ws.xml | 4 +- 27 files changed, 242 insertions(+), 2190 deletions(-) delete mode 100644 spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java delete mode 100644 spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java delete mode 100644 spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java delete mode 100644 spring-ws-core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java delete mode 100644 spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/AbstractSaajImplementationTestCase.java delete mode 100644 spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj11ImplementationTest.java delete mode 100644 spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj12ImplementationTest.java delete mode 100644 spring-ws-core/src/test/java/org/springframework/ws/soap/saaj/Saaj13ImplementationTest.java 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.