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();