View Javadoc

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  			// Velocity¥Þ¡¼¥¸Á°¤ÎXML¤Ç¤Ï¥³¥á¥ó¥È¤òµö²Ä¤¹¤?
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  			// Velocity¥Þ¡¼¥¸Á°¤ÎXML¤Ç¤Ï¥³¥á¥ó¥È¤òµö²Ä¤¹¤?
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 }