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