This is an automated email from the ASF dual-hosted git repository. billblough pushed a commit to branch AXIS2-5308 in repository https://gitbox.apache.org/repos/asf/axis-axis2-java-core.git
commit ed568896db884ef98e5addaa64eaf80ccc3c5833 Author: Andreas Veithen <veit...@apache.org> AuthorDate: Sun Jan 17 20:40:16 2016 +0000 Some initial code for AXIS2-5308. --- .../axis2/jaxws/message/impl/MessageImpl.java | 33 ++------------- .../axis2/jaxws/message/impl/XMLPartImpl.java | 8 +++- .../axis2/jaxws/message/util/SAAJConverter.java | 12 ++++-- .../jaxws/message/util/impl/SAAJConverterImpl.java | 47 +++++++++++++++++----- .../axis2/jaxws/message/SAAJConverterTests.java | 6 +-- .../src/org/apache/axis2/builder/MTOMBuilder.java | 3 -- 6 files changed, 60 insertions(+), 49 deletions(-) diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java index 723c897..88b746c 100644 --- a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java +++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java @@ -48,7 +48,6 @@ import javax.activation.DataHandler; import javax.jws.soap.SOAPBinding.Style; import javax.xml.namespace.QName; import javax.xml.soap.AttachmentPart; -import javax.xml.soap.MessageFactory; import javax.xml.soap.MimeHeaders; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPEnvelope; @@ -57,8 +56,6 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.ws.WebServiceException; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -188,36 +185,13 @@ public class MessageImpl implements Message { // Get OMElement from XMLPart. OMElement element = xmlPart.getAsOMElement(); + SOAPMessage soapMessage = getSAAJConverter().toSAAJ((org.apache.axiom.soap.SOAPEnvelope)element, false); + // Get the namespace so that we can determine SOAP11 or SOAP12 OMNamespace ns = element.getNamespace(); - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - element.serialize(outStream); - - // In some cases (usually inbound) the builder will not be closed after - // serialization. In that case it should be closed manually. - if (element.getBuilder() != null && !element.getBuilder().isCompleted()) { - element.close(false); - } - - byte[] bytes = outStream.toByteArray(); - - if (log.isDebugEnabled()) { - String text = new String(bytes); - log.debug(" inputstream = " + text); - } - - // Create InputStream - ByteArrayInputStream inStream = new ByteArrayInputStream(bytes); - - // Create MessageFactory that supports the version of SOAP in the om element - MessageFactory mf = getSAAJConverter().createMessageFactory(ns.getNamespaceURI()); - - // Create soapMessage object from Message Factory using the input - // stream created from OM. - // Get the MimeHeaders from the transportHeaders map - MimeHeaders defaultHeaders = new MimeHeaders(); + MimeHeaders defaultHeaders = soapMessage.getMimeHeaders(); if (transportHeaders != null) { Iterator it = transportHeaders.entrySet().iterator(); while (it.hasNext()) { @@ -266,7 +240,6 @@ public class MessageImpl implements Message { if (log.isDebugEnabled()) { log.debug(" setContentType =" + ctValue); } - SOAPMessage soapMessage = mf.createMessage(defaultHeaders, inStream); // At this point the XMLPart is still an OMElement. // We need to change it to the new SOAPEnvelope. diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java index 331d2a3..dc1d6c9 100644 --- a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java +++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java @@ -21,6 +21,7 @@ package org.apache.axis2.jaxws.message.impl; import org.apache.axiom.attachments.Attachments; import org.apache.axiom.om.OMElement; +import org.apache.axis2.jaxws.ExceptionFactory; import org.apache.axis2.jaxws.message.Message; import org.apache.axis2.jaxws.message.Protocol; import org.apache.axis2.jaxws.message.factory.SAAJConverterFactory; @@ -28,6 +29,7 @@ import org.apache.axis2.jaxws.message.util.SAAJConverter; import org.apache.axis2.jaxws.registry.FactoryRegistry; import javax.xml.soap.SOAPEnvelope; +import javax.xml.soap.SOAPException; import javax.xml.ws.WebServiceException; /** @@ -92,7 +94,11 @@ public class XMLPartImpl extends XMLPartBase { @Override protected SOAPEnvelope _convertOM2SE(OMElement om) throws WebServiceException { - return getSAAJConverter().toSAAJ((org.apache.axiom.soap.SOAPEnvelope)om); + try { + return getSAAJConverter().toSAAJ((org.apache.axiom.soap.SOAPEnvelope)om, true).getSOAPPart().getEnvelope(); + } catch (SOAPException ex) { + throw ExceptionFactory.makeWebServiceException(ex); + } } @Override diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java index 3fe42e1..6bcf7ee 100644 --- a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java +++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java @@ -27,6 +27,7 @@ import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFactory; +import javax.xml.soap.SOAPMessage; import javax.xml.ws.WebServiceException; /** SAAJConverter Provides Conversion between SAAJ and OM Constructed via the SAAJConverterFactory */ @@ -35,13 +36,18 @@ public interface SAAJConverter { public final static String OM_ATTRIBUTE_KEY = "ATTRIBUTE_TYPE_KEY"; /** - * Convert OM SOAPEnvleope to SAAJ SOAPEnvelope + * Convert OM {@link org.apache.axiom.soap.SOAPEnvelope} to SAAJ {@link SOAPMessage}. * * @param omElement - * @return SOAPEnvelope + * @param inlineMtom + * Specifies how optimized base64 encoded content is handled. {@code true} indicates + * that such content should be inlined (i.e. converted to text nodes). {@code false} + * instructs the method to produce an XOP encoded message and add the optimized + * content as attachment parts to the returned message. + * @return the converted message * @throws WebServiceException */ - public SOAPEnvelope toSAAJ(org.apache.axiom.soap.SOAPEnvelope omElement) + public SOAPMessage toSAAJ(org.apache.axiom.soap.SOAPEnvelope omElement, boolean inlineMtom) throws WebServiceException; /** diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java index 9d2a0bd..f1f63b7 100644 --- a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java +++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java @@ -28,18 +28,23 @@ import org.apache.axiom.soap.SOAP11Constants; import org.apache.axiom.soap.SOAP12Constants; import org.apache.axiom.soap.impl.builder.MTOMStAXSOAPModelBuilder; import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder; +import org.apache.axiom.util.stax.xop.MimePartProvider; +import org.apache.axiom.util.stax.xop.XOPEncodedStream; +import org.apache.axiom.util.stax.xop.XOPUtils; import org.apache.axis2.jaxws.ExceptionFactory; import org.apache.axis2.jaxws.i18n.Messages; import org.apache.axis2.jaxws.message.util.SAAJConverter; import org.apache.axis2.jaxws.message.util.SOAPElementReader; import org.apache.axis2.jaxws.utility.JavaUtils; import org.apache.axis2.jaxws.utility.SAAJFactory; +import org.apache.axis2.namespace.Constants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Node; -import org.w3c.dom.Attr; +import org.w3c.dom.Attr; import javax.xml.namespace.QName; +import javax.xml.soap.AttachmentPart; import javax.xml.soap.Detail; import javax.xml.soap.MessageFactory; import javax.xml.soap.Name; @@ -62,6 +67,7 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.ws.WebServiceException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.Iterator; /** SAAJConverterImpl Provides an conversion methods between OM<->SAAJ */ @@ -77,21 +83,20 @@ public class SAAJConverterImpl implements SAAJConverter { /* (non-Javadoc) * @see org.apache.axis2.jaxws.message.util.SAAJConverter#toSAAJ(org.apache.axiom.soap.SOAPEnvelope) */ - public SOAPEnvelope toSAAJ(org.apache.axiom.soap.SOAPEnvelope omEnvelope) + public SOAPMessage toSAAJ(org.apache.axiom.soap.SOAPEnvelope omEnvelope, boolean inlineMtom) throws WebServiceException { if (log.isDebugEnabled()) { - log.debug("Converting OM SOAPEnvelope to SAAJ SOAPEnvelope"); + log.debug("Converting OM SOAPEnvelope to SAAJ SOAPMessage"); log.debug("The conversion occurs due to " + JavaUtils.stackToString()); } - SOAPEnvelope soapEnvelope = null; try { // Build the default envelope OMNamespace ns = omEnvelope.getNamespace(); MessageFactory mf = createMessageFactory(ns.getNamespaceURI()); SOAPMessage sm = mf.createMessage(); SOAPPart sp = sm.getSOAPPart(); - soapEnvelope = sp.getEnvelope(); + SOAPEnvelope soapEnvelope = sp.getEnvelope(); // The getSOAPEnvelope() call creates a default SOAPEnvelope with a SOAPHeader and SOAPBody. // The SOAPHeader and SOAPBody are removed (they will be added back in if they are present in the @@ -109,15 +114,23 @@ public class SAAJConverterImpl implements SAAJConverter { // The best way to walk the data is to get the XMLStreamReader and use this // to build the SOAPElements XMLStreamReader reader = omEnvelope.getXMLStreamReader(); + MimePartProvider mimePartProvider; + if (inlineMtom) { + mimePartProvider = null; + } else { + XOPEncodedStream xop = XOPUtils.getXOPEncodedStream(reader); + mimePartProvider = xop.getMimePartProvider(); + reader = xop.getReader(); + } NameCreator nc = new NameCreator(soapEnvelope); - buildSOAPTree(nc, soapEnvelope, null, reader, false); + buildSOAPTree(nc, sm, soapEnvelope, null, reader, mimePartProvider, false); + return sm; } catch (WebServiceException e) { throw e; } catch (SOAPException e) { throw ExceptionFactory.makeWebServiceException(e); } - return soapEnvelope; } /* (non-Javadoc) @@ -253,7 +266,7 @@ public class SAAJConverterImpl implements SAAJConverter { .makeWebServiceException(Messages.getMessage("SAAJConverterErr1")); } NameCreator nc = new NameCreator((SOAPEnvelope)env); - return buildSOAPTree(nc, null, parent, reader, false); + return buildSOAPTree(nc, null, null, parent, reader, null, false); } @@ -279,7 +292,7 @@ public class SAAJConverterImpl implements SAAJConverter { reader = omElement.getXMLStreamReaderWithoutCaching(); } NameCreator nc = new NameCreator(sf); - return buildSOAPTree(nc, null, parent, reader, false); + return buildSOAPTree(nc, null, null, parent, reader, null, false); } @@ -295,9 +308,11 @@ public class SAAJConverterImpl implements SAAJConverter { * @param quitAtBody - true if quit reading after the body START_ELEMENT */ protected SOAPElement buildSOAPTree(NameCreator nc, + SOAPMessage message, SOAPElement root, SOAPElement parent, XMLStreamReader reader, + MimePartProvider mimePartProvider, boolean quitAtBody) throws WebServiceException { try { @@ -316,6 +331,18 @@ public class SAAJConverterImpl implements SAAJConverter { root = parent; } } + if (message != null && mimePartProvider != null + && Constants.ELEM_XOP_INCLUDE.equals(reader.getLocalName()) + && Constants.URI_XOP_INCLUDE.equals(reader.getNamespaceURI())) { + String href = reader.getAttributeValue(null, "href"); + if (href != null) { + String contentId = XOPUtils.getContentIDFromURL(href); + AttachmentPart part = message.createAttachmentPart(); + part.setContentId(contentId); + part.setDataHandler(mimePartProvider.getDataHandler(contentId)); + message.addAttachmentPart(part); + } + } if (quitAtBody && parent instanceof SOAPBody) { return root; } @@ -388,6 +415,8 @@ public class SAAJConverterImpl implements SAAJConverter { throw ExceptionFactory.makeWebServiceException(e); } catch (SOAPException e) { throw ExceptionFactory.makeWebServiceException(e); + } catch (IOException e) { + throw ExceptionFactory.makeWebServiceException(e); } return root; } diff --git a/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java b/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java index bd499bc..0473782 100644 --- a/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java +++ b/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java @@ -107,7 +107,7 @@ public class SAAJConverterTests extends TestCase { SAAJConverter converter = f.getSAAJConverter(); // Step 2: Convert the OM SOAPEnvelope to an SAAJ SOAPEnvelope - SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope); + SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope, true).getSOAPPart().getEnvelope(); // Step 2a: Simple assertion check to ensure correctness. String name = saajEnvelope.getBody().getFirstChild().getLocalName(); @@ -121,7 +121,7 @@ public class SAAJConverterTests extends TestCase { assertTrue("a".equals(name)); // Step 4: Rinse and repeat - saajEnvelope = converter.toSAAJ(omEnvelope); + saajEnvelope = converter.toSAAJ(omEnvelope, true).getSOAPPart().getEnvelope(); name = saajEnvelope.getBody().getFirstChild().getLocalName(); assertTrue("a".equals(name)); omEnvelope = converter.toOM(saajEnvelope); @@ -212,7 +212,7 @@ public class SAAJConverterTests extends TestCase { SAAJConverter converter = f.getSAAJConverter(); // Step 2: Convert the OM SOAPEnvelope to an SAAJ SOAPEnvelope - SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope); + SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope, true).getSOAPPart().getEnvelope(); // Step 3: Verify attribute type is stored after conversion Element testElement = (Element) saajEnvelope.getBody().getFirstChild().getFirstChild(); diff --git a/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java b/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java index 4ddb79d..9a04afa 100644 --- a/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java +++ b/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java @@ -43,9 +43,6 @@ public class MTOMBuilder implements MIMEAwareBuilder { public OMElement processMIMEMessage(Attachments attachments, String contentType, MessageContext messageContext) throws AxisFault { try { - // TODO: this will be changed later (see AXIS2-5308) - messageContext.setAttachmentMap(attachments); - SOAPModelBuilder builder = OMXMLBuilderFactory.createSOAPModelBuilder(attachments); OMDocument document = builder.getDocument(); String charsetEncoding = document.getCharsetEncoding();