diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/InputStreamSourceDataSource.java b/core/src/main/java/org/springframework/ws/soap/saaj/InputStreamSourceDataSource.java new file mode 100644 index 00000000..0c9aebf6 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/InputStreamSourceDataSource.java @@ -0,0 +1,58 @@ +/* + * Copyright 2006 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.InputStream; +import java.io.OutputStream; +import javax.activation.DataSource; + +import org.springframework.core.io.InputStreamSource; + +/** + * Activation framework DataSource that wraps a Spring InputStreamSource. + * + * @author Arjen Poutsma + */ +class InputStreamSourceDataSource implements DataSource { + + private final InputStreamSource inputStreamSource; + + private final String contentType; + + public InputStreamSourceDataSource(InputStreamSource inputStreamSource, String contentType) { + this.inputStreamSource = inputStreamSource; + this.contentType = contentType; + } + + public InputStream getInputStream() throws IOException { + return inputStreamSource.getInputStream(); + } + + public OutputStream getOutputStream() { + throw new UnsupportedOperationException("Read-only javax.activation.DataSource"); + } + + public String getContentType() { + return contentType; + } + + public String getName() { + throw new UnsupportedOperationException("DataSource name not available"); + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java new file mode 100644 index 00000000..185ba4ec --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java @@ -0,0 +1,126 @@ +/* + * Copyright 2006 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.util.Iterator; +import java.util.Locale; +import javax.xml.namespace.QName; +import javax.xml.soap.Detail; +import javax.xml.soap.DetailEntry; +import javax.xml.soap.Name; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFault; +import javax.xml.soap.SOAPHeader; +import javax.xml.soap.SOAPHeaderElement; + +import org.springframework.ws.soap.saaj.support.SaajUtils; + +/** + * SAAJ 1.2 specific implementation of the SaajImplementation interface. + * + * @author Arjen Poutsma + */ +public class Saaj12Implementation extends SaajImplementation { + + private static final Saaj12Implementation INSTANCE = new Saaj12Implementation(); + + private Saaj12Implementation() { + } + + public static Saaj12Implementation getInstance() { + return INSTANCE; + } + + public QName getName(SOAPElement element) { + return SaajUtils.toQName(element.getElementName()); + } + + public QName getFaultCode(SOAPFault fault) { + return SaajUtils.toQName(fault.getFaultCodeAsName()); + } + + public boolean isSoap11(SOAPElement element) { + return true; + } + + public DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException { + Name detailEntryName = SaajUtils.toName(name, detail); + return detail.addDetailEntry(detailEntryName); + } + + public SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException { + Name saajName = SaajUtils.toName(name, header); + return header.addHeaderElement(saajName); + } + + 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); + } + } + + // + // SOAP 1.2 + // + + public String getFaultRole(SOAPFault fault) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public void setFaultRole(SOAPFault fault, String role) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public Iterator getFaultSubcodes(SOAPFault fault) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public void appendFaultSubcode(SOAPFault fault, QName subcode) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public String getFaultNode(SOAPFault fault) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public void setFaultNode(SOAPFault fault, String uri) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public String getFaultReasonText(SOAPFault fault, Locale locale) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + + public void setFaultReasonText(SOAPFault fault, Locale locale, String text) { + throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2"); + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java new file mode 100644 index 00000000..2bd0396c --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java @@ -0,0 +1,117 @@ +/* + * Copyright 2006 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.util.Iterator; +import java.util.Locale; +import javax.xml.namespace.QName; +import javax.xml.soap.Detail; +import javax.xml.soap.DetailEntry; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPConstants; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFault; +import javax.xml.soap.SOAPHeader; +import javax.xml.soap.SOAPHeaderElement; + +/** + * SAAJ 1.3 specific implementation of the SaajImplementation interface. + * + * @author Arjen Poutsma + */ +public class Saaj13Implementation extends SaajImplementation { + + private static final Saaj13Implementation INSTANCE = new Saaj13Implementation(); + + private Saaj13Implementation() { + } + + public static Saaj13Implementation getInstance() { + return INSTANCE; + } + + public QName getName(SOAPElement element) { + return element.getElementQName(); + } + + public QName getFaultCode(SOAPFault fault) { + return fault.getFaultCodeAsQName(); + } + + public boolean isSoap11(SOAPElement element) { + return SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE.equals(element.getNamespaceURI()); + } + + public DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException { + return detail.addDetailEntry(name); + } + + public SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException { + return header.addHeaderElement(name); + } + + public String getFaultRole(SOAPFault fault) { + return fault.getFaultRole(); + } + + public void setFaultRole(SOAPFault fault, String role) throws SOAPException { + fault.setFaultRole(role); + } + + public SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) throws SOAPException { + return header.addNotUnderstoodHeaderElement(name); + } + + public SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris) + throws SOAPException { + return header.addUpgradeHeaderElement(supportedSoapUris); + } + + public Iterator getFaultSubcodes(SOAPFault fault) { + return fault.getFaultSubcodes(); + } + + public void appendFaultSubcode(SOAPFault fault, QName subcode) throws SOAPException { + fault.appendFaultSubcode(subcode); + } + + public String getFaultNode(SOAPFault fault) { + return fault.getFaultNode(); + } + + public void setFaultNode(SOAPFault fault, String uri) throws SOAPException { + fault.setFaultNode(uri); + } + + public String getFaultReasonText(SOAPFault fault, Locale locale) throws SOAPException { + return fault.getFaultReasonText(locale); + } + + public void setFaultReasonText(SOAPFault fault, Locale locale, String text) throws SOAPException { + fault.addFaultReasonText(text, locale); + } + + 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); + } + } +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajAttachment.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajAttachment.java new file mode 100644 index 00000000..ef66bbea --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajAttachment.java @@ -0,0 +1,75 @@ +/* + * Copyright 2006 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.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import javax.xml.soap.AttachmentPart; +import javax.xml.soap.SOAPException; + +import org.springframework.util.Assert; +import org.springframework.ws.soap.Attachment; + +/** + * SAAJ-specific implementation of the Attachment interface. Wraps a {@link + * javax.xml.soap.AttachmentPart}. + * + * @author Arjen Poutsma + */ +class SaajAttachment implements Attachment { + + private final AttachmentPart saajAttachment; + + public SaajAttachment(AttachmentPart saajAttachment) { + Assert.notNull(saajAttachment, "saajAttachment must not be null"); + this.saajAttachment = saajAttachment; + } + + public String getId() { + return saajAttachment.getContentId(); + } + + public void setId(String id) { + saajAttachment.setContentId(id); + } + + public String getContentType() { + return saajAttachment.getContentType(); + } + + public InputStream getInputStream() throws IOException { + try { + return saajAttachment.getDataHandler().getInputStream(); + } + catch (SOAPException e) { + return new ByteArrayInputStream(new byte[0]); + } + } + + public long getSize() { + try { + int result = saajAttachment.getSize(); + // SAAJ returns -1 when the size cannot be determined + return result != -1 ? result : 0; + } + catch (SOAPException ex) { + throw new SaajAttachmentException(ex); + } + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java new file mode 100644 index 00000000..f1d935b9 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java @@ -0,0 +1,249 @@ +/* + * Copyright 2006 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.activation.DataSource; +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.SOAPBodyElement; +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.TransportOutputStream; + +/** + * Forms bridge between the SoapMessage hierarchy and specific version of SAAJ. Various Saaj* + * classes delegate to this implementation to remain independent of SAAJ versions. + * + * @author Arjen Poutsma + */ +abstract class SaajImplementation { + + protected SaajImplementation() { + } + + /** + * Returns the singleton instance for the version of SAAJ in use. + */ + public static SaajImplementation getImplementation() { + if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_12) { + return Saaj12Implementation.getInstance(); + } + else if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_13) { + return Saaj13Implementation.getInstance(); + } + else { + throw new IllegalStateException("Could not find SAAJ 1.2 or SAAJ 1.3 on the classpath"); + } + } + + public abstract QName getName(SOAPElement element); + + public Source getSource(SOAPElement element) { + return new DOMSource(element); + } + + public Result getResult(SOAPElement element) { + return new DOMResult(element); + } + + public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException { + return message.getSOAPPart().getEnvelope(); + } + + public SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException { + return envelope.getHeader(); + } + + public SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException { + return envelope.getBody(); + } + + public String getActorOrRole(SOAPHeaderElement headerElement) { + return headerElement.getActor(); + } + + public void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole) { + headerElement.setActor(actorOrRole); + } + + public boolean getMustUnderstand(SOAPHeaderElement headerElement) { + return headerElement.getMustUnderstand(); + } + + public void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand) { + headerElement.setMustUnderstand(mustUnderstand); + } + + public abstract QName getFaultCode(SOAPFault fault); + + public String getFaultActor(SOAPFault fault) { + return fault.getFaultActor(); + } + + public void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException { + fault.setFaultActor(actorOrRole); + } + + public void addTextNode(DetailEntry detailEntry, String text) throws SOAPException { + detailEntry.addTextNode(text); + } + + public Iterator getDetailEntries(Detail detail) { + return detail.getDetailEntries(); + } + + public SOAPBodyElement getFirstBodyElement(SOAPBody body) { + for (Iterator iterator = body.getChildElements(); iterator.hasNext();) { + Object child = iterator.next(); + if (child instanceof SOAPBodyElement) { + return (SOAPBodyElement) child; + } + } + return null; + } + + public boolean hasFault(SOAPBody body) { + return body.hasFault(); + } + + public SOAPFault getFault(SOAPBody body) { + return body.getFault(); + } + + public abstract boolean isSoap11(SOAPElement element); + + public void removeContents(SOAPElement element) { + element.removeContents(); + } + + public abstract DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException; + + public Iterator examineAllHeaderElements(SOAPHeader header) { + return header.examineAllHeaderElements(); + } + + public Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) { + return header.examineMustUnderstandHeaderElements(actorOrRole); + } + + public abstract SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException; + + public abstract String getFaultRole(SOAPFault fault); + + public abstract void setFaultRole(SOAPFault fault, String role) throws SOAPException; + + public abstract SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) throws SOAPException; + + public abstract SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris) + throws SOAPException; + + public Detail getFaultDetail(SOAPFault fault) { + return fault.getDetail(); + } + + public Detail addFaultDetail(SOAPFault fault) throws SOAPException { + return fault.addDetail(); + } + + public String getFaultString(SOAPFault fault) { + return fault.getFaultString(); + } + + public Locale getFaultStringLocale(SOAPFault fault) { + return fault.getFaultStringLocale(); + } + + public abstract Iterator getFaultSubcodes(SOAPFault fault); + + public abstract void appendFaultSubcode(SOAPFault fault, QName subcode) throws SOAPException; + + public abstract String getFaultNode(SOAPFault fault); + + public abstract void setFaultNode(SOAPFault fault, String uri) throws SOAPException; + + public abstract String getFaultReasonText(SOAPFault fault, Locale locale) throws SOAPException; + + public abstract void setFaultReasonText(SOAPFault fault, Locale locale, String text) throws SOAPException; + + public abstract SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) + throws SOAPException; + + 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("Content-Type"))) { + if (isSoap11(getEnvelope(message))) { + headers.addHeader("Content-Type", SoapVersion.SOAP_11.getContentType()); + } + else { + headers.addHeader("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); + + } + + public Iterator getAttachments(SOAPMessage message) { + return message.getAttachments(); + } + + public Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders) { + return message.getAttachments(mimeHeaders); + } + + public AttachmentPart addAttachmentPart(SOAPMessage message, DataSource dataSource) { + AttachmentPart attachmentPart = message.createAttachmentPart(new DataHandler(dataSource)); + message.addAttachmentPart(attachmentPart); + return attachmentPart; + } +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Body.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Body.java new file mode 100644 index 00000000..6ba137f3 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Body.java @@ -0,0 +1,79 @@ +/* + * Copyright 2006 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.util.Locale; +import javax.xml.namespace.QName; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFault; + +import org.springframework.util.Assert; +import org.springframework.ws.soap.SoapFault; +import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.soap.soap11.Soap11Body; +import org.springframework.ws.soap.soap11.Soap11Fault; + +/** + * SAAJ-specific implementation of the Soap11Body interface. Wraps a {@link javax.xml.soap.SOAPBody}. + * + * @author Arjen Poutsma + */ +class SaajSoap11Body extends SaajSoapBody implements Soap11Body { + + public SaajSoap11Body(SOAPBody body) { + super(body); + } + + public SoapFault getFault() { + SOAPFault fault = getImplementation().getFault(getSaajBody()); + return new SaajSoap11Fault(fault); + } + + public Soap11Fault addFault(QName faultCode, String faultString, Locale faultStringLocale) { + Assert.notNull(faultCode, "No faultCode given"); + Assert.hasLength(faultString, "faultString cannot be empty"); + 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); + return new SaajSoap11Fault(saajFault); + } + catch (SOAPException ex) { + throw new SaajSoapFaultException(ex); + } + } + + public SoapFault addClientOrSenderFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_11.getClientOrSenderFaultName(), faultString, locale); + } + + public SoapFault addMustUnderstandFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_11.getMustUnderstandFaultName(), faultString, locale); + } + + public SoapFault addServerOrReceiverFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_11.getServerOrReceiverFaultName(), faultString, locale); + } + + public SoapFault addVersionMismatchFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_11.getVersionMismatchFaultName(), faultString, locale); + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Fault.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Fault.java new file mode 100644 index 00000000..d08497b0 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap11Fault.java @@ -0,0 +1,56 @@ +/* + * Copyright 2006 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.util.Locale; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFault; + +import org.springframework.ws.soap.soap11.Soap11Fault; + +/** + * SAAJ-specific implementation of the Soap11Fault interface. Wraps a {@link javax.xml.soap.SOAPFault}. + * + * @author Arjen Poutsma + */ +class SaajSoap11Fault extends SaajSoapFault implements Soap11Fault { + + SaajSoap11Fault(SOAPFault fault) { + super(fault); + } + + public String getFaultActorOrRole() { + return getImplementation().getFaultActor(getSaajFault()); + } + + public void setFaultActorOrRole(String faultActor) { + try { + getImplementation().setFaultActor(getSaajFault(), faultActor); + } + catch (SOAPException ex) { + throw new SaajSoapFaultException(ex); + } + } + + public String getFaultString() { + return getImplementation().getFaultString(getSaajFault()); + } + + public Locale getFaultStringLocale() { + return getImplementation().getFaultStringLocale(getSaajFault()); + } +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Body.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Body.java new file mode 100644 index 00000000..96eec751 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Body.java @@ -0,0 +1,88 @@ +/* + * Copyright 2006 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.util.Locale; +import javax.xml.namespace.QName; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFault; + +import org.springframework.util.Assert; +import org.springframework.ws.soap.SoapFault; +import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.soap.soap12.Soap12Body; +import org.springframework.ws.soap.soap12.Soap12Fault; + +/** + * SAAJ-specific implementation of the Soap12Body interface. Wraps a {@link javax.xml.soap.SOAPBody}. + * + * @author Arjen Poutsma + */ +class SaajSoap12Body extends SaajSoapBody implements Soap12Body { + + public SaajSoap12Body(SOAPBody body) { + super(body); + } + + public SoapFault getFault() { + SOAPFault fault = getImplementation().getFault(getSaajBody()); + return new SaajSoap12Fault(fault); + } + + public SoapFault addClientOrSenderFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_12.getClientOrSenderFaultName(), faultString, locale); + } + + public SoapFault addMustUnderstandFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_12.getMustUnderstandFaultName(), faultString, locale); + } + + public SoapFault addServerOrReceiverFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_12.getServerOrReceiverFaultName(), faultString, locale); + } + + public SoapFault addVersionMismatchFault(String faultString, Locale locale) { + return addFault(SoapVersion.SOAP_12.getVersionMismatchFaultName(), faultString, locale); + } + + public Soap12Fault addDataEncodingUnknownFault(QName[] subcodes, String reason, Locale locale) { + QName name = new QName(SoapVersion.SOAP_12.getEnvelopeNamespaceUri(), "DataEncodingUnknown"); + Soap12Fault fault = addFault(name, reason, locale); + for (int i = 0; i < subcodes.length; i++) { + fault.addFaultSubcode(subcodes[i]); + } + return fault; + } + + protected Soap12Fault addFault(QName faultCode, String faultString, Locale faultStringLocale) { + Assert.notNull(faultCode, "No faultCode given"); + Assert.hasLength(faultString, "faultString cannot be empty"); + 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); + return new SaajSoap12Fault(saajFault); + } + catch (SOAPException ex) { + throw new SaajSoapFaultException(ex); + } + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Fault.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Fault.java similarity index 52% rename from core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Fault.java rename to core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Fault.java index b0d42f67..3da1a116 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Fault.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Fault.java @@ -14,55 +14,32 @@ * limitations under the License. */ -package org.springframework.ws.soap.saaj.saaj13; +package org.springframework.ws.soap.saaj; import java.util.Iterator; import java.util.Locale; import javax.xml.namespace.QName; -import javax.xml.soap.Detail; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFault; -import javax.xml.transform.Source; -import javax.xml.transform.dom.DOMSource; -import org.springframework.ws.soap.SoapFaultDetail; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; import org.springframework.ws.soap.soap12.Soap12Fault; /** - * Internal class that uses SAAJ 1.3 to implement the Soap12Fault interface. - * * @author Arjen Poutsma */ -class Saaj13Soap12Fault implements Soap12Fault { +class SaajSoap12Fault extends SaajSoapFault implements Soap12Fault { - private final SOAPFault saajFault; - - Saaj13Soap12Fault(SOAPFault saajFault) { - this.saajFault = saajFault; + public SaajSoap12Fault(SOAPFault fault) { + super(fault); } - public QName getName() { - return saajFault.getElementQName(); + public String getFaultActorOrRole() { + return getImplementation().getFaultRole(getSaajFault()); } - public Source getSource() { - return new DOMSource(saajFault); - } - - public QName getFaultCode() { - return saajFault.getFaultCodeAsQName(); - } - - public SoapFaultDetail getFaultDetail() { - Detail saajDetail = saajFault.getDetail(); - return saajDetail != null ? new Saaj13SoapFaultDetail(saajDetail) : null; - } - - public SoapFaultDetail addFaultDetail() { + public void setFaultActorOrRole(String faultRole) { try { - Detail saajDetail = saajFault.addDetail(); - return saajDetail != null ? new Saaj13SoapFaultDetail(saajDetail) : null; + getImplementation().setFaultRole(getSaajFault(), faultRole); } catch (SOAPException ex) { throw new SaajSoapFaultException(ex); @@ -70,25 +47,12 @@ class Saaj13Soap12Fault implements Soap12Fault { } public Iterator getFaultSubcodes() { - return saajFault.getFaultSubcodes(); + return getImplementation().getFaultSubcodes(getSaajFault()); } public void addFaultSubcode(QName subcode) { try { - saajFault.appendFaultSubcode(subcode); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public String getFaultActorOrRole() { - return saajFault.getFaultRole(); - } - - public void setFaultActorOrRole(String uri) { - try { - saajFault.setFaultRole(uri); + getImplementation().appendFaultSubcode(getSaajFault(), subcode); } catch (SOAPException ex) { throw new SaajSoapFaultException(ex); @@ -96,33 +60,36 @@ class Saaj13Soap12Fault implements Soap12Fault { } public String getFaultNode() { - return saajFault.getFaultNode(); + return getImplementation().getFaultNode(getSaajFault()); } public void setFaultNode(String uri) { try { - saajFault.setFaultNode(uri); + getImplementation().setFaultNode(getSaajFault(), uri); } catch (SOAPException ex) { throw new SaajSoapFaultException(ex); } + } public void setFaultReasonText(Locale locale, String text) { try { - saajFault.addFaultReasonText(text, locale); + getImplementation().setFaultReasonText(getSaajFault(), locale, text); } catch (SOAPException ex) { throw new SaajSoapFaultException(ex); } + } public String getFaultReasonText(Locale locale) { try { - return saajFault.getFaultReasonText(locale); + return getImplementation().getFaultReasonText(getSaajFault(), locale); } catch (SOAPException ex) { throw new SaajSoapFaultException(ex); } + } } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Header.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Header.java similarity index 65% rename from core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Header.java rename to core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Header.java index c601fbf2..493f7b9e 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Header.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoap12Header.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ws.soap.saaj.saaj13; +package org.springframework.ws.soap.saaj; import javax.xml.namespace.QName; import javax.xml.soap.SOAPException; @@ -22,24 +22,24 @@ import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPHeaderElement; import org.springframework.ws.soap.SoapHeaderElement; -import org.springframework.ws.soap.saaj.SaajSoapHeaderException; import org.springframework.ws.soap.soap12.Soap12Header; /** - * Internal class that uses SAAJ 1.3 to implement the Soap12Header interface. + * SAAJ-specific implementation of the Soap12Header interface. Wraps a {@link javax.xml.soap.SOAPHeader}. * * @author Arjen Poutsma */ -class Saaj13Soap12Header extends Saaj13SoapHeader implements Soap12Header { +class SaajSoap12Header extends SaajSoapHeader implements Soap12Header { - Saaj13Soap12Header(SOAPHeader saajHeader) { - super(saajHeader); + SaajSoap12Header(SOAPHeader header) { + super(header); } public SoapHeaderElement addNotUnderstoodHeaderElement(QName headerName) { try { - SOAPHeaderElement saajHeaderElement = getSaajHeader().addNotUnderstoodHeaderElement(headerName); - return new Saaj13SoapHeaderElement(saajHeaderElement); + SOAPHeaderElement headerElement = + getImplementation().addNotUnderstoodHeaderElement(getSaajHeader(), headerName); + return new SaajSoapHeaderElement(headerElement); } catch (SOAPException ex) { throw new SaajSoapHeaderException(ex); @@ -48,8 +48,9 @@ class Saaj13Soap12Header extends Saaj13SoapHeader implements Soap12Header { public SoapHeaderElement addUpgradeHeaderElement(String[] supportedSoapUris) { try { - SOAPHeaderElement saajHeaderElement = getSaajHeader().addUpgradeHeaderElement(supportedSoapUris); - return new Saaj13SoapHeaderElement(saajHeaderElement); + SOAPHeaderElement headerElement = + getImplementation().addUpgradeHeaderElement(getSaajHeader(), supportedSoapUris); + return new SaajSoapHeaderElement(headerElement); } catch (SOAPException ex) { throw new SaajSoapHeaderException(ex); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBody.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBody.java new file mode 100644 index 00000000..596bbbed --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBody.java @@ -0,0 +1,55 @@ +/* + * Copyright 2006 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 javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPBodyElement; +import javax.xml.transform.Result; +import javax.xml.transform.Source; + +import org.springframework.ws.soap.SoapBody; + +/** + * SAAJ-specific abstract base class of the SoapBody interface. Wraps a {@link javax.xml.soap.SOAPBody}. + * + * @author Arjen Poutsma + */ +abstract class SaajSoapBody extends SaajSoapElement implements SoapBody { + + public SaajSoapBody(SOAPBody body) { + super(body); + } + + public Source getPayloadSource() { + SOAPBodyElement bodyElement = getImplementation().getFirstBodyElement(getSaajBody()); + return bodyElement == null ? null : getImplementation().getSource(bodyElement); + } + + public Result getPayloadResult() { + getImplementation().removeContents(getSaajBody()); + return getImplementation().getResult(getSaajBody()); + } + + public boolean hasFault() { + return getImplementation().hasFault(getSaajBody()); + } + + protected SOAPBody getSaajBody() { + return (SOAPBody) getSaajElement(); + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java similarity index 54% rename from core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapElement.java rename to core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java index 4fd1e792..3d43c652 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapElement.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java @@ -14,35 +14,42 @@ * limitations under the License. */ -package org.springframework.ws.soap.saaj.saaj12; +package org.springframework.ws.soap.saaj; import javax.xml.namespace.QName; import javax.xml.soap.SOAPElement; 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; -abstract class Saaj12SoapElement implements SoapElement { +/** + * SAAJ-specific implementation of the SoapElement interface. Wraps a {@link javax.xml.soap.SOAPElement}. + * + * @author Arjen Poutsma + */ +class SaajSoapElement implements SoapElement { - private final SOAPElement saajElement; + private final SOAPElement element; - protected Saaj12SoapElement(SOAPElement saajElement) { - Assert.notNull(saajElement, "No saajElement given"); - this.saajElement = saajElement; + public SaajSoapElement(SOAPElement element) { + Assert.notNull(element, "element must not be null"); + this.element = element; + } + + public Source getSource() { + return getImplementation().getSource(element); + } + + public QName getName() { + return getImplementation().getName(element); } protected SOAPElement getSaajElement() { - return saajElement; + return element; } - public final QName getName() { - return SaajUtils.toQName(saajElement.getElementName()); - } - - public final Source getSource() { - return new DOMSource(saajElement); + protected SaajImplementation getImplementation() { + return SaajImplementation.getImplementation(); } } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapEnvelope.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapEnvelope.java similarity index 57% rename from core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapEnvelope.java rename to core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapEnvelope.java index b17380cb..84b81534 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapEnvelope.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapEnvelope.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package org.springframework.ws.soap.saaj.saaj12; +package org.springframework.ws.soap.saaj; +import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; @@ -23,29 +24,33 @@ import javax.xml.soap.SOAPHeader; import org.springframework.ws.soap.SoapBody; import org.springframework.ws.soap.SoapEnvelope; import org.springframework.ws.soap.SoapHeader; -import org.springframework.ws.soap.saaj.SaajSoapBodyException; -import org.springframework.ws.soap.saaj.SaajSoapHeaderException; /** - * Internal class that uses SAAJ 1.2 to implement the SoapEnvelope interface. Used by - * SaajSoapMessage. + * SAAJ-specific implementation of the SoapEnvelope interface. Wraps a {@link + * javax.xml.soap.SOAPEnvelope}. * * @author Arjen Poutsma */ -class Saaj12SoapEnvelope extends Saaj12SoapElement implements SoapEnvelope { +class SaajSoapEnvelope extends SaajSoapElement implements SoapEnvelope { - private Saaj12Soap11Body body; + private SaajSoapBody body; - private Saaj12SoapHeader header; + private SaajSoapHeader header; - public Saaj12SoapEnvelope(SOAPEnvelope saajEnvelope) { - super(saajEnvelope); + public SaajSoapEnvelope(SOAPEnvelope envelope) { + super(envelope); } - public final SoapBody getBody() { + public SoapBody getBody() { if (body == null) { try { - body = new Saaj12Soap11Body(getSaajEnvelope().getBody()); + SOAPBody saajBody = getImplementation().getBody(getSaajEnvelope()); + if (getImplementation().isSoap11(saajBody)) { + body = new SaajSoap11Body(saajBody); + } + else { + body = new SaajSoap12Body(saajBody); + } } catch (SOAPException ex) { throw new SaajSoapBodyException(ex); @@ -54,12 +59,17 @@ class Saaj12SoapEnvelope extends Saaj12SoapElement implements SoapEnvelope { return body; } - public final SoapHeader getHeader() { + public SoapHeader getHeader() { if (header == null) { try { - SOAPHeader saajHeader = getSaajEnvelope().getHeader(); + SOAPHeader saajHeader = getImplementation().getHeader(getSaajEnvelope()); if (saajHeader != null) { - header = new Saaj12SoapHeader(saajHeader); + if (getImplementation().isSoap11(saajHeader)) { + header = new SaajSoapHeader(saajHeader); + } + else { + header = new SaajSoap12Header(saajHeader); + } } else { header = null; @@ -75,4 +85,5 @@ class Saaj12SoapEnvelope extends Saaj12SoapElement implements SoapEnvelope { protected SOAPEnvelope getSaajEnvelope() { return (SOAPEnvelope) getSaajElement(); } + } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFault.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFault.java new file mode 100644 index 00000000..5e39a155 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFault.java @@ -0,0 +1,60 @@ +/* + * Copyright 2006 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 javax.xml.namespace.QName; +import javax.xml.soap.Detail; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFault; + +import org.springframework.ws.soap.SoapFault; +import org.springframework.ws.soap.SoapFaultDetail; + +/** + * SAAJ-specific abstract base class of the SoapFault interface. Wraps a {@link javax.xml.soap.SOAPFault}. + * + * @author Arjen Poutsma + */ +abstract class SaajSoapFault extends SaajSoapElement implements SoapFault { + + protected SaajSoapFault(SOAPFault fault) { + super(fault); + } + + public QName getFaultCode() { + return getImplementation().getFaultCode(getSaajFault()); + } + + protected SOAPFault getSaajFault() { + return (SOAPFault) getSaajElement(); + } + + public SoapFaultDetail getFaultDetail() { + Detail saajDetail = getImplementation().getFaultDetail(getSaajFault()); + return saajDetail == null ? null : new SaajSoapFaultDetail(saajDetail); + } + + public SoapFaultDetail addFaultDetail() { + try { + Detail saajDetail = getImplementation().addFaultDetail(getSaajFault()); + return new SaajSoapFaultDetail(saajDetail); + } + catch (SOAPException ex) { + throw new SaajSoapFaultException(ex); + } + } +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapFaultDetail.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetail.java similarity index 51% rename from core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapFaultDetail.java rename to core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetail.java index db7575d2..5ad966c2 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapFaultDetail.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetail.java @@ -14,39 +14,40 @@ * limitations under the License. */ -package org.springframework.ws.soap.saaj.saaj12; +package org.springframework.ws.soap.saaj; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.soap.Detail; import javax.xml.soap.DetailEntry; -import javax.xml.soap.Name; 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; import org.springframework.ws.soap.SoapFaultDetailElement; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; -import org.springframework.ws.soap.saaj.support.SaajUtils; /** - * Internal class that uses SAAJ 1.2 to implement the SoapFaultDetail interface. + * SAAJ-specific implementation of the SoapFaultDetail interface. Wraps a {@link + * javax.xml.soap.SOAPFaultElement}. * * @author Arjen Poutsma */ -class Saaj12SoapFaultDetail extends Saaj12SoapElement implements SoapFaultDetail { +class SaajSoapFaultDetail extends SaajSoapElement implements SoapFaultDetail { - Saaj12SoapFaultDetail(Detail saajDetail) { - super(saajDetail); + public SaajSoapFaultDetail(SOAPFaultElement faultElement) { + super(faultElement); + } + + public Result getResult() { + return getImplementation().getResult(getSaajDetail()); } public SoapFaultDetailElement addFaultDetailElement(QName name) { try { - Name detailEntryName = SaajUtils.toName(name, getSaajDetail()); - DetailEntry saajDetailEntry = getSaajDetail().addDetailEntry(detailEntryName); - return new Saaj12SoapFaultDetailElement(saajDetailEntry); + DetailEntry detailEntry = getImplementation().addDetailEntry(getSaajDetail(), name); + return new SaajSoapFaultDetailElement(detailEntry); } catch (SOAPException ex) { throw new SaajSoapFaultException(ex); @@ -54,37 +55,36 @@ class Saaj12SoapFaultDetail extends Saaj12SoapElement implements SoapFaultDetail } public Iterator getDetailEntries() { - return new Saaj12SoapFaultDetailIterator(getSaajDetail().getDetailEntries()); + Iterator iterator = getImplementation().getDetailEntries(getSaajDetail()); + return new SaajSoapFaultDetailElementIterator(iterator); } - public Result getResult() { - return new DOMResult(getSaajDetail()); - } - - private Detail getSaajDetail() { + protected Detail getSaajDetail() { return (Detail) getSaajElement(); } - private static class Saaj12SoapFaultDetailIterator implements Iterator { + private static class SaajSoapFaultDetailElementIterator implements Iterator { - private final Iterator saajIterator; + private final Iterator iterator; - public Saaj12SoapFaultDetailIterator(Iterator saajIterator) { - Assert.notNull(saajIterator, "No saajIterator given"); - this.saajIterator = saajIterator; + private SaajSoapFaultDetailElementIterator(Iterator iterator) { + Assert.notNull(iterator, "No iterator given"); + this.iterator = iterator; } public boolean hasNext() { - return saajIterator.hasNext(); + return iterator.hasNext(); } public Object next() { - DetailEntry saajDetailEntry = (DetailEntry) saajIterator.next(); - return new Saaj12SoapFaultDetailElement(saajDetailEntry); + DetailEntry saajDetailEntry = (DetailEntry) iterator.next(); + return new SaajSoapFaultDetailElement(saajDetailEntry); } public void remove() { - saajIterator.remove(); + iterator.remove(); } } + + } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapFaultDetailElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetailElement.java similarity index 64% rename from core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapFaultDetailElement.java rename to core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetailElement.java index 64b9e1d6..295b62ba 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapFaultDetailElement.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapFaultDetailElement.java @@ -14,42 +14,41 @@ * limitations under the License. */ -package org.springframework.ws.soap.saaj.saaj12; +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; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; /** - * Internal class that uses SAAJ 1.2 to implement the SoapFaultDetailElement interface. + * SAAJ-specific implementation of the SoapFaultDetailElement interface. Wraps a {@link + * javax.xml.soap.DetailEntry}. * * @author Arjen Poutsma */ -class Saaj12SoapFaultDetailElement extends Saaj12SoapElement implements SoapFaultDetailElement { +class SaajSoapFaultDetailElement extends SaajSoapElement implements SoapFaultDetailElement { - Saaj12SoapFaultDetailElement(DetailEntry saajDetailEntry) { - super(saajDetailEntry); + SaajSoapFaultDetailElement(DetailEntry entry) { + super(entry); } public Result getResult() { - return new DOMResult(getSaajDetailEntry()); - } - - private DetailEntry getSaajDetailEntry() { - return (DetailEntry) getSaajElement(); + return getImplementation().getResult(getSaajDetailEntry()); } public void addText(String text) { try { - getSaajDetailEntry().addTextNode(text); + getImplementation().addTextNode(getSaajDetailEntry(), text); } catch (SOAPException ex) { throw new SaajSoapFaultException(ex); } } + protected DetailEntry getSaajDetailEntry() { + return (DetailEntry) getSaajElement(); + } + } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java new file mode 100644 index 00000000..cbe6fd01 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java @@ -0,0 +1,88 @@ +/* + * Copyright 2006 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.util.Iterator; +import javax.xml.namespace.QName; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPHeader; +import javax.xml.soap.SOAPHeaderElement; + +import org.springframework.util.Assert; +import org.springframework.ws.soap.SoapHeader; +import org.springframework.ws.soap.SoapHeaderElement; +import org.springframework.ws.soap.SoapHeaderException; + +/** + * SAAJ-specific implementation of the SoapHeader interface. Wraps a {@link javax.xml.soap.SOAPHeader}. + * + * @author Arjen Poutsma + */ +class SaajSoapHeader extends SaajSoapElement implements SoapHeader { + + SaajSoapHeader(SOAPHeader header) { + super(header); + } + + public Iterator examineAllHeaderElements() throws SoapHeaderException { + Iterator iterator = getImplementation().examineAllHeaderElements(getSaajHeader()); + return new SaajSoapHeaderElementIterator(iterator); + } + + public Iterator examineMustUnderstandHeaderElements(String actorOrRole) throws SoapHeaderException { + Iterator iterator = getImplementation().examineMustUnderstandHeaderElements(getSaajHeader(), actorOrRole); + return new SaajSoapHeaderElementIterator(iterator); + } + + public SoapHeaderElement addHeaderElement(QName name) throws SoapHeaderException { + try { + SOAPHeaderElement headerElement = getImplementation().addHeaderElement(getSaajHeader(), name); + return new SaajSoapHeaderElement(headerElement); + } + catch (SOAPException ex) { + throw new SaajSoapHeaderException(ex); + } + } + + protected SOAPHeader getSaajHeader() { + return (SOAPHeader) getSaajElement(); + } + + private static class SaajSoapHeaderElementIterator implements Iterator { + + private final Iterator iterator; + + private SaajSoapHeaderElementIterator(Iterator iterator) { + Assert.notNull(iterator, "iterator must not be null"); + this.iterator = iterator; + } + + public boolean hasNext() { + return iterator.hasNext(); + } + + public Object next() { + SOAPHeaderElement saajHeaderElement = (SOAPHeaderElement) iterator.next(); + return new SaajSoapHeaderElement(saajHeaderElement); + } + + public void remove() { + iterator.remove(); + } + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeaderElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeaderElement.java new file mode 100644 index 00000000..6e9760d4 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeaderElement.java @@ -0,0 +1,61 @@ +/* + * Copyright 2006 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 javax.xml.soap.SOAPHeaderElement; +import javax.xml.transform.Result; + +import org.springframework.ws.soap.SoapHeaderElement; +import org.springframework.ws.soap.SoapHeaderException; + +/** + * SAAJ-specific implementation of the SoapHeaderElement interface. Wraps a {@link + * javax.xml.soap.SOAPHeaderElement}. + * + * @author Arjen Poutsma + */ +class SaajSoapHeaderElement extends SaajSoapElement implements SoapHeaderElement { + + SaajSoapHeaderElement(SOAPHeaderElement headerElement) { + super(headerElement); + } + + public Result getResult() throws SoapHeaderException { + return getImplementation().getResult(getSaajElement()); + } + + public String getActorOrRole() throws SoapHeaderException { + return getImplementation().getActorOrRole(getSaajHeaderElement()); + } + + public void setActorOrRole(String actorOrRole) throws SoapHeaderException { + getImplementation().setActorOrRole(getSaajHeaderElement(), actorOrRole); + } + + public boolean getMustUnderstand() throws SoapHeaderException { + return getImplementation().getMustUnderstand(getSaajHeaderElement()); + } + + public void setMustUnderstand(boolean mustUnderstand) throws SoapHeaderException { + getImplementation().setMustUnderstand(getSaajHeaderElement(), mustUnderstand); + } + + protected SOAPHeaderElement getSaajHeaderElement() { + return (SOAPHeaderElement) getSaajElement(); + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java index 1eb56e24..a621fd32 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2005, 2006 the original author or authors. + * Copyright 2006 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. @@ -16,17 +16,13 @@ package org.springframework.ws.soap.saaj; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; -import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.xml.soap.AttachmentPart; -import javax.xml.soap.MimeHeader; import javax.xml.soap.MimeHeaders; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; @@ -35,12 +31,10 @@ import javax.xml.soap.SOAPMessage; import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; import org.springframework.util.Assert; -import org.springframework.util.ObjectUtils; import org.springframework.ws.soap.AbstractSoapMessage; import org.springframework.ws.soap.Attachment; import org.springframework.ws.soap.AttachmentException; import org.springframework.ws.soap.SoapEnvelope; -import org.springframework.ws.transport.TransportOutputStream; /** * SAAJ-specific implementation of the SoapMessage interface. Accessed via the @@ -49,7 +43,7 @@ import org.springframework.ws.transport.TransportOutputStream; * @author Arjen Poutsma * @see javax.xml.soap.SOAPMessage */ -public abstract class SaajSoapMessage extends AbstractSoapMessage { +public class SaajSoapMessage extends AbstractSoapMessage { private SOAPMessage saajMessage; @@ -60,7 +54,7 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { * * @param soapMessage the SAAJ SOAPMessage */ - protected SaajSoapMessage(SOAPMessage soapMessage) { + public SaajSoapMessage(SOAPMessage soapMessage) { Assert.notNull(soapMessage, "soapMessage must not be null"); saajMessage = soapMessage; } @@ -68,23 +62,23 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { /** * Return the SAAJ SOAPMessage that this SaajSoapMessage is based on. */ - public final SOAPMessage getSaajMessage() { + public SOAPMessage getSaajMessage() { return saajMessage; } /** * Sets the SAAJ SOAPMessage that this SaajSoapMessage is based on. */ - public final void setSaajMessage(SOAPMessage soapMessage) { + public void setSaajMessage(SOAPMessage soapMessage) { Assert.notNull(soapMessage, "soapMessage must not be null"); saajMessage = soapMessage; } - public final SoapEnvelope getEnvelope() { + public SoapEnvelope getEnvelope() { if (envelope == null) { try { - SOAPEnvelope saajEnvelope = saajMessage.getSOAPPart().getEnvelope(); - envelope = createSaajSoapEnvelope(saajEnvelope); + SOAPEnvelope saajEnvelope = getImplementation().getEnvelope(saajMessage); + envelope = new SaajSoapEnvelope(saajEnvelope); } catch (SOAPException ex) { throw new SaajSoapEnvelopeException(ex); @@ -93,39 +87,24 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { return envelope; } - protected abstract SoapEnvelope createSaajSoapEnvelope(SOAPEnvelope saajEnvelope); - - public final void writeTo(OutputStream outputStream) throws IOException { + public void writeTo(OutputStream outputStream) throws IOException { try { - if (saajMessage.saveRequired()) { - saajMessage.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 = saajMessage.getMimeHeaders(); - if (ObjectUtils.isEmpty(headers.getHeader("Content-Type"))) { - headers.addHeader("Content-Type", getVersion().getContentType()); - if (saajMessage.saveRequired()) { - saajMessage.saveChanges(); - } - } - for (Iterator iterator = headers.getAllHeaders(); iterator.hasNext();) { - MimeHeader mimeHeader = (MimeHeader) iterator.next(); - transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue()); - } - } - saajMessage.writeTo(outputStream); + getImplementation().writeTo(saajMessage, outputStream); } catch (SOAPException ex) { throw new SaajSoapMessageException("Could not write message to OutputStream: " + ex.getMessage(), ex); } } + public Iterator getAttachments() throws AttachmentException { + Iterator iterator = getImplementation().getAttachments(saajMessage); + return new SaajAttachmentIterator(iterator); + } + public Attachment getAttachment(String contentId) { MimeHeaders mimeHeaders = new MimeHeaders(); mimeHeaders.addHeader("Content-Id", contentId); - Iterator iterator = saajMessage.getAttachments(mimeHeaders); + Iterator iterator = getImplementation().getAttachment(saajMessage, mimeHeaders); if (!iterator.hasNext()) { return null; } @@ -135,17 +114,11 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { } } - public Iterator getAttachments() { - Iterator saajAttachmentIterator = saajMessage.getAttachments(); - return new SaajAttachmentIterator(saajAttachmentIterator); - } - public Attachment addAttachment(File file) throws AttachmentException { Assert.notNull(file, "File must not be null"); - FileDataSource dataSource = new FileDataSource(file); - AttachmentPart saajAttachment = saajMessage.createAttachmentPart(new DataHandler(dataSource)); - saajMessage.addAttachmentPart(saajAttachment); - return new SaajAttachment(saajAttachment); + DataSource dataSource = new FileDataSource(file); + AttachmentPart attachmentPart = getImplementation().addAttachmentPart(saajMessage, dataSource); + return new SaajAttachment(attachmentPart); } public Attachment addAttachment(InputStreamSource inputStreamSource, String contentType) { @@ -154,82 +127,13 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { throw new IllegalArgumentException("Passed-in Resource contains an open stream: invalid argument. " + "SAAJ requires an InputStreamSource that creates a fresh stream for every call."); } - DataSource dataSource = createDataSource(inputStreamSource, contentType); - AttachmentPart saajAttachment = saajMessage.createAttachmentPart(new DataHandler(dataSource)); - saajMessage.addAttachmentPart(saajAttachment); + DataSource dataSource = new InputStreamSourceDataSource(inputStreamSource, contentType); + AttachmentPart saajAttachment = getImplementation().addAttachmentPart(saajMessage, dataSource); return new SaajAttachment(saajAttachment); } - /** - * Create an Activation Framework DataSource for the given InputStreamSource. - * - * @param inputStreamSource the InputStreamSource (typically a Spring Resource) - * @param contentType the content type - * @return the Activation Framework DataSource - */ - private DataSource createDataSource(final InputStreamSource inputStreamSource, final String contentType) { - return new DataSource() { - public InputStream getInputStream() throws IOException { - return inputStreamSource.getInputStream(); - } - - public OutputStream getOutputStream() { - throw new UnsupportedOperationException("Read-only javax.activation.DataSource"); - } - - public String getContentType() { - return contentType; - } - - public String getName() { - throw new UnsupportedOperationException("DataSource name not available"); - } - }; - } - - /** - * SAAJ-specific implementation of org.springframework.ws.soap.Attachment - */ - private static class SaajAttachment implements Attachment { - - private final AttachmentPart saajAttachment; - - public SaajAttachment(AttachmentPart saajAttachment) { - this.saajAttachment = saajAttachment; - } - - public String getId() { - return saajAttachment.getContentId(); - } - - public void setId(String id) { - saajAttachment.setContentId(id); - } - - public String getContentType() { - return saajAttachment.getContentType(); - } - - public InputStream getInputStream() throws IOException { - try { - return saajAttachment.getDataHandler().getInputStream(); - } - catch (SOAPException e) { - return new ByteArrayInputStream(new byte[0]); - } - } - - public long getSize() { - try { - int result = saajAttachment.getSize(); - // SAAJ returns -1 when the size cannot be determined - return result != -1 ? result : 0; - } - catch (SOAPException ex) { - throw new SaajAttachmentException(ex); - } - } - + protected SaajImplementation getImplementation() { + return SaajImplementation.getImplementation(); } private static class SaajAttachmentIterator implements Iterator { @@ -254,5 +158,4 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { } } - } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java index 553ab3db..d2d43377 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java @@ -24,7 +24,6 @@ import javax.xml.soap.MessageFactory; import javax.xml.soap.MimeHeaders; 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; @@ -33,8 +32,6 @@ import org.springframework.util.StringUtils; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.WebServiceMessageFactory; import org.springframework.ws.soap.SoapMessageCreationException; -import org.springframework.ws.soap.saaj.saaj12.Saaj12SoapMessage; -import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessage; import org.springframework.ws.soap.saaj.support.SaajUtils; import org.springframework.ws.transport.TransportInputStream; @@ -66,6 +63,13 @@ public class SaajSoapMessageFactory implements WebServiceMessageFactory, Initial this.messageFactory = messageFactory; } + /** + * Sets the SAAJ MessageFactory. + */ + public void setMessageFactory(MessageFactory messageFactory) { + this.messageFactory = messageFactory; + } + /** * Returns the SAAJ MessageFactory used. */ @@ -95,7 +99,7 @@ public class SaajSoapMessageFactory implements WebServiceMessageFactory, Initial } else { throw new IllegalStateException( - "SaajSoapMessageContextFactory requires SAAJ 1.2, which was not" + "found on the classpath"); + "SaajSoapMessageFactory requires SAAJ 1.2, which was not" + "found on the classpath"); } } catch (SOAPException ex) { @@ -105,7 +109,7 @@ public class SaajSoapMessageFactory implements WebServiceMessageFactory, Initial public WebServiceMessage createWebServiceMessage() { try { - return createSaajSoapMessage(messageFactory.createMessage()); + return new SaajSoapMessage(messageFactory.createMessage()); } catch (SOAPException ex) { throw new SoapMessageCreationException("Could not create empty message: " + ex.getMessage(), ex); @@ -128,26 +132,13 @@ public class SaajSoapMessageFactory implements WebServiceMessageFactory, Initial } } try { - return createSaajSoapMessage(messageFactory.createMessage(mimeHeaders, inputStream)); + return new SaajSoapMessage(messageFactory.createMessage(mimeHeaders, inputStream)); } catch (SOAPException ex) { throw new SoapMessageCreationException("Could not create message from InputStream: " + ex.getMessage(), ex); } } - private WebServiceMessage createSaajSoapMessage(SOAPMessage requestMessage) { - if (SaajUtils.getSaajVersion() >= SaajUtils.SAAJ_13) { - return new Saaj13SoapMessage(requestMessage); - } - else if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_12) { - return new Saaj12SoapMessage(requestMessage); - } - else { - throw new IllegalStateException( - "SaajSoapMessageContextFactory requires SAAJ 1.2, which was not" + "found on the classpath"); - } - } - /** * Sets the protocol for the MessageFactory. Only used for SAAJ 1.3+, defaults to * SOAPConstants.DEFAULT_SOAP_PROTOCOL (i.e. SOAP 1.1). diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11Body.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11Body.java deleted file mode 100644 index 3ae17233..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11Body.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2006 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.saaj12; - -import java.util.Iterator; -import java.util.Locale; -import javax.xml.namespace.QName; -import javax.xml.soap.Name; -import javax.xml.soap.SOAPBody; -import javax.xml.soap.SOAPBodyElement; -import javax.xml.soap.SOAPEnvelope; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPFault; -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.Assert; -import org.springframework.util.StringUtils; -import org.springframework.ws.soap.SoapFault; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; -import org.springframework.ws.soap.saaj.support.SaajUtils; -import org.springframework.ws.soap.soap11.Soap11Body; -import org.springframework.ws.soap.soap11.Soap11Fault; - -/** - * Internal class that uses SAAJ 1.2 to implement the Soap11Body interface. - * - * @author Arjen Poutsma - */ -class Saaj12Soap11Body extends Saaj12SoapElement implements Soap11Body { - - Saaj12Soap11Body(SOAPBody saajBody) { - super(saajBody); - } - - public Soap11Fault addFault(QName faultCode, String faultString, Locale faultStringLocale) { - Assert.notNull(faultCode, "No faultCode given"); - Assert.hasLength(faultString, "faultString cannot be empty"); - if (!StringUtils.hasLength(faultCode.getNamespaceURI())) { - throw new IllegalArgumentException( - "A fault code with namespace and local part must be specific for a custom fault code"); - } - try { - Name name = SaajUtils.toName(faultCode, getSaajBody()); - getSaajBody().removeContents(); - SOAPFault saajFault; - if (faultStringLocale == null) { - saajFault = getSaajBody().addFault(name, faultString); - } - else { - saajFault = getSaajBody().addFault(name, faultString, faultStringLocale); - } - return new Saaj12Soap11Fault(saajFault); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public SoapFault addClientOrSenderFault(String faultString, Locale locale) { - return addStandardFault("Client", faultString, locale); - } - - public SoapFault addMustUnderstandFault(String faultString, Locale locale) { - return addStandardFault("MustUnderstand", faultString, locale); - } - - public SoapFault addServerOrReceiverFault(String faultString, Locale locale) { - return addStandardFault("Server", faultString, locale); - } - - public SoapFault addVersionMismatchFault(String faultString, Locale locale) { - return addStandardFault("VersionMismatch", faultString, locale); - } - - public SoapFault getFault() { - return new Saaj12Soap11Fault(getSaajBody().getFault()); - } - - public final Result getPayloadResult() { - getSaajBody().removeContents(); - return new DOMResult(getSaajBody()); - } - - public final Source getPayloadSource() { - SOAPBodyElement payloadElement = getPayloadElement(); - return payloadElement != null ? new DOMSource(payloadElement) : null; - } - - public final boolean hasFault() { - return getSaajBody().hasFault(); - } - - private Soap11Fault addStandardFault(String localName, String faultString, Locale locale) { - try { - Name faultCode = getEnvelope() - .createName(localName, getSaajBody().getElementName().getPrefix(), - getSaajBody().getElementName().getURI()); - getSaajBody().removeContents(); - SOAPFault saajFault; - if (locale == null) { - saajFault = getSaajBody().addFault(faultCode, faultString); - } - else { - saajFault = getSaajBody().addFault(faultCode, faultString, locale); - } - return new Saaj12Soap11Fault(saajFault); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - private SOAPEnvelope getEnvelope() { - return (SOAPEnvelope) getSaajBody().getParentElement(); - } - - /** - * Retrieves the payload of the wrapped SAAJ message as a single DOM element. The payload of a message is the - * contents of the SOAP body. - * - * @return the message payload, or null if none is set. - */ - private SOAPBodyElement getPayloadElement() { - for (Iterator iterator = getSaajBody().getChildElements(); iterator.hasNext();) { - Object child = iterator.next(); - if (child instanceof SOAPBodyElement) { - return (SOAPBodyElement) child; - } - } - return null; - } - - protected final SOAPBody getSaajBody() { - return (SOAPBody) getSaajElement(); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11Fault.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11Fault.java deleted file mode 100644 index 8c446cca..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11Fault.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2006 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.saaj12; - -import java.util.Locale; -import javax.xml.namespace.QName; -import javax.xml.soap.Detail; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPFault; - -import org.springframework.ws.soap.SoapFaultDetail; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; -import org.springframework.ws.soap.saaj.support.SaajUtils; -import org.springframework.ws.soap.soap11.Soap11Fault; - -/** - * Internal class that uses SAAJ 1.2 to implement the Soap11Fault interface. - * - * @author Arjen Poutsma - */ -class Saaj12Soap11Fault extends Saaj12SoapElement implements Soap11Fault { - - Saaj12Soap11Fault(SOAPFault saajFault) { - super(saajFault); - } - - public String getFaultString() { - return getSaajFault().getFaultString(); - } - - public Locale getFaultStringLocale() { - return getSaajFault().getFaultStringLocale(); - } - - public SoapFaultDetail addFaultDetail() { - try { - Detail saajDetail = getSaajFault().addDetail(); - return saajDetail != null ? new Saaj12SoapFaultDetail(saajDetail) : null; - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public String getFaultActorOrRole() { - return getSaajFault().getFaultActor(); - } - - public QName getFaultCode() { - return SaajUtils.toQName(getSaajFault().getFaultCodeAsName()); - } - - public SoapFaultDetail getFaultDetail() { - Detail saajDetail = getSaajFault().getDetail(); - return saajDetail != null ? new Saaj12SoapFaultDetail(saajDetail) : null; - } - - public void setFaultActorOrRole(String faultActor) { - try { - getSaajFault().setFaultActor(faultActor); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - protected SOAPFault getSaajFault() { - return (SOAPFault) getSaajElement(); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapHeader.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapHeader.java deleted file mode 100644 index 8c2d1add..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapHeader.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2006 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.saaj12; - -import java.util.Iterator; -import javax.xml.namespace.QName; -import javax.xml.soap.Name; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPHeader; -import javax.xml.soap.SOAPHeaderElement; - -import org.springframework.ws.soap.SoapHeader; -import org.springframework.ws.soap.SoapHeaderElement; -import org.springframework.ws.soap.saaj.SaajSoapHeaderException; -import org.springframework.ws.soap.saaj.support.SaajUtils; - -/** - * Internal class that uses SAAJ 1.2 to implement the SoapHeader interface. - * - * @author Arjen Poutsma - */ -class Saaj12SoapHeader extends Saaj12SoapElement implements SoapHeader { - - Saaj12SoapHeader(SOAPHeader saajHeader) { - super(saajHeader); - } - - public SoapHeaderElement addHeaderElement(QName name) { - try { - Name saajName = SaajUtils.toName(name, getSaajHeader()); - SOAPHeaderElement saajHeaderElement = getSaajHeader().addHeaderElement(saajName); - return new Saaj12SoapHeaderElement(saajHeaderElement); - } - catch (SOAPException ex) { - throw new SaajSoapHeaderException(ex); - } - } - - public Iterator examineAllHeaderElements() { - return new Saaj12SoapHeaderElementIterator(getSaajHeader().examineAllHeaderElements()); - } - - public Iterator examineMustUnderstandHeaderElements(String role) { - return new Saaj12SoapHeaderElementIterator(getSaajHeader().examineMustUnderstandHeaderElements(role)); - } - - private SOAPHeader getSaajHeader() { - return (SOAPHeader) getSaajElement(); - } - - private static class Saaj12SoapHeaderElementIterator implements Iterator { - - private final Iterator saajIterator; - - private Saaj12SoapHeaderElementIterator(Iterator saajIterator) { - this.saajIterator = saajIterator; - } - - public boolean hasNext() { - return saajIterator.hasNext(); - } - - public Object next() { - SOAPHeaderElement saajHeaderElement = (SOAPHeaderElement) saajIterator.next(); - return new Saaj12SoapHeaderElement(saajHeaderElement); - } - - public void remove() { - saajIterator.remove(); - } - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapHeaderElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapHeaderElement.java deleted file mode 100644 index a65e2b4d..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapHeaderElement.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2006 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.saaj12; - -import javax.xml.namespace.QName; -import javax.xml.soap.Name; -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; -import org.springframework.ws.soap.saaj.SaajSoapHeaderException; -import org.springframework.ws.soap.saaj.support.SaajUtils; - -/** - * Internal class that uses SAAJ 1.2 to implement the SoapHeaderElement interface. - * - * @author Arjen Poutsma - */ -class Saaj12SoapHeaderElement extends Saaj12SoapElement implements SoapHeaderElement { - - Saaj12SoapHeaderElement(SOAPHeaderElement saajHeaderElement) { - super(saajHeaderElement); - } - - public String getActorOrRole() { - return getSaajHeaderElement().getActor(); - } - - public boolean getMustUnderstand() { - return getSaajHeaderElement().getMustUnderstand(); - } - - public Result getResult() { - return new DOMResult(getSaajHeaderElement()); - } - - public void setActorOrRole(String role) { - getSaajHeaderElement().setActor(role); - } - - public void setMustUnderstand(boolean mustUnderstand) { - getSaajHeaderElement().setMustUnderstand(mustUnderstand); - } - - public void addAttribute(QName name, String value) throws SoapHeaderException { - try { - Name saajName = SaajUtils.toName(name, getSaajHeaderElement()); - getSaajHeaderElement().addAttribute(saajName, value); - } - catch (SOAPException ex) { - throw new SaajSoapHeaderException(ex); - } - } - - private SOAPHeaderElement getSaajHeaderElement() { - return (SOAPHeaderElement) getSaajElement(); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessage.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessage.java deleted file mode 100644 index e5ef46a8..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2006 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.saaj12; - -import javax.xml.soap.SOAPEnvelope; -import javax.xml.soap.SOAPMessage; - -import org.springframework.ws.soap.SoapEnvelope; -import org.springframework.ws.soap.SoapVersion; -import org.springframework.ws.soap.saaj.SaajSoapMessage; - -/** - * SAAJ 1.2 specific implementation of the SoapMessage interface. - * - * @author Arjen Poutsma - * @see javax.xml.soap.SOAPMessage - */ -public class Saaj12SoapMessage extends SaajSoapMessage { - - public Saaj12SoapMessage(SOAPMessage soapMessage) { - super(soapMessage); - } - - protected SoapEnvelope createSaajSoapEnvelope(SOAPEnvelope saajEnvelope) { - return new Saaj12SoapEnvelope(saajEnvelope); - } - - public SoapVersion getVersion() { - return SoapVersion.SOAP_11; - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/package.html b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/package.html deleted file mode 100644 index f42143de..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/package.html +++ /dev/null @@ -1,5 +0,0 @@ - - -SAAJ 1.2 support for Spring-WS soap message infrastructure. - - diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11Body.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11Body.java deleted file mode 100644 index 30ef0ca5..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11Body.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import java.util.Locale; -import javax.xml.namespace.QName; -import javax.xml.soap.SOAPBody; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPFault; - -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; -import org.springframework.ws.soap.SoapFault; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; -import org.springframework.ws.soap.soap11.Soap11Body; -import org.springframework.ws.soap.soap11.Soap11Fault; -import org.springframework.xml.namespace.QNameUtils; - -/** - * Internal class that uses SAAJ 1.3 to implement the Soap11Body interface. Used by - * Saaj13SoapEnvelope. - * - * @author Arjen Poutsma - */ -class Saaj13Soap11Body extends Saaj13SoapBody implements Soap11Body { - - Saaj13Soap11Body(SOAPBody saajBody) { - super(saajBody); - } - - public Soap11Fault addFault(QName faultCode, String faultString, Locale faultStringLocale) { - Assert.notNull(faultCode, "No faultCode given"); - Assert.notNull(faultString, "No faultString given"); - if (!StringUtils.hasLength(faultCode.getNamespaceURI())) { - throw new IllegalArgumentException("fault code has no namespace"); - } - try { - getSaajBody().removeContents(); - SOAPFault saajFault; - if (faultStringLocale == null) { - saajFault = getSaajBody().addFault(faultCode, faultString); - } - else { - saajFault = getSaajBody().addFault(faultCode, faultString, faultStringLocale); - } - return new Saaj13Soap11Fault(saajFault); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public SoapFault addMustUnderstandFault(String faultString, Locale locale) { - return addStandardFault("MustUnderstand", faultString, locale); - } - - public SoapFault addClientOrSenderFault(String faultString, Locale locale) { - return addStandardFault("Client", faultString, locale); - } - - public SoapFault addServerOrReceiverFault(String faultString, Locale locale) { - return addStandardFault("Server", faultString, locale); - } - - public SoapFault addVersionMismatchFault(String faultString, Locale locale) { - return addStandardFault("VersionMismatch", faultString, locale); - - } - - private Soap11Fault addStandardFault(String localName, String faultString, Locale faultStringLocale) { - try { - QName faultCode = QNameUtils.createQName(getSaajBody().getElementQName().getNamespaceURI(), localName, - QNameUtils.getPrefix(getSaajBody().getElementQName())); - getSaajBody().removeContents(); - SOAPFault saajFault = faultStringLocale == null ? getSaajBody().addFault(faultCode, faultString) : - getSaajBody().addFault(faultCode, faultString, faultStringLocale); - return new Saaj13Soap11Fault(saajFault); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public SoapFault getFault() { - return new Saaj13Soap11Fault(getSaajBody().getFault()); - } - -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11Fault.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11Fault.java deleted file mode 100644 index 5b489f08..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11Fault.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import java.util.Locale; -import javax.xml.namespace.QName; -import javax.xml.soap.Detail; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPFault; - -import org.springframework.ws.soap.SoapFaultDetail; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; -import org.springframework.ws.soap.soap11.Soap11Fault; - -/** - * Internal class that uses SAAJ 1.3 to implement the Soap11Fault interface. - * - * @author Arjen Poutsma - */ -class Saaj13Soap11Fault extends Saaj13SoapElement implements Soap11Fault { - - Saaj13Soap11Fault(SOAPFault saajFault) { - super(saajFault); - } - - public String getFaultString() { - return getSaajFault().getFaultString(); - } - - public Locale getFaultStringLocale() { - return getSaajFault().getFaultStringLocale(); - } - - public SoapFaultDetail addFaultDetail() { - try { - Detail saajDetail = getSaajFault().addDetail(); - return saajDetail != null ? new Saaj13SoapFaultDetail(saajDetail) : null; - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public String getFaultActorOrRole() { - return getSaajFault().getFaultActor(); - } - - public QName getFaultCode() { - return getSaajFault().getFaultCodeAsQName(); - } - - public SoapFaultDetail getFaultDetail() { - Detail saajDetail = getSaajFault().getDetail(); - return saajDetail != null ? new Saaj13SoapFaultDetail(saajDetail) : null; - } - - public void setFaultActorOrRole(String faultActor) { - try { - getSaajFault().setFaultActor(faultActor); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - private SOAPFault getSaajFault() { - return (SOAPFault) getSaajElement(); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Body.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Body.java deleted file mode 100644 index 58d8b4ff..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12Body.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import java.util.Locale; -import javax.xml.namespace.QName; -import javax.xml.soap.SOAPBody; -import javax.xml.soap.SOAPConstants; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPFault; - -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; -import org.springframework.ws.soap.SoapFault; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; -import org.springframework.ws.soap.soap12.Soap12Body; -import org.springframework.ws.soap.soap12.Soap12Fault; - -/** - * Internal class that uses SAAJ 1.3 to implement the Soap12Body interface. Used by - * Saaj13SoapEnvelope. - * - * @author Arjen Poutsma - */ -class Saaj13Soap12Body extends Saaj13SoapBody implements Soap12Body { - - Saaj13Soap12Body(SOAPBody saajBody) { - super(saajBody); - } - - private Soap12Fault addFault(QName code, String reason, Locale locale) { - Assert.notNull(code, "No code given"); - Assert.hasLength(reason, "reason cannot be empty"); - Assert.notNull(locale, "No locale given"); - if (!StringUtils.hasLength(code.getNamespaceURI())) { - throw new IllegalArgumentException( - "A code with namespace and local part must be specific for a custom fault code"); - } - try { - getSaajBody().removeContents(); - SOAPFault saajFault = getSaajBody().addFault(code, reason, locale); - return new Saaj13Soap12Fault(saajFault); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public SoapFault addMustUnderstandFault(String reason, Locale locale) { - return addFault(SOAPConstants.SOAP_MUSTUNDERSTAND_FAULT, reason, locale); - } - - public SoapFault addClientOrSenderFault(String reason, Locale locale) { - return addFault(SOAPConstants.SOAP_SENDER_FAULT, reason, locale); - } - - public SoapFault addServerOrReceiverFault(String reason, Locale reasonLocale) { - return addFault(SOAPConstants.SOAP_RECEIVER_FAULT, reason, reasonLocale); - } - - public SoapFault addVersionMismatchFault(String reason, Locale locale) { - return addFault(SOAPConstants.SOAP_VERSIONMISMATCH_FAULT, reason, locale); - } - - public Soap12Fault addDataEncodingUnknownFault(QName[] subcodes, String reason, Locale reasonLocale) { - return addFault(SOAPConstants.SOAP_DATAENCODINGUNKNOWN_FAULT, reason, reasonLocale); - } - - public SoapFault getFault() { - return new Saaj13Soap12Fault(getSaajBody().getFault()); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapBody.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapBody.java deleted file mode 100644 index 7578555a..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapBody.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import java.util.Iterator; -import javax.xml.soap.SOAPBody; -import javax.xml.soap.SOAPBodyElement; -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; - -/** - * * Internal class that uses SAAJ 1.3 to implement the SoapBody interface. Used by - * Saaj13SoapEnvelope. - * - * @author Arjen Poutsma - */ -abstract class Saaj13SoapBody extends Saaj13SoapElement implements SoapBody { - - protected Saaj13SoapBody(SOAPBody saajBody) { - super(saajBody); - } - - public final Result getPayloadResult() { - getSaajBody().removeContents(); - return new DOMResult(getSaajBody()); - } - - public final Source getPayloadSource() { - SOAPBodyElement payloadElement = getPayloadElement(); - return payloadElement != null ? new DOMSource(payloadElement) : null; - } - - public final boolean hasFault() { - return getSaajBody().hasFault(); - } - - /** - * Retrieves the payload of the wrapped SAAJ message as a single DOM element. The payload of a message is the - * contents of the SOAP body. - * - * @return the message payload, or null if none is set. - */ - private SOAPBodyElement getPayloadElement() { - for (Iterator iterator = getSaajBody().getChildElements(); iterator.hasNext();) { - Object child = iterator.next(); - if (child instanceof SOAPBodyElement) { - return (SOAPBodyElement) child; - } - } - return null; - } - - protected final SOAPBody getSaajBody() { - return (SOAPBody) getSaajElement(); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapElement.java deleted file mode 100644 index ee2a9ff4..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapElement.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import javax.xml.namespace.QName; -import javax.xml.soap.SOAPElement; -import javax.xml.transform.Source; -import javax.xml.transform.dom.DOMSource; - -import org.springframework.util.Assert; - -abstract class Saaj13SoapElement { - - private final SOAPElement saajElement; - - protected Saaj13SoapElement(SOAPElement saajElement) { - Assert.notNull(saajElement, "No saajElement given"); - this.saajElement = saajElement; - } - - protected SOAPElement getSaajElement() { - return saajElement; - } - - public final QName getName() { - return saajElement.getElementQName(); - } - - public final Source getSource() { - return new DOMSource(saajElement); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapEnvelope.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapEnvelope.java deleted file mode 100644 index 2516d020..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapEnvelope.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import javax.xml.soap.SOAPBody; -import javax.xml.soap.SOAPConstants; -import javax.xml.soap.SOAPEnvelope; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPHeader; - -import org.springframework.ws.soap.SoapBody; -import org.springframework.ws.soap.SoapEnvelope; -import org.springframework.ws.soap.SoapHeader; -import org.springframework.ws.soap.saaj.SaajSoapBodyException; -import org.springframework.ws.soap.saaj.SaajSoapHeaderException; - -/** - * Internal class that uses SAAJ 1.3 to implement the SoapEnvelope interface. Used by - * SaajSoapMessage. - * - * @author Arjen Poutsma - */ -class Saaj13SoapEnvelope extends Saaj13SoapElement implements SoapEnvelope { - - private Saaj13SoapBody body; - - private Saaj13SoapHeader header; - - public Saaj13SoapEnvelope(SOAPEnvelope saajEnvelope) { - super(saajEnvelope); - } - - public final SoapBody getBody() { - if (body == null) { - try { - SOAPBody saajBody = getSaajEnvelope().getBody(); - Saaj13SoapBody result; - if (isSoap11()) { - result = new Saaj13Soap11Body(saajBody); - } - else { - result = new Saaj13Soap12Body(saajBody); - } - body = result; - } - catch (SOAPException ex) { - throw new SaajSoapBodyException(ex); - } - } - return body; - } - - public final SoapHeader getHeader() { - if (header == null) { - try { - SOAPHeader saajHeader = getSaajEnvelope().getHeader(); - if (saajHeader != null) { - if (isSoap11()) { - header = new Saaj13SoapHeader(saajHeader); - } - else { - header = new Saaj13Soap12Header(saajHeader); - } - } - else { - header = null; - } - } - catch (SOAPException ex) { - throw new SaajSoapHeaderException(ex); - } - } - return header; - } - - protected SOAPEnvelope getSaajEnvelope() { - return (SOAPEnvelope) getSaajElement(); - } - - /** - * Returns true if this is a SOAP 1.1 message, false if SOAP 1.2. Throws an exception - * otherwise. - */ - private boolean isSoap11() { - String namespaceURI = getSaajEnvelope().getElementQName().getNamespaceURI(); - if (SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE.equals(namespaceURI)) { - return true; - } - else if (SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE.equals(namespaceURI)) { - return false; - } - else { - throw new IllegalStateException("Unknown SOAP namespace \"" + namespaceURI + "\""); - } - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapFaultDetail.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapFaultDetail.java deleted file mode 100644 index bfe6c48b..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapFaultDetail.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import java.util.Iterator; -import javax.xml.namespace.QName; -import javax.xml.soap.Detail; -import javax.xml.soap.DetailEntry; -import javax.xml.soap.SOAPException; -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.Assert; -import org.springframework.ws.soap.SoapFaultDetail; -import org.springframework.ws.soap.SoapFaultDetailElement; -import org.springframework.ws.soap.saaj.SaajSoapFaultException; - -/** - * @author Arjen Poutsma - */ -class Saaj13SoapFaultDetail implements SoapFaultDetail { - - private Detail saajDetail; - - Saaj13SoapFaultDetail(Detail saajDetail) { - Assert.notNull(saajDetail, "No saajDetail given"); - this.saajDetail = saajDetail; - } - - public QName getName() { - return saajDetail.getElementQName(); - } - - public Source getSource() { - return new DOMSource(saajDetail); - } - - public Result getResult() { - return new DOMResult(saajDetail); - } - - public SoapFaultDetailElement addFaultDetailElement(QName name) { - try { - DetailEntry saajDetailEntry = saajDetail.addDetailEntry(name); - return new Saaj13SoapFaultDetailElement(saajDetailEntry); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public Iterator getDetailEntries() { - return new Saaj13SoapFaultDetailIterator(saajDetail.getDetailEntries()); - } - - private static class Saaj13SoapFaultDetailElement implements SoapFaultDetailElement { - - private DetailEntry saajDetailEntry; - - private Saaj13SoapFaultDetailElement(DetailEntry saajDetailEntry) { - Assert.notNull(saajDetailEntry, "No saajDetailEntry given"); - this.saajDetailEntry = saajDetailEntry; - } - - public Result getResult() { - return new DOMResult(saajDetailEntry); - } - - public void addText(String text) { - try { - saajDetailEntry.addTextNode(text); - } - catch (SOAPException ex) { - throw new SaajSoapFaultException(ex); - } - } - - public QName getName() { - return saajDetailEntry.getElementQName(); - } - - public Source getSource() { - return new DOMSource(saajDetailEntry); - } - } - - private static class Saaj13SoapFaultDetailIterator implements Iterator { - - private final Iterator saajIterator; - - public Saaj13SoapFaultDetailIterator(Iterator saajIterator) { - Assert.notNull(saajIterator, "No saajIterator given"); - this.saajIterator = saajIterator; - } - - public boolean hasNext() { - return saajIterator.hasNext(); - } - - public Object next() { - DetailEntry saajDetailEntry = (DetailEntry) saajIterator.next(); - return new Saaj13SoapFaultDetailElement(saajDetailEntry); - } - - public void remove() { - saajIterator.remove(); - } - - } - -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapHeader.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapHeader.java deleted file mode 100644 index bf6985a5..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapHeader.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import java.util.Iterator; -import javax.xml.namespace.QName; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPHeader; -import javax.xml.soap.SOAPHeaderElement; - -import org.springframework.ws.soap.SoapHeader; -import org.springframework.ws.soap.SoapHeaderElement; -import org.springframework.ws.soap.saaj.SaajSoapHeaderException; - -/** - * Internal class that uses SAAJ 1.3 to implement the SoapHeader interface. - * - * @author Arjen Poutsma - */ -class Saaj13SoapHeader extends Saaj13SoapElement implements SoapHeader { - - Saaj13SoapHeader(SOAPHeader saajHeader) { - super(saajHeader); - } - - protected final SOAPHeader getSaajHeader() { - return (SOAPHeader) getSaajElement(); - } - - public SoapHeaderElement addHeaderElement(QName name) { - try { - SOAPHeaderElement saajHeaderElement = getSaajHeader().addHeaderElement(name); - return new Saaj13SoapHeaderElement(saajHeaderElement); - } - catch (SOAPException ex) { - throw new SaajSoapHeaderException(ex); - } - } - - public Iterator examineMustUnderstandHeaderElements(String role) { - return new SaajSoapHeaderElementIterator(getSaajHeader().examineMustUnderstandHeaderElements(role)); - } - - public Iterator examineAllHeaderElements() { - return new SaajSoapHeaderElementIterator(getSaajHeader().examineAllHeaderElements()); - } - - private static class SaajSoapHeaderElementIterator implements Iterator { - - private final Iterator saajIterator; - - private SaajSoapHeaderElementIterator(Iterator saajIterator) { - this.saajIterator = saajIterator; - } - - public boolean hasNext() { - return saajIterator.hasNext(); - } - - public Object next() { - SOAPHeaderElement saajHeaderElement = (SOAPHeaderElement) saajIterator.next(); - return new Saaj13SoapHeaderElement(saajHeaderElement); - } - - public void remove() { - saajIterator.remove(); - } - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapHeaderElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapHeaderElement.java deleted file mode 100644 index 135c4e9d..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapHeaderElement.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import javax.xml.namespace.QName; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPHeaderElement; -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.Assert; -import org.springframework.ws.soap.SoapHeaderElement; -import org.springframework.ws.soap.SoapHeaderException; -import org.springframework.ws.soap.saaj.SaajSoapHeaderException; - -/** - * Internal class that uses SAAJ 1.3 to implement the SoapHeaderElement interface. - * - * @author Arjen Poutsma - */ -class Saaj13SoapHeaderElement implements SoapHeaderElement { - - private final SOAPHeaderElement saajHeaderElement; - - Saaj13SoapHeaderElement(SOAPHeaderElement saajHeaderElement) { - Assert.notNull(saajHeaderElement, "No saajHeaderElement given"); - this.saajHeaderElement = saajHeaderElement; - } - - public QName getName() { - return saajHeaderElement.getElementQName(); - } - - public Source getSource() { - return new DOMSource(saajHeaderElement); - } - - public String getActorOrRole() { - return saajHeaderElement.getActor(); - } - - public void setActorOrRole(String role) { - saajHeaderElement.setActor(role); - } - - public boolean getMustUnderstand() { - return saajHeaderElement.getMustUnderstand(); - } - - public void setMustUnderstand(boolean mustUnderstand) { - saajHeaderElement.setMustUnderstand(mustUnderstand); - } - - public Result getResult() { - return new DOMResult(saajHeaderElement); - } - - public void addAttribute(QName name, String value) throws SoapHeaderException { - try { - saajHeaderElement.addAttribute(name, value); - } - catch (SOAPException ex) { - throw new SaajSoapHeaderException(ex); - } - } - -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessage.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessage.java deleted file mode 100644 index 63c9208e..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessage.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2006 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.saaj13; - -import javax.xml.soap.SOAPEnvelope; -import javax.xml.soap.SOAPMessage; - -import org.springframework.ws.soap.SoapEnvelope; -import org.springframework.ws.soap.saaj.SaajSoapMessage; - -/** - * SAAJ 1.3 specific implementation of the SoapMessage interface. - * - * @author Arjen Poutsma - */ -public class Saaj13SoapMessage extends SaajSoapMessage { - - /** - * Create a new SaajSoapMessage based on the given SAAJ SOAPMessage. - * - * @param soapMessage the SAAJ SOAPMessage - */ - public Saaj13SoapMessage(SOAPMessage soapMessage) { - super(soapMessage); - } - - protected SoapEnvelope createSaajSoapEnvelope(SOAPEnvelope saajEnvelope) { - return new Saaj13SoapEnvelope(saajEnvelope); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/package.html b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/package.html deleted file mode 100644 index d0f7aeb3..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/package.html +++ /dev/null @@ -1,5 +0,0 @@ - - -SAAJ 1.3 support for Spring-WS soap message infrastructure. - -