package cn.org.rapid_framework.freemarker;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Locale;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import cn.org.rapid_framework.freemarker.directive.DirectiveUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* freemarker的template处理类,用于将check exception转换为uncheck exception
* 并提供相关工具类方法
* @author badqiu
*/
public class FreemarkerTemplateProcessor implements InitializingBean{
static Log log = LogFactory.getLog(FreemarkerTemplateProcessor.class);
private Configuration configuration;
private boolean exposeRapidMacros = true;
public FreemarkerTemplateProcessor() {}
public FreemarkerTemplateProcessor(Configuration configuration) {
setConfiguration(configuration);
}
public void setConfiguration(Configuration freemarkerConfiguration) {
this.configuration = freemarkerConfiguration;
}
public Configuration getConfiguration() {
return configuration;
}
public void setExposeRapidMacros(boolean exposeRapidMacros) {
this.exposeRapidMacros = exposeRapidMacros;
}
public void afterPropertiesSet() throws Exception {
Assert.notNull(configuration,"configuration property must be not null");
if(exposeRapidMacros) {
if(log.isInfoEnabled())
log.info("expose rapid macros: <@block> <@extends> <@override> for freemarker");
DirectiveUtils.exposeRapidMacros(configuration);
}
}
public String processTemplate(String templateName, Object model) throws FreemarkerTemplateException{
Template template = getTemplate(configuration,templateName);
return processTemplateIntoString(template, model);
}
public void processTemplate(String templateName, Object model,Writer out) throws FreemarkerTemplateException{
Template template = getTemplate(configuration,templateName);
processTemplate(template, model, out);
}
public String processTemplate(String templateName, Object model,String encoding) throws FreemarkerTemplateException {
Template template = getTemplate(configuration,templateName,encoding);
return processTemplateIntoString(template, model);
}
public String processTemplate(String templateName, Object model,Locale locale,String encoding) throws FreemarkerTemplateException {
Template template = getTemplate(configuration,templateName,locale,encoding);
return processTemplateIntoString(template, model);
}
public static String processTemplateIntoString(Template template,Object model) throws FreemarkerTemplateException {
StringWriter out = new StringWriter(512);
processTemplate(template, model, out);
return out.toString();
}
public static void processTemplate(Template template,Object model,Writer out) throws FreemarkerTemplateException {
try {
template.process(model, out);
} catch (IOException e) {
throw new FreemarkerTemplateException("process template occer IOException,templateName:"+template.getName(),e);
} catch (TemplateException e) {
throw new FreemarkerTemplateException("process template occer TemplateException,templateName:"+template.getName(),e);
}
}
public static Template getTemplate(Configuration conf,String templateName) throws FreemarkerTemplateException {
try {
return conf.getTemplate(templateName);
} catch (IOException e) {
throw new FreemarkerTemplateException("load template error,templateName:"+templateName,e);
}
}
public static Template getTemplate(Configuration conf,String templateName,String encoding) throws FreemarkerTemplateException {
try {
return conf.getTemplate(templateName,encoding);
} catch (IOException e) {
throw new FreemarkerTemplateException("load template error,templateName:"+templateName,e);
}
}
public static Template getTemplate(Configuration conf,String templateName,Locale locale,String encoding) throws FreemarkerTemplateException {
try {
return conf.getTemplate(templateName,locale,encoding);
} catch (IOException e) {
throw new FreemarkerTemplateException("load template error,templateName:"+templateName,e);
}
}
}