+++ /dev/null
-/*\r
- * @(#) $Id: MultipartUtility.java,v 1.1.2.2 2004/10/24 10:26:50 otsuka Exp $\r
- * $Revision: 1.1.2.2 $\r
- * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.\r
- */\r
-package com.ozacc.mail.fetch.impl.sk_jp;\r
-\r
-import java.io.IOException;\r
-import java.io.UnsupportedEncodingException;\r
-\r
-import javax.activation.DataHandler;\r
-import javax.mail.MessagingException;\r
-import javax.mail.Multipart;\r
-import javax.mail.Part;\r
-import javax.mail.internet.ContentType;\r
-import javax.mail.internet.MimeBodyPart;\r
-import javax.mail.internet.MimeMultipart;\r
-\r
-/**\r
- * メッセージボディを取り出す手段を提供するstaticメソッドのセットです。\r
- * <p>\r
- * </p>\r
- * @version $Revision: 1.1.2.2 $ $Date: 2004/10/24 10:26:50 $\r
- * @author Shin\r
- * @author Tomohiro Otsuka\r
- */\r
-public class MultipartUtility {\r
-\r
- private static final String JIS_CHARSET = "ISO-2022-JP";\r
-\r
- /**\r
- * 指定パートのボディを返します。\r
- * <P>\r
- * Part#getContent()の代わりです。\r
- * MIMEに準拠しないContent-Type:の補正を行います。\r
- * charset指定がない場合は"ISO-2022-JP"を補います。\r
- * </P><P>\r
- * パートがUTF-7の場合も正常に内容を取得出来ます。\r
- * </P>\r
- */\r
- public static Object getContent(Part part) throws MessagingException, IOException {\r
- return getContent(part, JIS_CHARSET);\r
- }\r
-\r
- private static CorrectedContentTypeDataSource correctedDataSource = new CorrectedContentTypeDataSourceUTF7Support();\r
-\r
- private static DataHandler correctedDataHandler = new DataHandler(correctedDataSource);\r
-\r
- /**\r
- * 指定パートのボディを返します。\r
- * <P>\r
- * MIMEに準拠しないContent-Type:の補正を行います。\r
- * charset指定がない場合はcharsetで指定されたもので補います。\r
- * </P><P>\r
- * パートがUTF-7の場合も正常に内容を取得出来ます。\r
- * </P>\r
- */\r
- public static Object getContent(Part part, String charset) throws MessagingException,\r
- IOException {\r
- synchronized (correctedDataSource) {\r
-\r
- correctedDataSource.setPart(part);\r
- try {\r
- correctedDataSource.setDefaultCharset(charset);\r
- return correctedDataHandler.getContent();\r
- } catch (UnsupportedEncodingException e) {\r
- /*\r
- * 不正な文字コードがcharsetにセットされ例外がスローされた場合に\r
- * JIS_CHARSETに文字コードを置き換え、再度ホディの取得を試みます。\r
- * \r
- * by otsuka\r
- */\r
- correctedDataSource.setForceCharset(JIS_CHARSET);\r
- return correctedDataHandler.getContent();\r
- }\r
-\r
- }\r
- }\r
-\r
- /**\r
- * 指定パート配下で最初に見つけたテキストパートのボディを返します。\r
- * process()を呼び出して結果を返すだけのconvenience methodです。\r
- */\r
- public static String getFirstPlainText(Part part) throws MessagingException {\r
- FirstPlainPartExtractor h = new FirstPlainPartExtractor();\r
- process(part, h);\r
- return h.getText();\r
- }\r
-\r
- /**\r
- * 指定パート配下のinlineなテキストパートを集めて表示用のボディを返します。\r
- * process()を呼び出して結果を返すだけのconvenience methodです。\r
- */\r
- public static String getPlainText(Part part) throws MessagingException {\r
- PlainPartExtractor h = new PlainPartExtractor();\r
- process(part, h);\r
- return h.getText();\r
- }\r
-\r
- /**\r
- * 指定パート配下の各パートを処理します。\r
- * <P>\r
- * すべてのPartに対してPartHandlerが呼び出されます。<BR>\r
- * </P>\r
- */\r
- public static void process(Part part, PartHandler handler) throws MessagingException {\r
- process(part, handler, null);\r
- }\r
-\r
- private static boolean process(Part part, PartHandler handler, ContentType context)\r
- throws MessagingException {\r
- try {\r
- if (part.isMimeType("multipart/*")) {\r
- Multipart mp = (Multipart)part.getContent();\r
- ContentType cType = new ContentType(part.getContentType());\r
- for (int i = 0; i < mp.getCount(); i++) {\r
- if (!process(mp.getBodyPart(i), handler, cType)) {\r
- return false;\r
- }\r
- }\r
- return true;\r
- }\r
- return handler.processPart(part, context);\r
- } catch (IOException e) {\r
- throw new MessagingException("Got exception \nin " + part + "\n", e);\r
- }\r
- }\r
-\r
- /**\r
- * 指定partにbodyPartを追加します。\r
- * partがマルチパーとコンテナの場合はそのコンテナにbodyPartを追加します。\r
- * そうでない場合はpartのボディとしてmultipart/mixedのコンテナを設定し、\r
- * 元のpartのボディとbodyPartのボディをそのコンテナに追加します。\r
- */\r
- public static void addBodyPart(Part part, MimeBodyPart bodyPart) throws MessagingException,\r
- IOException {\r
- if (part.isMimeType("multipart/*")) {\r
- ((MimeMultipart)part.getContent()).addBodyPart(bodyPart);\r
- return;\r
- }\r
- // 仮\r
- MimeMultipart mp = new MimeMultipart("mixed");\r
- MimeBodyPart original = new MimeBodyPart();\r
- original.setContent(part.getContent(), part.getContentType());\r
- mp.addBodyPart(original);\r
- mp.addBodyPart(bodyPart);\r
- part.setContent(mp);\r
- }\r
-\r
- /**\r
- * partのツリー構造をダンプするデバッグ用メソッドです。\r
- */\r
- public static void dump(Part part) {\r
- dump(part, 0);\r
- }\r
-\r
- private static void dump(Part part, int layer) {\r
- for (int i = 0; i < layer; i++) {\r
- System.out.print(" ");\r
- }\r
- try {\r
- System.out.println(part.getClass() + ":" + part.getContentType());\r
- if (part.isMimeType("multipart/*")) {\r
- MimeMultipart mp = (MimeMultipart)part.getContent();\r
- for (int i = 0; i < mp.getCount(); i++) {\r
- dump(mp.getBodyPart(i), layer + 1);\r
- }\r
- }\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- }\r
- }\r
-}
\ No newline at end of file