View Javadoc

    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.jdom.CDATA;
    10  import org.jdom.DocType;
    11  import org.jdom.Document;
    12  import org.jdom.Element;
    13  import org.jdom.JDOMException;
    14  import org.jdom.output.DOMOutputter;
    15  import org.jdom.output.Format;
    16  import org.jdom.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 		XMLOutputter outputter = new XMLOutputter(format);
    208 		return outputter;
    209 	}
    210 }