]> source.dussan.org Git - poi.git/commitdiff
Tweak the attribute getter names on Attachments, and add MAPI+TNEF Attribute unit...
authorNick Burch <nick@apache.org>
Thu, 3 Mar 2011 17:06:37 +0000 (17:06 +0000)
committerNick Burch <nick@apache.org>
Thu, 3 Mar 2011 17:06:37 +0000 (17:06 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1076685 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hmef/Attachment.java
src/scratchpad/src/org/apache/poi/hmef/HMEFMessage.java
src/scratchpad/testcases/org/apache/poi/hmef/TestAttachments.java
src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestMAPIAttributes.java
src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestTNEFAttributes.java

index e961481a1e6e4b00ae10d8f90928542d9f9cf1b2..89b063c263140a256ed8bf5fd85556784c46a279 100644 (file)
@@ -53,7 +53,7 @@ public final class Attachment {
     * Return the attachment attribute with the given ID,
     *  or null if there isn't one. 
     */
-   public TNEFAttribute getMessageAttribute(TNEFProperty id) {
+   public TNEFAttribute getAttribute(TNEFProperty id) {
       for(TNEFAttribute attr : attributes) {
          if(attr.getProperty() == id) {
             return attr;
@@ -66,7 +66,7 @@ public final class Attachment {
     * Return the attachment MAPI Attribute with the given ID,
     *  or null if there isn't one. 
     */
-   public MAPIAttribute getMessageMAPIAttribute(MAPIProperty id) {
+   public MAPIAttribute getMAPIAttribute(MAPIProperty id) {
       for(MAPIAttribute attr : mapiAttributes) {
          if(attr.getProperty() == id) {
             return attr;
@@ -97,14 +97,14 @@ public final class Attachment {
     *  if it isn't set
     */
    private String getString(MAPIProperty id) {
-      return MAPIStringAttribute.getAsString( getMessageMAPIAttribute(id) );
+      return MAPIStringAttribute.getAsString( getMAPIAttribute(id) );
    }
    /**
     * Returns the string value of the TNEF property, or
     *  null if it isn't set
     */
    private String getString(TNEFProperty id) {
-      return TNEFStringAttribute.getAsString( getMessageAttribute(id) );
+      return TNEFStringAttribute.getAsString( getAttribute(id) );
    }
    
    /**
@@ -131,7 +131,7 @@ public final class Attachment {
     */
    public Date getModifiedDate() {
       return TNEFDateAttribute.getAsDate(
-            getMessageAttribute(TNEFProperty.ID_ATTACHMODIFYDATE)
+            getAttribute(TNEFProperty.ID_ATTACHMODIFYDATE)
       );
    }
    
@@ -139,7 +139,7 @@ public final class Attachment {
     * Returns the contents of the attachment.
     */
    public byte[] getContents() {
-      TNEFAttribute contents = getMessageAttribute(TNEFProperty.ID_ATTACHDATA);
+      TNEFAttribute contents = getAttribute(TNEFProperty.ID_ATTACHDATA);
       if(contents == null) {
          throw new IllegalArgumentException("Attachment corrupt - no Data section");
       }
@@ -151,7 +151,7 @@ public final class Attachment {
     *  of the attachment, or null if not set.
     */
    public byte[] getRenderedMetaFile() {
-      TNEFAttribute meta = getMessageAttribute(TNEFProperty.ID_ATTACHMETAFILE);
+      TNEFAttribute meta = getAttribute(TNEFProperty.ID_ATTACHMETAFILE);
       if(meta == null) return null;
       return meta.getData();
    }
index 7da39f9c6c8004a8b7c58cf7f7839547e831f459..b53543680da01cce2ce47d08861b952ecd312d16 100644 (file)
@@ -23,7 +23,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.poi.hmef.attribute.MAPIAttribute;
-import org.apache.poi.hmef.attribute.MAPIRtfAttribute;
 import org.apache.poi.hmef.attribute.MAPIStringAttribute;
 import org.apache.poi.hmef.attribute.TNEFAttribute;
 import org.apache.poi.hmef.attribute.TNEFMAPIAttribute;
index 13a82024a0a6c5a3158a5ba8ba7ce019864ed066..0e89f46a106153b0052707699d8e959c3393381d 100644 (file)
@@ -87,6 +87,8 @@ public final class TestAttachments extends TestCase {
    public void testAttachmentDetails() throws Exception {
       List<Attachment> attachments = quick.getAttachments();
       
+      // Pick a predictable date format
+      // Note that the 28th April is in summer time in the UK
       DateFormat fmt = DateFormat.getDateTimeInstance(
             DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK
       );
index 8ed7ba5b4913fbcfe44f231e96c598b0517bc912..60655a4ddd928a70e5f48097fab05f01548154a7 100644 (file)
 
 package org.apache.poi.hmef.attribute;
 
+import java.io.ByteArrayInputStream;
+import java.text.DateFormat;
+import java.util.Locale;
+
 import junit.framework.TestCase;
 
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.hmef.HMEFMessage;
+import org.apache.poi.hsmf.datatypes.MAPIProperty;
+import org.apache.poi.util.LittleEndian;
 
 public final class TestMAPIAttributes extends TestCase {
-    private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
-
-       public void testOpen() throws Exception {
-               HMEFMessage msg = new HMEFMessage(
-                _samples.openResourceAsStream("quick-winmail.dat")
-               );
+   private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
+   private HMEFMessage quick;
+   
+   @Override
+   protected void setUp() throws Exception {
+      super.setUp();
+      
+      quick = new HMEFMessage(
+            _samples.openResourceAsStream("quick-winmail.dat")
+      );
+   }
+   
+   /** 
+    * Test counts
+    */
+   public void testCounts() throws Exception {
+      // Message should have 54
+      assertEquals(54, quick.getMessageMAPIAttributes().size());
+      
+      // First attachment should have 22
+      assertEquals(22, quick.getAttachments().get(0).getMAPIAttributes().size());
+   }
+       
+   /**
+    * Test various general ones
+    */
+   public void testBasics() throws Exception {
+      // Try constructing two attributes
+      byte[] data = new byte[] {
+            // Level one, id 36867, type 6
+            0x01,    0x03, (byte)0x90,   0x06, 0x00,
+            // Length 24
+            0x24, 0x00, 0x00, 0x00,
+            
+            // Three attributes
+            0x03, 0x00, 0x00, 0x00,
+            // AlternateRecipientAllowed = 01 00
+            0x0B, 0x00, 0x02, 0x00,
+            0x01, 0x00, 0x00, 0x00,
+            // Priority = 00 00 00 00
+            0x03, 0x00, 0x26, 0x00,
+            0x00, 0x00, 0x00, 0x00,
+            // ConversationTopic = Test
+            0x1E, 0x00, 0x70, 0x00,
+            0x01, 0x00, 0x00, 0x00,
+            0x04, 0x00, 0x00, 0x00,
+            (byte)'T', (byte)'e',
+            (byte)'s', (byte)'t',
+            // Checksum (may be wrong...)
+            0x01, 0x00
+      };
+      ByteArrayInputStream bais = new ByteArrayInputStream(data);
+      
+      // Create it
+      int level = bais.read();
+      assertEquals(1, level);
+      TNEFAttribute attr = TNEFAttribute.create(bais);
+      
+      // Check it
+      assertNotNull(attr);
+      assertEquals(TNEFMAPIAttribute.class, attr.getClass());
+      
+      TNEFMAPIAttribute mapi = (TNEFMAPIAttribute)attr;
+      assertEquals(3, mapi.getMAPIAttributes().size());
+      
+      assertEquals(
+            MAPIProperty.ALTERNATE_RECIPIENT_ALLOWED, 
+            mapi.getMAPIAttributes().get(0).getProperty()
+      );
+      assertEquals(1, LittleEndian.getUShort(
+               mapi.getMAPIAttributes().get(0).getData()
+      ));
+      
+      assertEquals(
+            MAPIProperty.PRIORITY, 
+            mapi.getMAPIAttributes().get(1).getProperty()
+      );
+      assertEquals(0, LittleEndian.getUShort(
+               mapi.getMAPIAttributes().get(1).getData()
+      ));
+      
+      assertEquals(
+            MAPIProperty.CONVERSATION_TOPIC, 
+            mapi.getMAPIAttributes().get(2).getProperty()
+      );
+      assertEquals(
+            "Test",
+            ((MAPIStringAttribute)mapi.getMAPIAttributes().get(2)).getDataString()
+      );
+   }
 
-               assertNotNull(msg);
-       }
+   /**
+    * Test String, Date and RTF ones
+    */
+   public void testTyped() throws Exception {
+      MAPIAttribute attr;
+      
+      // String
+      //  ConversationTopic -> This is a test message
+      attr = quick.getMessageMAPIAttribute(MAPIProperty.CONVERSATION_TOPIC);
+      assertNotNull(attr);
+      assertEquals(MAPIStringAttribute.class, attr.getClass());
+      
+      MAPIStringAttribute str = (MAPIStringAttribute)attr;
+      assertEquals("This is a test message", str.getDataString());
+      
+      // Date
+      //  (Unknown/Custom) 32955 -> Wed Dec 15 2010 @ 14:46:31 UTC
+      attr = null;
+      for(MAPIAttribute a : quick.getMessageMAPIAttributes()) {
+         if(a.getProperty().id == 32955) {
+            attr = a;
+            break;
+         }
+      }
+      assertNotNull(attr);
+      assertEquals(MAPIDateAttribute.class, attr.getClass());
+      
+      MAPIDateAttribute date = (MAPIDateAttribute)attr;
+      DateFormat fmt = DateFormat.getDateTimeInstance(
+            DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK
+      );
+      assertEquals("15-Dec-2010 14:46:31", fmt.format(date.getDate()));
+      
+      // RTF
+      //   RtfCompressed -> {\rtf1...
+      attr = quick.getMessageMAPIAttribute(MAPIProperty.RTF_COMPRESSED);
+      assertNotNull(attr);
+      assertEquals(MAPIRtfAttribute.class, attr.getClass());
+      
+      MAPIRtfAttribute rtf = (MAPIRtfAttribute)attr;
+      assertEquals("{\\rtf1", rtf.getDataString().substring(0, 6));
+   }
 
-       // Test basics
-       // Test counts
-       
-       // Check untyped
-       // Check typed
-       // Check common
+   /**
+    * Check common ones via helper accessors
+    */
+   public void testCommon() throws Exception {
+      assertEquals("This is a test message", quick.getSubject());
+      
+      assertEquals("quick.doc", quick.getAttachments().get(0).getLongFilename());
+      assertEquals(".doc", quick.getAttachments().get(0).getExtension());
+   }
 }
index 6096ba3f1b5a0102eb2f6b5cffc60e179dc0de5a..f7883dfed6fc3ef9757f4077a95b003a14a23b4d 100644 (file)
 
 package org.apache.poi.hmef.attribute;
 
+import java.io.ByteArrayInputStream;
+import java.text.DateFormat;
+import java.util.Locale;
+
 import junit.framework.TestCase;
 
 import org.apache.poi.POIDataSamples;
+import org.apache.poi.hmef.Attachment;
 import org.apache.poi.hmef.HMEFMessage;
+import org.apache.poi.hsmf.datatypes.MAPIProperty;
+import org.apache.poi.util.LittleEndian;
 
 public final class TestTNEFAttributes extends TestCase {
-    private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
-
-       public void testOpen() throws Exception {
-               HMEFMessage msg = new HMEFMessage(
-                _samples.openResourceAsStream("quick-winmail.dat")
-               );
-
-               assertNotNull(msg);
+   private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
+   private HMEFMessage quick;
+   
+   @Override
+   protected void setUp() throws Exception {
+      super.setUp();
+      
+      quick = new HMEFMessage(
+            _samples.openResourceAsStream("quick-winmail.dat")
+      );
+   }
+       
+       /** 
+        * Test counts
+        */
+       public void testCounts() throws Exception {
+          // The message should have 4 attributes 
+      assertEquals(4, quick.getMessageAttributes().size());
+      
+      // Each attachment should have 6 attributes
+      for(Attachment attach : quick.getAttachments()) {
+         assertEquals(6, attach.getAttributes().size());
+      }
        }
        
-       // Test counts
+       /** 
+        * Test the basics
+        */
+       public void testBasics() throws Exception {
+          // An int one
+      assertEquals(
+            0x010000, 
+            LittleEndian.getInt( quick.getMessageAttribute(TNEFProperty.ID_TNEFVERSION).getData() )
+      );
+      
+      // Claims not to be text, but really is
+      assertEquals(
+            "IPM.Microsoft Mail.Note\0", 
+            new String(quick.getMessageAttribute(TNEFProperty.ID_MESSAGECLASS).getData(), "ASCII")
+      );
+          
+          // Try constructing two attributes
+      byte[] data = new byte[] {
+            // Level one, id 36870, type 8
+            0x01,    0x06, (byte)0x90,   0x08, 0x00,
+            // Length 4
+            0x04, 0x00, 0x00, 0x00,
+            // Data
+            0x00, 0x00, 0x01, 0x00,
+            // Checksum
+            0x01, 0x00, 
+            
+            // level one, id 36871, type 6
+            0x01,    0x07, (byte)0x90,   0x06, 0x00,
+            // Length 8
+            0x08, 0x00, 0x00, 0x00,
+            // Data
+            (byte)0xe4, 0x04, 0x00, 0x00,
+            0x00, 0x00, 0x00, 0x00,
+            // Checksum
+            (byte)0xe8, 0x00
+      };
+      ByteArrayInputStream bais = new ByteArrayInputStream(data);
+      
+      // Create them
+      int level = bais.read();
+      assertEquals(1, level);
+      TNEFAttribute attr1 = TNEFAttribute.create(bais);
+      
+      level = bais.read();
+      assertEquals(1, level);
+      TNEFAttribute attr2 = TNEFAttribute.create(bais);
+      
+      assertEquals(-1, bais.read());
+      
+      // Check them
+      assertEquals(TNEFProperty.ID_TNEFVERSION, attr1.getProperty());
+      assertEquals(8, attr1.getType());
+      assertEquals(4, attr1.getData().length);
+      assertEquals(0x010000, LittleEndian.getInt( attr1.getData() ));
+      
+      assertEquals(TNEFProperty.ID_OEMCODEPAGE, attr2.getProperty());
+      assertEquals(6, attr2.getType());
+      assertEquals(8, attr2.getData().length);
+      assertEquals(0x04e4, LittleEndian.getInt( attr2.getData() ));
+       }
        
-       // Test basics
+       /**
+        * Test string based ones
+        */
+       public void testString() throws Exception {
+          TNEFAttribute attr = quick.getAttachments().get(0).getAttribute(
+                TNEFProperty.ID_ATTACHTITLE
+          );
+          assertNotNull(attr);
+          assertEquals(TNEFStringAttribute.class, attr.getClass());
+          
+          // It is a null terminated string
+          assertEquals("quick.doc\u0000", new String(attr.getData(), "ASCII"));
+          
+          // But when we ask for the string, that is sorted for us
+          TNEFStringAttribute str = (TNEFStringAttribute)attr;
+          assertEquals("quick.doc", str.getString());
+       }
+
+       /**
+        * Test date based ones
+        */
+       public void testDate() throws Exception {
+      TNEFAttribute attr = quick.getAttachments().get(0).getAttribute(
+            TNEFProperty.ID_ATTACHMODIFYDATE
+      );
+      assertNotNull(attr);
+      assertEquals(TNEFDateAttribute.class, attr.getClass());
+      
+      // It is a series of date parts
+      // Weds 28th April 2010 @ 12:40:56 UTC
+      assertEquals(2010, LittleEndian.getUShort(attr.getData(), 0));
+      assertEquals(04, LittleEndian.getUShort(attr.getData(), 2));
+      assertEquals(28, LittleEndian.getUShort(attr.getData(), 4));
+      assertEquals(12, LittleEndian.getUShort(attr.getData(), 6));
+      assertEquals(40, LittleEndian.getUShort(attr.getData(), 8));
+      assertEquals(56, LittleEndian.getUShort(attr.getData(), 10));
+      assertEquals(3, LittleEndian.getUShort(attr.getData(), 12)); // Weds
+      
+      // Ask for it as a Java date, and have it converted
+      // Pick a predictable format + location. Note location is in summer time!
+      TNEFDateAttribute date = (TNEFDateAttribute)attr;
+      DateFormat fmt = DateFormat.getDateTimeInstance(
+            DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK
+      );
+      assertEquals("28-Apr-2010 13:40:56", fmt.format(date.getDate()));
+       }
        
-       // Test string
+       /** 
+        * Test a bit of mapi
+        */
+       public void testMAPI() throws Exception {
+          // Message MAPI
+      TNEFAttribute attr = quick.getMessageAttribute(
+            TNEFProperty.ID_MAPIPROPERTIES
+      );
+      assertNotNull(attr);
+      assertEquals(TNEFMAPIAttribute.class, attr.getClass());
+          
+      TNEFMAPIAttribute mapi = (TNEFMAPIAttribute)attr;
+      assertEquals(54, mapi.getMAPIAttributes().size());
+      assertEquals(
+            MAPIProperty.ALTERNATE_RECIPIENT_ALLOWED, 
+            mapi.getMAPIAttributes().get(0).getProperty()
+      );
+      
+      
+          // Attribute MAPI
+      attr = quick.getAttachments().get(0).getAttribute(
+            TNEFProperty.ID_ATTACHMENT
+      );
+      assertNotNull(attr);
+      assertEquals(TNEFMAPIAttribute.class, attr.getClass());
+      
+      mapi = (TNEFMAPIAttribute)attr;
+      assertEquals(22, mapi.getMAPIAttributes().size());
+      assertEquals(
+            MAPIProperty.ATTACH_SIZE, 
+            mapi.getMAPIAttributes().get(0).getProperty()
+      );
+       }
        
-       // Test a bit of mapi
+       /**
+        * Test common ones via helpers
+        */
+       public void testCommon() throws Exception {
+          assertEquals("This is a test message", quick.getSubject());
+          assertEquals("quick.doc", quick.getAttachments().get(0).getFilename());
+       }
 }