Author: dims
Date: Sun Jun 21 12:05:56 2009
New Revision: 787001

URL: http://svn.apache.org/viewvc?rev=787001&view=rev
Log:
Added back the change for WSCOMMONS-477 which was originally added in r785554 
and reverted by Andreas in r786897. 

When removeDataHandler is called, the specific cid was not being removed from 
cids array list. Added a new test case as well.


Added:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/attachments/DeleteAttachmentTest.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/resources/soap/soap11/SWAAttachmentStream.txt
Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/Attachments.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/attachments/AttachmentsTest.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/Attachments.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/Attachments.java?rev=787001&r1=787000&r2=787001&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/Attachments.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/Attachments.java
 Sun Jun 21 12:05:56 2009
@@ -389,7 +389,7 @@
                 }
             }
         }
-        if (!cids.contains(blobContentID)) {
+        if (cids.contains(blobContentID)) {
             cids.remove(blobContentID);
         }
     }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java?rev=787001&r1=787000&r2=787001&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
 Sun Jun 21 12:05:56 2009
@@ -72,6 +72,18 @@
     public static final String USE_CTE_BASE64_FOR_NON_TEXTUAL_ATTACHMENTS = 
         "org.apache.axiom.om.OMFormat.use.cteBase64.forNonTextualAttachments";
     
+    // The old default behavior for the swa output attachment order was the 
+    // natural order of the content ids.
+    //
+    // There are some customers who want the output order to match the 
+    // input order for swa attachments.
+    public static final String RESPECT_SWA_ATTACHMENT_ORDER =
+        "org.apache.axiom.om.OMFormat.respectSWAAttachmentOrder";
+    
+    public static final Boolean RESPECT_SWA_ATTACHMENT_ORDER_DEFAULT =
+        Boolean.TRUE;
+    
+    
     HashMap map = null;  // Map of generic properties
 
 

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java?rev=787001&r1=787000&r2=787001&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java
 Sun Jun 21 12:05:56 2009
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.StringWriter;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
@@ -260,14 +261,40 @@
         javax.activation.DataHandler dh = new javax.activation.DataHandler(
                 writer.toString(), "text/xml; charset="
                 + format.getCharSetEncoding());
-        writeDataHandlerWithAttachmentsMessage(dh, contentType, outputStream, 
attachments.getMap(), format);
+        
+        // Get the collection of ids associated with the attachments
+        Collection ids = null;         
+        if (respectSWAAttachmentOrder(format)) {
+            // ContentIDList is the order of the incoming/added attachments
+            ids = attachments.getContentIDList();
+        } else {
+            // ContentIDSet is an undefined order (the implemenentation 
currently
+            // orders the attachments using the natural order of the content 
ids)
+            ids = attachments.getContentIDSet();
+        }
+        writeDataHandlerWithAttachmentsMessage(dh, contentType, outputStream, 
+                    attachments.getMap(), format, ids);
     }
 
     public static void writeDataHandlerWithAttachmentsMessage(DataHandler 
rootDataHandler,
+            String contentType,
+            OutputStream outputStream,
+            Map attachments,
+            OMOutputFormat format) {
+        writeDataHandlerWithAttachmentsMessage(rootDataHandler,
+                contentType,
+                outputStream,
+                attachments,
+                format,
+                null);
+                    
+    }
+    public static void writeDataHandlerWithAttachmentsMessage(DataHandler 
rootDataHandler,
                                                        String contentType,
                                                        OutputStream 
outputStream,
                                                        Map attachments,
-                                                       OMOutputFormat format) {
+                                                       OMOutputFormat format,
+                                                       Collection ids) {
         try {
             startWritingMime(outputStream, format.getMimeBoundary());
 
@@ -282,9 +309,20 @@
             writeBodyPart(outputStream, rootMimeBodyPart, format
                     .getMimeBoundary());
 
-            Iterator iterator = attachments.keySet().iterator();
-            while (iterator.hasNext()) {
-                String key = (String) iterator.next();
+            Iterator idIterator = null;
+            if (ids == null) {
+                // If ids are not provided, use the attachment map
+                // to get the keys
+                idIterator = attachments.keySet().iterator();  
+            } else {
+                // if ids are provided (normal case), iterate
+                // over the ids so that the attachments are 
+                // written in the same order as the id keys.
+                idIterator = ids.iterator();
+            }
+            
+            while (idIterator.hasNext()) {
+                String key = (String) idIterator.next();
                 MimeBodyPart part = createMimeBodyPart(key,
                         (DataHandler) attachments.get(key), format);
                 writeBodyPart(outputStream, part,
@@ -357,7 +395,15 @@
                 outputStream.write(CRLF);
                 outputStream.write(CRLF);
                 startWritingMime(outputStream, innerBoundary);
-                Iterator attachmentIDIterator = 
attachments.getContentIDSet().iterator();
+                Iterator attachmentIDIterator = null;
+                if (respectSWAAttachmentOrder(format)) {
+                    // ContentIDList is the order of the incoming/added 
attachments
+                    attachmentIDIterator = 
attachments.getContentIDList().iterator();
+                } else {
+                    // ContentIDSet is an undefined order (the 
implemenentation currently
+                    // orders the attachments using the natural order of the 
content ids)
+                    attachmentIDIterator = 
attachments.getContentIDSet().iterator();
+                }
                 while (attachmentIDIterator.hasNext()) {
                     String contentID = (String) attachmentIDIterator.next();
                     DataHandler dataHandler = 
attachments.getDataHandler(contentID);
@@ -376,4 +422,16 @@
             throw new OMException("Problem writing Mime Parts.", e);
         }
     }
+    
+    /**
+     * @param format
+     * @return true if the incoming attachment order should be respected
+     */
+    private static boolean respectSWAAttachmentOrder(OMOutputFormat format) {
+        Boolean value = (Boolean) 
format.getProperty(OMOutputFormat.RESPECT_SWA_ATTACHMENT_ORDER);
+        if (value == null) {
+            value = OMOutputFormat.RESPECT_SWA_ATTACHMENT_ORDER_DEFAULT;
+        }
+        return value.booleanValue();
+    }
 }

Added: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/attachments/DeleteAttachmentTest.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/attachments/DeleteAttachmentTest.java?rev=787001&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/attachments/DeleteAttachmentTest.java
 (added)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/attachments/DeleteAttachmentTest.java
 Sun Jun 21 12:05:56 2009
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axiom.attachments;
+
+import org.apache.axiom.om.AbstractTestCase;
+import org.apache.axiom.om.TestConstants;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
+
+
+public class DeleteAttachmentTest extends AbstractTestCase {
+    File temp;
+
+    public void testIncomingAttachmentInputStreamFunctions() throws Exception {
+        InputStream inStream = getTestResource(TestConstants.MTOM_MESSAGE);
+        Attachments attachments = new Attachments(inStream, 
TestConstants.MTOM_MESSAGE_CONTENT_TYPE);
+
+        Collection list = attachments.getContentIDSet();
+        assertEquals(3, list.size());
+        
+        
assertTrue(list.contains("1.urn:uuid:a3adbaee51a1a87b2a11443668160...@apache.org"));
+        
assertTrue(list.contains("2.urn:uuid:a3adbaee51a1a87b2a11443668160...@apache.org"));
+        
+        
attachments.removeDataHandler("1.urn:uuid:a3adbaee51a1a87b2a11443668160...@apache.org");
+
+        List list2 = attachments.getContentIDList();
+        assertEquals(2, list2.size());
+        assertEquals(2, attachments.getMap().size());
+
+        
assertFalse(list2.contains("1.urn:uuid:a3adbaee51a1a87b2a11443668160...@apache.org"));
+        
assertTrue(list2.contains("2.urn:uuid:a3adbaee51a1a87b2a11443668160...@apache.org"));
+    }
+}
\ No newline at end of file


Reply via email to