package com.github.aesteve.vertx.nubes.views; import com.github.aesteve.vertx.nubes.Config; import com.github.aesteve.vertx.nubes.context.ViewResolver; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.handler.TemplateHandler; import io.vertx.ext.web.templ.TemplateEngine; import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE; public class TemplateEngineManager implements TemplateHandler { private static final Logger LOG = LoggerFactory.getLogger(TemplateEngineManager.class); private final Config config; public TemplateEngineManager(Config config) { this.config = config; } public TemplateEngine fromViewName(String tplName) { int pointIdx = tplName.lastIndexOf('.'); String extension = tplName.substring(pointIdx + 1, tplName.length()); return config.getTemplateEngines().get(extension); } @Override public void handle(RoutingContext context) { String tplName = normalize(config.getTplDir()) + ViewResolver.getViewName(context); TemplateEngine engine = fromViewName(tplName); if (engine == null) { LOG.error("No template handler found for " + tplName); context.fail(500); return; } engine.render(context, tplName, res -> { if (res.succeeded()) { context.response().putHeader(CONTENT_TYPE, "text/html").end(res.result()); } else { context.fail(res.cause()); } }); } private static String normalize(String dir) { String normalizedDir = dir; if (!dir.endsWith("/")) { normalizedDir += "/"; } return normalizedDir; } }