1 package com.ozacc.mail.impl;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.StringReader;
6 import java.io.StringWriter;
7 import java.util.Properties;
8
9 import javax.xml.parsers.DocumentBuilder;
10 import javax.xml.transform.OutputKeys;
11 import javax.xml.transform.Transformer;
12 import javax.xml.transform.TransformerConfigurationException;
13 import javax.xml.transform.TransformerException;
14 import javax.xml.transform.TransformerFactory;
15 import javax.xml.transform.TransformerFactoryConfigurationError;
16 import javax.xml.transform.dom.DOMSource;
17 import javax.xml.transform.stream.StreamResult;
18
19 import org.apache.commons.logging.Log;
20 import org.apache.commons.logging.LogFactory;
21 import org.apache.velocity.VelocityContext;
22 import org.apache.velocity.app.Velocity;
23 import org.apache.velocity.exception.MethodInvocationException;
24 import org.apache.velocity.exception.ParseErrorException;
25 import org.apache.velocity.exception.ResourceNotFoundException;
26 import org.w3c.dom.Document;
27 import org.xml.sax.InputSource;
28 import org.xml.sax.SAXException;
29
30 import com.ozacc.mail.Mail;
31 import com.ozacc.mail.MailBuildException;
32 import com.ozacc.mail.VelocityMailBuilder;
33
34 /***
35 * XML¥Õ¥¡¥¤¥?¤òÆÉ¤ß¹?¤ß¡¢Velocity¤ÈÏ¢·È¤·¤ÆÆ°Åª¤Ë¥á¡¼¥?¥Ç¡¼¥¿¤òÀ¸À®¤·¡¢¤½¤Î¥Ç¡¼¥¿¤«¤éMail¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤¹¤?¥¯¥é¥¹¡£
36 *
37 * @since 1.0.1
38 * @author Tomohiro Otsuka
39 * @version $Id: XMLVelocityMailBuilderImpl.java,v 1.1 2004/09/13 07:07:11 otsuka Exp $
40 */
41 public class XMLVelocityMailBuilderImpl extends XMLMailBuilderImpl implements VelocityMailBuilder {
42
43 private static Log log = LogFactory.getLog(XMLVelocityMailBuilderImpl.class);
44
45 private String charset = "UTF-8";
46
47 /***
48 * @see com.ozacc.mail.VelocityMailBuilder#buildMail(java.lang.String, org.apache.velocity.VelocityContext)
49 */
50 public Mail buildMail(String classPath, VelocityContext context) throws MailBuildException {
51 Document doc;
52 try {
53 doc = getDocumentFromClassPath(classPath);
54 } catch (SAXException e) {
55 throw new MailBuildException("XML¤Î¥Ñ¡¼¥¹¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£" + e.getMessage(), e);
56 } catch (IOException e) {
57 throw new MailBuildException("XML¥Õ¥¡¥¤¥?¤ÎÆÉ¤ß¹?¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", e);
58 }
59
60 try {
61 return build(doc, context);
62 } catch (Exception e) {
63 throw new MailBuildException("¥á¡¼¥?¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", e);
64 }
65 }
66
67 /***
68 * @see com.ozacc.mail.VelocityMailBuilder#buildMail(java.io.File, org.apache.velocity.VelocityContext)
69 */
70 public Mail buildMail(File file, VelocityContext context) throws MailBuildException {
71 Document doc;
72 try {
73 doc = getDocumentFromFile(file);
74 } catch (SAXException e) {
75 throw new MailBuildException("XML¤Î¥Ñ¡¼¥¹¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£" + e.getMessage(), e);
76 } catch (IOException e) {
77 throw new MailBuildException("XML¥Õ¥¡¥¤¥?¤ÎÆÉ¤ß¹?¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", e);
78 }
79
80 try {
81 return build(doc, context);
82 } catch (Exception e) {
83 throw new MailBuildException("¥á¡¼¥?¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", e);
84 }
85 }
86
87 /***
88 * @param doc
89 * @param context
90 * @throws TransformerFactoryConfigurationError
91 * @throws Exception
92 * @throws ParseErrorException
93 * @throws MethodInvocationException
94 * @throws ResourceNotFoundException
95 * @throws IOException
96 */
97 private Mail build(Document doc, VelocityContext context)
98 throws TransformerFactoryConfigurationError,
99 Exception, ParseErrorException,
100 MethodInvocationException,
101 ResourceNotFoundException,
102 IOException {
103 String xmlContent = convertDocumentIntoString(doc);
104
105 if (log.isDebugEnabled()) {
106 log.debug("Source XML Mail Data\n" + xmlContent);
107 }
108
109 Velocity.init();
110 StringWriter w = new StringWriter();
111 Velocity.evaluate(context, w, "xmlMail", xmlContent);
112 StringReader reader = new StringReader(w.toString());
113
114 DocumentBuilder db = createDocumentBuilder();
115 InputSource source = new InputSource(reader);
116 Document newDoc = db.parse(source);
117
118 if (log.isDebugEnabled()) {
119 String newXmlContent = convertDocumentIntoString(newDoc);
120 log.debug("VelocityContext-merged XML Mail Data\n" + newXmlContent);
121 }
122
123 return build(newDoc);
124 }
125
126 /***
127 * »ØÄꤵ¤?¤¿DOM Document¤òʸ»úÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£
128 *
129 * @param doc
130 * @return XML¥É¥¥å¥á¥ó¥È¤Îʸ»úÎ?
131 * @throws TransformerFactoryConfigurationError
132 */
133 private String convertDocumentIntoString(Document doc)
134 throws TransformerFactoryConfigurationError {
135 TransformerFactory tf = TransformerFactory.newInstance();
136 Transformer t;
137 try {
138 t = tf.newTransformer();
139 } catch (TransformerConfigurationException e) {
140 throw new MailBuildException(e.getMessage(), e);
141 }
142 t.setOutputProperties(getOutputProperties());
143
144 DOMSource source = new DOMSource(doc);
145 StringWriter w = new StringWriter();
146 StreamResult result = new StreamResult(w);
147 try {
148 t.transform(source, result);
149 } catch (TransformerException e) {
150 throw new MailBuildException(e.getMessage(), e);
151 }
152
153 return w.toString();
154 }
155
156 /***
157 * ½ÐÎÏ¥×¥úÁѥƥ£¤òÀ¸À®¡£
158 * @return ½ÐÎÏ¥×¥úÁѥƥ£¤òÀßÄꤷ¤¿Properties¥¤¥ó¥¹¥¿¥ó¥¹
159 */
160 private Properties getOutputProperties() {
161 Properties p = new Properties();
162 p.put(OutputKeys.ENCODING, charset);
163 p.put(OutputKeys.DOCTYPE_PUBLIC, Mail.DOCTYPE_PUBLIC);
164 p.put(OutputKeys.DOCTYPE_SYSTEM, Mail.DOCTYPE_SYSTEM);
165 return p;
166 }
167
168 }