package com.dbdeploy.appliers; import com.dbdeploy.ChangeScriptApplier; import com.dbdeploy.database.DelimiterType; import com.dbdeploy.exceptions.UsageException; import com.dbdeploy.scripts.ChangeScript; import freemarker.cache.ClassTemplateLoader; import freemarker.cache.FileTemplateLoader; import freemarker.cache.MultiTemplateLoader; import freemarker.cache.TemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; public class TemplateBasedApplier implements ChangeScriptApplier { private Configuration configuration; private Writer writer; private String syntax; private String changeLogTableName; private String delimiter; private DelimiterType delimiterType; public TemplateBasedApplier(Writer writer, String syntax, String changeLogTableName, String delimiter, DelimiterType delimiterType, File templateDirectory) throws IOException { this.syntax = syntax; this.changeLogTableName = changeLogTableName; this.delimiter = delimiter; this.delimiterType = delimiterType; this.writer = writer; this.configuration = new Configuration(); FileTemplateLoader fileTemplateLoader = createFileTemplateLoader(templateDirectory); this.configuration.setTemplateLoader( new MultiTemplateLoader(new TemplateLoader[]{ fileTemplateLoader, new ClassTemplateLoader(getClass(), "/"), })); } private FileTemplateLoader createFileTemplateLoader(File templateDirectory) throws IOException { if (templateDirectory == null) { return new FileTemplateLoader(); } else { return new FileTemplateLoader(templateDirectory, true); } } public void apply(List<ChangeScript> changeScripts) { String filename = syntax + "_" + getTemplateQualifier() + ".ftl"; try { Map<String, Object> model = new HashMap<String, Object>(); model.put("scripts", changeScripts); model.put("changeLogTableName", changeLogTableName); model.put("delimiter", delimiter); model.put("separator", delimiterType == DelimiterType.row ? "\n" : ""); try { Template template = configuration.getTemplate(filename); template.process(model, writer); } finally { writer.close(); } } catch (FileNotFoundException ex) { throw new UsageException("Could not find template named " + filename + "\n" + "Check that you have got the name of the database syntax correct.", ex); } catch (Exception e) { throw new RuntimeException(e); } } protected String getTemplateQualifier() { return "apply"; } }