package spark.template.jinjava;
import java.io.IOException;
import java.util.Map;
import spark.ModelAndView;
import spark.TemplateEngine;
import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import com.hubspot.jinjava.Jinjava;
import com.hubspot.jinjava.JinjavaConfig;
import com.hubspot.jinjava.interpret.Context;
import com.hubspot.jinjava.lib.filter.Filter;
import com.hubspot.jinjava.lib.fn.ELFunctionDefinition;
import com.hubspot.jinjava.lib.tag.Tag;
import com.hubspot.jinjava.loader.FileLocator;
import com.hubspot.jinjava.loader.ResourceLocator;
public class JinjavaEngine extends TemplateEngine {
private Jinjava jinjava;
private Context context;
public JinjavaEngine() {
this(new JinjavaConfig());
}
public JinjavaEngine(JinjavaConfig jinjavaConfig) {
this(jinjavaConfig, new FileLocator());
}
public JinjavaEngine(JinjavaConfig jinjavaConfig, ResourceLocator resourceLocator) {
jinjava = new Jinjava(jinjavaConfig);
jinjava.setResourceLocator(resourceLocator);
context = jinjava.getGlobalContext();
}
public void registerTag(Tag tag) {
context.registerTag(tag);
}
public void registerFilter(Filter filter) {
context.registerFilter(filter);
}
public void registerFunction(ELFunctionDefinition function) {
context.registerFunction(function);
}
@Override
public String render(ModelAndView modelAndView) {
Object model = modelAndView.getModel();
if (model instanceof Map) {
String template = null;
try {
template = Resources.toString(Resources.getResource(modelAndView.getViewName()), Charsets.UTF_8);
} catch (IOException ignored) {
}
return jinjava.render(template, (Map<String, Object>) model);
} else {
throw new IllegalArgumentException("modelAndView.getModel() must return a java.util.Map");
}
}
}