-package com.ozacc.mail.xml.impl;\r
-\r
-import java.io.File;\r
-import java.util.Properties;\r
-\r
-import javax.mail.internet.InternetAddress;\r
-import javax.xml.parsers.DocumentBuilder;\r
-import javax.xml.parsers.DocumentBuilderFactory;\r
-import javax.xml.parsers.FactoryConfigurationError;\r
-import javax.xml.parsers.ParserConfigurationException;\r
-import javax.xml.transform.OutputKeys;\r
-import javax.xml.transform.Transformer;\r
-import javax.xml.transform.TransformerException;\r
-import javax.xml.transform.TransformerFactory;\r
-import javax.xml.transform.dom.DOMSource;\r
-import javax.xml.transform.stream.StreamResult;\r
-\r
-import org.w3c.dom.Document;\r
-import org.w3c.dom.Element;\r
-\r
-import com.ozacc.mail.Mail;\r
-import com.ozacc.mail.xml.XMLBuildException;\r
-import com.ozacc.mail.xml.XMLBuilder;\r
-\r
-/**\r
- * JDK 1.4以降の標準XMLライブラリを使用して実装されたXMLBuilder。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: XMLBuilderImpl.java,v 1.4.2.1 2005/01/21 22:15:07 otsuka Exp $\r
- */\r
-public class XMLBuilderImpl implements XMLBuilder {\r
-\r
- private String charset = "UTF-8";\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- public XMLBuilderImpl() {}\r
-\r
- /**\r
- * コンストラクタ。\r
- * 出力XMLファイルの文字コードを指定します。デフォルトはUTF-8。\r
- * \r
- * @param charset 出力XMLファイルの文字コード\r
- */\r
- public XMLBuilderImpl(String charset) {\r
- super();\r
- this.charset = charset;\r
- }\r
-\r
- /**\r
- * 出力XMLファイルの文字コードを返します。\r
- * \r
- * @return 出力XMLファイルの文字コード\r
- */\r
- public String getCharset() {\r
- return charset;\r
- }\r
-\r
- /**\r
- * 出力XMLファイルの文字コードを指定します。デフォルトはUTF-8。\r
- * \r
- * @param charset 出力XMLファイルの文字コード\r
- */\r
- public void setCharset(String charset) {\r
- this.charset = charset;\r
- }\r
-\r
- /**\r
- * @see com.ozacc.mail.xml.XMLBuilder#buildDocument(com.ozacc.mail.Mail)\r
- */\r
- public Document buildDocument(Mail mail) throws XMLBuildException {\r
- Document doc = createNewDocument();\r
-\r
- /*DOMImplementation domImpl = doc.getImplementation();\r
- DocumentType docType = domImpl.createDocumentType("mail", Mail.DOCTYPE_PUBLIC, Mail.DOCTYPE_SYSTEM);\r
- doc.appendChild(docType);*/\r
-\r
- Element mailElem = doc.createElement("mail");\r
-\r
- // Return-Path\r
- if (mail.getReturnPath() != null) {\r
- InternetAddress returnPath = mail.getReturnPath();\r
- Element returnPathElem = convertInternetAddressIntoElement(returnPath, "returnPath",\r
- doc);\r
- mailElem.appendChild(returnPathElem);\r
- }\r
-\r
- // From\r
- if (mail.getFrom() != null) {\r
- InternetAddress from = mail.getFrom();\r
- Element fromElem = convertInternetAddressIntoElement(from, "from", doc);\r
- mailElem.appendChild(fromElem);\r
- }\r
-\r
- if (mail.getTo().length > 0 || mail.getCc().length > 0 || mail.getBcc().length > 0) {\r
- Element recipientsElem = doc.createElement("recipients");\r
-\r
- // To\r
- if (mail.getTo().length > 0) {\r
- for (int i = 0; i < mail.getTo().length; i++) {\r
- InternetAddress to = mail.getTo()[i];\r
- Element toElem = convertInternetAddressIntoElement(to, "to", doc);\r
- recipientsElem.appendChild(toElem);\r
- }\r
- }\r
- // Cc\r
- if (mail.getCc().length > 0) {\r
- for (int i = 0; i < mail.getCc().length; i++) {\r
- InternetAddress cc = mail.getCc()[i];\r
- Element ccElem = convertInternetAddressIntoElement(cc, "cc", doc);\r
- recipientsElem.appendChild(ccElem);\r
- }\r
- }\r
- // Bcc\r
- if (mail.getBcc().length > 0) {\r
- for (int i = 0; i < mail.getBcc().length; i++) {\r
- InternetAddress bcc = mail.getBcc()[i];\r
- Element bccElem = convertInternetAddressIntoElement(bcc, "bcc", doc);\r
- recipientsElem.appendChild(bccElem);\r
- }\r
- }\r
- mailElem.appendChild(recipientsElem);\r
- }\r
-\r
- // Reply-To\r
- if (mail.getReplyTo() != null) {\r
- InternetAddress replyTo = mail.getReplyTo();\r
- Element replyToElem = convertInternetAddressIntoElement(replyTo, "replyTo", doc);\r
- mailElem.appendChild(replyToElem);\r
- }\r
-\r
- // Subject\r
- if (mail.getSubject() != null) {\r
- Element subjectElem = doc.createElement("subject");\r
- subjectElem.appendChild(doc.createTextNode(mail.getSubject()));\r
- mailElem.appendChild(subjectElem);\r
- }\r
-\r
- // Body\r
- if (mail.getText() != null) {\r
- Element bodyElem = doc.createElement("body");\r
- bodyElem.appendChild(doc.createTextNode(mail.getText()));\r
- mailElem.appendChild(bodyElem);\r
- }\r
-\r
- // Html\r
- if (mail.isHtmlMail()) {\r
- Element htmlElem = doc.createElement("html");\r
- htmlElem.appendChild(doc.createCDATASection(mail.getHtmlText()));\r
- mailElem.appendChild(htmlElem);\r
- }\r
-\r
- doc.appendChild(mailElem);\r
-\r
- return doc;\r
- }\r
-\r
- public static Document createNewDocument() throws FactoryConfigurationError {\r
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
- try {\r
- DocumentBuilder db = dbf.newDocumentBuilder();\r
- Document doc = db.newDocument();\r
- return doc;\r
- } catch (ParserConfigurationException e) {\r
- // never be thrown\r
- throw new XMLBuildException("", e);\r
- }\r
- }\r
-\r
- private Element convertInternetAddressIntoElement(InternetAddress address, String elemName,\r
- Document doc) {\r
- Element element = doc.createElement(elemName);\r
- element.setAttribute("email", address.getAddress());\r
- if (address.getPersonal() != null) {\r
- element.setAttribute("name", address.getPersonal());\r
- }\r
- return element;\r
- }\r
-\r
- /**\r
- * 指定されたMailインスタンスからXMLドキュメントを生成し、\r
- * 指定されたファイルに保存します。\r
- * \r
- * このメソッド内部で使用されるTransformerFactoryがスレッドセーフではないため、synchronzedメソッドになっています。\r
- * \r
- * @see com.ozacc.mail.xml.XMLBuilder#saveDocument(com.ozacc.mail.Mail, java.io.File)\r
- * @see TransformerFactory\r
- */\r
- public synchronized void saveDocument(Mail mail, File destFile) throws XMLBuildException {\r
- Document doc = buildDocument(mail);\r
-\r
- Transformer t;\r
- try {\r
- t = TransformerFactory.newInstance().newTransformer();\r
- } catch (Exception e) {\r
- // never be thrown\r
- throw new XMLBuildException(e.getMessage());\r
- }\r
- t.setOutputProperties(getOutputProperties());\r
-\r
- DOMSource source = new DOMSource(doc);\r
- StreamResult result = new StreamResult(destFile);\r
- try {\r
- t.transform(source, result);\r
- } catch (TransformerException e) {\r
- throw new XMLBuildException("XMLファイルの保存に失敗しました。", e);\r
- }\r
- }\r
-\r
- /**\r
- * 出力プロパティを生成。\r
- * @return 出力プロパティを設定したPropertiesインスタンス\r
- */\r
- private Properties getOutputProperties() {\r
- Properties p = new Properties();\r
- p.put(OutputKeys.ENCODING, charset);\r
- p.put(OutputKeys.INDENT, "yes");\r
- p.put(OutputKeys.DOCTYPE_PUBLIC, Mail.DOCTYPE_PUBLIC);\r
- p.put(OutputKeys.DOCTYPE_SYSTEM, Mail.DOCTYPE_SYSTEM);\r
- return p;\r
- }\r
-\r
+package com.ozacc.mail.xml.impl;
+
+import java.io.File;
+import java.util.Properties;
+
+import javax.mail.internet.InternetAddress;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import com.ozacc.mail.Mail;
+import com.ozacc.mail.xml.XMLBuildException;
+import com.ozacc.mail.xml.XMLBuilder;
+
+/**
+ * JDK 1.4以降の標準XMLライブラリを使用して実装されたXMLBuilder。
+ *
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: XMLBuilderImpl.java,v 1.4.2.1 2005/01/21 22:15:07 otsuka Exp $
+ */
+public class XMLBuilderImpl implements XMLBuilder {
+
+ private String charset = "UTF-8";
+
+ /**
+ * コンストラクタ。
+ */
+ public XMLBuilderImpl() {}
+
+ /**
+ * コンストラクタ。
+ * 出力XMLファイルの文字コードを指定します。デフォルトはUTF-8。
+ *
+ * @param charset 出力XMLファイルの文字コード
+ */
+ public XMLBuilderImpl(String charset) {
+ super();
+ this.charset = charset;
+ }
+
+ /**
+ * 出力XMLファイルの文字コードを返します。
+ *
+ * @return 出力XMLファイルの文字コード
+ */
+ public String getCharset() {
+ return charset;
+ }
+
+ /**
+ * 出力XMLファイルの文字コードを指定します。デフォルトはUTF-8。
+ *
+ * @param charset 出力XMLファイルの文字コード
+ */
+ public void setCharset(String charset) {
+ this.charset = charset;
+ }
+
+ /**
+ * @see com.ozacc.mail.xml.XMLBuilder#buildDocument(com.ozacc.mail.Mail)
+ */
+ public Document buildDocument(Mail mail) throws XMLBuildException {
+ Document doc = createNewDocument();
+
+ /*DOMImplementation domImpl = doc.getImplementation();
+ DocumentType docType = domImpl.createDocumentType("mail", Mail.DOCTYPE_PUBLIC, Mail.DOCTYPE_SYSTEM);
+ doc.appendChild(docType);*/
+
+ Element mailElem = doc.createElement("mail");
+
+ // Return-Path
+ if (mail.getReturnPath() != null) {
+ InternetAddress returnPath = mail.getReturnPath();
+ Element returnPathElem = convertInternetAddressIntoElement(returnPath, "returnPath",
+ doc);
+ mailElem.appendChild(returnPathElem);
+ }
+
+ // From
+ if (mail.getFrom() != null) {
+ InternetAddress from = mail.getFrom();
+ Element fromElem = convertInternetAddressIntoElement(from, "from", doc);
+ mailElem.appendChild(fromElem);
+ }
+
+ if (mail.getTo().length > 0 || mail.getCc().length > 0 || mail.getBcc().length > 0) {
+ Element recipientsElem = doc.createElement("recipients");
+
+ // To
+ if (mail.getTo().length > 0) {
+ for (int i = 0; i < mail.getTo().length; i++) {
+ InternetAddress to = mail.getTo()[i];
+ Element toElem = convertInternetAddressIntoElement(to, "to", doc);
+ recipientsElem.appendChild(toElem);
+ }
+ }
+ // Cc
+ if (mail.getCc().length > 0) {
+ for (int i = 0; i < mail.getCc().length; i++) {
+ InternetAddress cc = mail.getCc()[i];
+ Element ccElem = convertInternetAddressIntoElement(cc, "cc", doc);
+ recipientsElem.appendChild(ccElem);
+ }
+ }
+ // Bcc
+ if (mail.getBcc().length > 0) {
+ for (int i = 0; i < mail.getBcc().length; i++) {
+ InternetAddress bcc = mail.getBcc()[i];
+ Element bccElem = convertInternetAddressIntoElement(bcc, "bcc", doc);
+ recipientsElem.appendChild(bccElem);
+ }
+ }
+ mailElem.appendChild(recipientsElem);
+ }
+
+ // Reply-To
+ if (mail.getReplyTo() != null) {
+ InternetAddress replyTo = mail.getReplyTo();
+ Element replyToElem = convertInternetAddressIntoElement(replyTo, "replyTo", doc);
+ mailElem.appendChild(replyToElem);
+ }
+
+ // Subject
+ if (mail.getSubject() != null) {
+ Element subjectElem = doc.createElement("subject");
+ subjectElem.appendChild(doc.createTextNode(mail.getSubject()));
+ mailElem.appendChild(subjectElem);
+ }
+
+ // Body
+ if (mail.getText() != null) {
+ Element bodyElem = doc.createElement("body");
+ bodyElem.appendChild(doc.createTextNode(mail.getText()));
+ mailElem.appendChild(bodyElem);
+ }
+
+ // Html
+ if (mail.isHtmlMail()) {
+ Element htmlElem = doc.createElement("html");
+ htmlElem.appendChild(doc.createCDATASection(mail.getHtmlText()));
+ mailElem.appendChild(htmlElem);
+ }
+
+ doc.appendChild(mailElem);
+
+ return doc;
+ }
+
+ public static Document createNewDocument() throws FactoryConfigurationError {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ try {
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document doc = db.newDocument();
+ return doc;
+ } catch (ParserConfigurationException e) {
+ // never be thrown
+ throw new XMLBuildException("", e);
+ }
+ }
+
+ private Element convertInternetAddressIntoElement(InternetAddress address, String elemName,
+ Document doc) {
+ Element element = doc.createElement(elemName);
+ element.setAttribute("email", address.getAddress());
+ if (address.getPersonal() != null) {
+ element.setAttribute("name", address.getPersonal());
+ }
+ return element;
+ }
+
+ /**
+ * 指定されたMailインスタンスからXMLドキュメントを生成し、
+ * 指定されたファイルに保存します。
+ *
+ * このメソッド内部で使用されるTransformerFactoryがスレッドセーフではないため、synchronzedメソッドになっています。
+ *
+ * @see com.ozacc.mail.xml.XMLBuilder#saveDocument(com.ozacc.mail.Mail, java.io.File)
+ * @see TransformerFactory
+ */
+ public synchronized void saveDocument(Mail mail, File destFile) throws XMLBuildException {
+ Document doc = buildDocument(mail);
+
+ Transformer t;
+ try {
+ t = TransformerFactory.newInstance().newTransformer();
+ } catch (Exception e) {
+ // never be thrown
+ throw new XMLBuildException(e.getMessage());
+ }
+ t.setOutputProperties(getOutputProperties());
+
+ DOMSource source = new DOMSource(doc);
+ StreamResult result = new StreamResult(destFile);
+ try {
+ t.transform(source, result);
+ } catch (TransformerException e) {
+ throw new XMLBuildException("XMLファイルの保存に失敗しました。", e);
+ }
+ }
+
+ /**
+ * 出力プロパティを生成。
+ * @return 出力プロパティを設定したPropertiesインスタンス
+ */
+ private Properties getOutputProperties() {
+ Properties p = new Properties();
+ p.put(OutputKeys.ENCODING, charset);
+ p.put(OutputKeys.INDENT, "yes");
+ p.put(OutputKeys.DOCTYPE_PUBLIC, Mail.DOCTYPE_PUBLIC);
+ p.put(OutputKeys.DOCTYPE_SYSTEM, Mail.DOCTYPE_SYSTEM);
+ return p;
+ }
+
}
\ No newline at end of file