2 * @(#) $Id: MultipartUtility.java,v 1.1.2.2 2004/10/24 10:26:50 otsuka Exp $
\r
3 * $Revision: 1.1.2.2 $
\r
4 * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.
\r
6 package com.ozacc.mail.fetch.impl.sk_jp;
\r
8 import java.io.IOException;
\r
9 import java.io.UnsupportedEncodingException;
\r
11 import javax.activation.DataHandler;
\r
12 import javax.mail.MessagingException;
\r
13 import javax.mail.Multipart;
\r
14 import javax.mail.Part;
\r
15 import javax.mail.internet.ContentType;
\r
16 import javax.mail.internet.MimeBodyPart;
\r
17 import javax.mail.internet.MimeMultipart;
\r
20 * メッセージボディを取り出す手段を提供するstaticメソッドのセットです。
\r
23 * @version $Revision: 1.1.2.2 $ $Date: 2004/10/24 10:26:50 $
\r
25 * @author Tomohiro Otsuka
\r
27 public class MultipartUtility {
\r
29 private static final String JIS_CHARSET = "ISO-2022-JP";
\r
34 * Part#getContent()の代わりです。
\r
35 * MIMEに準拠しないContent-Type:の補正を行います。
\r
36 * charset指定がない場合は"ISO-2022-JP"を補います。
\r
38 * パートがUTF-7の場合も正常に内容を取得出来ます。
\r
41 public static Object getContent(Part part) throws MessagingException, IOException {
\r
42 return getContent(part, JIS_CHARSET);
\r
45 private static CorrectedContentTypeDataSource correctedDataSource = new CorrectedContentTypeDataSourceUTF7Support();
\r
47 private static DataHandler correctedDataHandler = new DataHandler(correctedDataSource);
\r
52 * MIMEに準拠しないContent-Type:の補正を行います。
\r
53 * charset指定がない場合はcharsetで指定されたもので補います。
\r
55 * パートがUTF-7の場合も正常に内容を取得出来ます。
\r
58 public static Object getContent(Part part, String charset) throws MessagingException,
\r
60 synchronized (correctedDataSource) {
\r
62 correctedDataSource.setPart(part);
\r
64 correctedDataSource.setDefaultCharset(charset);
\r
65 return correctedDataHandler.getContent();
\r
66 } catch (UnsupportedEncodingException e) {
\r
68 * 不正な文字コードがcharsetにセットされ例外がスローされた場合に
\r
69 * JIS_CHARSETに文字コードを置き換え、再度ホディの取得を試みます。
\r
73 correctedDataSource.setForceCharset(JIS_CHARSET);
\r
74 return correctedDataHandler.getContent();
\r
81 * 指定パート配下で最初に見つけたテキストパートのボディを返します。
\r
82 * process()を呼び出して結果を返すだけのconvenience methodです。
\r
84 public static String getFirstPlainText(Part part) throws MessagingException {
\r
85 FirstPlainPartExtractor h = new FirstPlainPartExtractor();
\r
91 * 指定パート配下のinlineなテキストパートを集めて表示用のボディを返します。
\r
92 * process()を呼び出して結果を返すだけのconvenience methodです。
\r
94 public static String getPlainText(Part part) throws MessagingException {
\r
95 PlainPartExtractor h = new PlainPartExtractor();
\r
101 * 指定パート配下の各パートを処理します。
\r
103 * すべてのPartに対してPartHandlerが呼び出されます。<BR>
\r
106 public static void process(Part part, PartHandler handler) throws MessagingException {
\r
107 process(part, handler, null);
\r
110 private static boolean process(Part part, PartHandler handler, ContentType context)
\r
111 throws MessagingException {
\r
113 if (part.isMimeType("multipart/*")) {
\r
114 Multipart mp = (Multipart)part.getContent();
\r
115 ContentType cType = new ContentType(part.getContentType());
\r
116 for (int i = 0; i < mp.getCount(); i++) {
\r
117 if (!process(mp.getBodyPart(i), handler, cType)) {
\r
123 return handler.processPart(part, context);
\r
124 } catch (IOException e) {
\r
125 throw new MessagingException("Got exception \nin " + part + "\n", e);
\r
130 * 指定partにbodyPartを追加します。
\r
131 * partがマルチパーとコンテナの場合はそのコンテナにbodyPartを追加します。
\r
132 * そうでない場合はpartのボディとしてmultipart/mixedのコンテナを設定し、
\r
133 * 元のpartのボディとbodyPartのボディをそのコンテナに追加します。
\r
135 public static void addBodyPart(Part part, MimeBodyPart bodyPart) throws MessagingException,
\r
137 if (part.isMimeType("multipart/*")) {
\r
138 ((MimeMultipart)part.getContent()).addBodyPart(bodyPart);
\r
142 MimeMultipart mp = new MimeMultipart("mixed");
\r
143 MimeBodyPart original = new MimeBodyPart();
\r
144 original.setContent(part.getContent(), part.getContentType());
\r
145 mp.addBodyPart(original);
\r
146 mp.addBodyPart(bodyPart);
\r
147 part.setContent(mp);
\r
151 * partのツリー構造をダンプするデバッグ用メソッドです。
\r
153 public static void dump(Part part) {
\r
157 private static void dump(Part part, int layer) {
\r
158 for (int i = 0; i < layer; i++) {
\r
159 System.out.print(" ");
\r
162 System.out.println(part.getClass() + ":" + part.getContentType());
\r
163 if (part.isMimeType("multipart/*")) {
\r
164 MimeMultipart mp = (MimeMultipart)part.getContent();
\r
165 for (int i = 0; i < mp.getCount(); i++) {
\r
166 dump(mp.getBodyPart(i), layer + 1);
\r
169 } catch (Exception e) {
\r
170 e.printStackTrace();
\r