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 2022/11/04 08:53:20 UTC

[ws-axiom] branch master updated: Make use of ContentType in some places where String is used

This is an automated email from the ASF dual-hosted git repository.

veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git


The following commit(s) were added to refs/heads/master by this push:
     new c452fd909 Make use of ContentType in some places where String is used
c452fd909 is described below

commit c452fd909665cdb7d901fd84c4daf61c829021a2
Author: Andreas Veithen <an...@gmail.com>
AuthorDate: Fri Nov 4 08:52:40 2022 +0000

    Make use of ContentType in some places where String is used
---
 axiom-api/pom.xml                                  |   2 +
 .../org/apache/axiom/mime/MultipartBodyWriter.java |  22 +-
 .../java/org/apache/axiom/om/OMOutputFormat.java   |   4 +-
 .../apache/axiom/om/impl/OMMultipartWriter.java    |  55 ++--
 .../org/apache/axiom/soap/SOAP11Constants.java     |   4 +-
 .../org/apache/axiom/soap/SOAP12Constants.java     |   4 +-
 .../apache/axiom/mime/MultipartBodyWriterTest.java |   2 +-
 .../org/apache/axiom/om/OMOutputFormatTest.java    |  14 +-
 .../org/apache/axiom/om/impl/MIMEOutputUtils.java  | 359 ---------------------
 .../apache/axiom/attachments/AttachmentsTest.java  |  67 ----
 .../axiom/om/impl/mixin/AxiomContainerMixin.java   |  11 +-
 11 files changed, 77 insertions(+), 467 deletions(-)

diff --git a/axiom-api/pom.xml b/axiom-api/pom.xml
index b457ff6dd..ddae29a5a 100644
--- a/axiom-api/pom.xml
+++ b/axiom-api/pom.xml
@@ -264,6 +264,8 @@
                                 org.apache.axiom.om.OMXMLBuilderFactory -&gt; org.apache.axiom.soap.SOAPModelBuilder,
                                 org.apache.axiom.om.OMXMLBuilderFactory -&gt; org.apache.axiom.soap.SOAPProcessingException,
                                 org.apache.axiom.om.OMXMLBuilderFactory -&gt; org.apache.axiom.soap.SOAPVersion,
+                                org.apache.axiom.om.OMOutputFormat -&gt; org.apache.axiom.soap.SOAP11Constants,
+                                org.apache.axiom.om.OMOutputFormat -&gt; org.apache.axiom.soap.SOAP12Constants,
                                 <!-- The public API shouldn't depend on classes in o.a.a.om.util -->
                                 org.apache.axiom.om.OMMetaFactorySPI -&gt; org.apache.axiom.om.util.StAXParserConfiguration,
                                 org.apache.axiom.om.OMXMLBuilderFactory -&gt; org.apache.axiom.om.util.StAXParserConfiguration,
diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBodyWriter.java b/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBodyWriter.java
index 73ed4b746..726e0336f 100644
--- a/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBodyWriter.java
+++ b/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBodyWriter.java
@@ -20,6 +20,7 @@ package org.apache.axiom.mime;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.text.ParseException;
 import java.util.List;
 
 import javax.activation.DataHandler;
@@ -28,7 +29,7 @@ import org.apache.axiom.util.UIDGenerator;
 
 /**
  * Writes a MIME multipart body as used by XOP/MTOM and SOAP with Attachments. MIME parts are
- * written using {@link #writePart(String, ContentTransferEncoding, String, List)} or
+ * written using {@link #writePart(ContentType, ContentTransferEncoding, String, List)} or
  * {@link #writePart(DataHandler, ContentTransferEncoding, String, List)}. Calls to both methods can be mixed, i.e.
  * it is not required to use the same method for all MIME parts. Instead, the caller should choose
  * the most convenient method for each part (depending on the form in which the content is
@@ -118,7 +119,7 @@ public final class MultipartBodyWriter {
      * {@link OutputStream#close()} must be called to complete the writing of the MIME part.
      * 
      * @param contentType
-     *            the value of the {@code Content-Type} header of the MIME part; may be {@code null}
+     *            the content type of the MIME part; may be {@code null}
      * @param contentTransferEncoding
      *            the content transfer encoding to be used (see above); must not be
      *            <code>null</code>
@@ -131,7 +132,7 @@ public final class MultipartBodyWriter {
      * @throws IOException
      *             if an I/O error occurs when writing to the underlying stream
      */
-    public OutputStream writePart(String contentType, ContentTransferEncoding contentTransferEncoding,
+    public OutputStream writePart(ContentType contentType, ContentTransferEncoding contentTransferEncoding,
             String contentID, List<Header> extraHeaders) throws IOException {
         writeAscii("--");
         writeAscii(boundary);
@@ -139,7 +140,7 @@ public final class MultipartBodyWriter {
         // text/plain; charset=us-ascii).
         if (contentType != null) {
             writeAscii("\r\nContent-Type: ");
-            writeAscii(contentType);
+            writeAscii(contentType.toString());
         }
         writeAscii("\r\nContent-Transfer-Encoding: ");
         writeAscii(contentTransferEncoding.toString());
@@ -178,7 +179,18 @@ public final class MultipartBodyWriter {
      */
     public void writePart(DataHandler dataHandler, ContentTransferEncoding contentTransferEncoding, String contentID, List<Header> extraHeaders)
             throws IOException {
-        OutputStream partOutputStream = writePart(dataHandler.getContentType(), contentTransferEncoding, contentID, extraHeaders);
+        ContentType contentType;
+        String contentTypeString = dataHandler.getContentType();
+        if (contentTypeString == null) {
+            contentType = null;
+        } else {
+            try {
+                contentType = new ContentType(contentTypeString);
+            } catch (ParseException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+        OutputStream partOutputStream = writePart(contentType, contentTransferEncoding, contentID, extraHeaders);
         dataHandler.writeTo(partOutputStream);
         partOutputStream.close();
     }
diff --git a/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java b/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
index 62e8b9370..b300ebe1f 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
@@ -189,9 +189,9 @@ public class OMOutputFormat {
         }
         if (contentType == null) {
             if (isSoap11) {
-                contentType = SOAP11Constants.SOAP_11_CONTENT_TYPE;
+                contentType = SOAP11Constants.SOAP_11_CONTENT_TYPE.toString();
             } else {
-                contentType = SOAP12Constants.SOAP_12_CONTENT_TYPE;
+                contentType = SOAP12Constants.SOAP_12_CONTENT_TYPE.toString();
             }
         }
         // If MTOM or SWA, the returned content-type is an 
diff --git a/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java b/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java
index f214de7a4..d06817892 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java
@@ -30,6 +30,7 @@ import org.apache.axiom.attachments.ConfigurableDataHandler;
 import org.apache.axiom.mime.ContentTransferEncoding;
 import org.apache.axiom.mime.ContentType;
 import org.apache.axiom.mime.Header;
+import org.apache.axiom.mime.MediaType;
 import org.apache.axiom.mime.MultipartBodyWriter;
 import org.apache.axiom.om.OMOutputFormat;
 import org.apache.axiom.soap.SOAP11Constants;
@@ -44,7 +45,7 @@ public class OMMultipartWriter {
     private final OMOutputFormat format;
     private final MultipartBodyWriter writer;
     private final boolean useCTEBase64;
-    private final String rootPartContentType;
+    private final ContentType rootPartContentType;
     
     public OMMultipartWriter(OutputStream out, OMOutputFormat format) {
         this.format = format;
@@ -54,30 +55,28 @@ public class OMMultipartWriter {
         useCTEBase64 = format != null && Boolean.TRUE.equals(
                 format.getProperty(OMOutputFormat.USE_CTE_BASE64_FOR_NON_TEXTUAL_ATTACHMENTS));
         
-        String soapContentType;
+        MediaType soapContentType;
         if (format.isSOAP11()) {
             soapContentType = SOAP11Constants.SOAP_11_CONTENT_TYPE;
         } else {
             soapContentType = SOAP12Constants.SOAP_12_CONTENT_TYPE;
         }
         if (format.isOptimized()) {
-            rootPartContentType = "application/xop+xml; charset=" + format.getCharSetEncoding()
-                    + "; type=\"" + soapContentType + "\"";            
+            rootPartContentType = ContentType.builder()
+                    .setMediaType(MediaType.APPLICATION_XOP_XML)
+                    .setParameter("charset", format.getCharSetEncoding())
+                    .setParameter("type", soapContentType.toString())
+                    .build();
         } else {
-            rootPartContentType = soapContentType + "; charset=" + format.getCharSetEncoding();
+            rootPartContentType = ContentType.builder()
+                    .setMediaType(soapContentType)
+                    .setParameter("charset", format.getCharSetEncoding())
+                    .build();
         }
     }
 
-    private static boolean isTextual(String contentType) {
-        try {
-            return new ContentType(contentType).isTextual();
-        } catch (ParseException ex) {
-            return false;
-        }
-    }
-
-    private ContentTransferEncoding getContentTransferEncoding(String contentType) {
-        if (useCTEBase64 && !isTextual(contentType)) {
+    private ContentTransferEncoding getContentTransferEncoding(ContentType contentType) {
+        if (useCTEBase64 && !contentType.isTextual()) {
             return ContentTransferEncoding.BASE64;
         } else {
             return ContentTransferEncoding.BINARY;
@@ -90,13 +89,13 @@ public class OMMultipartWriter {
      * 
      * @return the content type of the root part
      */
-    public String getRootPartContentType() {
+    public ContentType getRootPartContentType() {
         return rootPartContentType;
     }
 
     /**
      * Start writing the root part of the MIME package. This method delegates to
-     * {@link MultipartBodyWriter#writePart(String, ContentTransferEncoding, String, List)}, but computes the content type,
+     * {@link MultipartBodyWriter#writePart(ContentType, ContentTransferEncoding, String, List)}, but computes the content type,
      * content transfer encoding and content ID from the {@link OMOutputFormat}.
      * 
      * @return an output stream to write the content of the MIME part
@@ -109,7 +108,7 @@ public class OMMultipartWriter {
 
     /**
      * Start writing an attachment part of the MIME package. This method delegates to
-     * {@link MultipartBodyWriter#writePart(String, ContentTransferEncoding, String, List)}, but computes the content transfer
+     * {@link MultipartBodyWriter#writePart(ContentType, ContentTransferEncoding, String, List)}, but computes the content transfer
      * encoding based on the content type and the {@link OMOutputFormat}.
      * 
      * @param contentType
@@ -120,13 +119,13 @@ public class OMMultipartWriter {
      * @throws IOException
      *             if an I/O error occurs when writing to the underlying stream
      */
-    public OutputStream writePart(String contentType, String contentID) throws IOException {
+    public OutputStream writePart(ContentType contentType, String contentID) throws IOException {
         return writer.writePart(contentType, getContentTransferEncoding(contentType), contentID, null);
     }
     
     /**
      * Start writing an attachment part of the MIME package. This method delegates to
-     * {@link MultipartBodyWriter#writePart(String, ContentTransferEncoding, String, List)}, but computes the content
+     * {@link MultipartBodyWriter#writePart(ContentType, ContentTransferEncoding, String, List)}, but computes the content
      * transfer encoding based on the content type and the {@link OMOutputFormat}.
      * 
      * @param contentType
@@ -139,7 +138,7 @@ public class OMMultipartWriter {
      * @throws IOException
      *             if an I/O error occurs when writing to the underlying stream
      */
-    public OutputStream writePart(String contentType, String contentID, List<Header> extraHeaders) throws IOException {    
+    public OutputStream writePart(ContentType contentType, String contentID, List<Header> extraHeaders) throws IOException {    
         return writer.writePart(contentType, getContentTransferEncoding(contentType), contentID, extraHeaders);
     }
     
@@ -172,7 +171,19 @@ public class OMMultipartWriter {
             }
         }
         if (contentTransferEncoding == null) {
-            contentTransferEncoding = getContentTransferEncoding(dataHandler.getContentType());
+            String contentTypeString = dataHandler.getContentType();
+            if (contentTypeString != null) {
+                ContentType contentType;
+                try {
+                    contentType = new ContentType(contentTypeString);
+                } catch (ParseException ex) {
+                    throw new RuntimeException(ex);
+                }
+                contentTransferEncoding = getContentTransferEncoding(contentType);
+            }
+        }
+        if (contentTransferEncoding == null) {
+            contentTransferEncoding = ContentTransferEncoding.BINARY;
         }
         writer.writePart(dataHandler, contentTransferEncoding, contentID, extraHeaders);
     }
diff --git a/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java b/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java
index 5a7707438..1b421d793 100644
--- a/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java
+++ b/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java
@@ -21,6 +21,8 @@ package org.apache.axiom.soap;
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.mime.MediaType;
+
 
 public interface SOAP11Constants extends SOAPConstants {
     static final String SOAP_ENVELOPE_NAMESPACE_URI =
@@ -41,7 +43,7 @@ public interface SOAP11Constants extends SOAPConstants {
     static final String SOAP_FAULT_DETAIL_LOCAL_NAME = "detail";
 
     //SOAP 1.2 Content Type
-    static final String SOAP_11_CONTENT_TYPE = "text/xml";
+    static final MediaType SOAP_11_CONTENT_TYPE = MediaType.TEXT_XML;
 
     // -------- SOAP Fault Codes ------------------------------
     static final String FAULT_CODE_SENDER = "Client";
diff --git a/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java b/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java
index eaee64a57..8ac541ea6 100644
--- a/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java
+++ b/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java
@@ -21,6 +21,8 @@ package org.apache.axiom.soap;
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.mime.MediaType;
+
 
 public interface SOAP12Constants extends SOAPConstants {
     public String SOAP_ENVELOPE_NAMESPACE_URI =
@@ -61,7 +63,7 @@ public interface SOAP12Constants extends SOAPConstants {
     public static final String SOAP_FAULT_ROLE_LOCAL_NAME = "Role";
 
     //SOAP 1.2 Content Type
-    public static final String SOAP_12_CONTENT_TYPE = "application/soap+xml";
+    public static final MediaType SOAP_12_CONTENT_TYPE = MediaType.APPLICATION_SOAP_XML;
 
     // -------- SOAP Fault Codes ------------------------------
     public static final String FAULT_CODE_SENDER = "Sender";
diff --git a/axiom-api/src/test/java/org/apache/axiom/mime/MultipartBodyWriterTest.java b/axiom-api/src/test/java/org/apache/axiom/mime/MultipartBodyWriterTest.java
index 7096df03d..22102131d 100644
--- a/axiom-api/src/test/java/org/apache/axiom/mime/MultipartBodyWriterTest.java
+++ b/axiom-api/src/test/java/org/apache/axiom/mime/MultipartBodyWriterTest.java
@@ -38,7 +38,7 @@ public class MultipartBodyWriterTest extends TestCase {
         MultipartBodyWriter mpw = new MultipartBodyWriter(baos, UIDGenerator.generateMimeBoundary());
         byte[] content = new byte[8192];
         random.nextBytes(content);
-        OutputStream partOutputStream = mpw.writePart("application/octet-stream", contentTransferEncoding, UIDGenerator.generateContentId(), null);
+        OutputStream partOutputStream = mpw.writePart(new ContentType(MediaType.APPLICATION_OCTET_STREAM), contentTransferEncoding, UIDGenerator.generateContentId(), null);
         partOutputStream.write(content);
         partOutputStream.close();
         mpw.complete();
diff --git a/axiom-api/src/test/java/org/apache/axiom/om/OMOutputFormatTest.java b/axiom-api/src/test/java/org/apache/axiom/om/OMOutputFormatTest.java
index 4096aafe6..395a07d91 100644
--- a/axiom-api/src/test/java/org/apache/axiom/om/OMOutputFormatTest.java
+++ b/axiom-api/src/test/java/org/apache/axiom/om/OMOutputFormatTest.java
@@ -54,14 +54,14 @@ public class OMOutputFormatTest extends TestCase {
     public void testGetContentTypeDefault() {
         OMOutputFormat format = new OMOutputFormat();
         String contentType = format.getContentType();
-        assertTrue(contentType.equals(SOAP11Constants.SOAP_11_CONTENT_TYPE));
+        assertTrue(contentType.equals(SOAP11Constants.SOAP_11_CONTENT_TYPE.toString()));
     }
     
     public void testGetContentTypeSOAP12() {
         OMOutputFormat format = new OMOutputFormat();
         format.setSOAP11(false);
         String contentType = format.getContentType();
-        assertTrue(contentType.equals(SOAP12Constants.SOAP_12_CONTENT_TYPE));
+        assertTrue(contentType.equals(SOAP12Constants.SOAP_12_CONTENT_TYPE.toString()));
     }
     
     public void testGetContentTypeSOAP11MTOM() {
@@ -71,7 +71,7 @@ public class OMOutputFormatTest extends TestCase {
         
         // This is rudimentary.  We can add a more complete test that checks
         // sub items in the future.
-        assertTrue(contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE)!=-1);
+        assertTrue(contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE.toString())!=-1);
         assertTrue(contentType.indexOf(MTOMConstants.MTOM_TYPE)!=-1);
         
         // Test for a double quoted boundary value.
@@ -89,7 +89,7 @@ public class OMOutputFormatTest extends TestCase {
         
         // This is rudimentary.  We can add a more complete test that checks
         // sub items in the future.
-        assertTrue(contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE)>=0);
+        assertTrue(contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE.toString())>=0);
         assertTrue(contentType.indexOf("multipart/related")>=0);
         assertTrue(contentType.indexOf(MTOMConstants.MTOM_TYPE) < 0);
         
@@ -104,7 +104,7 @@ public class OMOutputFormatTest extends TestCase {
         
         // This is rudimentary.  We can add a more complete test that checks
         // sub items in the future.
-        assertTrue(contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE)>=0);
+        assertTrue(contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE.toString())>=0);
         assertTrue(contentType.indexOf("multipart/related")>=0);
         assertTrue(contentType.indexOf(MTOMConstants.MTOM_TYPE) < 0);
         
@@ -123,7 +123,7 @@ public class OMOutputFormatTest extends TestCase {
         
         // This is rudimentary.  We can add a more complete test that checks
         // sub items in the future.
-        assertTrue(contentType.indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE)!=-1);
+        assertTrue(contentType.indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE.toString())!=-1);
         assertTrue(contentType.indexOf(MTOMConstants.MTOM_TYPE)!=-1);
     }
     
@@ -136,7 +136,7 @@ public class OMOutputFormatTest extends TestCase {
         
         // This is rudimentary.  We can add a more complete test that checks
         // sub items in the future.
-        assertTrue(contentType.indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE)!=-1);
+        assertTrue(contentType.indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE.toString())!=-1);
         assertTrue(contentType.indexOf(MTOMConstants.MTOM_TYPE)!=-1);
         assertTrue(contentType.indexOf("action=\\\"testSoapAction\\\"")!=-1);
     }
diff --git a/axiom-compat/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java b/axiom-compat/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java
deleted file mode 100644
index 97098f80a..000000000
--- a/axiom-compat/src/main/java/org/apache/axiom/om/impl/MIMEOutputUtils.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * 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.om.impl;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-import javax.activation.DataHandler;
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeBodyPart;
-
-import org.apache.axiom.attachments.Attachments;
-import org.apache.axiom.attachments.ConfigurableDataHandler;
-import org.apache.axiom.attachments.ByteArrayDataSource;
-import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMOutputFormat;
-import org.apache.axiom.om.OMText;
-import org.apache.axiom.om.util.CommonUtils;
-import org.apache.axiom.util.activation.DataHandlerWrapper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @deprecated The features of this class are now implemented by {@link OMMultipartWriter}, which
- *             has as cleaner API and supports streaming of individual MIME parts, in particular the
- *             SOAP part.
- */
-@SuppressWarnings("rawtypes")
-public class MIMEOutputUtils {
-    
-    private static final Log log = LogFactory.getLog(MIMEOutputUtils.class);
-
-    private static byte[] CRLF = { 13, 10 };
-
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void complete(OutputStream outStream, 
-                                byte[] xmlData,
-                                LinkedList binaryNodeList, 
-                                String boundary, 
-                                String contentId,
-                                String charSetEncoding, 
-                                String SOAPContentType) {
-        complete(outStream, xmlData, binaryNodeList, boundary,
-                 contentId, charSetEncoding, SOAPContentType, null);
-    }
-    
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void complete(OutputStream outStream, 
-                                byte[] xmlData,
-                                LinkedList binaryNodeList, 
-                                String boundary, 
-                                String contentId,
-                                String charSetEncoding, 
-                                String SOAPContentType, 
-                                OMOutputFormat omOutputFormat) {
-        try {
-            log.debug("Start: write the SOAPPart and the attachments");
-            
-            // Write out the mime boundary
-            startWritingMime(outStream, boundary);
-
-            javax.activation.DataHandler dh = 
-                new javax.activation.DataHandler(new ByteArrayDataSource(xmlData,
-                                                 "text/xml; charset=" + charSetEncoding));
-            MimeBodyPart rootMimeBodyPart = new MimeBodyPart();
-            rootMimeBodyPart.setDataHandler(dh);
-
-            rootMimeBodyPart.addHeader("Content-Type",
-                                       "application/xop+xml; charset=" + charSetEncoding +
-                                               "; type=\"" + SOAPContentType + "\"");
-            rootMimeBodyPart.addHeader("Content-Transfer-Encoding", "binary");
-            rootMimeBodyPart.addHeader("Content-ID", "<" + contentId + ">");
-
-            // Write out the SOAPPart
-            writeBodyPart(outStream, rootMimeBodyPart, boundary);
-
-            // Now write out the Attachment parts (which are represented by the
-            // text nodes int the binary node list)
-            Iterator binaryNodeIterator = binaryNodeList.iterator();
-            while (binaryNodeIterator.hasNext()) {
-                OMText binaryNode = (OMText) binaryNodeIterator.next();
-                writeBodyPart(outStream, createMimeBodyPart(binaryNode.getContentID(),
-                        binaryNode.getDataHandler(), omOutputFormat), boundary);
-            }
-            finishWritingMime(outStream);
-            outStream.flush();
-            log.debug("End: write the SOAPPart and the attachments");
-        } catch (IOException e) {
-            throw new OMException("Error while writing to the OutputStream.", e);
-        } catch (MessagingException e) {
-            throw new OMException("Problem writing Mime Parts.", e);
-        }
-    }
-
-    /**
-     * @deprecated This method is only useful in conjunction with
-     *             {@link #writeBodyPart(OutputStream, MimeBodyPart, String)}, which is deprecated.
-     */
-    public static MimeBodyPart createMimeBodyPart(String contentID,
-                                                  DataHandler dataHandler) 
-            throws MessagingException {
-        return createMimeBodyPart(contentID, dataHandler, null);
-    }
-                                                  
-    /**
-     * @deprecated This method is only useful in conjunction with
-     *             {@link #writeBodyPart(OutputStream, MimeBodyPart, String)}, which is deprecated.
-     */
-    public static MimeBodyPart createMimeBodyPart(String contentID,
-                                                  DataHandler dataHandler,
-                                                  OMOutputFormat omOutputFormat)
-           throws MessagingException {
-        String contentType = dataHandler.getContentType();
-        
-        // Get the content-transfer-encoding
-        String contentTransferEncoding = "binary";
-        if (dataHandler instanceof ConfigurableDataHandler) {
-            ConfigurableDataHandler configurableDataHandler = (ConfigurableDataHandler) dataHandler;
-            contentTransferEncoding = configurableDataHandler.getTransferEncoding();
-        }
-        
-        if (log.isDebugEnabled()) {
-            log.debug("Create MimeBodyPart");
-            log.debug("  Content-ID = " + contentID);
-            log.debug("  Content-Type = " + contentType);
-            log.debug("  Content-Transfer-Encoding = " + contentTransferEncoding);
-        }
-        
-        boolean useCTEBase64 = omOutputFormat != null &&
-            Boolean.TRUE.equals(
-               omOutputFormat.getProperty(
-                   OMOutputFormat.USE_CTE_BASE64_FOR_NON_TEXTUAL_ATTACHMENTS));
-        if (useCTEBase64) {
-            if (!CommonUtils.isTextualPart(contentType) && 
-                "binary".equals(contentTransferEncoding)) {
-                if (log.isDebugEnabled()) {
-                    log.debug(" changing Content-Transfer-Encoding from " + 
-                              contentTransferEncoding + " to base-64");
-                }
-                contentTransferEncoding = "base64";
-            }
-            
-        }
-        
-        // Now create the mimeBodyPart for the datahandler and add the appropriate content headers
-        MimeBodyPart mimeBodyPart = new MimeBodyPart();
-        mimeBodyPart.setDataHandler(dataHandler);
-        mimeBodyPart.addHeader("Content-ID", "<" + contentID + ">");
-        mimeBodyPart.addHeader("Content-Type", contentType);
-        mimeBodyPart.addHeader("Content-Transfer-Encoding", contentTransferEncoding);
-        return mimeBodyPart;
-    }
-
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void writeMimeBoundary(OutputStream outStream,
-                                         String boundary) throws IOException {
-        // REVIEW: This conversion is hard-coded to UTF-8.
-        // The complete solution is to respect the charset setting of the message.
-        // However this may cause problems in BoundaryDelimittedStream and other
-        // lower level classes.
-        outStream.write(new byte[] { 45, 45 });
-        outStream.write(boundary.getBytes("UTF-8"));
-    }
-
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void startWritingMime(OutputStream outStream,
-                                        String boundary)
-            throws IOException {
-        writeMimeBoundary(outStream, boundary);
-        //outStream.write(CRLF);
-    }
-
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void writeBodyPart(OutputStream outStream,
-                                     MimeBodyPart part,
-                                     String boundary) throws IOException,
-            MessagingException {
-        if (log.isDebugEnabled()) {
-            log.debug("Start writeMimeBodyPart for " + part.getContentID());
-        }
-        outStream.write(CRLF);
-        part.writeTo(outStream);
-        outStream.write(CRLF);
-        writeMimeBoundary(outStream, boundary);
-        outStream.flush();
-        log.debug("End writeMimeBodyPart");
-    }
-
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void finishWritingMime(OutputStream outStream)
-            throws IOException {
-        log.debug("Write --, which indicates the end of the last boundary");
-        outStream.write(new byte[] { 45, 45 });
-    }
-
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void writeSOAPWithAttachmentsMessage(StringWriter writer,
-                                                       OutputStream outputStream,
-                                                       Attachments attachments,
-                                                       OMOutputFormat format) {
-        try {
-            OMMultipartWriter mpw = new OMMultipartWriter(outputStream, format);
-            
-            Writer rootPartWriter = new OutputStreamWriter(mpw.writeRootPart(), format.getCharSetEncoding());
-            rootPartWriter.write(writer.toString());
-            rootPartWriter.close();
-            
-            // Get the collection of ids associated with the attachments
-            Collection ids = Arrays.asList(attachments.getAllContentIDs());
-            
-            for (Iterator it = ids.iterator(); it.hasNext(); ) {
-                String id = (String)it.next();
-                mpw.writePart(attachments.getDataHandler(id), id);
-            }
-            
-            mpw.complete();
-        } catch (IOException ex) {
-            throw new OMException("Error writing SwA message", ex);
-        }
-    }
-
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void writeDataHandlerWithAttachmentsMessage(DataHandler rootDataHandler,
-            String contentType,
-            OutputStream outputStream,
-            Map attachments,
-            OMOutputFormat format) {
-        writeDataHandlerWithAttachmentsMessage(rootDataHandler,
-                contentType,
-                outputStream,
-                attachments,
-                format,
-                null);
-                    
-    }
-    
-    /**
-     * @deprecated Use {@link OMMultipartWriter} instead.
-     */
-    public static void writeDataHandlerWithAttachmentsMessage(DataHandler rootDataHandler,
-                                                       final String contentType,
-                                                       OutputStream outputStream,
-                                                       Map attachments,
-                                                       OMOutputFormat format,
-                                                       Collection ids) {
-        try {
-            if (!rootDataHandler.getContentType().equals(contentType)) {
-                rootDataHandler = new DataHandlerWrapper(rootDataHandler) {
-                    @Override
-                    public String getContentType() {
-                        return contentType;
-                    }
-                };
-            }
-            
-            OMMultipartWriter mpw = new OMMultipartWriter(outputStream, format);
-            
-            mpw.writePart(rootDataHandler, format.getRootContentId());
-
-            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();
-                mpw.writePart((DataHandler) attachments.get(key), key);
-            }
-            mpw.complete();
-            outputStream.flush();
-        } catch (IOException e) {
-            throw new OMException("Error while writing to the OutputStream.", e);
-        }
-    }
-
-    /**
-     * @deprecated Axiom only supports standard SwA messages. However, {@link OMMultipartWriter}
-     *             provides a flexible way to build MIME packages for non standard formats such as
-     *             MM7.
-     */
-    public static void writeMM7Message(StringWriter writer,
-                                       OutputStream outputStream, Attachments attachments,
-                                       OMOutputFormat format, String innerPartCID,
-                                       String innerBoundary) {
-        try {
-            OMMultipartWriter mpw = new OMMultipartWriter(outputStream, format);
-            
-            Writer rootPartWriter = new OutputStreamWriter(mpw.writeRootPart(), format.getCharSetEncoding());
-            rootPartWriter.write(writer.toString());
-            rootPartWriter.close();
-            
-            if (attachments.getContentIDSet().size() != 0) {
-                OMOutputFormat innerFormat = new OMOutputFormat(format);
-                innerFormat.setMimeBoundary(innerBoundary);
-                OutputStream innerOutputStream = mpw.writePart("multipart/related; boundary=\"" + innerBoundary + "\"", innerPartCID);
-                OMMultipartWriter innerMpw = new OMMultipartWriter(innerOutputStream, innerFormat);
-                Collection ids = Arrays.asList(attachments.getAllContentIDs());
-                for (Iterator it = ids.iterator(); it.hasNext(); ) {
-                    String id = (String)it.next();
-                    innerMpw.writePart(attachments.getDataHandler(id), id);
-                }
-                innerMpw.complete();
-                innerOutputStream.close();
-            }
-            
-            mpw.complete();
-        } catch (IOException e) {
-            throw new OMException("Error while writing to the OutputStream.", e);
-        }
-    }
-}
diff --git a/axiom-compat/src/test/java/org/apache/axiom/attachments/AttachmentsTest.java b/axiom-compat/src/test/java/org/apache/axiom/attachments/AttachmentsTest.java
deleted file mode 100644
index 0fc5765f4..000000000
--- a/axiom-compat/src/test/java/org/apache/axiom/attachments/AttachmentsTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.OMElement;
-import org.apache.axiom.om.OMOutputFormat;
-import org.apache.axiom.om.OMXMLBuilderFactory;
-import org.apache.axiom.om.impl.MIMEOutputUtils;
-import org.apache.axiom.soap.SOAPModelBuilder;
-import org.apache.axiom.ts.soap.SwASample;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.StringWriter;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("deprecation")
-public class AttachmentsTest extends TestCase {
-    public void testSWAWriteWithIncomingOrder() throws Exception {
-
-        // Read the stream that has soap xml followed by BAttachment then AAttachment
-        InputStream inStream = SwASample.SAMPLE1.getInputStream();
-        Attachments attachments = new Attachments(inStream, SwASample.SAMPLE1.getContentType());
-
-        // Get the contentIDs to force the reading
-        attachments.getAllContentIDs();
-        
-        // Get the root
-        SOAPModelBuilder builder = OMXMLBuilderFactory.createSOAPModelBuilder(attachments.getRootPartInputStream(), "UTF-8");
-        OMElement root = builder.getDocumentElement();
-        StringWriter xmlWriter = new StringWriter();
-        root.serialize(xmlWriter);
-        
-        // Serialize the message using the legacy behavior (order by content id)
-        OMOutputFormat format = new OMOutputFormat();
-        format.setCharSetEncoding("utf-8");
-        format.setDoingSWA(true);
-        
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        
-        MIMEOutputUtils.writeSOAPWithAttachmentsMessage(xmlWriter, baos, attachments, format);
-        
-        String text = baos.toString();
-        // Assert that AAttachment occurs before BAttachment since
-        // that is the natural ordering of the content ids.
-        assertTrue(text.indexOf("BAttachment") < text.indexOf("AAttachment"));
-        
-    }
-}
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerMixin.java
index bb8c8a23d..49e86387b 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerMixin.java
@@ -21,6 +21,7 @@ package org.apache.axiom.om.impl.mixin;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Writer;
+import java.text.ParseException;
 import java.util.Iterator;
 
 import javax.activation.DataHandler;
@@ -48,6 +49,7 @@ import org.apache.axiom.core.stream.sax.input.XmlHandlerContentHandler;
 import org.apache.axiom.core.stream.serializer.Serializer;
 import org.apache.axiom.core.stream.stax.pull.output.StAXPivot;
 import org.apache.axiom.core.stream.stax.push.input.XMLStreamWriterNamespaceContextProvider;
+import org.apache.axiom.mime.ContentType;
 import org.apache.axiom.mime.PartDataHandler;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
@@ -387,8 +389,13 @@ public abstract class AxiomContainerMixin implements AxiomContainer {
                 if (cache || !(dataHandler instanceof PartDataHandler)) {
                     multipartWriter.writePart(dataHandler, contentID);
                 } else {
-                    OutputStream part =
-                            multipartWriter.writePart(dataHandler.getContentType(), contentID);
+                    ContentType contentType;
+                    try {
+                        contentType = new ContentType(dataHandler.getContentType());
+                    } catch (ParseException ex) {
+                        throw new OMException(ex);
+                    }
+                    OutputStream part = multipartWriter.writePart(contentType, contentID);
                     IOUtils.copy(
                             ((PartDataHandler) dataHandler).getPart().getInputStream(false),
                             part,