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.
This commit is contained in:
Arjen Poutsma
2014-04-11 15:31:10 +02:00
parent 160907a6e1
commit a23de2afd2
27 changed files with 242 additions and 2190 deletions

View File

@@ -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'

View File

@@ -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 <code>SaajImplementation</code> 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<QName> getAllAttributes(SOAPElement element) {
List<QName> results = new ArrayList<QName>();
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<SOAPHeaderElement> examineAllHeaderElements(SOAPHeader header) {
List<SOAPHeaderElement> result = new ArrayList<SOAPHeaderElement>();
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<SOAPHeaderElement> examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) {
List<SOAPHeaderElement> result = new ArrayList<SOAPHeaderElement>();
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 <code>true</code> if the body has a fault, <code>false</code> 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<DetailEntry> 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<SOAPElement> 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<AttachmentPart> getAttachments(SOAPMessage message) {
return message.getAttachments();
}
@Override
@SuppressWarnings("unchecked")
public Iterator<AttachmentPart> 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<QName> 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");
}
}

View File

@@ -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 <code>SaajImplementation</code> 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<QName> getAllAttributes(SOAPElement element) {
List<QName> results = new ArrayList<QName>();
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<SOAPHeaderElement> examineAllHeaderElements(SOAPHeader header) {
return header.examineAllHeaderElements();
}
@Override
@SuppressWarnings("unchecked")
public Iterator<SOAPHeaderElement> 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<DetailEntry> 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<SOAPElement> 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<AttachmentPart> getAttachments(SOAPMessage message) {
return message.getAttachments();
}
@Override
@SuppressWarnings("unchecked")
public Iterator<AttachmentPart> 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<QName> 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");
}
}

View File

@@ -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 <code>SaajImplementation</code> 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<QName> 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<QName> 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<SOAPHeaderElement> examineAllHeaderElements(SOAPHeader header) {
return header.examineAllHeaderElements();
}
@Override
@SuppressWarnings("unchecked")
public Iterator<SOAPHeaderElement> 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<DetailEntry> 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<SOAPElement> 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<AttachmentPart> getAttachments(SOAPMessage message) {
return message.getAttachments();
}
@Override
@SuppressWarnings("unchecked")
public Iterator<AttachmentPart> 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;
}
}

View File

@@ -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 <code>Source</code> of the given element. */
abstract Source getSource(SOAPElement element);
/** Returns the writable <code>Result</code> 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<QName> 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<SOAPElement> 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<AttachmentPart> getAttachments(SOAPMessage message);
/** Returns an iteration over all attachments in the message with the given headers. */
abstract Iterator<AttachmentPart> 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<SOAPHeaderElement> examineAllHeaderElements(SOAPHeader header);
/** Returns all header elements for which the must understand attribute is true, given the actor or role. */
abstract Iterator<SOAPHeaderElement> 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 <code>true</code> if the body has a fault, <code>false</code> 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<QName> 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<DetailEntry> getDetailEntries(Detail detail);
/*
* DetailEntry
*/
/** Adds a text node to the given detail entry. */
abstract void addTextNode(DetailEntry detailEntry, String text) throws SOAPException;
}

View File

@@ -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) {

View File

@@ -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();
}
}

View File

@@ -42,7 +42,7 @@ class SaajSoap11Header extends SaajSoapHeader implements Soap11Header {
public Iterator<SoapHeaderElement> examineHeaderElementsToProcess(String[] actors) {
List<SOAPHeaderElement> result = new ArrayList<SOAPHeaderElement>();
Iterator<SOAPHeaderElement> iterator = getImplementation().examineAllHeaderElements(getSaajHeader());
Iterator<SOAPHeaderElement> iterator = getSaajHeader().examineAllHeaderElements();
while (iterator.hasNext()) {
SOAPHeaderElement saajHeaderElement = iterator.next();
String headerActor = saajHeaderElement.getActor();

View File

@@ -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) {

View File

@@ -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<QName> 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();
}
}

View File

@@ -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<SoapHeaderElement> examineHeaderElementsToProcess(String[] roles, boolean isUltimateDestination)
throws SoapHeaderException {
List<SOAPHeaderElement> result = new ArrayList<SOAPHeaderElement>();
Iterator<SOAPHeaderElement> iterator = getImplementation().examineAllHeaderElements(getSaajHeader());
Iterator<SOAPHeaderElement> iterator = getSaajHeader().examineAllHeaderElements();
while (iterator.hasNext()) {
SOAPHeaderElement saajHeaderElement = iterator.next();
String headerRole = saajHeaderElement.getRole();

View File

@@ -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 <code>SoapBody</code> interface. Wraps a {@link javax.xml.soap.SOAPBody}.
@@ -35,18 +38,21 @@ abstract class SaajSoapBody extends SaajSoapElement<SOAPBody> 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() {

View File

@@ -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 <code>SoapElement</code> interface. Wraps a {@link javax.xml.soap.SOAPElement}.
@@ -36,55 +36,51 @@ class SaajSoapElement<T extends SOAPElement> 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<QName> 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<T extends SOAPElement> 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;
}
}

View File

@@ -49,8 +49,8 @@ class SaajSoapEnvelope extends SaajSoapElement<SOAPEnvelope> 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<SOAPEnvelope> 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);
}

View File

@@ -36,22 +36,25 @@ abstract class SaajSoapFault extends SaajSoapElement<SOAPFault> 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) {

View File

@@ -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<SOAPFaultElement> 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<SOAPFaultElement> implements S
}
public Iterator<SoapFaultDetailElement> getDetailEntries() {
Iterator<DetailEntry> iterator = getImplementation().getDetailEntries(getSaajDetail());
Iterator<DetailEntry> iterator = getSaajDetail().getDetailEntries();
return new SaajSoapFaultDetailElementIterator(iterator);
}

View File

@@ -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<DetailEntry> 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);

View File

@@ -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<SOAPHeader> implements Soa
super(header);
}
@Override
@SuppressWarnings("unchecked")
public Iterator<SoapHeaderElement> examineAllHeaderElements() throws SoapHeaderException {
Iterator<SOAPHeaderElement> iterator = getImplementation().examineAllHeaderElements(getSaajHeader());
Iterator<SOAPHeaderElement> iterator = getSaajHeader().examineAllHeaderElements();
return new SaajSoapHeaderElementIterator(iterator);
}
@Override
@SuppressWarnings("unchecked")
public Iterator<SoapHeaderElement> 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<SoapHeaderElement> examineMustUnderstandHeaderElements(String actorOrRole) throws SoapHeaderException {
Iterator<SOAPHeaderElement> iterator = getImplementation().examineMustUnderstandHeaderElements(getSaajHeader(), actorOrRole);
Iterator<SOAPHeaderElement> 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<SOAPHeader> implements Soa
}
}
@SuppressWarnings("unchecked")
@Override
public void removeHeaderElement(QName name) throws SoapHeaderException {
try {
Iterator<SOAPElement> iterator = getImplementation().getChildElements(getSaajHeader(), name);
if (iterator.hasNext()) {
SOAPElement element = iterator.next();
element.detachNode();
}
}
catch (SOAPException ex) {
throw new SaajSoapHeaderException(ex);
}
Iterator<SOAPElement> 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<SoapHeaderElement> {
@@ -102,15 +103,18 @@ abstract class SaajSoapHeader extends SaajSoapElement<SOAPHeader> 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();
}

View File

@@ -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<SOAPHeaderElement> 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();
}
}

View File

@@ -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 <code>SaajSoapMessage</code> based on the given SAAJ <code>SOAPMessage</code>.
*
@@ -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<Attachment> getAttachments() throws AttachmentException {
Iterator<AttachmentPart> iterator = getImplementation().getAttachments(getSaajMessage());
Iterator<AttachmentPart> 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<AttachmentPart> iterator = getImplementation().getAttachment(getSaajMessage(), mimeHeaders);
Iterator<AttachmentPart> 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();
}

View File

@@ -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);
}
}
}

View File

@@ -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<String, Integer> saajVersions = new ConcurrentHashMap<String, Integer>();
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.
* <p/>
* 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.
* <p/>
* 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 "<code>SAAJ 1.3</code>", "<code>SAAJ
* 1.2</code>", or "<code>SAAJ 1.1</code>".
*
@@ -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;
}
}

View File

@@ -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("<Body xmlns='http://schemas.xmlsoap.org/soap/envelope/'/>", result.toString());
}
@Test
public void testGetResult() throws Exception {
Source source = new StringSource("<content xmlns='http://springframework.org/spring-ws'/>");
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<SOAPHeaderElement> 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<SOAPHeaderElement> 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<DetailEntry> 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<AttachmentPart> 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());
}
}

View File

@@ -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 {
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -78,8 +78,8 @@
<section>
<title>Runtime environment</title>
<para>
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.
</para>
<para>
Spring-WS consists of a number of modules, which are described in the remainder of this section.