OSDN Git Service

CVS最新版の全ファイルを追加
[spring-ext/ozacc-mail.git] / src / java / com / ozacc / mail / fetch / impl / sk_jp / MultipartUtility.java
1 /*\r
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
5  */\r
6 package com.ozacc.mail.fetch.impl.sk_jp;\r
7 \r
8 import java.io.IOException;\r
9 import java.io.UnsupportedEncodingException;\r
10 \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
18 \r
19 /**\r
20  * メッセージボディを取り出す手段を提供するstaticメソッドのセットです。\r
21  * <p>\r
22  * </p>\r
23  * @version $Revision: 1.1.2.2 $ $Date: 2004/10/24 10:26:50 $\r
24  * @author Shin\r
25  * @author Tomohiro Otsuka\r
26  */\r
27 public class MultipartUtility {\r
28 \r
29         private static final String JIS_CHARSET = "ISO-2022-JP";\r
30 \r
31         /**\r
32          * 指定パートのボディを返します。\r
33          * <P>\r
34          * Part#getContent()の代わりです。\r
35          * MIMEに準拠しないContent-Type:の補正を行います。\r
36          * charset指定がない場合は"ISO-2022-JP"を補います。\r
37          * </P><P>\r
38          * パートがUTF-7の場合も正常に内容を取得出来ます。\r
39          * </P>\r
40          */\r
41         public static Object getContent(Part part) throws MessagingException, IOException {\r
42                 return getContent(part, JIS_CHARSET);\r
43         }\r
44 \r
45         private static CorrectedContentTypeDataSource correctedDataSource = new CorrectedContentTypeDataSourceUTF7Support();\r
46 \r
47         private static DataHandler correctedDataHandler = new DataHandler(correctedDataSource);\r
48 \r
49         /**\r
50          * 指定パートのボディを返します。\r
51          * <P>\r
52          * MIMEに準拠しないContent-Type:の補正を行います。\r
53          * charset指定がない場合はcharsetで指定されたもので補います。\r
54          * </P><P>\r
55          * パートがUTF-7の場合も正常に内容を取得出来ます。\r
56          * </P>\r
57          */\r
58         public static Object getContent(Part part, String charset) throws MessagingException,\r
59                                                                                                                                 IOException {\r
60                 synchronized (correctedDataSource) {\r
61 \r
62                         correctedDataSource.setPart(part);\r
63                         try {\r
64                                 correctedDataSource.setDefaultCharset(charset);\r
65                                 return correctedDataHandler.getContent();\r
66                         } catch (UnsupportedEncodingException e) {\r
67                                 /*\r
68                                  * 不正な文字コードがcharsetにセットされ例外がスローされた場合に\r
69                                  * JIS_CHARSETに文字コードを置き換え、再度ホディの取得を試みます。\r
70                                  * \r
71                                  * by otsuka\r
72                                  */\r
73                                 correctedDataSource.setForceCharset(JIS_CHARSET);\r
74                                 return correctedDataHandler.getContent();\r
75                         }\r
76 \r
77                 }\r
78         }\r
79 \r
80         /**\r
81          * 指定パート配下で最初に見つけたテキストパートのボディを返します。\r
82          * process()を呼び出して結果を返すだけのconvenience methodです。\r
83          */\r
84         public static String getFirstPlainText(Part part) throws MessagingException {\r
85                 FirstPlainPartExtractor h = new FirstPlainPartExtractor();\r
86                 process(part, h);\r
87                 return h.getText();\r
88         }\r
89 \r
90         /**\r
91          * 指定パート配下のinlineなテキストパートを集めて表示用のボディを返します。\r
92          * process()を呼び出して結果を返すだけのconvenience methodです。\r
93          */\r
94         public static String getPlainText(Part part) throws MessagingException {\r
95                 PlainPartExtractor h = new PlainPartExtractor();\r
96                 process(part, h);\r
97                 return h.getText();\r
98         }\r
99 \r
100         /**\r
101          * 指定パート配下の各パートを処理します。\r
102          * <P>\r
103          * すべてのPartに対してPartHandlerが呼び出されます。<BR>\r
104          * </P>\r
105          */\r
106         public static void process(Part part, PartHandler handler) throws MessagingException {\r
107                 process(part, handler, null);\r
108         }\r
109 \r
110         private static boolean process(Part part, PartHandler handler, ContentType context)\r
111                                                                                                                                                                                 throws MessagingException {\r
112                 try {\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
118                                                 return false;\r
119                                         }\r
120                                 }\r
121                                 return true;\r
122                         }\r
123                         return handler.processPart(part, context);\r
124                 } catch (IOException e) {\r
125                         throw new MessagingException("Got exception \nin " + part + "\n", e);\r
126                 }\r
127         }\r
128 \r
129         /**\r
130          * 指定partにbodyPartを追加します。\r
131          * partがマルチパーとコンテナの場合はそのコンテナにbodyPartを追加します。\r
132          * そうでない場合はpartのボディとしてmultipart/mixedのコンテナを設定し、\r
133          * 元のpartのボディとbodyPartのボディをそのコンテナに追加します。\r
134          */\r
135         public static void addBodyPart(Part part, MimeBodyPart bodyPart) throws MessagingException,\r
136                                                                                                                                         IOException {\r
137                 if (part.isMimeType("multipart/*")) {\r
138                         ((MimeMultipart)part.getContent()).addBodyPart(bodyPart);\r
139                         return;\r
140                 }\r
141                 // 仮\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
148         }\r
149 \r
150         /**\r
151          * partのツリー構造をダンプするデバッグ用メソッドです。\r
152          */\r
153         public static void dump(Part part) {\r
154                 dump(part, 0);\r
155         }\r
156 \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
160                 }\r
161                 try {\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
167                                 }\r
168                         }\r
169                 } catch (Exception e) {\r
170                         e.printStackTrace();\r
171                 }\r
172         }\r
173 }