Author: veithen
Date: Tue Jun  8 22:06:21 2010
New Revision: 952842

URL: http://svn.apache.org/viewvc?rev=952842&view=rev
Log:
WSCOMMONS-518 / AXIS2-4603: Only allow unwrapping of selected XMLStreamReader 
wrappers and use a specialized API (XOPUtils#getXOPEncodedStream) to unwrap 
XOPDecodingStreamReader.

Added:
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/AbstractJAXBAttachmentUnmarshaller.java
      - copied, changed from r952771, 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java
Modified:
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/attachments/JAXBAttachmentUnmarshaller.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java

Copied: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/AbstractJAXBAttachmentUnmarshaller.java
 (from r952771, 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java)
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/AbstractJAXBAttachmentUnmarshaller.java?p2=axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/AbstractJAXBAttachmentUnmarshaller.java&p1=axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java&r1=952771&r2=952842&rev=952842&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/AbstractJAXBAttachmentUnmarshaller.java
 Tue Jun  8 22:06:21 2010
@@ -19,42 +19,38 @@
 
 package org.apache.axis2.datasource.jaxb;
 
-import org.apache.axiom.om.OMAttachmentAccessor;
 import org.apache.axiom.om.OMException;
-import org.apache.axiom.util.stax.XMLStreamReaderUtils;
-import org.apache.axis2.context.MessageContext;
+import org.apache.axiom.util.stax.xop.MimePartProvider;
 import org.apache.axis2.jaxws.i18n.Messages;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import javax.activation.DataHandler;
 import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.stream.XMLStreamReader;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
 /**
- * JAXBAttachmentUnmarshaller
- * <p/>
- * An implementation of the 
<link>javax.xml.bind.attachment.AttachmentUnmarshaller</link> that is
- * used for deserializing XOP elements into their corresponding binary data 
packages.
+ * Abstract base class for {...@link JAXBAttachmentUnmarshaller} and
+ * {...@link 
org.apache.axis2.jaxws.message.attachments.JAXBAttachmentUnmarshaller}. This is 
a partial
+ * implementation of the {...@link AttachmentUnmarshaller} class. It handles 
the attachments provided
+ * by Axiom through the {...@link MimePartProvider} interface. It should be 
noted that while Axiom only
+ * handles attachments referenced using XOP, {...@link AttachmentUnmarshaller} 
is also used to retrieve
+ * attachments from SwA messages. Hence the {...@link 
#getDataHandlerForSwA(String)} method.
  */
-public class JAXBAttachmentUnmarshaller extends AttachmentUnmarshaller {
+public abstract class AbstractJAXBAttachmentUnmarshaller extends 
AttachmentUnmarshaller {
 
-    private static final Log log = 
LogFactory.getLog(JAXBAttachmentUnmarshaller.class);
+    private static final Log log = 
LogFactory.getLog(AbstractJAXBAttachmentUnmarshaller.class);
 
-    private MessageContext msgContext;
-    private XMLStreamReader xmlStreamReader;
+    private final MimePartProvider mimePartProvider;
 
-    public JAXBAttachmentUnmarshaller(MessageContext msgContext, 
-                                      XMLStreamReader xmlStreamReader) {
-        this.msgContext = msgContext;
-        this.xmlStreamReader = xmlStreamReader;
+    public AbstractJAXBAttachmentUnmarshaller(MimePartProvider 
mimePartProvider) {
+        this.mimePartProvider = mimePartProvider;
     }
 
-    public boolean isXOPPackage() {
+    public final boolean isXOPPackage() {
         
         // Any message that is received might contain MTOM.
         // So always return true.
@@ -66,7 +62,7 @@ public class JAXBAttachmentUnmarshaller 
         return value;
     }
 
-    public byte[] getAttachmentAsByteArray(String cid) {
+    public final byte[] getAttachmentAsByteArray(String cid) {
         if (log.isDebugEnabled()) {
             log.debug("Attempting to retrieve attachment [" + cid + "] as a 
byte[]");
         }
@@ -87,7 +83,7 @@ public class JAXBAttachmentUnmarshaller 
         return null;
     }
 
-    public DataHandler getAttachmentAsDataHandler(String cid) {
+    public final DataHandler getAttachmentAsDataHandler(String cid) {
         if (log.isDebugEnabled()) {
             log.debug("Attempting to retrieve attachment [" + cid + "] as a 
DataHandler");
         }
@@ -156,32 +152,27 @@ public class JAXBAttachmentUnmarshaller 
         return baos.toByteArray();
     }
     
-    protected DataHandler getDataHandler(String cid) {
+    private DataHandler getDataHandler(String cid) {
         String blobcid = cid;
         if (blobcid.startsWith("cid:")) {
             blobcid = blobcid.substring(4);
         }
-        // Get the attachment from the messagecontext using the blob cid
-        if (msgContext != null) {
-            DataHandler dh = msgContext.getAttachment(blobcid);
-            if (dh != null) {
-                JAXBAttachmentUnmarshallerMonitor.addBlobCID(blobcid);
-            }
-            return dh;
+        DataHandler dh;
+        try {
+            dh = mimePartProvider.getDataHandler(blobcid);
+        } catch (IllegalArgumentException ex) {
+            dh = null;
+        } catch (IOException ex) {
+            throw new OMException("Failed to load attachment with content ID " 
+ blobcid, ex);
         }
-        XMLStreamReader attachmentAccessor = 
-            XMLStreamReaderUtils.getWrappedXMLStreamReader(xmlStreamReader, 
OMAttachmentAccessor.class);
-        
-        if (attachmentAccessor != null &&
-            attachmentAccessor instanceof OMAttachmentAccessor) {
-            
-            DataHandler dh = 
-                ((OMAttachmentAccessor) 
attachmentAccessor).getDataHandler(blobcid);
-            if (dh != null) {
-                JAXBAttachmentUnmarshallerMonitor.addBlobCID(blobcid);
-            }
-            return dh;
+        if (dh == null) {
+            dh = getDataHandlerForSwA(blobcid);
         }
-        return null;
+        if (dh != null) {
+            JAXBAttachmentUnmarshallerMonitor.addBlobCID(blobcid);
+        }
+        return dh;
     }
+    
+    protected abstract DataHandler getDataHandlerForSwA(String blobcid);
 }

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java?rev=952842&r1=952841&r2=952842&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBAttachmentUnmarshaller.java
 Tue Jun  8 22:06:21 2010
@@ -19,21 +19,10 @@
 
 package org.apache.axis2.datasource.jaxb;
 
-import org.apache.axiom.om.OMAttachmentAccessor;
-import org.apache.axiom.om.OMException;
-import org.apache.axiom.util.stax.XMLStreamReaderUtils;
+import org.apache.axiom.util.stax.xop.MimePartProvider;
 import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.jaxws.i18n.Messages;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 import javax.activation.DataHandler;
-import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.stream.XMLStreamReader;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
 
 /**
  * JAXBAttachmentUnmarshaller
@@ -41,147 +30,17 @@ import java.io.InputStream;
  * An implementation of the 
<link>javax.xml.bind.attachment.AttachmentUnmarshaller</link> that is
  * used for deserializing XOP elements into their corresponding binary data 
packages.
  */
-public class JAXBAttachmentUnmarshaller extends AttachmentUnmarshaller {
-
-    private static final Log log = 
LogFactory.getLog(JAXBAttachmentUnmarshaller.class);
-
-    private MessageContext msgContext;
-    private XMLStreamReader xmlStreamReader;
+public class JAXBAttachmentUnmarshaller extends 
AbstractJAXBAttachmentUnmarshaller {
+    private final MessageContext msgContext;
 
-    public JAXBAttachmentUnmarshaller(MessageContext msgContext, 
-                                      XMLStreamReader xmlStreamReader) {
+    public JAXBAttachmentUnmarshaller(MimePartProvider mimePartProvider,
+            MessageContext msgContext) {
+        super(mimePartProvider);
         this.msgContext = msgContext;
-        this.xmlStreamReader = xmlStreamReader;
     }
 
-    public boolean isXOPPackage() {
-        
-        // Any message that is received might contain MTOM.
-        // So always return true.
-        boolean value = true;
-    
-        if (log.isDebugEnabled()){ 
-            log.debug("isXOPPackage returns " + value);
-        }
-        return value;
-    }
-
-    public byte[] getAttachmentAsByteArray(String cid) {
-        if (log.isDebugEnabled()) {
-            log.debug("Attempting to retrieve attachment [" + cid + "] as a 
byte[]");
-        }
-        DataHandler dh = getAttachmentAsDataHandler(cid);
-        if (dh != null) {
-            try {
-                return convert(dh);
-            } catch (IOException ioe) {
-                if (log.isDebugEnabled()) {
-                    log.debug("Exception occurred while getting the byte[] " + 
ioe);
-                }
-                throw new OMException(ioe);
-            }
-        }
-        if (log.isDebugEnabled()) {
-            log.debug("returning null byte[]");
-        }
-        return null;
-    }
-
-    public DataHandler getAttachmentAsDataHandler(String cid) {
-        if (log.isDebugEnabled()) {
-            log.debug("Attempting to retrieve attachment [" + cid + "] as a 
DataHandler");
-        }
-
-        DataHandler dh = getDataHandler(cid);
-        if (dh != null) {
-            return dh;
-        } else {
-            String cid2 = getNewCID(cid);
-            if (log.isDebugEnabled()) {
-                log.debug("A dataHandler was not found for [" + cid + "] 
trying [" + cid2 + "]");
-            }
-            dh = getDataHandler(cid2);
-            if (dh != null) {
-                return dh;
-            }
-        }
-        // No Data Handler found
-        throw new OMException(Messages.getMessage("noDataHandler", cid));
-    }
-    
-    /**
-     * @param cid
-     * @return cid with translated characters
-     */
-    private String getNewCID(String cid) {
-        String cid2 = cid;
-
-        try {
-            cid2 = java.net.URLDecoder.decode(cid, "UTF-8");
-        } catch (Exception e) {
-            if (log.isDebugEnabled()) {
-                log.debug("getNewCID decoding " + cid + " as UTF-8 decoding 
error: " + e);
-            }
-        }
-        return cid2;
-    }
-
-    /**
-     * Read the bytes from the DataHandler
-     * 
-     * @param dh
-     * @return byte[]
-     * @throws IOException
-     */
-    private byte[] convert(DataHandler dh) throws IOException {
-        if (log.isDebugEnabled()) {
-            log.debug("Reading byte[] from DataHandler " + dh);
-        }
-        InputStream is = dh.getInputStream();
-        if (log.isDebugEnabled()) {
-            log.debug("DataHandler InputStream " + is);
-        }
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        byte[] b = new byte[1024];
-        int num = is.read(b);
-        if (log.isDebugEnabled()) {
-            if (num <= 0) {
-                log.debug("DataHandler InputStream contains no data. num=" + 
num);
-            }
-        }
-        while (num > 0) {
-            baos.write(b, 0, num);
-            num = is.read(b);
-        }
-        return baos.toByteArray();
-    }
-    
-    protected DataHandler getDataHandler(String cid) {
-        String blobcid = cid;
-        if (blobcid.startsWith("cid:")) {
-            blobcid = blobcid.substring(4);
-        }
-        // Get the attachment from the messagecontext using the blob cid
-        if (msgContext != null) {
-            DataHandler dh = msgContext.getAttachment(blobcid);
-            if (dh != null) {
-                JAXBAttachmentUnmarshallerMonitor.addBlobCID(blobcid);
-            }
-            return dh;
-        }
-        XMLStreamReader attachmentAccessor = 
-            XMLStreamReaderUtils.getWrappedXMLStreamReader(xmlStreamReader, 
OMAttachmentAccessor.class);
-        
-        if (attachmentAccessor != null &&
-            attachmentAccessor instanceof OMAttachmentAccessor) {
-            
-            DataHandler dh = 
-                ((OMAttachmentAccessor) 
attachmentAccessor).getDataHandler(blobcid);
-            if (dh != null) {
-                JAXBAttachmentUnmarshallerMonitor.addBlobCID(blobcid);
-            }
-            return dh;
-        }
-        return null;
+    @Override
+    protected DataHandler getDataHandlerForSwA(String blobcid) {
+        return msgContext.getAttachment(blobcid);
     }
 }

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java?rev=952842&r1=952841&r2=952842&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java
 Tue Jun  8 22:06:21 2010
@@ -22,6 +22,9 @@ package org.apache.axis2.datasource.jaxb
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
 import org.apache.axiom.util.stax.XMLStreamReaderUtils;
+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.context.MessageContext;
 import org.apache.axis2.java.security.AccessController;
 import org.apache.axis2.jaxws.message.OccurrenceArray;
@@ -286,8 +289,8 @@ public class JAXBDSContext {
      * Create an Attachment unmarshaller for unmarshalling MTOM/SWA Attachments
      * @return AttachmentUnmarshaller
      */
-    protected AttachmentUnmarshaller 
createAttachmentUnmarshaller(XMLStreamReader reader) {
-        return new JAXBAttachmentUnmarshaller(getMessageContext(), reader);
+    protected AttachmentUnmarshaller 
createAttachmentUnmarshaller(MimePartProvider mimePartProvider) {
+        return new JAXBAttachmentUnmarshaller(mimePartProvider, 
getMessageContext());
     }
 
     /**
@@ -302,10 +305,10 @@ public class JAXBDSContext {
             String clsText = (inputReader !=null) ? 
inputReader.getClass().toString() : "null";
             log.debug("unmarshal with inputReader=" + clsText);
         } 
-        XMLStreamReader reader = 
XMLStreamReaderUtils.getOriginalXMLStreamReader(inputReader);
-        if (reader == null) {
-            reader = inputReader;
-        }
+        // See the Javadoc of the CustomBuilder interface for a complete 
explanation of
+        // the following two instructions:
+        XOPEncodedStream xopEncodedStream = 
XOPUtils.getXOPEncodedStream(inputReader);
+        XMLStreamReader reader = 
XMLStreamReaderUtils.getOriginalXMLStreamReader(xopEncodedStream.getReader());
         if (DEBUG_ENABLED) {
             String clsText = (reader !=null) ? reader.getClass().toString() : 
"null";
             log.debug("  originalReader=" + clsText);
@@ -318,7 +321,7 @@ public class JAXBDSContext {
 
         
         // Create an attachment unmarshaller
-        AttachmentUnmarshaller aum = createAttachmentUnmarshaller(reader);
+        AttachmentUnmarshaller aum = 
createAttachmentUnmarshaller(xopEncodedStream.getMimePartProvider());
 
         if (aum != null) {
             if (DEBUG_ENABLED) {

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/attachments/JAXBAttachmentUnmarshaller.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/attachments/JAXBAttachmentUnmarshaller.java?rev=952842&r1=952841&r2=952842&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/attachments/JAXBAttachmentUnmarshaller.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/attachments/JAXBAttachmentUnmarshaller.java
 Tue Jun  8 22:06:21 2010
@@ -19,13 +19,11 @@
 
 package org.apache.axis2.jaxws.message.attachments;
 
-import org.apache.axiom.om.OMAttachmentAccessor;
-import org.apache.axiom.util.stax.XMLStreamReaderUtils;
-import org.apache.axis2.datasource.jaxb.JAXBAttachmentUnmarshallerMonitor;
+import org.apache.axiom.util.stax.xop.MimePartProvider;
+import org.apache.axis2.datasource.jaxb.AbstractJAXBAttachmentUnmarshaller;
 import org.apache.axis2.jaxws.message.Message;
 
 import javax.activation.DataHandler;
-import javax.xml.stream.XMLStreamReader;
 
 /**
  * JAXBAttachmentUnmarshaller
@@ -33,41 +31,17 @@ import javax.xml.stream.XMLStreamReader;
  * An implementation of the 
<link>javax.xml.bind.attachment.AttachmentUnmarshaller</link> that is
  * used for deserializing XOP elements into their corresponding binary data 
packages.
  */
-public class JAXBAttachmentUnmarshaller extends 
org.apache.axis2.datasource.jaxb.JAXBAttachmentUnmarshaller {
+public class JAXBAttachmentUnmarshaller extends 
AbstractJAXBAttachmentUnmarshaller {
 
-    private Message message;
-    private XMLStreamReader xmlStreamReader;
+    private final Message message;
 
-    public JAXBAttachmentUnmarshaller(Message message, XMLStreamReader 
xmlStreamReader) {
-        super(null, xmlStreamReader);
+    public JAXBAttachmentUnmarshaller(MimePartProvider mimePartProvider, 
Message message) {
+        super(mimePartProvider);
         this.message = message;
     }
 
-    protected DataHandler getDataHandler(String cid) {
-        
-        // Get the attachment from the message using the cid
-        if (message != null) {
-            DataHandler dh = message.getDataHandler(cid);
-            if (dh != null) {
-                JAXBAttachmentUnmarshallerMonitor.addBlobCID(cid);
-            }
-            return dh;
-        }
-        
-        XMLStreamReader attachmentAccessor = 
-            XMLStreamReaderUtils.getWrappedXMLStreamReader(xmlStreamReader, 
OMAttachmentAccessor.class);
-        
-        if (attachmentAccessor != null &&
-            attachmentAccessor instanceof OMAttachmentAccessor) {
-            DataHandler dh = 
-                ((OMAttachmentAccessor) 
attachmentAccessor).getDataHandler(cid);
-            if (dh != null) {
-                JAXBAttachmentUnmarshallerMonitor.addBlobCID(cid);
-            }
-            return dh;
-        }
-        return null;
+    @Override
+    protected DataHandler getDataHandlerForSwA(String blobcid) {
+        return message.getDataHandler(blobcid);
     }
-
-    
 }

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java?rev=952842&r1=952841&r2=952842&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java
 Tue Jun  8 22:06:21 2010
@@ -19,6 +19,7 @@
 
 package org.apache.axis2.jaxws.message.databinding;
 
+import org.apache.axiom.util.stax.xop.MimePartProvider;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.datasource.jaxb.JAXBDSContext;
 import org.apache.axis2.jaxws.message.Message;
@@ -29,7 +30,6 @@ import org.apache.axis2.jaxws.spi.Consta
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.attachment.AttachmentMarshaller;
 import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 import java.util.TreeSet;
 
@@ -94,8 +94,8 @@ public class JAXBBlockContext extends JA
     }
     
     @Override
-    protected AttachmentUnmarshaller 
createAttachmentUnmarshaller(XMLStreamReader reader) {
-        return new JAXBAttachmentUnmarshaller(getMessage(), reader);
+    protected AttachmentUnmarshaller 
createAttachmentUnmarshaller(MimePartProvider mimePartProvider) {
+        return new JAXBAttachmentUnmarshaller(mimePartProvider, getMessage());
     }
 
     public ClassLoader getClassLoader() {


Reply via email to