added Ant target to compile scratchpad examples, added example HSMF application that converts a .msg file to text and extracts attachments, see Bugzilla 47922

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@821500 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2009-10-04 10:25:53 +00:00
parent a40baa56ba
commit 2ad9b00e9f
3 changed files with 208 additions and 2 deletions

View File

@ -27,6 +27,7 @@ under the License.
Modified by:
Rainer Klute klute@rainer-klute.de
Bruno Girin brunogirin@gmail.com
This build was tested with ant 1.6.2 although it will probably work with
other versions. The following jar files should be available on the
@ -110,6 +111,10 @@ under the License.
<property name="examples.src" location="src/examples/src"/>
<property name="examples.output.dir" location="build/examples-classes"/>
<!-- Scratchpad Examples: -->
<property name="scratchpad.examples.src" location="src/scratchpad/examples/src"/>
<property name="scratchpad.examples.output.dir" location="build/scratchpad-examples-classes"/>
<!-- OOXML support: -->
<property name="ooxml.src" location="src/ooxml/java"/>
<property name="ooxml.src.test" location="src/ooxml/testcases"/>
@ -273,6 +278,7 @@ under the License.
<mkdir dir="${scratchpad.output.dir}"/>
<mkdir dir="${contrib.output.dir}"/>
<mkdir dir="${examples.output.dir}"/>
<mkdir dir="${scratchpad.examples.output.dir}"/>
<mkdir dir="${ooxml.output.dir}"/>
<mkdir dir="${main.output.test.dir}"/>
<mkdir dir="${contrib.output.test.dir}"/>
@ -423,8 +429,8 @@ under the License.
</target>
<target name="compile" depends="init, compile-main,
compile-scratchpad, compile-contrib, compile-examples"
description="Compiles the POI main classes, scratchpad, contrib, and examples"/>
compile-scratchpad, compile-contrib, compile-examples, compile-scratchpad-examples"
description="Compiles the POI main classes, scratchpad, contrib, examples, and scratchpad examples"/>
<target name="compile-main">
<copy todir="${main.output.dir}">
@ -508,6 +514,19 @@ under the License.
</javac>
</target>
<target name="compile-scratchpad-examples" depends="init,compile-ooxml">
<javac target="${jdk.version.class}" source="${jdk.version.source}"
failonerror="true" destdir="${scratchpad.examples.output.dir}" debug="on" fork="yes"
srcdir="${scratchpad.examples.src}">
<classpath>
<path refid="examples.classpath"/>
<path refid="ooxml.classpath"/>
<pathelement path="${ooxml.output.dir}"/>
<pathelement location="${junit.jar1.dir}"/>
</classpath>
</javac>
</target>
<target name="compile-ooxml" depends="init, compile-main, compile-scratchpad">
<javac target="1.5" source="1.5"
destdir="${ooxml.output.dir}" debug="on" srcdir="${ooxml.src}">

View File

@ -33,6 +33,8 @@
<changes>
<release version="3.6-beta1" date="2009-??-??">
<action dev="POI-DEVELOPERS" type="add">47922 - added example HSMF application that converts a .msg file to text and extracts attachments</action>
<action dev="POI-DEVELOPERS" type="add">47903 - added Ant target to compile scratchpad examples</action>
<action dev="POI-DEVELOPERS" type="add">47839 - improved API for OOXML custom properties</action>
<action dev="POI-DEVELOPERS" type="fix">47862 - fixed XSSFSheet.setColumnWidth to handle columns included in a column span</action>
<action dev="POI-DEVELOPERS" type="fix">47804 - fixed XSSFSheet.setColumnHidden to handle columns included in a column span</action>

View File

@ -0,0 +1,185 @@
/* ====================================================================
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.hsmf.examples;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Map;
import org.apache.poi.hsmf.MAPIMessage;
import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
/**
* Reads one or several Outlook MSG files and for each of them creates
* a text file from available chunks and a directory that contains
* attachments.
*
* @author Bruno Girin
*
*/
public class Msg2txt {
/**
* The stem used to create file names for the text file and the directory
* that contains the attachments.
*/
private String fileNameStem;
/**
* The Outlook MSG file being processed.
*/
private MAPIMessage msg;
public Msg2txt(String fileName) throws IOException {
fileNameStem = fileName;
if(fileNameStem.endsWith(".msg") || fileNameStem.endsWith(".MSG")) {
fileNameStem = fileNameStem.substring(0, fileNameStem.length() - 4);
}
msg = new MAPIMessage(fileName);
}
/**
* Processes the message.
*
* @throws IOException if an exception occurs while writing the message out
*/
public void processMessage() throws IOException {
String txtFileName = fileNameStem + ".txt";
String attDirName = fileNameStem + "-att";
PrintWriter txtOut = null;
try {
txtOut = new PrintWriter(txtFileName);
try {
String displayFrom = msg.getDisplayFrom();
txtOut.println("From: "+displayFrom);
} catch (ChunkNotFoundException e) {
// ignore
}
try {
String displayTo = msg.getDisplayTo();
txtOut.println("To: "+displayTo);
} catch (ChunkNotFoundException e) {
// ignore
}
try {
String displayCC = msg.getDisplayCC();
txtOut.println("CC: "+displayCC);
} catch (ChunkNotFoundException e) {
// ignore
}
try {
String displayBCC = msg.getDisplayBCC();
txtOut.println("BCC: "+displayBCC);
} catch (ChunkNotFoundException e) {
// ignore
}
try {
String subject = msg.getSubject();
txtOut.println("Subject: "+subject);
} catch (ChunkNotFoundException e) {
// ignore
}
try {
String body = msg.getTextBody();
txtOut.println(body);
} catch (ChunkNotFoundException e) {
System.err.println("No message body");
}
Map attachmentMap = msg.getAttachmentFiles();
if(attachmentMap.size() > 0) {
File d = new File(attDirName);
if(d.mkdir()) {
for(
Iterator ii = attachmentMap.entrySet().iterator();
ii.hasNext();
) {
Map.Entry entry = (Map.Entry)ii.next();
processAttachment(d, entry.getKey().toString(),
(ByteArrayInputStream)entry.getValue());
}
} else {
System.err.println("Can't create directory "+attDirName);
}
}
} finally {
if(txtOut != null) {
txtOut.close();
}
}
}
/**
* Processes a single attachment: reads it from the Outlook MSG file and
* writes it to disk as an individual file.
*
* @param dir the directory in which to write the attachment file
* @param fileName the name of the attachment file
* @param fileIn the input stream that contains the attachment's data
* @throws IOException when any of the file operations fails
*/
public void processAttachment(File dir, String fileName,
ByteArrayInputStream fileIn) throws IOException {
File f = new File(dir, fileName);
OutputStream fileOut = null;
try {
fileOut = new FileOutputStream(f);
byte[] buffer = new byte[2048];
int bNum = fileIn.read(buffer);
while(bNum > 0) {
fileOut.write(buffer);
bNum = fileIn.read(buffer);
}
} finally {
try {
if(fileIn != null) {
fileIn.close();
}
} finally {
if(fileOut != null) {
fileOut.close();
}
}
}
}
/**
* Processes the list of arguments as a list of names of Outlook MSG files.
*
* @param args the list of MSG files to process
*/
public static void main(String[] args) {
if(args.length <= 0) {
System.err.println("No files names provided");
} else {
for(int i = 0; i < args.length; i++) {
try {
Msg2txt processor = new Msg2txt(args[i]);
processor.processMessage();
} catch (IOException e) {
System.err.println("Could not process "+args[i]+": "+e);
}
}
}
}
}