MHTMLの展開

とあるMHTMLファイルをOffice 2004だと問題なく表示出来ていたのに2008だと画像が表示出来なくなっていた。時間に余裕ができていたのでMHTMLを展開するプログラムを書いた。
javax.mail.Multipartを利用するのでJavaMailとJAFを含めて一つのJARにマージして実行*1したらSecurityExceptionを吐く。どうもMANIFEST.MFにあるべきハッシュが無いので困っているっぽい。
面倒そうなので今回はマージせずにクラスパスに含めて実行した。
以下コード。

import java.net.*;
import java.io.*;
import java.util.*;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;

public class unmht {

	public static void main (String args[]) throws MalformedURLException, MessagingException, IOException {
		File file = new File(args[0]);
		String baseName = removeFileExtension(file.getName());
		URL url = file.toURL();
		DataSource dataSource = new URLDataSource(url);
		Multipart multipart = new MimeMultipart(dataSource);
		System.out.println("File: " + file + " has " + multipart.getCount() + "body.");
		for (int i = 0; i < multipart.getCount(); i++) {
			BodyPart bodyPart = multipart.getBodyPart(i);
			System.out.println("Part " + i);
			Enumeration e = bodyPart.getAllHeaders();
			while (e.hasMoreElements()) {
				Header header = (Header) e.nextElement();
				System.out.println(header.getName() + ": " + header.getValue());
			}
			String contentLocation = bodyPart.getHeader("Content-Location")[0];
			String outputFilename = removePrefixBefore(contentLocation, baseName);
			File outputFile = new File(outputFilename);
			adjustDirectory(outputFile);
			InputStream inputStream = bodyPart.getInputStream();
			OutputStream outputStream = new FileOutputStream(outputFile);
			int b;
			while ((b = inputStream.read()) > -1) {
				outputStream.write(b);
			}
		}
	}

	public static void adjustDirectory(File file) {
		File parent = file.getParentFile();
		if (parent != null) {
			parent.mkdirs();
		}
	}

	public static String removePrefixBefore(String str, String base) {
		int basePosition = str.indexOf(base);
		if (basePosition > -1) {
			return str.substring(basePosition);
		} else {
			return str;
		}
	}

	//from http://www7a.biglobe.ne.jp/~java-master/samples/file/RemoveFileExtension.html
	public static String removeFileExtension(String filename) {
		int lastDotPos = filename.lastIndexOf('.');
		if (lastDotPos == -1) {
			return filename;
		} else if (lastDotPos == 0) {
			return filename;
		} else {
			return filename.substring(0, lastDotPos);
		}
	}

}

*1:XcodeJava ToolプロジェクトのlibフォルダにライブラリのJARファイルを置けばデフォルトでそうなる