interro_robot/src/main/java/com/supervision/util/freemark/StringTemplateConfig.java

85 lines
2.4 KiB
Java

package com.supervision.util.freemark;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class StringTemplateConfig {
private final Configuration configuration;
private final StringTemplateLoader loader;
private final Map<String, String> tempMap = new HashMap<>();
private static class SingletonHolder {
private static final StringTemplateConfig INSTANCE = new StringTemplateConfig();
}
private StringTemplateConfig() {
configuration = new Configuration(Configuration.VERSION_2_3_30);
loader = new StringTemplateLoader();
configuration.setTemplateLoader(loader);
}
public static StringTemplateConfig getInstance() {
return SingletonHolder.INSTANCE;
}
public Template getTemplate(String name) throws IOException {
if (!tempMap.containsKey(name)) {
return null;
}
return this.configuration.getTemplate(name);
}
public void putTemplate(String name, String content){
tempMap.put(name, content);
this.loader.putTemplate(name, content);
}
public boolean removeTemplate(String name){
if (tempMap.remove(name) != null){
return this.loader.removeTemplate(name);
}
return true;
}
public String process(String content, List<Map<String, Object>> data) throws IOException, TemplateException {
if (StrUtil.isEmpty(content)) {
return null;
}
String name = contentToName(content);
if (Objects.isNull(tempMap.get(name))) {
this.putTemplate(name, content);
}
Template template = this.getTemplate(name);
StringWriter out = new StringWriter();
Map<String, Object> dataModel = new HashMap<>();
if (CollUtil.size(data) > 1){
dataModel.put("list", data);
}else {
dataModel= CollUtil.getFirst(data);
}
template.process(dataModel, out);
return out.toString();
}
public String contentToName(String content){
return MD5.create().digestHex16(content);
}
}