From f0fc4c8919ee91d5526be181b705f308dbc3dc30 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 4 Apr 2013 12:44:44 +0200 Subject: [PATCH] Upgrade to Axiom 1.2.14 Upgraded to Axiom 1.2.14, replacing several deprecated methods with their new replacement (if any), inlined old Axiom code in other places. Also made axiom-impl a runtime dependency (instead of compile). --- .../ws/soap/axiom/AxiomSoap12Fault.java | 4 +- .../ws/soap/axiom/AxiomSoapMessage.java | 52 +++++++++++++------ .../soap/axiom/AxiomSoapMessageFactory.java | 19 +++---- .../ws/soap/axiom/NonCachingPayloadTest.java | 4 +- .../ws/soap/axiom/support/AxiomUtilsTest.java | 5 +- parent/pom.xml | 5 +- 6 files changed, 55 insertions(+), 34 deletions(-) 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 ad355470..4ea46dea 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 @@ -105,14 +105,14 @@ class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault { return null; } else { - return faultNode.getNodeValue(); + return faultNode.getFaultNodeValue(); } } public void setFaultNode(String uri) { try { SOAPFaultNode faultNode = getAxiomFactory().createSOAPFaultNode(getAxiomFault()); - faultNode.setNodeValue(uri); + faultNode.setFaultNodeValue(uri); getAxiomFault().setNode(faultNode); } catch (SOAPProcessingException ex) { diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java index e5b0301d..2432662c 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java @@ -18,12 +18,27 @@ package org.springframework.ws.soap.axiom; import java.io.IOException; import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; +import java.io.Writer; import java.util.Iterator; import javax.activation.DataHandler; import javax.xml.stream.XMLStreamException; +import org.apache.axiom.attachments.Attachments; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMException; +import org.apache.axiom.om.OMOutputFormat; +import org.apache.axiom.om.impl.MTOMConstants; +import org.apache.axiom.om.impl.OMMultipartWriter; +import org.apache.axiom.soap.SOAPBody; +import org.apache.axiom.soap.SOAPEnvelope; +import org.apache.axiom.soap.SOAPFactory; +import org.apache.axiom.soap.SOAPMessage; +import org.apache.axiom.soap.SOAPProcessingException; +import org.w3c.dom.Document; + import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.ws.mime.Attachment; @@ -38,19 +53,6 @@ import org.springframework.ws.stream.StreamingWebServiceMessage; import org.springframework.ws.transport.TransportConstants; import org.springframework.ws.transport.TransportOutputStream; -import org.apache.axiom.attachments.Attachments; -import org.apache.axiom.om.OMElement; -import org.apache.axiom.om.OMException; -import org.apache.axiom.om.OMOutputFormat; -import org.apache.axiom.om.impl.MIMEOutputUtils; -import org.apache.axiom.om.impl.MTOMConstants; -import org.apache.axiom.soap.SOAPBody; -import org.apache.axiom.soap.SOAPEnvelope; -import org.apache.axiom.soap.SOAPFactory; -import org.apache.axiom.soap.SOAPMessage; -import org.apache.axiom.soap.SOAPProcessingException; -import org.w3c.dom.Document; - /** * AXIOM-specific implementation of the {@link SoapMessage} interface. Created via the {@link AxiomSoapMessageFactory}, * wraps a {@link SOAPMessage}. @@ -96,8 +98,8 @@ public class AxiomSoapMessage extends AbstractSoapMessage implements StreamingWe public AxiomSoapMessage(SOAPFactory soapFactory, boolean payloadCaching, boolean langAttributeOnSoap11FaultString) { SOAPEnvelope soapEnvelope = soapFactory.getDefaultEnvelope(); axiomFactory = soapFactory; - axiomMessage = axiomFactory.createSOAPMessage(soapEnvelope.getBuilder()); - axiomMessage.setSOAPEnvelope(soapEnvelope); + axiomMessage = axiomFactory.createSOAPMessage(); + axiomMessage.setSOAPEnvelope(soapEnvelope); attachments = new Attachments(); this.payloadCaching = payloadCaching; this.langAttributeOnSoap11FaultString = langAttributeOnSoap11FaultString; @@ -325,7 +327,25 @@ public class AxiomSoapMessage extends AbstractSoapMessage implements StreamingWe else { envelope.serializeAndConsume(writer, format); } - MIMEOutputUtils.writeSOAPWithAttachmentsMessage(writer, outputStream, attachments, format); + + try { + OMMultipartWriter mpw = new OMMultipartWriter(outputStream, format); + + Writer rootPartWriter = new OutputStreamWriter(mpw.writeRootPart(), + format.getCharSetEncoding()); + rootPartWriter.write(writer.toString()); + rootPartWriter.close(); + + // Get the collection of ids associated with the attachments + for (String id: attachments.getAllContentIDs()) { + mpw.writePart(attachments.getDataHandler(id), id); + } + + mpw.complete(); + } + catch (IOException ex) { + throw new OMException("Error writing SwA message", ex); + } } public String toString() { diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java index 270568e7..0d8449ce 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java @@ -39,16 +39,17 @@ import org.springframework.ws.transport.TransportConstants; import org.springframework.ws.transport.TransportInputStream; import org.apache.axiom.attachments.Attachments; +import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMException; import org.apache.axiom.om.impl.MTOMConstants; import org.apache.axiom.soap.SOAP11Constants; +import org.apache.axiom.soap.SOAP11Version; import org.apache.axiom.soap.SOAP12Constants; +import org.apache.axiom.soap.SOAP12Version; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPMessage; import org.apache.axiom.soap.impl.builder.MTOMStAXSOAPModelBuilder; import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder; -import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory; -import org.apache.axiom.soap.impl.llom.soap12.SOAP12Factory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -99,7 +100,7 @@ public class AxiomSoapMessageFactory implements SoapMessageFactory, Initializing private int attachmentCacheThreshold = 4096; // use SOAP 1.1 by default - private SOAPFactory soapFactory = new SOAP11Factory(); + private SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory(); private boolean langAttributeOnSoap11FaultString = true; @@ -152,10 +153,10 @@ public class AxiomSoapMessageFactory implements SoapMessageFactory, Initializing public void setSoapVersion(SoapVersion version) { if (SoapVersion.SOAP_11 == version) { - soapFactory = new SOAP11Factory(); + soapFactory = OMAbstractFactory.getSOAP11Factory(); } else if (SoapVersion.SOAP_12 == version) { - soapFactory = new SOAP12Factory(); + soapFactory = OMAbstractFactory.getSOAP12Factory(); } else { throw new IllegalArgumentException( @@ -252,8 +253,8 @@ public class AxiomSoapMessageFactory implements SoapMessageFactory, Initializing Attachments attachments = new Attachments(inputStream, contentType, attachmentCaching, attachmentCacheDir.getAbsolutePath(), Integer.toString(attachmentCacheThreshold)); - XMLStreamReader reader = inputFactory.createXMLStreamReader(attachments.getSOAPPartInputStream(), - getCharSetEncoding(attachments.getSOAPPartContentType())); + XMLStreamReader reader = inputFactory.createXMLStreamReader(attachments.getRootPartInputStream(), + getCharSetEncoding(attachments.getRootPartContentType())); StAXSOAPModelBuilder builder; String envelopeNamespace = getSoapEnvelopeNamespace(contentType); if (MTOMConstants.SWA_TYPE.equals(attachments.getAttachmentSpecType()) || @@ -334,10 +335,10 @@ public class AxiomSoapMessageFactory implements SoapMessageFactory, Initializing public String toString() { StringBuilder builder = new StringBuilder("AxiomSoapMessageFactory["); - if (soapFactory instanceof SOAP11Factory) { + if (soapFactory.getSOAPVersion() == SOAP11Version.getSingleton()) { builder.append("SOAP 1.1"); } - else if (soapFactory instanceof SOAP12Factory) { + else if (soapFactory.getSOAPVersion() == SOAP12Version.getSingleton()) { builder.append("SOAP 1.2"); } builder.append(','); diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java index efdb1862..6298855b 100644 --- a/core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java +++ b/core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java @@ -21,9 +21,9 @@ import javax.xml.stream.XMLStreamWriter; import org.springframework.util.xml.StaxUtils; +import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.soap.SOAPBody; import org.apache.axiom.soap.SOAPFactory; -import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory; import org.junit.Before; import org.junit.Test; @@ -38,7 +38,7 @@ public class NonCachingPayloadTest { @Before public final void setUp() { - SOAPFactory soapFactory = new SOAP11Factory(); + SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory(); body = soapFactory.createSOAPBody(); payload = new NonCachingPayload(body, soapFactory); } diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTest.java index 2b73d882..8746035a 100644 --- a/core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTest.java +++ b/core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTest.java @@ -37,7 +37,6 @@ import org.apache.axiom.soap.SOAP11Constants; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPMessage; import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder; -import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Assert; import org.junit.Before; @@ -118,7 +117,7 @@ public class AxiomUtilsTest { XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLStreamReader reader = inputFactory.createXMLStreamReader(resource.getInputStream()); StAXSOAPModelBuilder builder = - new StAXSOAPModelBuilder(reader, new SOAP11Factory(), SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI); + new StAXSOAPModelBuilder(reader, OMAbstractFactory.getSOAP11Factory(), SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI); SOAPMessage soapMessage = builder.getSoapMessage(); Document result = AxiomUtils.toDocument(soapMessage.getSOAPEnvelope()); @@ -145,4 +144,4 @@ public class AxiomUtilsTest { assertXMLEqual("Invalid SOAPEnvelope generated from document", expected, result); } -} \ No newline at end of file +} diff --git a/parent/pom.xml b/parent/pom.xml index 771bdc5f..2e02c29c 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -457,7 +457,7 @@ org.apache.ws.commons.axiom axiom-api - 1.2.13 + 1.2.14 org.apache.geronimo.specs @@ -480,7 +480,8 @@ org.apache.ws.commons.axiom axiom-impl - 1.2.13 + 1.2.14 + runtime org.apache.geronimo.specs