You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by bi...@apache.org on 2020/04/14 19:57:51 UTC

[axis-axis2-java-core] 02/02: Some initial code for AXIS2-5308.

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