package org.krakenapps.docxcod; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreeMarkerRunner implements OOXMLProcessor { private Logger logger = LoggerFactory.getLogger(getClass().getName()); private final Map<String, Object> data; public FreeMarkerRunner(Map<String, Object> data) { this.data = data; } @Override public void process(OOXMLPackage docx, Map<String, Object> rootMap) { // TODO Auto-generated method stub Configuration cfg = new Configuration(); cfg.setObjectWrapper(new DefaultObjectWrapper()); for (String s : docx.listParts("")) { InputStreamReader templateReader = null; PrintWriter writer = null; File sf = new File(docx.getDataDir(), s); File outf = new File(sf.getPath() + ".new"); try { templateReader = new InputStreamReader(new FileInputStream(sf)); writer = new PrintWriter(new FileOutputStream(outf)); logger.info("process: try freemarker template processing: {}", sf); Template t = new Template(s, templateReader, cfg); t.process(data, writer); logger.trace("process: freemarker template processing completed"); safeClose(writer); safeClose(templateReader); writer = null; templateReader = null; logger.trace("process: rename {} to {}", outf, sf); boolean deleteResult = sf.delete(); if (deleteResult) { logger.trace("process: deleting old file success: {}", sf); outf.renameTo(sf); } else { logger.error("process: deleting old file failed: {}", sf); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TemplateException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { safeClose(templateReader); safeClose(writer); } } } private void safeClose(Closeable o) { try { if (o != null) o.close(); } catch (IOException e) { // ignore } } }