1 package com.ozacc.mail.impl;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 import javax.xml.parsers.DocumentBuilder;
10 import javax.xml.parsers.DocumentBuilderFactory;
11 import javax.xml.parsers.FactoryConfigurationError;
12 import javax.xml.parsers.ParserConfigurationException;
13
14 import org.w3c.dom.Document;
15 import org.w3c.dom.Element;
16 import org.w3c.dom.Node;
17 import org.w3c.dom.NodeList;
18 import org.xml.sax.SAXException;
19
20 import com.ozacc.mail.Mail;
21
22 /***
23 * XMLMailBuilder実装が継承する基底クラス。
24 *
25 * @since 1.1
26 *
27 * @author Tomohiro Otsuka
28 * @version $Id: AbstractXMLMailBuilder.java,v 1.4.2.2 2004/11/25 08:00:49 otsuka Exp $
29 */
30 public abstract class AbstractXMLMailBuilder {
31
32 protected Map documentBuilderCache;
33
34 /***
35 * コンストラクタ。
36 */
37 public AbstractXMLMailBuilder() {
38 documentBuilderCache = new HashMap();
39 }
40
41 /***
42 * 指定されたXMLファイルを読み込み、DOM Documentを生成します。
43 * ignoreCommentが指定されている場合は、XMLのコメントを削除しません。
44 *
45 * @param file XMLファイル
46 * @return DOM Document
47 * @throws IOException
48 * @throws SAXException
49 */
50 protected synchronized Document getDocumentFromFile(File file, boolean ignoreComment)
51 throws SAXException,
52 IOException {
53 DocumentBuilder db = createDocumentBuilder(ignoreComment);
54 return db.parse(file);
55 }
56
57 /***
58 * 指定されたXMLファイルを読み込み、DOM Documentを生成します。
59 * XMLのコメントや改行は削除されます。
60 *
61 * @param file XMLファイル
62 * @return DOM Document
63 * @throws IOException
64 * @throws SAXException
65 */
66 protected Document getDocumentFromFile(File file) throws SAXException, IOException {
67 return getDocumentFromFile(file, true);
68 }
69
70 /***
71 * DocumentBuilderインスタンスを生成します。
72 * ignoreCommentが指定されている場合は、コメントを削除しないように設定されたDocumentBuilderを生成します。
73 *
74 * @param ignoreComment
75 * @return DocumentBuilder
76 * @throws FactoryConfigurationError
77 */
78 protected DocumentBuilder createDocumentBuilder(boolean ignoreComment)
79 throws FactoryConfigurationError {
80 Boolean dbKey = Boolean.valueOf(ignoreComment);
81 DocumentBuilder db = (DocumentBuilder)documentBuilderCache.get(dbKey);
82 if (db == null) {
83 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
84 dbf.setIgnoringComments(ignoreComment);
85 dbf.setCoalescing(ignoreComment);
86 dbf.setIgnoringElementContentWhitespace(true);
87 dbf.setValidating(true);
88 try {
89 db = dbf.newDocumentBuilder();
90 db.setEntityResolver(new DTDEntityResolver());
91 documentBuilderCache.put(dbKey, db);
92 } catch (ParserConfigurationException e) {
93
94 throw new RuntimeException(e);
95 }
96 }
97 return db;
98 }
99
100 /***
101 * DocumentBuilderインスタンスを生成します。
102 * このDocumentBuilderを使用して生成されるDOM Documentでは、元のXMLデータにあるコメントは削除されます。
103 *
104 * @return DocumentBuilder
105 * @throws FactoryConfigurationError
106 */
107 protected DocumentBuilder createDocumentBuilder() throws FactoryConfigurationError {
108 return createDocumentBuilder(true);
109 }
110
111 /***
112 * 指定されたクラスパスのXMLファイルを読み込み、DOM Documentを生成します。
113 * ignoreCommentが指定されている場合は、XMLのコメントを削除しません。
114 *
115 * @param ignoreComment
116 * @param classPath
117 * @return DOM Document
118 * @throws IOException
119 * @throws SAXException
120 */
121 protected synchronized Document getDocumentFromClassPath(String classPath, boolean ignoreComment)
122 throws SAXException,
123 IOException {
124 InputStream is = getClass().getResourceAsStream(classPath);
125 DocumentBuilder db = createDocumentBuilder(ignoreComment);
126 try {
127 return db.parse(is);
128 } finally {
129 if (is != null) {
130 is.close();
131 }
132 }
133 }
134
135 /***
136 * 指定されたクラスパスのXMLファイルを読み込み、DOM Documentを生成します。
137 * XMLのコメントや改行は削除されます。
138 *
139 * @param classPath
140 * @return DOM Document
141 * @throws IOException
142 * @throws SAXException
143 */
144 protected Document getDocumentFromClassPath(String classPath) throws SAXException, IOException {
145 return getDocumentFromClassPath(classPath, true);
146 }
147
148 /***
149 * @param root
150 * @param mail
151 */
152 protected void setReplyTo(Element root, Mail mail) {
153 NodeList nodes = root.getElementsByTagName("replyTo");
154 Element replyTo = (Element)nodes.item(0);
155 if (replyTo != null && replyTo.getAttribute("email").length() > 0) {
156 mail.setReplyTo(replyTo.getAttribute("email"));
157 }
158 }
159
160 /***
161 * @param root
162 * @param mail
163 */
164 protected void setText(Element root, Mail mail) {
165 NodeList nodes = root.getElementsByTagName("body");
166 Element bodyElem = (Element)nodes.item(0);
167 if (bodyElem == null) {
168 return;
169 }
170 String body = bodyElem.getFirstChild().getNodeValue();
171 mail.setText(body.trim());
172 }
173
174 /***
175 * HTML本文をセット。
176 *
177 * @param root
178 * @param mail
179 */
180 protected void setHtml(Element root, Mail mail) {
181 NodeList nodes = root.getElementsByTagName("html");
182 Element htmlElem = (Element)nodes.item(0);
183 if (htmlElem == null) {
184 return;
185 }
186 String html = htmlElem.getFirstChild().getNodeValue();
187 mail.setHtmlText(html.trim());
188 }
189
190 /***
191 * @param root
192 * @param mail
193 */
194 protected void setSubject(Element root, Mail mail) {
195 NodeList nodes = root.getElementsByTagName("subject");
196 Element subjectElem = (Element)nodes.item(0);
197 if (subjectElem == null) {
198 return;
199 }
200 String subject = subjectElem.getFirstChild().getNodeValue();
201 mail.setSubject(subject.trim());
202 }
203
204 /***
205 * @param root
206 * @param mail
207 */
208 protected void setRecipients(Element root, Mail mail) {
209 NodeList nodes = root.getElementsByTagName("recipients");
210 Element recipientsElem = (Element)nodes.item(0);
211 if (recipientsElem == null) {
212 return;
213 }
214
215 NodeList recipientElemList = recipientsElem.getChildNodes();
216 for (int i = 0, max = recipientElemList.getLength(); i < max; i++) {
217 Node node = recipientElemList.item(i);
218 if (node.getNodeType() != Node.ELEMENT_NODE) {
219 continue;
220 }
221 Element e = (Element)node;
222 if ("to".equals(e.getNodeName())) {
223 if (e.getAttribute("email").length() > 0) {
224 if (e.getAttribute("name").length() > 0) {
225 mail.addTo(e.getAttribute("email"), e.getAttribute("name"));
226 } else {
227 mail.addTo(e.getAttribute("email"));
228 }
229 }
230 } else if ("cc".equals(e.getNodeName())) {
231 if (e.getAttribute("email").length() > 0) {
232 if (e.getAttribute("name").length() > 0) {
233 mail.addCc(e.getAttribute("email"), e.getAttribute("name"));
234 } else {
235 mail.addCc(e.getAttribute("email"));
236 }
237 }
238 } else {
239 if (e.getAttribute("email").length() > 0) {
240 mail.addBcc(e.getAttribute("email"));
241 }
242 }
243 }
244 }
245
246 /***
247 * @param root
248 * @param mail
249 */
250 protected void setReturnPath(Element root, Mail mail) {
251 NodeList nodes = root.getElementsByTagName("returnPath");
252 Element returnPath = (Element)nodes.item(0);
253 if (returnPath != null && returnPath.getAttribute("email").length() > 0) {
254 mail.setReturnPath(returnPath.getAttribute("email"));
255 }
256 }
257
258 /***
259 * @param root
260 * @param mail
261 */
262 protected void setFrom(Element root, Mail mail) {
263 NodeList nodes = root.getElementsByTagName("from");
264 Element from = (Element)nodes.item(0);
265 if (from != null && from.getAttribute("email").length() > 0) {
266 if (from.getAttribute("name").length() > 0) {
267 mail.setFrom(from.getAttribute("email"), from.getAttribute("name"));
268 } else {
269 mail.setFrom(from.getAttribute("email"));
270 }
271 }
272 }
273
274 }