From 5a700059902f2ab240b1f996168274ba04f2e777 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Sat, 5 May 2007 10:35:31 +0000 Subject: [PATCH] Added methods to access attributes on SoapElement. --- .../springframework/ws/WebServiceMessage.java | 19 +-- .../springframework/ws/soap/SoapElement.java | 25 ++++ .../ws/soap/SoapElementException.java | 38 ++++++ .../ws/soap/axiom/AxiomSoap11Body.java | 27 +++-- .../ws/soap/axiom/AxiomSoap11Fault.java | 10 +- .../ws/soap/axiom/AxiomSoap12Body.java | 20 ++-- .../ws/soap/axiom/AxiomSoap12Fault.java | 30 ++--- .../ws/soap/axiom/AxiomSoap12Header.java | 13 +- .../ws/soap/axiom/AxiomSoapBody.java | 36 ++---- .../ws/soap/axiom/AxiomSoapElement.java | 113 ++++++++++++++++++ .../soap/axiom/AxiomSoapElementException.java | 34 ++++++ .../ws/soap/axiom/AxiomSoapEnvelope.java | 59 ++++----- .../ws/soap/axiom/AxiomSoapFault.java | 41 ++----- .../ws/soap/axiom/AxiomSoapFaultDetail.java | 41 ++----- .../axiom/AxiomSoapFaultDetailElement.java | 29 +---- .../ws/soap/axiom/AxiomSoapHeader.java | 41 +++---- .../ws/soap/axiom/AxiomSoapHeaderElement.java | 59 ++------- .../ws/soap/saaj/Saaj11Implementation.java | 19 +++ .../ws/soap/saaj/Saaj12Implementation.java | 21 ++++ .../ws/soap/saaj/Saaj13Implementation.java | 12 ++ .../ws/soap/saaj/SaajImplementation.java | 9 ++ .../ws/soap/saaj/SaajSoapBodyException.java | 8 +- .../ws/soap/saaj/SaajSoapElement.java | 28 ++++- .../soap/saaj/SaajSoapElementException.java | 35 ++++++ .../ws/soap/AbstractSoapBodyTestCase.java | 12 +- .../ws/soap/AbstractSoapElementTestCase.java | 51 ++++++++ .../ws/soap/AbstractSoapEnvelopeTestCase.java | 14 +-- .../ws/soap/AbstractSoapHeaderTestCase.java | 12 +- src/changes/changes.xml | 1 + 29 files changed, 545 insertions(+), 312 deletions(-) create mode 100644 core/src/main/java/org/springframework/ws/soap/SoapElementException.java create mode 100644 core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java create mode 100644 core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElementException.java create mode 100644 core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElementException.java create mode 100644 core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java diff --git a/core/src/main/java/org/springframework/ws/WebServiceMessage.java b/core/src/main/java/org/springframework/ws/WebServiceMessage.java index c6a73670..33cefad6 100644 --- a/core/src/main/java/org/springframework/ws/WebServiceMessage.java +++ b/core/src/main/java/org/springframework/ws/WebServiceMessage.java @@ -23,8 +23,8 @@ import javax.xml.transform.Source; /** * Represents a protocol-agnostic XML message. - * - *

Contains methods that provide access to the payload of the message. + *

+ * Contains methods that provide access to the payload of the message. * * @author Arjen Poutsma * @see org.springframework.ws.soap.SoapMessage @@ -33,18 +33,18 @@ import javax.xml.transform.Source; public interface WebServiceMessage { /** - * Returns the contents of the message as a {@link java.xml.transform.Source}. - * - *

Depending on the implementation, this can be retrieved multiple times, or just a single time. + * Returns the contents of the message as a {@link Source}. + *

+ * Depending on the implementation, this can be retrieved multiple times, or just a single time. * * @return the message contents */ Source getPayloadSource(); /** - * Returns the contents of the message as a {@link java.xml.transform.Result}. - * - *

Implementations that are read-only will throw an {@link UnsupportedOperationException}. + * Returns the contents of the message as a {@link Result}. + *

+ * Implementations that are read-only will throw an {@link UnsupportedOperationException}. * * @return the message contents * @throws UnsupportedOperationException if the message is read-only @@ -64,12 +64,13 @@ public interface WebServiceMessage { * Does this message have a fault? * * @return true if the message has a fault; false otherwise - * @see #getFaultReason() + * @see #getFaultReason() */ boolean hasFault(); /** * Returns the fault reason message, if any. Returns null when no fault is present. + * * @see #hasFault() */ String getFaultReason(); diff --git a/core/src/main/java/org/springframework/ws/soap/SoapElement.java b/core/src/main/java/org/springframework/ws/soap/SoapElement.java index 02f9746f..ace3ccb5 100644 --- a/core/src/main/java/org/springframework/ws/soap/SoapElement.java +++ b/core/src/main/java/org/springframework/ws/soap/SoapElement.java @@ -16,6 +16,7 @@ package org.springframework.ws.soap; +import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.transform.Source; @@ -42,4 +43,28 @@ public interface SoapElement { */ Source getSource(); + /** + * Adds an attribute with the specified qualified name and value to this element. + * + * @param name the qualified name of the attribute + * @param value the value of the attribute + */ + void addAttribute(QName name, String value); + + /** + * Returns the value of the attribute with the specified qualified name. + * + * @param name the qualified name + * @return the value, or null if there is no such attribute + */ + String getAttributeValue(QName name); + + /** + * Returns an Iterator over all of the attributes in element as {@link QName qualified names}. + * + * @return an iterator over all the attribute names + */ + Iterator getAllAttibutes(); + + } diff --git a/core/src/main/java/org/springframework/ws/soap/SoapElementException.java b/core/src/main/java/org/springframework/ws/soap/SoapElementException.java new file mode 100644 index 00000000..95561756 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/SoapElementException.java @@ -0,0 +1,38 @@ +/* + * Copyright 2007 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; + +/** + * Exception thrown when a SOAP element could not be accessed. + * + * @author Arjen Poutsma + */ +public class SoapElementException extends SoapMessageException { + + public SoapElementException(String msg) { + super(msg); + } + + public SoapElementException(String msg, Throwable ex) { + super(msg, ex); + } + + public SoapElementException(Throwable ex) { + super("Could not access element: " + ex.getMessage(), ex); + } + +} diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Body.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Body.java index b4a1cad0..0b6e6c0e 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Body.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Body.java @@ -49,22 +49,22 @@ class AxiomSoap11Body extends AxiomSoapBody implements Soap11Body { public SoapFault addMustUnderstandFault(String faultString, Locale locale) { SOAPFault fault = addStandardFault(SOAP11Constants.FAULT_CODE_MUST_UNDERSTAND, faultString, locale); - return new AxiomSoap11Fault(fault, axiomFactory); + return new AxiomSoap11Fault(fault, getAxiomFactory()); } public SoapFault addClientOrSenderFault(String faultString, Locale locale) { SOAPFault fault = addStandardFault(SOAP11Constants.FAULT_CODE_SENDER, faultString, locale); - return new AxiomSoap11Fault(fault, axiomFactory); + return new AxiomSoap11Fault(fault, getAxiomFactory()); } public SoapFault addServerOrReceiverFault(String faultString, Locale locale) { SOAPFault fault = addStandardFault(SOAP11Constants.FAULT_CODE_RECEIVER, faultString, locale); - return new AxiomSoap11Fault(fault, axiomFactory); + return new AxiomSoap11Fault(fault, getAxiomFactory()); } public SoapFault addVersionMismatchFault(String faultString, Locale locale) { SOAPFault fault = addStandardFault(SOAP11Constants.FAULT_CODE_VERSION_MISMATCH, faultString, locale); - return new AxiomSoap11Fault(fault, axiomFactory); + return new AxiomSoap11Fault(fault, getAxiomFactory()); } public Soap11Fault addFault(QName code, String faultString, Locale locale) { @@ -76,15 +76,15 @@ class AxiomSoap11Body extends AxiomSoapBody implements Soap11Body { } try { detachAllBodyChildren(); - SOAPFault fault = axiomFactory.createSOAPFault(axiomBody); - SOAPFaultCode faultCode = axiomFactory.createSOAPFaultCode(fault); + SOAPFault fault = getAxiomFactory().createSOAPFault(getAxiomBody()); + SOAPFaultCode faultCode = getAxiomFactory().createSOAPFaultCode(fault); setValueText(code, fault, faultCode); - SOAPFaultReason faultReason = axiomFactory.createSOAPFaultReason(fault); + SOAPFaultReason faultReason = getAxiomFactory().createSOAPFaultReason(fault); if (locale != null) { addLangAttribute(locale, faultReason); } faultReason.setText(faultString); - return new AxiomSoap11Fault(fault, axiomFactory); + return new AxiomSoap11Fault(fault, getAxiomFactory()); } catch (SOAPProcessingException ex) { @@ -115,11 +115,11 @@ class AxiomSoap11Body extends AxiomSoapBody implements Soap11Body { Assert.notNull(faultString, "No faultString given"); try { detachAllBodyChildren(); - SOAPFault fault = axiomFactory.createSOAPFault(axiomBody); - SOAPFaultCode faultCode = axiomFactory.createSOAPFaultCode(fault); + SOAPFault fault = getAxiomFactory().createSOAPFault(getAxiomBody()); + SOAPFaultCode faultCode = getAxiomFactory().createSOAPFaultCode(fault); faultCode.setText( new QName(fault.getNamespace().getNamespaceURI(), localName, fault.getNamespace().getPrefix())); - SOAPFaultReason faultReason = axiomFactory.createSOAPFaultReason(fault); + SOAPFaultReason faultReason = getAxiomFactory().createSOAPFaultReason(fault); if (locale != null) { addLangAttribute(locale, faultReason); } @@ -132,8 +132,9 @@ class AxiomSoap11Body extends AxiomSoapBody implements Soap11Body { } private void addLangAttribute(Locale locale, SOAPFaultReason faultReason) { - OMNamespace xmlNamespace = axiomFactory.createOMNamespace("http://www.w3.org/XML/1998/namespace", "xml"); - OMAttribute langAttribute = axiomFactory.createOMAttribute("lang", xmlNamespace, AxiomUtils.toLanguage(locale)); + OMNamespace xmlNamespace = getAxiomFactory().createOMNamespace("http://www.w3.org/XML/1998/namespace", "xml"); + OMAttribute langAttribute = + getAxiomFactory().createOMAttribute("lang", xmlNamespace, AxiomUtils.toLanguage(locale)); faultReason.addAttribute(langAttribute); } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Fault.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Fault.java index 5aca46c3..325a3ac2 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Fault.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap11Fault.java @@ -37,20 +37,20 @@ class AxiomSoap11Fault extends AxiomSoapFault implements Soap11Fault { } public QName getFaultCode() { - return axiomFault.getCode().getTextAsQName(); + return getAxiomFault().getCode().getTextAsQName(); } public String getFaultStringOrReason() { - if (axiomFault.getReason() != null) { - return axiomFault.getReason().getText(); + if (getAxiomFault().getReason() != null) { + return getAxiomFault().getReason().getText(); } return null; } public Locale getFaultStringLocale() { - if (axiomFault.getReason() != null) { + if (getAxiomFault().getReason() != null) { OMAttribute langAttribute = - axiomFault.getReason().getAttribute(new QName("http://www.w3.org/XML/1998/namespace", "lang")); + getAxiomFault().getReason().getAttribute(new QName("http://www.w3.org/XML/1998/namespace", "lang")); if (langAttribute != null) { String xmlLangString = langAttribute.getAttributeValue(); if (xmlLangString != null) { diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Body.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Body.java index 0c2ce456..ded0cad8 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Body.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Body.java @@ -48,43 +48,43 @@ class AxiomSoap12Body extends AxiomSoapBody implements Soap12Body { public SoapFault addMustUnderstandFault(String reason, Locale locale) { Assert.notNull(locale, "No locale given"); SOAPFault fault = addStandardFault(SOAP12Constants.FAULT_CODE_MUST_UNDERSTAND, reason, locale); - return new AxiomSoap12Fault(fault, axiomFactory); + return new AxiomSoap12Fault(fault, getAxiomFactory()); } public SoapFault addClientOrSenderFault(String reason, Locale locale) { Assert.notNull(locale, "No locale given"); SOAPFault fault = addStandardFault(SOAP12Constants.FAULT_CODE_SENDER, reason, locale); - return new AxiomSoap12Fault(fault, axiomFactory); + return new AxiomSoap12Fault(fault, getAxiomFactory()); } public SoapFault addServerOrReceiverFault(String reason, Locale locale) { Assert.notNull(locale, "No locale given"); SOAPFault fault = addStandardFault(SOAP12Constants.FAULT_CODE_RECEIVER, reason, locale); - return new AxiomSoap12Fault(fault, axiomFactory); + return new AxiomSoap12Fault(fault, getAxiomFactory()); } public SoapFault addVersionMismatchFault(String reason, Locale locale) { Assert.notNull(locale, "No locale given"); SOAPFault fault = addStandardFault(SOAP12Constants.FAULT_CODE_VERSION_MISMATCH, reason, locale); - return new AxiomSoap12Fault(fault, axiomFactory); + return new AxiomSoap12Fault(fault, getAxiomFactory()); } public Soap12Fault addDataEncodingUnknownFault(QName[] subcodes, String reason, Locale locale) { Assert.notNull(locale, "No locale given"); SOAPFault fault = addStandardFault(SOAP12Constants.FAULT_CODE_DATA_ENCODING_UNKNOWN, reason, locale); - return new AxiomSoap12Fault(fault, axiomFactory); + return new AxiomSoap12Fault(fault, getAxiomFactory()); } private SOAPFault addStandardFault(String localName, String faultStringOrReason, Locale locale) { Assert.notNull(faultStringOrReason, "No faultStringOrReason given"); try { detachAllBodyChildren(); - SOAPFault fault = axiomFactory.createSOAPFault(axiomBody); - SOAPFaultCode code = axiomFactory.createSOAPFaultCode(fault); - SOAPFaultValue value = axiomFactory.createSOAPFaultValue(code); + SOAPFault fault = getAxiomFactory().createSOAPFault(getAxiomBody()); + SOAPFaultCode code = getAxiomFactory().createSOAPFaultCode(fault); + SOAPFaultValue value = getAxiomFactory().createSOAPFaultValue(code); value.setText(fault.getNamespace().getPrefix() + ":" + localName); - SOAPFaultReason reason = axiomFactory.createSOAPFaultReason(fault); - SOAPFaultText text = axiomFactory.createSOAPFaultText(reason); + SOAPFaultReason reason = getAxiomFactory().createSOAPFaultReason(fault); + SOAPFaultText text = getAxiomFactory().createSOAPFaultText(reason); if (locale != null) { text.setLang(AxiomUtils.toLanguage(locale)); } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Fault.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Fault.java index b5019db0..aed5b58d 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Fault.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Fault.java @@ -45,12 +45,12 @@ class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault { } public QName getFaultCode() { - return axiomFault.getCode().getValue().getTextAsQName(); + return getAxiomFault().getCode().getValue().getTextAsQName(); } public Iterator getFaultSubcodes() { List subcodes = new ArrayList(); - SOAPFaultSubCode subcode = axiomFault.getCode().getSubCode(); + SOAPFaultSubCode subcode = getAxiomFault().getCode().getSubCode(); while (subcode != null) { subcodes.add(subcode.getValue().getTextAsQName()); subcode = subcode.getSubCode(); @@ -59,10 +59,10 @@ class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault { } public void addFaultSubcode(QName subcode) { - SOAPFaultCode faultCode = axiomFault.getCode(); + SOAPFaultCode faultCode = getAxiomFault().getCode(); SOAPFaultSubCode faultSubCode = null; if (faultCode.getSubCode() == null) { - faultSubCode = axiomFactory.createSOAPFaultSubCode(faultCode); + faultSubCode = getAxiomFactory().createSOAPFaultSubCode(faultCode); } else { faultSubCode = faultCode.getSubCode(); @@ -71,25 +71,25 @@ class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault { faultSubCode = faultSubCode.getSubCode(); } else { - faultSubCode = axiomFactory.createSOAPFaultSubCode(faultSubCode); + faultSubCode = getAxiomFactory().createSOAPFaultSubCode(faultSubCode); break; } } } - SOAPFaultValue faultValue = axiomFactory.createSOAPFaultValue(faultSubCode); + SOAPFaultValue faultValue = getAxiomFactory().createSOAPFaultValue(faultSubCode); setValueText(subcode, faultValue); } private void setValueText(QName code, SOAPFaultValue faultValue) { String prefix = QNameUtils.getPrefix(code); if (StringUtils.hasLength(code.getNamespaceURI()) && StringUtils.hasLength(prefix)) { - OMNamespace namespace = axiomFault.findNamespaceURI(prefix); + OMNamespace namespace = getAxiomFault().findNamespaceURI(prefix); if (namespace == null) { - axiomFault.declareNamespace(code.getNamespaceURI(), prefix); + getAxiomFault().declareNamespace(code.getNamespaceURI(), prefix); } } else if (StringUtils.hasLength(code.getNamespaceURI())) { - OMNamespace namespace = axiomFault.findNamespace(code.getNamespaceURI(), null); + OMNamespace namespace = getAxiomFault().findNamespace(code.getNamespaceURI(), null); if (namespace == null) { throw new IllegalArgumentException("Could not resolve namespace of code [" + code + "]"); } @@ -99,7 +99,7 @@ class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault { } public String getFaultNode() { - SOAPFaultNode faultNode = axiomFault.getNode(); + SOAPFaultNode faultNode = getAxiomFault().getNode(); if (faultNode == null) { return null; } @@ -110,9 +110,9 @@ class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault { public void setFaultNode(String uri) { try { - SOAPFaultNode faultNode = axiomFactory.createSOAPFaultNode(axiomFault); + SOAPFaultNode faultNode = getAxiomFactory().createSOAPFaultNode(getAxiomFault()); faultNode.setNodeValue(uri); - axiomFault.setNode(faultNode); + getAxiomFault().setNode(faultNode); } catch (SOAPProcessingException ex) { throw new AxiomSoapFaultException(ex); @@ -124,17 +124,17 @@ class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault { } public String getFaultReasonText(Locale locale) { - SOAPFaultReason faultReason = axiomFault.getReason(); + SOAPFaultReason faultReason = getAxiomFault().getReason(); String language = AxiomUtils.toLanguage(locale); SOAPFaultText faultText = faultReason.getSOAPFaultText(language); return faultText != null ? faultText.getText() : null; } public void setFaultReasonText(Locale locale, String text) { - SOAPFaultReason faultReason = axiomFault.getReason(); + SOAPFaultReason faultReason = getAxiomFault().getReason(); String language = AxiomUtils.toLanguage(locale); try { - SOAPFaultText faultText = axiomFactory.createSOAPFaultText(faultReason); + SOAPFaultText faultText = getAxiomFactory().createSOAPFaultText(faultReason); faultText.setLang(language); faultText.setText(text); } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Header.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Header.java index 11fcc0f2..a482d0de 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Header.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoap12Header.java @@ -42,11 +42,12 @@ class AxiomSoap12Header extends AxiomSoapHeader implements Soap12Header { public SoapHeaderElement addNotUnderstoodHeaderElement(QName headerName) { try { - SOAPHeaderBlock notUnderstood = axiomHeader.addHeaderBlock("NotUnderstood", axiomHeader.getNamespace()); + SOAPHeaderBlock notUnderstood = + getAxiomHeader().addHeaderBlock("NotUnderstood", getAxiomHeader().getNamespace()); OMNamespace headerNamespace = notUnderstood.declareNamespace(headerName.getNamespaceURI(), QNameUtils.getPrefix(headerName)); notUnderstood.addAttribute("qname", headerNamespace.getPrefix() + ":" + headerName.getLocalPart(), null); - return new AxiomSoapHeaderElement(notUnderstood, axiomFactory); + return new AxiomSoapHeaderElement(notUnderstood, getAxiomFactory()); } catch (SOAPProcessingException ex) { throw new AxiomSoapHeaderException(ex); @@ -55,14 +56,14 @@ class AxiomSoap12Header extends AxiomSoapHeader implements Soap12Header { public SoapHeaderElement addUpgradeHeaderElement(String[] supportedSoapUris) { try { - SOAPHeaderBlock upgrade = axiomHeader.addHeaderBlock("Upgrade", axiomHeader.getNamespace()); + SOAPHeaderBlock upgrade = getAxiomHeader().addHeaderBlock("Upgrade", getAxiomHeader().getNamespace()); for (int i = 0; i < supportedSoapUris.length; i++) { - OMElement supportedEnvelope = - axiomFactory.createOMElement("SupportedEnvelope", axiomHeader.getNamespace(), upgrade); + OMElement supportedEnvelope = getAxiomFactory() + .createOMElement("SupportedEnvelope", getAxiomHeader().getNamespace(), upgrade); OMNamespace namespace = supportedEnvelope.declareNamespace(supportedSoapUris[i], ""); supportedEnvelope.addAttribute("qname", namespace.getPrefix() + ":Envelope", null); } - return new AxiomSoapHeaderElement(upgrade, axiomFactory); + return new AxiomSoapHeaderElement(upgrade, getAxiomFactory()); } catch (OMException ex) { throw new AxiomSoapHeaderException(ex); diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapBody.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapBody.java index 9236971b..7a3e0f42 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapBody.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapBody.java @@ -17,7 +17,6 @@ package org.springframework.ws.soap.axiom; import java.util.Iterator; -import javax.xml.namespace.QName; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.sax.SAXResult; @@ -27,7 +26,6 @@ import org.apache.axiom.om.OMException; import org.apache.axiom.soap.SOAPBody; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPFault; -import org.springframework.util.Assert; import org.springframework.ws.soap.SoapBody; import org.springframework.ws.soap.SoapFault; import org.springframework.xml.transform.StaxSource; @@ -37,19 +35,12 @@ import org.springframework.xml.transform.StaxSource; * * @author Arjen Poutsma */ -abstract class AxiomSoapBody implements SoapBody { - - protected final SOAPBody axiomBody; - - protected final SOAPFactory axiomFactory; +abstract class AxiomSoapBody extends AxiomSoapElement implements SoapBody { private boolean payloadCaching; protected AxiomSoapBody(SOAPBody axiomBody, SOAPFactory axiomFactory, boolean payloadCaching) { - Assert.notNull(axiomBody, "No axiomBody given"); - Assert.notNull(axiomFactory, "No axiomFactory given"); - this.axiomBody = axiomBody; - this.axiomFactory = axiomFactory; + super(axiomBody, axiomFactory); this.payloadCaching = payloadCaching; } @@ -72,33 +63,25 @@ abstract class AxiomSoapBody implements SoapBody { } public Result getPayloadResult() { - return new SAXResult(new AxiomContentHandler(axiomBody)); + return new SAXResult(new AxiomContentHandler(getAxiomBody())); } public boolean hasFault() { - return axiomBody.hasFault(); + return getAxiomBody().hasFault(); } public SoapFault getFault() { - SOAPFault axiomFault = axiomBody.getFault(); - return axiomFault != null ? new AxiomSoap11Fault(axiomFault, axiomFactory) : null; - } - - public QName getName() { - return axiomBody.getQName(); - } - - public Source getSource() { - return new StaxSource(axiomBody.getXMLStreamReader()); + SOAPFault axiomFault = getAxiomBody().getFault(); + return axiomFault != null ? new AxiomSoap11Fault(axiomFault, getAxiomFactory()) : null; } private OMElement getPayloadElement() throws OMException { - return axiomBody.getFirstElement(); + return getAxiomBody().getFirstElement(); } protected void detachAllBodyChildren() { try { - for (Iterator iterator = axiomBody.getChildElements(); iterator.hasNext();) { + for (Iterator iterator = getAxiomBody().getChildElements(); iterator.hasNext();) { OMElement child = (OMElement) iterator.next(); child.detach(); } @@ -109,4 +92,7 @@ abstract class AxiomSoapBody implements SoapBody { } + protected final SOAPBody getAxiomBody() { + return (SOAPBody) getAxiomElement(); + } } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java new file mode 100644 index 00000000..ec09dfae --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java @@ -0,0 +1,113 @@ +/* + * Copyright 2007 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.axiom; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import javax.xml.namespace.QName; +import javax.xml.transform.Source; + +import org.apache.axiom.om.OMAttribute; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMException; +import org.apache.axiom.om.OMNamespace; +import org.apache.axiom.soap.SOAPFactory; +import org.springframework.util.Assert; +import org.springframework.ws.soap.SoapElement; +import org.springframework.xml.transform.StaxSource; + +/** + * Axiom-specific version of {@link SoapElement}. + * + * @author Arjen Poutsma + */ +class AxiomSoapElement implements SoapElement { + + private final OMElement axiomElement; + + private final SOAPFactory axiomFactory; + + protected AxiomSoapElement(OMElement axiomElement, SOAPFactory axiomFactory) { + Assert.notNull(axiomElement, "axiomElement must not be null"); + Assert.notNull(axiomFactory, "axiomFactory must not be null"); + this.axiomElement = axiomElement; + this.axiomFactory = axiomFactory; + } + + public final QName getName() { + try { + return axiomElement.getQName(); + } + catch (OMException ex) { + throw new AxiomSoapElementException(ex); + } + } + + public final Source getSource() { + try { + return new StaxSource(axiomElement.getXMLStreamReader()); + + } + catch (OMException ex) { + throw new AxiomSoapElementException(ex); + } + } + + public final void addAttribute(QName name, String value) { + try { + OMNamespace namespace = getAxiomFactory().createOMNamespace(name.getNamespaceURI(), name.getPrefix()); + OMAttribute attribute = getAxiomFactory().createOMAttribute(name.getLocalPart(), namespace, value); + getAxiomElement().addAttribute(attribute); + } + catch (OMException ex) { + throw new AxiomSoapElementException(ex); + } + } + + public final String getAttributeValue(QName name) { + try { + return getAxiomElement().getAttributeValue(name); + } + catch (OMException ex) { + throw new AxiomSoapElementException(ex); + } + } + + public final Iterator getAllAttibutes() { + try { + List results = new ArrayList(); + for (Iterator iterator = getAxiomElement().getAllAttributes(); iterator.hasNext();) { + OMAttribute attribute = (OMAttribute) iterator.next(); + results.add(attribute.getQName()); + } + return results.iterator(); + + } + catch (OMException ex) { + throw new AxiomSoapElementException(ex); + } + } + + protected final OMElement getAxiomElement() { + return axiomElement; + } + + protected final SOAPFactory getAxiomFactory() { + return axiomFactory; + } +} diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElementException.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElementException.java new file mode 100644 index 00000000..1e7a1c4b --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElementException.java @@ -0,0 +1,34 @@ +/* + * Copyright 2007 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.axiom; + +import org.springframework.ws.soap.SoapElementException; + +public class AxiomSoapElementException extends SoapElementException { + + public AxiomSoapElementException(String msg) { + super(msg); + } + + public AxiomSoapElementException(String msg, Throwable ex) { + super(msg, ex); + } + + public AxiomSoapElementException(Throwable ex) { + super(ex); + } +} diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapEnvelope.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapEnvelope.java index 562b5dd4..20ebd351 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapEnvelope.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapEnvelope.java @@ -1,65 +1,45 @@ package org.springframework.ws.soap.axiom; import org.apache.axiom.om.OMException; -import org.apache.axiom.soap.*; -import org.springframework.util.Assert; +import org.apache.axiom.soap.SOAP11Constants; +import org.apache.axiom.soap.SOAP12Constants; +import org.apache.axiom.soap.SOAPBody; +import org.apache.axiom.soap.SOAPEnvelope; +import org.apache.axiom.soap.SOAPFactory; +import org.apache.axiom.soap.SOAPHeader; import org.springframework.ws.soap.SoapBody; import org.springframework.ws.soap.SoapEnvelope; import org.springframework.ws.soap.SoapHeader; -import org.springframework.xml.transform.StaxSource; - -import javax.xml.namespace.QName; -import javax.xml.transform.Source; /** * Axiom-Specific version of org.springframework.ws.soap.SoapEnvelope. * * @author Arjen Poutsma */ -class AxiomSoapEnvelope implements SoapEnvelope { - - private final SOAPEnvelope axiomEnvelope; - - private final SOAPFactory axiomFactory; +class AxiomSoapEnvelope extends AxiomSoapElement implements SoapEnvelope { boolean payloadCaching; private AxiomSoapBody body; public AxiomSoapEnvelope(SOAPEnvelope axiomEnvelope, SOAPFactory axiomFactory, boolean payloadCaching) { - Assert.notNull(axiomEnvelope, "No axiomEnvelope given"); - Assert.notNull(axiomFactory, "No axiomFactory given"); - this.axiomEnvelope = axiomEnvelope; - this.axiomFactory = axiomFactory; + super(axiomEnvelope, axiomFactory); this.payloadCaching = payloadCaching; } - public QName getName() { - return axiomEnvelope.getQName(); - } - - public Source getSource() { - try { - return new StaxSource(axiomEnvelope.getXMLStreamReader()); - } - catch (OMException ex) { - throw new AxiomSoapEnvelopeException(ex); - } - } - public SoapHeader getHeader() { try { - if (axiomEnvelope.getHeader() == null) { + if (getAxiomEnvelope().getHeader() == null) { return null; } else { - SOAPHeader axiomHeader = axiomEnvelope.getHeader(); - String namespaceURI = axiomEnvelope.getNamespace().getNamespaceURI(); + SOAPHeader axiomHeader = getAxiomEnvelope().getHeader(); + String namespaceURI = getAxiomEnvelope().getNamespace().getNamespaceURI(); if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(namespaceURI)) { - return new AxiomSoapHeader(axiomHeader, axiomFactory); + return new AxiomSoapHeader(axiomHeader, getAxiomFactory()); } else if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(namespaceURI)) { - return new AxiomSoap12Header(axiomHeader, axiomFactory); + return new AxiomSoap12Header(axiomHeader, getAxiomFactory()); } else { throw new AxiomSoapEnvelopeException("Unknown SOAP namespace \"" + namespaceURI + "\""); @@ -74,13 +54,13 @@ class AxiomSoapEnvelope implements SoapEnvelope { public SoapBody getBody() { if (body == null) { try { - SOAPBody axiomBody = axiomEnvelope.getBody(); - String namespaceURI = axiomEnvelope.getNamespace().getNamespaceURI(); + SOAPBody axiomBody = getAxiomEnvelope().getBody(); + String namespaceURI = getAxiomEnvelope().getNamespace().getNamespaceURI(); if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(namespaceURI)) { - body = new AxiomSoap11Body(axiomBody, axiomFactory, payloadCaching); + body = new AxiomSoap11Body(axiomBody, getAxiomFactory(), payloadCaching); } else if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(namespaceURI)) { - body = new AxiomSoap12Body(axiomBody, axiomFactory, payloadCaching); + body = new AxiomSoap12Body(axiomBody, getAxiomFactory(), payloadCaching); } else { throw new AxiomSoapEnvelopeException("Unknown SOAP namespace \"" + namespaceURI + "\""); @@ -92,4 +72,9 @@ class AxiomSoapEnvelope implements SoapEnvelope { } return body; } + + protected SOAPEnvelope getAxiomEnvelope() { + return (SOAPEnvelope) getAxiomElement(); + } + } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFault.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFault.java index a8e738ca..37257bbb 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFault.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFault.java @@ -16,50 +16,30 @@ package org.springframework.ws.soap.axiom; -import javax.xml.namespace.QName; -import javax.xml.transform.Source; - import org.apache.axiom.om.OMException; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPFault; import org.apache.axiom.soap.SOAPFaultDetail; import org.apache.axiom.soap.SOAPFaultRole; import org.apache.axiom.soap.SOAPProcessingException; -import org.springframework.util.Assert; import org.springframework.ws.soap.SoapFault; import org.springframework.ws.soap.SoapFaultDetail; -import org.springframework.xml.transform.StaxSource; /** @author Arjen Poutsma */ -abstract class AxiomSoapFault implements SoapFault { - - protected final SOAPFault axiomFault; - - protected final SOAPFactory axiomFactory; +abstract class AxiomSoapFault extends AxiomSoapElement implements SoapFault { protected AxiomSoapFault(SOAPFault axiomFault, SOAPFactory axiomFactory) { - Assert.notNull(axiomFault, "No axiomFault given"); - Assert.notNull(axiomFactory, "No axiomFactory given"); - this.axiomFault = axiomFault; - this.axiomFactory = axiomFactory; - } - - public QName getName() { - return axiomFault.getQName(); - } - - public Source getSource() { - return new StaxSource(axiomFault.getXMLStreamReader()); + super(axiomFault, axiomFactory); } public String getFaultActorOrRole() { - SOAPFaultRole faultRole = axiomFault.getRole(); + SOAPFaultRole faultRole = getAxiomFault().getRole(); return faultRole != null ? faultRole.getRoleValue() : null; } public void setFaultActorOrRole(String actor) { try { - SOAPFaultRole axiomFaultRole = axiomFactory.createSOAPFaultRole(axiomFault); + SOAPFaultRole axiomFaultRole = getAxiomFactory().createSOAPFaultRole(getAxiomFault()); axiomFaultRole.setRoleValue(actor); } catch (SOAPProcessingException ex) { @@ -70,8 +50,8 @@ abstract class AxiomSoapFault implements SoapFault { public SoapFaultDetail getFaultDetail() { try { - SOAPFaultDetail axiomFaultDetail = axiomFault.getDetail(); - return axiomFaultDetail != null ? new AxiomSoapFaultDetail(axiomFaultDetail, axiomFactory) : null; + SOAPFaultDetail axiomFaultDetail = getAxiomFault().getDetail(); + return axiomFaultDetail != null ? new AxiomSoapFaultDetail(axiomFaultDetail, getAxiomFactory()) : null; } catch (OMException ex) { throw new AxiomSoapFaultException(ex); @@ -81,12 +61,17 @@ abstract class AxiomSoapFault implements SoapFault { public SoapFaultDetail addFaultDetail() { try { - SOAPFaultDetail axiomFaultDetail = axiomFactory.createSOAPFaultDetail(axiomFault); - return new AxiomSoapFaultDetail(axiomFaultDetail, axiomFactory); + SOAPFaultDetail axiomFaultDetail = getAxiomFactory().createSOAPFaultDetail(getAxiomFault()); + return new AxiomSoapFaultDetail(axiomFaultDetail, getAxiomFactory()); } catch (OMException ex) { throw new AxiomSoapFaultException(ex); } } + + protected SOAPFault getAxiomFault() { + return (SOAPFault) getAxiomElement(); + } + } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java index 5718856c..02717d71 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java @@ -19,40 +19,30 @@ package org.springframework.ws.soap.axiom; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.transform.Result; -import javax.xml.transform.Source; import javax.xml.transform.sax.SAXResult; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMException; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPFaultDetail; -import org.springframework.util.Assert; import org.springframework.ws.soap.SoapFaultDetail; import org.springframework.ws.soap.SoapFaultDetailElement; -import org.springframework.xml.transform.StaxSource; /** * Axiom-specific version of org.springframework.ws.soap.SoapFaultDetail. * * @author Arjen Poutsma */ -class AxiomSoapFaultDetail implements SoapFaultDetail { - - private final SOAPFaultDetail axiomFaultDetail; - - private final SOAPFactory axiomFactory; +class AxiomSoapFaultDetail extends AxiomSoapElement implements SoapFaultDetail { public AxiomSoapFaultDetail(SOAPFaultDetail axiomFaultDetail, SOAPFactory axiomFactory) { - Assert.notNull(axiomFaultDetail, "No axiomFaultDetail given"); - Assert.notNull(axiomFactory, "No axiomFactory given"); - this.axiomFaultDetail = axiomFaultDetail; - this.axiomFactory = axiomFactory; + super(axiomFaultDetail, axiomFactory); } public SoapFaultDetailElement addFaultDetailElement(QName name) { try { - OMElement element = axiomFactory.createOMElement(name, axiomFaultDetail); - return new AxiomSoapFaultDetailElement(element); + OMElement element = getAxiomFactory().createOMElement(name, getAxiomFaultDetail()); + return new AxiomSoapFaultDetailElement(element, getAxiomFactory()); } catch (OMException ex) { throw new AxiomSoapFaultException(ex); @@ -61,24 +51,15 @@ class AxiomSoapFaultDetail implements SoapFaultDetail { } public Iterator getDetailEntries() { - return new AxiomSoapFaultDetailElementIterator(axiomFaultDetail.getAllDetailEntries()); - } - - public QName getName() { - return axiomFaultDetail.getQName(); - } - - public Source getSource() { - try { - return new StaxSource(axiomFaultDetail.getXMLStreamReader()); - } - catch (OMException ex) { - throw new AxiomSoapFaultException(ex); - } + return new AxiomSoapFaultDetailElementIterator(getAxiomFaultDetail().getAllDetailEntries()); } public Result getResult() { - return new SAXResult(new AxiomContentHandler(axiomFaultDetail)); + return new SAXResult(new AxiomContentHandler(getAxiomFaultDetail())); + } + + protected SOAPFaultDetail getAxiomFaultDetail() { + return (SOAPFaultDetail) getAxiomElement(); } private class AxiomSoapFaultDetailElementIterator implements Iterator { @@ -96,7 +77,7 @@ class AxiomSoapFaultDetail implements SoapFaultDetail { public Object next() { try { OMElement axiomElement = (OMElement) axiomIterator.next(); - return new AxiomSoapFaultDetailElement(axiomElement); + return new AxiomSoapFaultDetailElement(axiomElement, getAxiomFactory()); } catch (OMException ex) { throw new AxiomSoapFaultException(ex); diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetailElement.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetailElement.java index 86f4af4c..02ee9d2d 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetailElement.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetailElement.java @@ -16,32 +16,28 @@ package org.springframework.ws.soap.axiom; -import javax.xml.namespace.QName; import javax.xml.transform.Result; -import javax.xml.transform.Source; import javax.xml.transform.sax.SAXResult; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMException; +import org.apache.axiom.soap.SOAPFactory; import org.springframework.ws.soap.SoapFaultDetailElement; -import org.springframework.xml.transform.StaxSource; /** * Axiom-specific version of org.springframework.ws.soap.SoapFaultDetailElement. * * @author Arjen Poutsma */ -class AxiomSoapFaultDetailElement implements SoapFaultDetailElement { +class AxiomSoapFaultDetailElement extends AxiomSoapElement implements SoapFaultDetailElement { - private final OMElement axiomElement; - - public AxiomSoapFaultDetailElement(OMElement axiomElement) { - this.axiomElement = axiomElement; + public AxiomSoapFaultDetailElement(OMElement axiomElement, SOAPFactory soapFactory) { + super(axiomElement, soapFactory); } public Result getResult() { try { - return new SAXResult(new AxiomContentHandler(axiomElement)); + return new SAXResult(new AxiomContentHandler(getAxiomElement())); } catch (OMException ex) { throw new AxiomSoapFaultException(ex); @@ -51,24 +47,11 @@ class AxiomSoapFaultDetailElement implements SoapFaultDetailElement { public void addText(String text) { try { - axiomElement.setText(text); + getAxiomElement().setText(text); } catch (OMException ex) { throw new AxiomSoapFaultException(ex); } } - public QName getName() { - return axiomElement.getQName(); - } - - public Source getSource() { - try { - return new StaxSource(axiomElement.getXMLStreamReader()); - } - catch (OMException ex) { - throw new AxiomSoapFaultException(ex); - } - - } } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java index 73a596fe..c1dd983d 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java @@ -19,7 +19,6 @@ package org.springframework.ws.soap.axiom; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.transform.Result; -import javax.xml.transform.Source; import javax.xml.transform.sax.SAXResult; import org.apache.axiom.om.OMException; @@ -27,47 +26,31 @@ import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPHeader; import org.apache.axiom.soap.SOAPHeaderBlock; -import org.springframework.util.Assert; import org.springframework.ws.soap.SoapHeader; import org.springframework.ws.soap.SoapHeaderElement; import org.springframework.xml.namespace.QNameUtils; -import org.springframework.xml.transform.StaxSource; /** * Axiom-specific version of org.springframework.ws.soap.SoapHeader. * * @author Arjen Poutsma */ -class AxiomSoapHeader implements SoapHeader { - - protected final SOAPHeader axiomHeader; - - protected final SOAPFactory axiomFactory; +class AxiomSoapHeader extends AxiomSoapElement implements SoapHeader { AxiomSoapHeader(SOAPHeader axiomHeader, SOAPFactory axiomFactory) { - Assert.notNull(axiomHeader, "No axiomHeader given"); - Assert.notNull(axiomFactory, "No axiomFactory given"); - this.axiomHeader = axiomHeader; - this.axiomFactory = axiomFactory; - } - - public QName getName() { - return axiomHeader.getQName(); - } - - public Source getSource() { - return new StaxSource(axiomHeader.getXMLStreamReader()); + super(axiomHeader, axiomFactory); } public Result getResult() { - return new SAXResult(new AxiomContentHandler(axiomHeader)); + return new SAXResult(new AxiomContentHandler(getAxiomHeader())); } public SoapHeaderElement addHeaderElement(QName name) { try { - OMNamespace namespace = axiomFactory.createOMNamespace(name.getNamespaceURI(), QNameUtils.getPrefix(name)); - SOAPHeaderBlock axiomHeaderBlock = axiomHeader.addHeaderBlock(name.getLocalPart(), namespace); - return new AxiomSoapHeaderElement(axiomHeaderBlock, axiomFactory); + OMNamespace namespace = + getAxiomFactory().createOMNamespace(name.getNamespaceURI(), QNameUtils.getPrefix(name)); + SOAPHeaderBlock axiomHeaderBlock = getAxiomHeader().addHeaderBlock(name.getLocalPart(), namespace); + return new AxiomSoapHeaderElement(axiomHeaderBlock, getAxiomFactory()); } catch (OMException ex) { throw new AxiomSoapHeaderException(ex); @@ -76,7 +59,7 @@ class AxiomSoapHeader implements SoapHeader { public Iterator examineMustUnderstandHeaderElements(String role) { try { - return new AxiomSoapHeaderElementIterator(axiomHeader.examineMustUnderstandHeaderBlocks(role)); + return new AxiomSoapHeaderElementIterator(getAxiomHeader().examineMustUnderstandHeaderBlocks(role)); } catch (OMException ex) { throw new AxiomSoapHeaderException(ex); @@ -85,7 +68,7 @@ class AxiomSoapHeader implements SoapHeader { public Iterator examineAllHeaderElements() { try { - return new AxiomSoapHeaderElementIterator(axiomHeader.examineAllHeaderBlocks()); + return new AxiomSoapHeaderElementIterator(getAxiomHeader().examineAllHeaderBlocks()); } catch (OMException ex) { throw new AxiomSoapHeaderException(ex); @@ -93,6 +76,10 @@ class AxiomSoapHeader implements SoapHeader { } + protected SOAPHeader getAxiomHeader() { + return (SOAPHeader) getAxiomElement(); + } + private class AxiomSoapHeaderElementIterator implements Iterator { private final Iterator axiomIterator; @@ -108,7 +95,7 @@ class AxiomSoapHeader implements SoapHeader { public Object next() { try { SOAPHeaderBlock axiomHeaderBlock = (SOAPHeaderBlock) axiomIterator.next(); - return new AxiomSoapHeaderElement(axiomHeaderBlock, axiomFactory); + return new AxiomSoapHeaderElement(axiomHeaderBlock, getAxiomFactory()); } catch (OMException ex) { throw new AxiomSoapHeaderException(ex); diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeaderElement.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeaderElement.java index 95cf2b43..5fd0cad9 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeaderElement.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeaderElement.java @@ -16,71 +16,40 @@ package org.springframework.ws.soap.axiom; -import javax.xml.namespace.QName; import javax.xml.transform.Result; -import javax.xml.transform.Source; import javax.xml.transform.sax.SAXResult; -import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMException; -import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPHeaderBlock; -import org.springframework.util.Assert; import org.springframework.ws.soap.SoapHeaderElement; -import org.springframework.ws.soap.SoapHeaderException; -import org.springframework.xml.namespace.QNameUtils; -import org.springframework.xml.transform.StaxSource; -/** - * Axiom-specific version of org.springframework.ws.soap.SoapHeaderHeaderElement. - */ -class AxiomSoapHeaderElement implements SoapHeaderElement { - - private final SOAPHeaderBlock axiomHeaderBlock; - - private final SOAPFactory axiomFactory; +/** Axiom-specific version of org.springframework.ws.soap.SoapHeaderHeaderElement. */ +class AxiomSoapHeaderElement extends AxiomSoapElement implements SoapHeaderElement { public AxiomSoapHeaderElement(SOAPHeaderBlock axiomHeaderBlock, SOAPFactory axiomFactory) { - Assert.notNull(axiomHeaderBlock, "No axiomHeaderBlock given"); - Assert.notNull(axiomFactory, "No axiomFactory given"); - this.axiomHeaderBlock = axiomHeaderBlock; - this.axiomFactory = axiomFactory; - } - - public QName getName() { - return axiomHeaderBlock.getQName(); - } - - public Source getSource() { - try { - return new StaxSource(axiomHeaderBlock.getXMLStreamReader()); - } - catch (OMException ex) { - throw new AxiomSoapHeaderException(ex); - } - + super(axiomHeaderBlock, axiomFactory); } public String getActorOrRole() { - return axiomHeaderBlock.getRole(); + return getAxiomHeaderBlock().getRole(); } public void setActorOrRole(String role) { - axiomHeaderBlock.setRole(role); + getAxiomHeaderBlock().setRole(role); } public boolean getMustUnderstand() { - return axiomHeaderBlock.getMustUnderstand(); + return getAxiomHeaderBlock().getMustUnderstand(); } public void setMustUnderstand(boolean mustUnderstand) { - axiomHeaderBlock.setMustUnderstand(mustUnderstand); + getAxiomHeaderBlock().setMustUnderstand(mustUnderstand); } public Result getResult() { try { - return new SAXResult(new AxiomContentHandler(axiomHeaderBlock)); + return new SAXResult(new AxiomContentHandler(getAxiomHeaderBlock())); } catch (OMException ex) { throw new AxiomSoapHeaderException(ex); @@ -88,14 +57,8 @@ class AxiomSoapHeaderElement implements SoapHeaderElement { } - public void addAttribute(QName name, String value) throws SoapHeaderException { - try { - OMNamespace namespace = axiomFactory.createOMNamespace(name.getNamespaceURI(), QNameUtils.getPrefix(name)); - OMAttribute attribute = axiomFactory.createOMAttribute(name.getLocalPart(), namespace, value); - axiomHeaderBlock.addAttribute(attribute); - } - catch (OMException ex) { - throw new AxiomSoapHeaderException(ex); - } + protected SOAPHeaderBlock getAxiomHeaderBlock() { + return (SOAPHeaderBlock) getAxiomElement(); } + } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java index df3693ae..e2a9bcd2 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java @@ -82,6 +82,25 @@ public class Saaj11Implementation implements SaajImplementation { return new SAXResult(new SaajContentHandler(element)); } + public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException { + Name attributeName = SaajUtils.toName(name, element); + element.addAttribute(attributeName, value); + } + + public String getAttributeValue(SOAPElement element, QName name) throws SOAPException { + Name attributeName = SaajUtils.toName(name, element); + return element.getAttributeValue(attributeName); + } + + public Iterator getAllAttibutes(SOAPElement element) { + List results = new ArrayList(); + for (Iterator iterator = element.getAllAttributes(); iterator.hasNext();) { + Name attributeName = (Name) iterator.next(); + results.add(SaajUtils.toQName(attributeName)); + } + return results.iterator(); + } + public QName getFaultCode(SOAPFault fault) { String code = fault.getFaultCode(); int idx = code.indexOf(':'); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java index 77911604..3c1eb4af 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java @@ -18,7 +18,9 @@ package org.springframework.ws.soap.saaj; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Locale; import javax.activation.DataHandler; import javax.activation.DataSource; @@ -103,6 +105,25 @@ public class Saaj12Implementation implements SaajImplementation { return new DOMResult(element); } + public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException { + Name attributeName = SaajUtils.toName(name, element); + element.addAttribute(attributeName, value); + } + + public String getAttributeValue(SOAPElement element, QName name) throws SOAPException { + Name attributeName = SaajUtils.toName(name, element); + return element.getAttributeValue(attributeName); + } + + public Iterator getAllAttibutes(SOAPElement element) { + List results = new ArrayList(); + for (Iterator iterator = element.getAllAttributes(); iterator.hasNext();) { + Name attributeName = (Name) iterator.next(); + results.add(SaajUtils.toQName(attributeName)); + } + return results.iterator(); + } + public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException { return message.getSOAPPart().getEnvelope(); } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java index 172c0b2d..32a1a6d9 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java @@ -140,6 +140,18 @@ public class Saaj13Implementation implements SaajImplementation { return new DOMResult(element); } + public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException { + element.addAttribute(name, value); + } + + public String getAttributeValue(SOAPElement element, QName name) throws SOAPException { + return element.getAttributeValue(name); + } + + public Iterator getAllAttibutes(SOAPElement element) { + return element.getAllAttributesAsQNames(); + } + public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException { return message.getSOAPPart().getEnvelope(); } 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 index 085584f6..6ebb167c 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java @@ -53,6 +53,15 @@ public interface SaajImplementation { /** Returns the writable Result of the given element. */ Result getResult(SOAPElement element); + /** Adds an attribute to the specified element. */ + void addAttribute(SOAPElement element, QName name, String value) throws SOAPException; + + /** Returns the attribute value * */ + String getAttributeValue(SOAPElement element, QName name) throws SOAPException; + + /** Returns all attributes as an iterator of QNames. * */ + Iterator getAllAttibutes(SOAPElement element); + /** Returns the envelope of the given message. */ SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException; diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBodyException.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBodyException.java index c961e340..3b80d08e 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBodyException.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapBodyException.java @@ -16,12 +16,10 @@ package org.springframework.ws.soap.saaj; -import org.springframework.ws.soap.SoapEnvelopeException; +import org.springframework.ws.soap.SoapBodyException; -/** - * @author Arjen Poutsma - */ -public class SaajSoapBodyException extends SoapEnvelopeException { +/** @author Arjen Poutsma */ +public class SaajSoapBodyException extends SoapBodyException { public SaajSoapBodyException(String msg) { super(msg); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java index 3b784344..1f67bdbd 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java @@ -16,8 +16,10 @@ package org.springframework.ws.soap.saaj; +import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPException; import javax.xml.transform.Source; import org.springframework.util.Assert; @@ -46,11 +48,33 @@ class SaajSoapElement implements SoapElement { return getImplementation().getName(element); } - protected SOAPElement getSaajElement() { + public void addAttribute(QName name, String value) { + try { + getImplementation().addAttribute(element, name, value); + } + catch (SOAPException ex) { + throw new SaajSoapElementException(ex); + } + } + + public String getAttributeValue(QName name) { + try { + return getImplementation().getAttributeValue(element, name); + } + catch (SOAPException ex) { + throw new SaajSoapElementException(ex); + } + } + + public Iterator getAllAttibutes() { + return getImplementation().getAllAttibutes(element); + } + + protected final SOAPElement getSaajElement() { return element; } - protected SaajImplementation getImplementation() { + protected final SaajImplementation getImplementation() { if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_13) { return Saaj13Implementation.getInstance(); } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElementException.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElementException.java new file mode 100644 index 00000000..b583c96e --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElementException.java @@ -0,0 +1,35 @@ +/* + * Copyright 2007 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 org.springframework.ws.soap.SoapElementException; + +/** @author Arjen Poutsma */ +public class SaajSoapElementException extends SoapElementException { + + public SaajSoapElementException(String msg) { + super(msg); + } + + public SaajSoapElementException(String msg, Throwable ex) { + super(msg, ex); + } + + public SaajSoapElementException(Throwable ex) { + super(ex); + } +} diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapBodyTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapBodyTestCase.java index 2f5c30cd..461841d0 100644 --- a/core/src/test/java/org/springframework/ws/soap/AbstractSoapBodyTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapBodyTestCase.java @@ -17,23 +17,17 @@ package org.springframework.ws.soap; import java.util.Locale; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import org.custommonkey.xmlunit.XMLTestCase; import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; -public abstract class AbstractSoapBodyTestCase extends XMLTestCase { +public abstract class AbstractSoapBodyTestCase extends AbstractSoapElementTestCase { protected SoapBody soapBody; - protected Transformer transformer; - - protected final void setUp() throws Exception { - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - transformer = transformerFactory.newTransformer(); + protected final SoapElement createSoapElement() throws Exception { soapBody = createSoapBody(); + return soapBody; } protected abstract SoapBody createSoapBody() throws Exception; diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java new file mode 100644 index 00000000..59a2fdca --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java @@ -0,0 +1,51 @@ +/* + * Copyright 2007 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; + +import java.util.Iterator; +import javax.xml.namespace.QName; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; + +import org.custommonkey.xmlunit.XMLTestCase; + +public abstract class AbstractSoapElementTestCase extends XMLTestCase { + + private SoapElement soapElement; + + protected Transformer transformer; + + protected final void setUp() throws Exception { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformer = transformerFactory.newTransformer(); + soapElement = createSoapElement(); + } + + protected abstract SoapElement createSoapElement() throws Exception; + + public void testAttributes() throws Exception { + QName name = new QName("http://springframework.org/spring-ws", "attribute"); + String value = "value"; + soapElement.addAttribute(name, value); + assertEquals("Invalid attribute value", value, soapElement.getAttributeValue(name)); + Iterator allAttributes = soapElement.getAllAttibutes(); + assertTrue("Iterator is empty", allAttributes.hasNext()); + + } + + +} diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapEnvelopeTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapEnvelopeTestCase.java index 1c01634a..6f747e99 100644 --- a/core/src/test/java/org/springframework/ws/soap/AbstractSoapEnvelopeTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapEnvelopeTestCase.java @@ -16,21 +16,13 @@ package org.springframework.ws.soap; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; - -import org.custommonkey.xmlunit.XMLTestCase; - -public abstract class AbstractSoapEnvelopeTestCase extends XMLTestCase { +public abstract class AbstractSoapEnvelopeTestCase extends AbstractSoapElementTestCase { protected SoapEnvelope soapEnvelope; - protected Transformer transformer; - - protected final void setUp() throws Exception { - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - transformer = transformerFactory.newTransformer(); + protected final SoapElement createSoapElement() throws Exception { soapEnvelope = createSoapEnvelope(); + return soapEnvelope; } protected abstract SoapEnvelope createSoapEnvelope() throws Exception; diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java index 9ba3a509..568bcc07 100644 --- a/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java @@ -18,23 +18,17 @@ package org.springframework.ws.soap; import java.util.Iterator; import javax.xml.namespace.QName; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import org.custommonkey.xmlunit.XMLTestCase; import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; -public abstract class AbstractSoapHeaderTestCase extends XMLTestCase { +public abstract class AbstractSoapHeaderTestCase extends AbstractSoapElementTestCase { protected SoapHeader soapHeader; - protected Transformer transformer; - - protected final void setUp() throws Exception { - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - transformer = transformerFactory.newTransformer(); + protected final SoapElement createSoapElement() throws Exception { soapHeader = createSoapHeader(); + return soapHeader; } protected abstract SoapHeader createSoapHeader() throws Exception; diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 603b2bbf..3bbfe40c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -6,6 +6,7 @@ + Add methods to access attributes on SoapElement Added XPath template, for evaluating XPaths in a template-like fashion MTOM support