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 }