package nl.gertontenham.magnolia.templating.servlets;
import com.google.common.net.HttpHeaders;
import freemarker.template.TemplateException;
import info.magnolia.context.MgnlContext;
import info.magnolia.freemarker.FreemarkerHelper;
import info.magnolia.i18nsystem.SimpleTranslator;
import info.magnolia.module.resources.ResourceLinker;
import info.magnolia.resourceloader.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;
/**
* Servlet endpoint for templates processed by Freemarker engine.
*/
public class FreemarkerTemplatesResourcesServlet extends StaticResourcesServlet {
private static final Logger log = LoggerFactory.getLogger(FreemarkerTemplatesResourcesServlet.class);
private final FreemarkerHelper fmHelper;
private final SimpleTranslator simpleTranslator;
@Inject
public FreemarkerTemplatesResourcesServlet(FreemarkerHelper fmHelper, ResourceLinker linker, SimpleTranslator simpleTranslator) {
super(linker);
this.fmHelper = fmHelper;
this.simpleTranslator = simpleTranslator;
}
public FreemarkerHelper getFmHelper() {
return fmHelper;
}
@Override
public void serveResource(HttpServletResponse response, Resource resource) throws IOException {
response.setDateHeader(HttpHeaders.LAST_MODIFIED, resource.getLastModified());
try {
// Fetch template through Freemarker engine (server side parsing)
renderFreemarker(response.getWriter(), resource);
} catch (TemplateException e) {
log.error("Error during rendering freemarker template", e);
} catch (IOException e) {
if (!response.isCommitted()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
}
protected void renderFreemarker(Writer writer, Resource resource) throws IOException, TemplateException {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("i18n", simpleTranslator);
fmHelper.render(resource.openReader(), map, writer);
}
private Locale checkLocale(Locale locale) {
if (locale != null) {
return locale;
} else if (MgnlContext.hasInstance()) {
return MgnlContext.getLocale();
} else {
return Locale.getDefault();
}
}
}