Tweak the attribute getter names on Attachments, and add MAPI+TNEF Attribute unit tests

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1076685 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2011-03-03 17:06:37 +00:00
parent efe5a63429
commit bbfa85f807
5 changed files with 334 additions and 35 deletions

View File

@ -53,7 +53,7 @@ public final class Attachment {
* Return the attachment attribute with the given ID, * Return the attachment attribute with the given ID,
* or null if there isn't one. * or null if there isn't one.
*/ */
public TNEFAttribute getMessageAttribute(TNEFProperty id) { public TNEFAttribute getAttribute(TNEFProperty id) {
for(TNEFAttribute attr : attributes) { for(TNEFAttribute attr : attributes) {
if(attr.getProperty() == id) { if(attr.getProperty() == id) {
return attr; return attr;
@ -66,7 +66,7 @@ public final class Attachment {
* Return the attachment MAPI Attribute with the given ID, * Return the attachment MAPI Attribute with the given ID,
* or null if there isn't one. * or null if there isn't one.
*/ */
public MAPIAttribute getMessageMAPIAttribute(MAPIProperty id) { public MAPIAttribute getMAPIAttribute(MAPIProperty id) {
for(MAPIAttribute attr : mapiAttributes) { for(MAPIAttribute attr : mapiAttributes) {
if(attr.getProperty() == id) { if(attr.getProperty() == id) {
return attr; return attr;
@ -97,14 +97,14 @@ public final class Attachment {
* if it isn't set * if it isn't set
*/ */
private String getString(MAPIProperty id) { private String getString(MAPIProperty id) {
return MAPIStringAttribute.getAsString( getMessageMAPIAttribute(id) ); return MAPIStringAttribute.getAsString( getMAPIAttribute(id) );
} }
/** /**
* Returns the string value of the TNEF property, or * Returns the string value of the TNEF property, or
* null if it isn't set * null if it isn't set
*/ */
private String getString(TNEFProperty id) { 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() { public Date getModifiedDate() {
return TNEFDateAttribute.getAsDate( 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. * Returns the contents of the attachment.
*/ */
public byte[] getContents() { public byte[] getContents() {
TNEFAttribute contents = getMessageAttribute(TNEFProperty.ID_ATTACHDATA); TNEFAttribute contents = getAttribute(TNEFProperty.ID_ATTACHDATA);
if(contents == null) { if(contents == null) {
throw new IllegalArgumentException("Attachment corrupt - no Data section"); throw new IllegalArgumentException("Attachment corrupt - no Data section");
} }
@ -151,7 +151,7 @@ public final class Attachment {
* of the attachment, or null if not set. * of the attachment, or null if not set.
*/ */
public byte[] getRenderedMetaFile() { public byte[] getRenderedMetaFile() {
TNEFAttribute meta = getMessageAttribute(TNEFProperty.ID_ATTACHMETAFILE); TNEFAttribute meta = getAttribute(TNEFProperty.ID_ATTACHMETAFILE);
if(meta == null) return null; if(meta == null) return null;
return meta.getData(); return meta.getData();
} }

View File

@ -23,7 +23,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.poi.hmef.attribute.MAPIAttribute; 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.MAPIStringAttribute;
import org.apache.poi.hmef.attribute.TNEFAttribute; import org.apache.poi.hmef.attribute.TNEFAttribute;
import org.apache.poi.hmef.attribute.TNEFMAPIAttribute; import org.apache.poi.hmef.attribute.TNEFMAPIAttribute;

View File

@ -87,6 +87,8 @@ public final class TestAttachments extends TestCase {
public void testAttachmentDetails() throws Exception { public void testAttachmentDetails() throws Exception {
List<Attachment> attachments = quick.getAttachments(); 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 fmt = DateFormat.getDateTimeInstance(
DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK
); );

View File

@ -17,26 +17,159 @@
package org.apache.poi.hmef.attribute; package org.apache.poi.hmef.attribute;
import java.io.ByteArrayInputStream;
import java.text.DateFormat;
import java.util.Locale;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hmef.HMEFMessage; 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 { public final class TestMAPIAttributes extends TestCase {
private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance(); private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
private HMEFMessage quick;
public void testOpen() throws Exception {
HMEFMessage msg = new HMEFMessage( @Override
_samples.openResourceAsStream("quick-winmail.dat") protected void setUp() throws Exception {
); super.setUp();
assertNotNull(msg); quick = new HMEFMessage(
} _samples.openResourceAsStream("quick-winmail.dat")
);
// Test basics }
// Test counts
/**
* 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());
}
// Check untyped /**
// Check typed * Test various general ones
// Check common */
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()
);
}
/**
* 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));
}
/**
* 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());
}
} }

View File

@ -17,27 +17,192 @@
package org.apache.poi.hmef.attribute; package org.apache.poi.hmef.attribute;
import java.io.ByteArrayInputStream;
import java.text.DateFormat;
import java.util.Locale;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hmef.Attachment;
import org.apache.poi.hmef.HMEFMessage; 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 { public final class TestTNEFAttributes extends TestCase {
private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance(); private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
private HMEFMessage quick;
public void testOpen() throws Exception {
HMEFMessage msg = new HMEFMessage( @Override
_samples.openResourceAsStream("quick-winmail.dat") protected void setUp() throws Exception {
); super.setUp();
assertNotNull(msg); 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());
}
} }