/* ====================================================================
- 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
+ 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
+ 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.
+ 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.poi.hmef.extractor;
* from a HMEF/TNEF/winmail.dat file
*/
public final class HMEFContentsExtractor {
- public static void main(String[] args) throws Exception {
- if (args.length < 2) {
+ /**
+ * Usage: HMEFContentsExtractor <filename> <output dir>
+ */
+ public static void main(String[] args) throws IOException {
+ if(args.length < 2) {
System.err.println("Use:");
System.err.println(" HMEFContentsExtractor <filename> <output dir>");
System.err.println("");
System.exit(2);
}
- HMEFContentsExtractor ext = new HMEFContentsExtractor(new File(args[0]));
+ final String filename = args[0];
+ final String outputDir = args[1];
- File dir = new File(args[1]);
+ HMEFContentsExtractor ext = new HMEFContentsExtractor(new File(filename));
+
+ File dir = new File(outputDir);
File rtf = new File(dir, "message.rtf");
- if (! dir.exists()) {
+ if(! dir.exists()) {
throw new FileNotFoundException("Output directory " + dir.getName() + " not found");
}
System.out.println("Extraction completed");
}
- private HMEFMessage message;
+ private final HMEFMessage message;
public HMEFContentsExtractor(File filename) throws IOException {
this(new HMEFMessage(new FileInputStream(filename)));
}
public void extractMessageBody(File dest) throws IOException {
OutputStream fout = new FileOutputStream(dest);
try {
- MAPIRtfAttribute body = (MAPIRtfAttribute)
- message.getMessageMAPIAttribute(MAPIProperty.RTF_COMPRESSED);
- fout.write(body.getData());
+ extractMessageBody(fout);
} finally {
fout.close();
}
}
+ /**
+ * Extracts the RTF message body to the supplied stream
+ */
+ public void extractMessageBody(OutputStream out) throws IOException {
+ MAPIRtfAttribute body = (MAPIRtfAttribute)
+ message.getMessageMAPIAttribute(MAPIProperty.RTF_COMPRESSED);
+ if (body != null) {
+ out.write(body.getData());
+ }
+ }
+
/**
* Extracts all the message attachments to the supplied directory
*/
--- /dev/null
+/* ====================================================================
+ 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.poi.hmef.extractor;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertArrayEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.util.TempFile;
+import org.junit.Test;
+
+public class TestHMEFContentsExtractor {
+ @Test
+ public void TestMain() throws IOException {
+ POIDataSamples samples = POIDataSamples.getHMEFInstance();
+ File message = samples.getFile("quick-winmail.dat");
+ File outputDirectory = TempFile.createTempDirectory("quick-winmail-main");
+ String[] args = new String[] { message.getAbsolutePath(), outputDirectory.getAbsolutePath() };
+ HMEFContentsExtractor.main(args);
+
+ String[] contents = new String[] {
+ "message.rtf", // from extractMessageBody
+ "quick.txt", "quick.pdf", "quick.xml", "quick.doc", "quick.html" // from extractAttachments
+ };
+
+ for (String filename : contents) {
+ File f = new File(outputDirectory, filename);
+ assertTrue(f + " does not exist", f.exists());
+ }
+
+ outputDirectory.delete();
+ }
+
+ @Test
+ public void TestExtractMessageBody_OutputStream() throws IOException {
+ POIDataSamples samples = POIDataSamples.getHMEFInstance();
+ File winmailTNEFFile = samples.getFile("quick-winmail.dat");
+ HMEFContentsExtractor extractor = new HMEFContentsExtractor(winmailTNEFFile);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ extractor.extractMessageBody(out);
+ assertTrue(out.size() > 0);
+ byte[] expectedMagic = new byte[] { '{', '\\', 'r', 't', 'f' };
+ byte[] magic = Arrays.copyOf(out.toByteArray(), 5);
+ assertArrayEquals("RTF magic number", expectedMagic, magic);
+ out.close();
+ }
+
+ @Test
+ public void TestExtractMessageBody_File() throws IOException {
+ POIDataSamples samples = POIDataSamples.getHMEFInstance();
+ File winmailTNEFFile = samples.getFile("quick-winmail.dat");
+ HMEFContentsExtractor extractor = new HMEFContentsExtractor(winmailTNEFFile);
+ File rtf = TempFile.createTempFile("quick-winmail-message-body", ".rtf");
+ assertTrue(rtf.delete());
+ extractor.extractMessageBody(rtf);
+ assertTrue("RTF message body is empty", rtf.length() > 0);
+ }
+}