OSDN Git Service

CVS最新版の全ファイルを追加
[spring-ext/ozacc-mail.git] / src / java / com / ozacc / mail / impl / XMLMailBuilderImpl.java
1 package com.ozacc.mail.impl;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 \r
6 import javax.xml.parsers.FactoryConfigurationError;\r
7 \r
8 import org.apache.commons.logging.Log;\r
9 import org.apache.commons.logging.LogFactory;\r
10 import org.w3c.dom.Document;\r
11 import org.w3c.dom.Element;\r
12 import org.xml.sax.SAXException;\r
13 \r
14 import com.ozacc.mail.Mail;\r
15 import com.ozacc.mail.MailBuildException;\r
16 import com.ozacc.mail.MultipleMailBuilder;\r
17 \r
18 /**\r
19  * メールデータのXMLファイルからMailインスタンスを生成するクラス。\r
20  * <p>\r
21  * ソースXMLを読み込む際に、DTDバリデーションが実行されますので妥当なXMLデータ(Valid XML Document)でなければいけません。\r
22  * メールデータXMLのDTDは、<a href="http://www.ozacc.com/library/dtd/ozacc-mail.dtd">http://www.ozacc.com/library/dtd/ozacc-mail.dtd</a>を参照。\r
23  * \r
24  * @since 1.0.1\r
25  * @author Tomohiro Otsuka\r
26  * @version $Id: XMLMailBuilderImpl.java,v 1.5.2.1 2005/01/21 22:16:31 otsuka Exp $\r
27  */\r
28 public class XMLMailBuilderImpl extends AbstractXMLMailBuilder implements MultipleMailBuilder {\r
29 \r
30         private static Log log = LogFactory.getLog(XMLMailBuilderImpl.class);\r
31 \r
32         /**\r
33          * コンストラクタ。\r
34          */\r
35         public XMLMailBuilderImpl() {\r
36                 super();\r
37         }\r
38 \r
39         /**\r
40          * @see com.ozacc.mail.MailBuilder#buildMail(java.lang.String)\r
41          */\r
42         public Mail buildMail(String classPath) throws MailBuildException {\r
43                 Document doc = retrieveDocument(classPath);\r
44                 return buildMail(doc.getDocumentElement());\r
45         }\r
46 \r
47         /**\r
48          * @see com.ozacc.mail.MailBuilder#buildMail(java.io.File)\r
49          */\r
50         public Mail buildMail(File file) throws MailBuildException {\r
51                 Document doc = retrieveDocument(file);\r
52                 return buildMail(doc.getDocumentElement());\r
53         }\r
54 \r
55         /**\r
56          * @param classPath\r
57          * @return \r
58          * @throws MailBuildException\r
59          */\r
60         private Document retrieveDocument(String classPath) throws MailBuildException {\r
61                 try {\r
62                         return getDocumentFromClassPath(classPath);\r
63                 } catch (SAXException e) {\r
64                         throw new MailBuildException("XMLのパースに失敗しました。" + e.getMessage(), e);\r
65                 } catch (IOException e) {\r
66                         throw new MailBuildException("XMLファイルの読み込みに失敗しました。", e);\r
67                 }\r
68         }\r
69 \r
70         /**\r
71          * @param file\r
72          * @return \r
73          * @throws MailBuildException\r
74          */\r
75         private Document retrieveDocument(File file) throws MailBuildException {\r
76                 try {\r
77                         return getDocumentFromFile(file);\r
78                 } catch (SAXException e) {\r
79                         throw new MailBuildException("XMLのパースに失敗しました。" + e.getMessage(), e);\r
80                 } catch (IOException e) {\r
81                         throw new MailBuildException("XMLファイルの読み込みに失敗しました。", e);\r
82                 }\r
83         }\r
84 \r
85         /**\r
86          * 指定されたXMLのmail要素からMailインスタンスを生成します。\r
87          * \r
88          * @param root メールデータのmail要素\r
89          * @return 生成されたMailインスタンス\r
90          */\r
91         protected Mail buildMail(Element root) {\r
92                 Mail mail = new Mail();\r
93                 setReturnPath(root, mail);\r
94                 setFrom(root, mail);\r
95                 setRecipients(root, mail);\r
96                 setReplyTo(root, mail);\r
97                 setSubject(root, mail);\r
98                 setText(root, mail);\r
99                 setHtml(root, mail);\r
100                 return mail;\r
101         }\r
102 \r
103         /**\r
104          * @see com.ozacc.mail.MultipleMailBuilder#buildMail(java.lang.String, java.lang.String)\r
105          */\r
106         public Mail buildMail(String classPath, String mailId) throws MailBuildException {\r
107                 if (mailId == null || "".equals(mailId)) {\r
108                         throw new IllegalArgumentException("メールIDが指定されていません。");\r
109                 }\r
110                 Document doc = retrieveDocument(classPath);\r
111                 if (Mail.DOCTYPE_PUBLIC.equals(doc.getDoctype().getPublicId())) {\r
112                         throw new MailBuildException("指定されたクラスパスのXMLはシングルメールテンプレートです。[classPath='" + classPath\r
113                                         + "']");\r
114                 }\r
115                 Element mailElem = doc.getElementById(mailId);\r
116                 return buildMail(mailElem);\r
117         }\r
118 \r
119         /**\r
120          * @see com.ozacc.mail.MultipleMailBuilder#buildMail(java.io.File, java.lang.String)\r
121          */\r
122         public Mail buildMail(File file, String mailId) throws MailBuildException {\r
123                 if (mailId == null || "".equals(mailId)) {\r
124                         throw new IllegalArgumentException("メールIDが指定されていません。");\r
125                 }\r
126                 Document doc = retrieveDocument(file);\r
127                 if (Mail.DOCTYPE_PUBLIC.equals(doc.getDoctype().getPublicId())) {\r
128                         throw new MailBuildException("指定されたファイルのXMLはシングルメールテンプレートです。[filePath='"\r
129                                         + file.getAbsolutePath() + "']");\r
130                 }\r
131                 return buildMail(doc, mailId);\r
132         }\r
133 \r
134         /**\r
135          * マルチプルメールテンプレートのXMLドキュメント上の指定されたIDが示すメールテンプレートからMailインスタンスを生成して返します。\r
136          * \r
137          * @param doc\r
138          * @param mailId\r
139          * @return 生成されたMailインスタンス\r
140          * @throws FactoryConfigurationError \r
141          */\r
142         protected Mail buildMail(Document doc, String mailId) throws FactoryConfigurationError {\r
143                 Element mailElem = doc.getElementById(mailId);\r
144                 if (mailElem == null) {\r
145                         throw new MailBuildException("指定されたID[" + mailId + "]のメールデータは見つかりませんでした。");\r
146                 }\r
147                 log.debug(mailElem);\r
148                 return buildMail(mailElem);\r
149         }\r
150 \r
151 }