package ddth.dasp.hetty.mvc.view.freemarker;
import java.io.IOException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ddth.dasp.common.utils.RegExpUtils;
import ddth.dasp.hetty.mvc.view.CacheViewResolver;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
public class FreeMarkerViewResolver extends CacheViewResolver {
private final Logger LOGGER = LoggerFactory.getLogger(FreeMarkerViewResolver.class);
private final static Pattern PATTERN = Pattern.compile("\\@\\{([^}]+)\\}");
private Configuration cfg;
private String defaultEncoding = "UTF-8";
private String defaultContentType = "text/html; charset=utf-8";
private TemplateLoader templateLoader;
private String dateFormat = "yyyy-MM-dd";
private String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
private String prefix = "", suffix = "";
public String getDefaultEncoding() {
return defaultEncoding;
}
public void setDefaultEncoding(String defaultEncoding) {
this.defaultEncoding = defaultEncoding;
}
public String getDefaultContentType() {
return defaultContentType;
}
public void setDefaultContentType(String defaultContentType) {
this.defaultContentType = defaultContentType;
}
public TemplateLoader getTemplateLoader() {
return templateLoader;
}
public void setTemplateLoader(TemplateLoader templateLoader) {
this.templateLoader = templateLoader;
}
public String getDateFormat() {
return dateFormat;
}
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
public String getDateTimeFormat() {
return dateTimeFormat;
}
public void setDateTimeFormat(String dateTimeFormat) {
this.dateTimeFormat = dateTimeFormat;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public void init() {
super.init();
cfg = new Configuration();
cfg.setObjectWrapper(new DefaultObjectWrapper());
cfg.setAutoFlush(true);
cfg.setDefaultEncoding(defaultEncoding);
cfg.setTemplateLoader(templateLoader);
cfg.setDateFormat(dateFormat);
cfg.setDateTimeFormat(dateTimeFormat);
if (!isEnableCache()) {
// check for a newer version of a template every time it's requested
cfg.setTemplateUpdateDelay(0);
} else {
cfg.setTemplateUpdateDelay(3600 * 24);
}
}
public void destroy() {
try {
cfg = null;
} finally {
super.destroy();
}
}
/**
* {@inheritDoc}
*/
@Override
protected FreeMarkerView createView(String name, Map<String, String> replacements) {
String templateName = (prefix != null ? prefix : "") + name
+ (suffix != null ? suffix : "");
Matcher m = PATTERN.matcher(templateName);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String replacement = replacements != null ? replacements.get(m.group(1)) : "";
if (replacement == null) {
replacement = "";
}
m.appendReplacement(sb, RegExpUtils.regexpReplacementEscape(replacement));
}
m.appendTail(sb);
templateName = sb.toString();
Object templateSource = null;
try {
templateSource = templateLoader.findTemplateSource(templateName);
if (templateSource == null) {
return null;
}
Template template = cfg.getTemplate(templateName);
FreeMarkerView view = new FreeMarkerView(template);
view.setContentType(getDefaultContentType());
view.setEncoding(getDefaultEncoding());
return view;
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
templateLoader.closeTemplateSource(templateSource);
} catch (IOException e) {
LOGGER.warn(e.getMessage(), e);
}
}
}
}