package cn.ibizlab.core.extensions.util;

import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.Map;

public class FreeMakerHelper {

    private static Log log = LogFactory.getLog(FreeMakerHelper.class);

    /**
     * 根据ftl生成目标文件
     * @param basePackagePath  ftl文件目录（classpath相对路径）
     * @param templateFileName ftl文件名
     * @param param            ftl文件所需参数
     * @param outputFilePath   目标文件输出路径
     * @throws Exception
     */
    public static void outputFreeMaker(String basePackagePath,String templateFileName,Map param, File outputFilePath) throws Exception{
        log.info("------freemaker正在进行文件输出任务------");
        // 第一步：创建一个Configuration对象，直接new一个对象。构造方法的参数就是freemarker对于的版本号。
        Configuration configuration = new Configuration(Configuration.getVersion());
        // 第二步：设置模板文件所在的路径
        TemplateLoader templateLoader= new ClassTemplateLoader(FreeMakerHelper.class,basePackagePath);
        configuration.setTemplateLoader(templateLoader);
        // 第三步：设置模板文件使用的字符集。一般就是utf-8.
        configuration.setDefaultEncoding("utf-8");
        // 第四步：加载一个模板，创建一个模板对象。
        Template template = configuration.getTemplate(templateFileName);
        // 第五步：创建一个模板使用的数据集，可以是pojo也可以是map。一般是Map。
        // 第六步：创建一个Writer对象，一般创建一FileWriter对象，指定生成的文件名。
        Writer out = new FileWriter(outputFilePath);
        // 第七步：调用模板对象的process方法输出文件。
        template.process(param, out);
        // 第八步：关闭流。
        out.close();
        log.info("------freemaker已完成文件输出任务------");
    }
}
