View Javadoc

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