OSDN Git Service

3fe508ae583e570e067671dfc1beea906bc1f1c3
[spring-ext/ozacc-mail.git] / src / main / java / com / ozacc / mail / xml / impl / JDomXMLBuilder.java
1 package com.ozacc.mail.xml.impl;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6
7 import javax.mail.internet.InternetAddress;
8
9 import org.jdom2.CDATA;
10 import org.jdom2.DocType;
11 import org.jdom2.Document;
12 import org.jdom2.Element;
13 import org.jdom2.JDOMException;
14 import org.jdom2.output.DOMOutputter;
15 import org.jdom2.output.Format;
16 import org.jdom2.output.XMLOutputter;
17
18 import com.ozacc.mail.Mail;
19 import com.ozacc.mail.xml.XMLBuildException;
20 import com.ozacc.mail.xml.XMLBuilder;
21
22 /**
23  * XMLBuilderの実装クラス。
24  * 
25  * @since 1.0
26  * @author Tomohiro Otsuka
27  * @version $Id: JDomXMLBuilder.java,v 1.6 2004/09/18 00:39:17 otsuka Exp $
28  */
29 public class JDomXMLBuilder implements XMLBuilder {
30
31         public static final String DOCTYPE_PUBLIC = "-//OZACC//DTD MAIL//EN";
32
33         public static final String DOCTYPE_SYSTEM = "http://www.ozacc.com/library/dtd/ozacc-mail.dtd";
34
35         private String charset = "UTF-8";
36
37         /**
38          * コンストラクタ。
39          */
40         public JDomXMLBuilder() {}
41
42         /**
43          * コンストラクタ。
44          * 出力XMLファイルの文字コードを指定します。デフォルトはUTF-8。
45          * 
46          * @param charset 出力XMLファイルの文字コード
47          */
48         public JDomXMLBuilder(String charset) {
49                 this();
50                 setCharset(charset);
51         }
52
53         /**
54          * 出力XMLファイルの文字コードを指定します。デフォルトはUTF-8。
55          * 
56          * @param charset 出力XMLファイルの文字コード
57          */
58         public void setCharset(String charset) {
59                 this.charset = charset;
60         }
61
62         /**
63          * 出力XMLファイルの文字コードを返します。
64          * 
65          * @return 出力XMLファイルの文字コード
66          */
67         public String getCharset() {
68                 return charset;
69         }
70
71         /**
72          * @see com.ozacc.mail.xml.XMLBuilder#buildDocument(com.ozacc.mail.Mail)
73          */
74         public org.w3c.dom.Document buildDocument(Mail mail) throws XMLBuildException {
75                 Document doc = buildJDomDocument(mail);
76                 DOMOutputter outputter = new DOMOutputter();
77                 try {
78                         return outputter.output(doc);
79                 } catch (JDOMException e) {
80                         throw new XMLBuildException("DOM Documentの生成に失敗しました。", e);
81                 }
82         }
83
84         /**
85          * 指定されたMailインスタンスからJDOMドキュメントを生成します。
86          * 
87          * @return 生成されたJDOMドキュメント
88          */
89         public Document buildJDomDocument(Mail mail) {
90
91                 Element mailElem = new Element("mail");
92
93                 // Return-Path
94                 if (mail.getReturnPath() != null) {
95                         InternetAddress returnPath = mail.getReturnPath();
96                         Element returnPathElem = convertInternetAddressIntoElement(returnPath, "returnPath");
97                         mailElem.addContent(returnPathElem);
98                 }
99
100                 // From
101                 if (mail.getFrom() != null) {
102                         InternetAddress from = mail.getFrom();
103                         Element fromElem = convertInternetAddressIntoElement(from, "from");
104                         mailElem.addContent(fromElem);
105                 }
106
107                 if (mail.getTo().length > 0 || mail.getCc().length > 0 || mail.getBcc().length > 0) {
108                         Element recipientsElem = new Element("recipients");
109
110                         // To
111                         if (mail.getTo().length > 0) {
112                                 for (int i = 0; i < mail.getTo().length; i++) {
113                                         InternetAddress to = mail.getTo()[i];
114                                         Element toElem = convertInternetAddressIntoElement(to, "to");
115                                         recipientsElem.addContent(toElem);
116                                 }
117                         }
118                         // Cc
119                         if (mail.getCc().length > 0) {
120                                 for (int i = 0; i < mail.getCc().length; i++) {
121                                         InternetAddress cc = mail.getCc()[i];
122                                         Element ccElem = convertInternetAddressIntoElement(cc, "cc");
123                                         recipientsElem.addContent(ccElem);
124                                 }
125                         }
126                         // Bcc
127                         if (mail.getBcc().length > 0) {
128                                 for (int i = 0; i < mail.getBcc().length; i++) {
129                                         InternetAddress bcc = mail.getBcc()[i];
130                                         Element bccElem = convertInternetAddressIntoElement(bcc, "bcc");
131                                         recipientsElem.addContent(bccElem);
132                                 }
133                         }
134                         mailElem.addContent(recipientsElem);
135                 }
136
137                 // Reply-To
138                 if (mail.getReplyTo() != null) {
139                         InternetAddress replyTo = mail.getReplyTo();
140                         Element replyToElem = convertInternetAddressIntoElement(replyTo, "replyTo");
141                         mailElem.addContent(replyToElem);
142                 }
143
144                 // Subject
145                 if (mail.getSubject() != null) {
146                         Element subjectElem = new Element("subject");
147                         subjectElem.setText(mail.getSubject());
148                         mailElem.addContent(subjectElem);
149                 }
150
151                 // Body
152                 if (mail.getText() != null) {
153                         Element textElem = new Element("body");
154                         textElem.setText(mail.getText());
155                         mailElem.addContent(textElem);
156                 }
157
158                 // Html
159                 if (mail.isHtmlMail()) {
160                         Element htmlElem = new Element("html");
161                         htmlElem.setContent(new CDATA(mail.getHtmlText()));
162                         mailElem.addContent(htmlElem);
163                 }
164
165                 Document doc = new Document(mailElem);
166                 DocType docType = new DocType("mail", DOCTYPE_PUBLIC, DOCTYPE_SYSTEM);
167                 doc.setDocType(docType);
168                 return doc;
169         }
170
171         /**
172          * 
173          * @param address
174          * @param elemName
175          * @return
176          */
177         private Element convertInternetAddressIntoElement(InternetAddress address, String elemName) {
178                 Element element = new Element(elemName);
179                 element.setAttribute("email", address.getAddress());
180                 if (address.getPersonal() != null) {
181                         element.setAttribute("name", address.getPersonal());
182                 }
183                 return element;
184         }
185
186         /**
187          * @see com.ozacc.mail.xml.XMLBuilder#saveDocument(com.ozacc.mail.Mail, java.io.File)
188          */
189         public void saveDocument(Mail mail, File destFile) throws XMLBuildException {
190                 // JDOM Documentを生成
191                 Document doc = buildJDomDocument(mail);
192
193                 // ファイル出力
194                 try {
195                         FileOutputStream fos = new FileOutputStream(destFile);
196                         XMLOutputter outputter = getXMLOutputter();
197                         outputter.output(doc, fos);
198                         fos.close();
199                 } catch (IOException e) {
200                         throw new XMLBuildException("DOM Documentのファイル出力に失敗しました。", e);
201                 }
202         }
203
204         public XMLOutputter getXMLOutputter() {
205                 Format format = Format.getPrettyFormat();
206                 format.setEncoding(charset);
207                 return new XMLOutputter(format);
208         }
209 }