Axiom
  1. Axiom
  2. AXIOM-280

Add access to the Content Transfer Encoding value from DataHandler

    Details

    • Type: Improvement Improvement
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 1.2.8
    • Fix Version/s: 1.2.17
    • Component/s: API
    • Labels:
      None

      Description

      We have a need to be able to identify how an SWA attachment was encoded in the message, by accessing the Content Transfer Encoding. Currently the DataHandler does contain this info, but there is no method you can use to get to the data.
      I have created a fix and an accompanying testcase. Please could you review the changes and if you're happy please could you integrate the fix.
      I intend to post on the Axiom mailing list to broadcast my suggestion.
      I've attached the diff details as an attachment.

        Issue Links

          Activity

          Tim Mitchell created issue -
          Hide
          Andreas Veithen added a comment -

          There is a discussion in WSCOMMONS-418 about this issue. Note that there the suggestion was to expose the "Part" interface in order to get to that information. Indeed, I'm not sure that exposing the MIME headers through an enhanced DataSource interface is the right way of doing things.

          PS: Can you please remove the patch from the description field and attach it properly to the JIRA issue?

          Show
          Andreas Veithen added a comment - There is a discussion in WSCOMMONS-418 about this issue. Note that there the suggestion was to expose the "Part" interface in order to get to that information. Indeed, I'm not sure that exposing the MIME headers through an enhanced DataSource interface is the right way of doing things. PS: Can you please remove the patch from the description field and attach it properly to the JIRA issue?
          Tim Mitchell made changes -
          Field Original Value New Value
          Description We have a need to be able to identify how an SWA attachment was encoded in the message, by accessing the Content Transfer Encoding. Currently the DataHandler does contain this info, but there is no method you can use to get to the data.
          I have created a fix and an accompanying testcase. Please could you review the changes and if you're happy please could you integrate the fix.
          I intend to post on the Axiom mailing list to broadcast my suggestion.

          The diff of the fixes are as follows. Please let me know if you would prefer me to post a zip of the changes:

          Index: modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/PartOnMemoryEnhanced.java
          ===================================================================
          --- modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/PartOnMemoryEnhanced.java (revision 749312)
          +++ modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/PartOnMemoryEnhanced.java (working copy)
          @@ -19,21 +19,22 @@
           
           package org.apache.axiom.attachments.impl;
           
          -import org.apache.axiom.attachments.utils.BAAInputStream;
          -import org.apache.axiom.om.OMException;
          -import org.apache.commons.logging.Log;
          -import org.apache.commons.logging.LogFactory;
          +import java.io.IOException;
          +import java.io.InputStream;
          +import java.io.OutputStream;
          +import java.util.ArrayList;
          +import java.util.Hashtable;
           
           import javax.activation.DataHandler;
           import javax.activation.DataSource;
           import javax.mail.MessagingException;
           import javax.mail.internet.MimeUtility;
           
          -import java.io.IOException;
          -import java.io.InputStream;
          -import java.io.OutputStream;
          -import java.util.ArrayList;
          -import java.util.Hashtable;
          +import org.apache.axiom.attachments.utils.BAAInputStream;
          +import org.apache.axiom.om.OMDataHandler;
          +import org.apache.axiom.om.OMException;
          +import org.apache.commons.logging.Log;
          +import org.apache.commons.logging.LogFactory;
           
           /**
            * PartOnMemoryEnhanced stores the attachment in memory (in non-contigous byte arrays)
          @@ -83,7 +84,7 @@
               }
               
               
          - class MyDataHandler extends DataHandler {
          + class MyDataHandler extends DataHandler implements OMDataHandler {
           
                   DataSource ds;
                   public MyDataHandler(DataSource ds) {
          @@ -99,6 +100,10 @@
                           BufferUtils.inputStream2OutputStream(is, os);
                       }
                   }
          +
          + public String getContentTransferEncoding() throws MessagingException {
          + return PartOnMemoryEnhanced.this.getContentTransferEncoding();
          + }
               }
               
               /**
          Index: modules/axiom-api/src/main/java/org/apache/axiom/om/OMDataHandler.java
          ===================================================================
          --- modules/axiom-api/src/main/java/org/apache/axiom/om/OMDataHandler.java (revision 0)
          +++ modules/axiom-api/src/main/java/org/apache/axiom/om/OMDataHandler.java (revision 0)
          @@ -0,0 +1,17 @@
          +package org.apache.axiom.om;
          +
          +import javax.mail.MessagingException;
          +
          +
          +/**
          + * Interface to allow the access the value of the content transfer encoding that the
          + * javax.activation.DataHandler doesn't allow you to do.
          + */
          +public interface OMDataHandler {
          +
          + /**
          + * @return A String containing the value of the content transfer encoding header.
          + */
          + public String getContentTransferEncoding() throws MessagingException;
          +
          +}
          Index: modules/axiom-tests/src/test/java/org/apache/axiom/attachments/AttachmentsTest.java
          ===================================================================
          --- modules/axiom-tests/src/test/java/org/apache/axiom/attachments/AttachmentsTest.java (revision 749312)
          +++ modules/axiom-tests/src/test/java/org/apache/axiom/attachments/AttachmentsTest.java (working copy)
          @@ -19,23 +19,24 @@
           
           package org.apache.axiom.attachments;
           
          +import java.io.ByteArrayInputStream;
          +import java.io.ByteArrayOutputStream;
          +import java.io.IOException;
          +import java.io.InputStream;
          +import java.util.Arrays;
          +import java.util.Set;
          +
          +import javax.activation.DataHandler;
          +
           import org.apache.axiom.attachments.utils.IOUtils;
           import org.apache.axiom.om.AbstractTestCase;
          +import org.apache.axiom.om.OMDataHandler;
           import org.apache.axiom.om.OMElement;
           import org.apache.axiom.om.OMOutputFormat;
           import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
           import org.apache.axiom.om.impl.builder.XOPAwareStAXOMBuilder;
           import org.apache.axiom.om.util.CommonUtils;
           
          -import javax.activation.DataHandler;
          -
          -import java.io.ByteArrayInputStream;
          -import java.io.ByteArrayOutputStream;
          -import java.io.IOException;
          -import java.io.InputStream;
          -import java.util.Arrays;
          -import java.util.Set;
          -
           public class AttachmentsTest extends AbstractTestCase {
           
               public AttachmentsTest(String testName) {
          @@ -43,6 +44,7 @@
               }
           
               String inMimeFileName = "mtom/MTOMAttachmentStream.bin";
          + String inMimeFileName2 = "swa/SWAAttachmentBase64Stream.bin";
               String img1FileName = "mtom/img/test.jpg";
               String img2FileName = "mtom/img/test2.jpg";
           
          @@ -56,6 +58,14 @@
                                   "start-info=\"application/soap+xml\"; " +
                                   "charset=UTF-8;" +
                                   "action=\"mtomSample\"";
          +
          + String contentTypeString2 =
          + "multipart/related; " +
          + "boundary=\"" + boundary + "\"; " +
          + "type=\"text/xml\"; " +
          + "start=\"<" + start +">\"; " +
          + "start-info=\"text/xml\"; " +
          + "charset=UTF-8;";
           
               public void testMIMEHelper() {
               }
          @@ -283,7 +293,29 @@
                   // Compare data across streams
                   compareStreams(dataIs, expectedDataIs);
               }
          +
          + public void testGetContentTransferEncoding() throws Exception {
           
          + InputStream inStream = getTestResource(inMimeFileName);
          + Attachments attachments = new Attachments(inStream, contentTypeString);
          + DataHandler dh = attachments
          + .getDataHandler("2.urn:uuid:A3ADBAEE51A1A87B2A11443668160994@apache.org");
          +
          + assertNotNull("DataHandler is null", dh);
          + assertTrue("DataHandler is not an instance of OMDataHandler", dh instanceof OMDataHandler);
          + String encodingType = ((OMDataHandler)dh).getContentTransferEncoding();
          + assertTrue("Encoding Type not binary: " + encodingType, "binary".equals(encodingType));
          +
          + InputStream inStream2 = getTestResource(inMimeFileName2);
          + Attachments attachments2 = new Attachments(inStream2, contentTypeString2);
          + dh = attachments2.getDataHandler("urn:uuid:F8FB8F9F7B7B7B678A1236015197849");
          +
          + assertNotNull("DataHandler is null", dh);
          + assertTrue("DataHandler is not an instance of OMDataHandler", dh instanceof OMDataHandler);
          + encodingType = ((OMDataHandler)dh).getContentTransferEncoding();
          + assertTrue("Encoding Type not base64: " + encodingType, "base64".equals(encodingType));
          + }
          +
               public void testNonExistingMIMEPart() throws Exception {
           
                   InputStream inStream = getTestResource(inMimeFileName);
          Index: modules/axiom-tests/test-resources/swa/SWAAttachmentBase64Stream.bin
          ===================================================================
          --- modules/axiom-tests/test-resources/swa/SWAAttachmentBase64Stream.bin (revision 0)
          +++ modules/axiom-tests/test-resources/swa/SWAAttachmentBase64Stream.bin (revision 0)
          @@ -0,0 +1,256 @@
          +--MIMEBoundaryurn:uuid:A3ADBAEE51A1A87B2A11443668160701
          +Content-Type: text/xml; charset=UTF-8
          +Content-Transfer-Encoding: 8bit
          +Content-ID: <0.urn:uuid:A3ADBAEE51A1A87B2A11443668160702@apache.org>
          +
          +<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:To>http://localhost:7081/axis2/services/SWAService&lt;/wsa:To&gt;&lt;wsa:MessageID&gt;urn:uuid:F8FB8F9F7B7B7B678A1236015197880&lt;/wsa:MessageID&gt;&lt;wsa:Action&gt;sendString&lt;/wsa:Action&gt;&lt;/soapenv:Header&gt;&lt;soapenv:Body&gt;&lt;SWAService:sendString xmlns:SWAService="http://test"><SWAService:clientString>Client Test</SWAService:clientString></SWAService:sendString><soapenv:SWAAttachment soapenv:href="cid:urn:uuid:F8FB8F9F7B7B7B678A1236015197849"></soapenv:SWAAttachment></soapenv:Body></soapenv:Envelope>
          +--MIMEBoundaryurn:uuid:A3ADBAEE51A1A87B2A11443668160701
          +Content-Type: application/octet-stream
          +Content-Transfer-Encoding: base64
          +Content-ID: <urn:uuid:F8FB8F9F7B7B7B678A1236015197849>
          +
          +/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
          +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
          +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCABgAKcDASIA
          +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
          +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
          +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
          +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
          +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
          +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
          +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
          +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD++iii
          +igAooooAKKKKACiiigAopGYKCTwFBLMSAAB1PPpgk+36/EP7Rv8AwUV/ZL/Zdguo/iX8TIrvX00D
          +/hItO8K+DNMvvFWqaxav4g0nwrDbQavZxxeCdHu28Qa/oVhdt4t8WeHNP0SHV7DWPEV/o+gTf2su
          +dSrSox5qtSFONm7zkor3Vd6tq9lrZa2OrB4LGZhiKWEwGExONxVacKdLD4WjUxFapUqTUKcIU6UZ
          +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
          +--MIMEBoundaryurn:uuid:A3ADBAEE51A1A87B2A11443668160701--
          \ No newline at end of file
          Index: modules/axiom-tests/pom.xml
          ===================================================================
          --- modules/axiom-tests/pom.xml (revision 749312)
          +++ modules/axiom-tests/pom.xml (working copy)
          @@ -134,8 +134,8 @@
                           <artifactId>maven-surefire-plugin</artifactId>
                           <configuration>
                               <includes>
          - <include>**/*Test.java</include>
          - <include>**/*TestCase.java</include>
          + <include>**/AttachmentsTest.java</include>
          + <!--include>**/*TestCase.java</include-->
                               </includes>
                               <excludes>
                                   <exclude>**/*AbstractOMSerializationTest.java</exclude>

          We have a need to be able to identify how an SWA attachment was encoded in the message, by accessing the Content Transfer Encoding. Currently the DataHandler does contain this info, but there is no method you can use to get to the data.
          I have created a fix and an accompanying testcase. Please could you review the changes and if you're happy please could you integrate the fix.
          I intend to post on the Axiom mailing list to broadcast my suggestion.
          I've attached the diff details as an attachment.
          Tim Mitchell made changes -
          Attachment ContentTransferEncodingDiff.txt [ 12401823 ]
          Tim Mitchell made changes -
          Attachment ContentTransferEncodingDiff.txt [ 12401823 ]
          Tim Mitchell made changes -
          Attachment ContentTransferEncodingDiff.txt [ 12401829 ]
          Andreas Veithen made changes -
          Fix Version/s Axiom 1.2.9 [ 12313561 ]
          Fix Version/s Axiom 1.2.8 [ 12313556 ]
          Andreas Veithen made changes -
          Fix Version/s Axiom 1.2.10 [ 12314861 ]
          Fix Version/s Axiom 1.2.9 [ 12313561 ]
          Andreas Veithen made changes -
          Fix Version/s Axiom 1.2.11 [ 12315420 ]
          Fix Version/s Axiom 1.2.10 [ 12314861 ]
          Andreas Veithen made changes -
          Project WS-Commons [ 12310250 ] Axiom [ 12311190 ]
          Key WSCOMMONS-448 AXIOM-280
          Affects Version/s Axiom 1.2.8 [ 12313556 ]
          Component/s AXIOM [ 12310703 ]
          Fix Version/s Axiom 1.2.11 [ 12315420 ]
          Jeff Turner made changes -
          Affects Version/s Axiom 1.2.8 [ 12315531 ]
          Fix Version/s Axiom 1.2.11 [ 12315534 ]
          Andreas Veithen made changes -
          Assignee Andreas Veithen [ veithen ]
          Component/s API [ 12313878 ]
          Andreas Veithen made changes -
          Link This issue is blocked by AXIOM-350 [ AXIOM-350 ]
          Andreas Veithen made changes -
          Fix Version/s 1.2.12 [ 12316132 ]
          Fix Version/s 1.2.11 [ 12315534 ]
          Hide
          Andreas Veithen added a comment -

          For a similar request, see: http://markmail.org/thread/omk4bgihxo4xmez7

          Show
          Andreas Veithen added a comment - For a similar request, see: http://markmail.org/thread/omk4bgihxo4xmez7
          Andreas Veithen made changes -
          Fix Version/s 1.2.13 [ 12316677 ]
          Fix Version/s 1.2.12 [ 12316132 ]
          Andreas Veithen made changes -
          Fix Version/s 1.2.14 [ 12318340 ]
          Fix Version/s 1.2.13 [ 12316677 ]
          Andreas Veithen made changes -
          Fix Version/s 1.2.15 [ 12318876 ]
          Fix Version/s 1.2.14 [ 12318340 ]
          Andreas Veithen made changes -
          Fix Version/s 1.2.16 [ 12323263 ]
          Fix Version/s 1.2.15 [ 12318876 ]
          Andreas Veithen made changes -
          Fix Version/s 1.2.17 [ 12332457 ]
          Fix Version/s 1.2.16 [ 12323263 ]

            People

            • Assignee:
              Andreas Veithen
              Reporter:
              Tim Mitchell
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:

                Development