package core.framework.api.template; import core.framework.api.util.Exceptions; import core.framework.api.util.Maps; import core.framework.api.util.StopWatch; import core.framework.impl.template.CDNManager; import core.framework.impl.template.HTMLTemplate; import core.framework.impl.template.HTMLTemplateBuilder; import core.framework.impl.template.TemplateContext; import core.framework.impl.template.source.ClasspathTemplateSource; import core.framework.impl.template.source.StringTemplateSource; import core.framework.impl.template.source.TemplateSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; /** * @author neo */ public final class HTMLTemplateEngine { private final Logger logger = LoggerFactory.getLogger(HTMLTemplateEngine.class); private final Map<String, HTMLTemplate> templates = Maps.newConcurrentHashMap(); private final CDNManager cdnManager = new CDNManager(); public String process(String name, Object model) { StopWatch watch = new StopWatch(); try { HTMLTemplate template = templates.get(name); if (template == null) throw Exceptions.error("template not found, name={}", name); TemplateContext context = new TemplateContext(model, cdnManager); return template.process(context); } finally { logger.debug("process, name={}, elapsedTime={}", name, watch.elapsedTime()); } } public void add(String name, String template, Class<?> modelClass) { add(new StringTemplateSource(name, template), modelClass); } public void add(String classpath, Class<?> modelClass) { add(new ClasspathTemplateSource(classpath), modelClass); } private void add(TemplateSource source, Class<?> modelClass) { StopWatch watch = new StopWatch(); String name = source.name(); try { HTMLTemplate previous = templates.putIfAbsent(name, new HTMLTemplateBuilder(source, modelClass).build()); if (previous != null) throw Exceptions.error("template is already added, name={}", name); } finally { logger.info("add, name={}, modelClass={}, elapsedTime={}", name, modelClass.getCanonicalName(), watch.elapsedTime()); } } }