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.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 }