You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2016/04/30 20:35:56 UTC

svn commit: r1741788 - in /webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments: MIMEMessage.java MIMEMessageAdapter.java

Author: veithen
Date: Sat Apr 30 18:35:56 2016
New Revision: 1741788

URL: http://svn.apache.org/viewvc?rev=1741788&view=rev
Log:
Implement a better way to manage DataHandlers in MIMEMessageAdapter.

Modified:
    webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessage.java
    webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessageAdapter.java

Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessage.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessage.java?rev=1741788&r1=1741787&r2=1741788&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessage.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessage.java Sat Apr 30 18:35:56 2016
@@ -150,7 +150,7 @@ class MIMEMessage implements Iterable<Pa
     /**
      * Force reading of all attachments.
      */
-    void fetchAllParts() {
+    private void fetchAllParts() {
         while (getNextPart() != null) {
             // Just loop until getNextPartDataHandler returns null
         }

Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessageAdapter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessageAdapter.java?rev=1741788&r1=1741787&r2=1741788&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessageAdapter.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/attachments/MIMEMessageAdapter.java Sat Apr 30 18:35:56 2016
@@ -21,9 +21,8 @@ package org.apache.axiom.attachments;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collections;
-import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -32,6 +31,7 @@ import javax.activation.DataHandler;
 import org.apache.axiom.blob.WritableBlobFactory;
 import org.apache.axiom.mime.ContentType;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.util.UIDGenerator;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -39,13 +39,12 @@ final class MIMEMessageAdapter extends A
     private static final Log log = LogFactory.getLog(MIMEMessageAdapter.class);
 
     private final MIMEMessage message;
-    private final Map<String,DataHandler> addedDataHandlers = new LinkedHashMap<String,DataHandler>();
-    private final Set<String> removedDataHandlers = new HashSet<String>();
+    private final Map<String,DataHandler> map = new LinkedHashMap<String,DataHandler>();
     private final int contentLength;
     private final CountingInputStream filterIS;
+    private final Part rootPart;
 
-    /** <code>boolean</code> Indicating if any data handlers have been directly requested */
-    private boolean partsRequested;
+    private Iterator<Part> partIterator;
 
     /** Container to hold streams for direct access */
     private IncomingAttachmentStreams streams;
@@ -66,13 +65,42 @@ final class MIMEMessageAdapter extends A
         }
 
         this.message = new MIMEMessage(inStream, contentTypeString, attachmentBlobFactory);
+
+        rootPart = message.getRootPart();
+        String rootPartContentID = rootPart.getContentID();
+        if (rootPartContentID == null) {
+            rootPartContentID = "firstPart_" + UIDGenerator.generateContentId();
+        }
+        map.put(rootPartContentID, rootPart.getDataHandler());
     }
 
-    private void requestParts() {
+    private boolean fetchNext() {
         if (streams != null) {
             throw new IllegalStateException("The attachments stream can only be accessed once; either by using the IncomingAttachmentStreams class or by getting a collection of AttachmentPart objects. They cannot both be called within the life time of the same service request.");
         }
-        partsRequested = true;
+        if (partIterator == null) {
+            partIterator = message.iterator();
+        }
+        if (partIterator.hasNext()) {
+            Part part = partIterator.next();
+            if (part != rootPart) {
+                String contentID = part.getContentID();
+                if (contentID == null) {
+                    throw new OMException(
+                            "Part content ID cannot be blank for non root MIME parts");
+                }
+                map.put(contentID, part.getDataHandler());
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private void fetchAll() {
+        while (fetchNext()) {
+            // Just loop
+        }
     }
 
     @Override
@@ -82,29 +110,28 @@ final class MIMEMessageAdapter extends A
 
     @Override
     DataHandler getDataHandler(String contentID) {
-        requestParts();
-        DataHandler dh = addedDataHandlers.get(contentID);
-        if (dh != null) {
-            return dh;
-        } else if (removedDataHandlers.contains(contentID)) {
-            return null;
-        } else {
-            return message.getDataHandler(contentID);
-        }
+        do {
+            DataHandler dataHandler = map.get(contentID);
+            if (dataHandler != null) {
+                return dataHandler;
+            }
+        } while (fetchNext());
+        return null;
     }
 
     @Override
     void addDataHandler(String contentID, DataHandler dataHandler) {
-        requestParts();
-        addedDataHandlers.put(contentID, dataHandler);
+        fetchAll();
+        map.put(contentID, dataHandler);
     }
 
     @Override
-    void removeDataHandler(String blobContentID) {
-        requestParts();
-        if (addedDataHandlers.remove(blobContentID) == null) {
-            removedDataHandlers.add(blobContentID);
-        }
+    void removeDataHandler(String contentID) {
+        do {
+            if (map.remove(contentID) != null) {
+                return;
+            }
+        } while (fetchNext());
     }
 
     @Override
@@ -128,7 +155,7 @@ final class MIMEMessageAdapter extends A
 
     @Override
     IncomingAttachmentStreams getIncomingAttachmentStreams() {
-        if (partsRequested) {
+        if (partIterator != null) {
             throw new IllegalStateException(
                     "The attachments stream can only be accessed once; either by using the IncomingAttachmentStreams class or by getting a " +
                             "collection of AttachmentPart objects. They cannot both be called within the life time of the same service request.");
@@ -144,25 +171,16 @@ final class MIMEMessageAdapter extends A
 
     @Override
     Set<String> getContentIDs(boolean fetchAll) {
-        requestParts();
-        Set<String> result = new LinkedHashSet<String>(message.getContentIDs(fetchAll));
-        result.removeAll(removedDataHandlers);
-        result.addAll(addedDataHandlers.keySet());
-        return result;
+        if (fetchAll) {
+            fetchAll();
+        }
+        return map.keySet();
     }
 
     @Override
     Map<String,DataHandler> getMap() {
-        requestParts();
-        Map<String,DataHandler> result = new LinkedHashMap<String,DataHandler>();
-        for (Map.Entry<String,Part> entry : message.getMap().entrySet()) {
-            String contentID = entry.getKey();
-            if (!removedDataHandlers.contains(contentID)) {
-                result.put(contentID, entry.getValue().getDataHandler());
-            }
-        }
-        result.putAll(addedDataHandlers);
-        return Collections.unmodifiableMap(result);
+        fetchAll();
+        return Collections.unmodifiableMap(map);
     }
 
     @Override
@@ -170,9 +188,8 @@ final class MIMEMessageAdapter extends A
         if (contentLength > 0) {
             return contentLength;
         } else {
-            requestParts();
             // Ensure all parts are read
-            message.fetchAllParts();
+            fetchAll();
             // Now get the count from the filter
             return filterIS.getCount();
         }