/** * Copyright (C) 2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package co.leugim.jade4ninja.template; import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Map; import ninja.Context; import ninja.Result; import ninja.i18n.Lang; import ninja.i18n.Messages; import ninja.template.TemplateEngine; import ninja.template.TemplateEngineHelper; import ninja.utils.NinjaProperties; import ninja.utils.ResponseStreams; import org.slf4j.Logger; import com.google.inject.Inject; import com.google.inject.Singleton; import de.neuland.jade4j.Jade4J; import de.neuland.jade4j.Jade4J.Mode; import de.neuland.jade4j.JadeConfiguration; import de.neuland.jade4j.exceptions.JadeException; import de.neuland.jade4j.template.ClasspathTemplateLoader; import de.neuland.jade4j.template.FileTemplateLoader; import de.neuland.jade4j.template.JadeTemplate; @Singleton public class TemplateEngineJade4J implements TemplateEngine { public static final String SUFFIX = ".jade"; private static final String CONTENT_TYPE = "text/html"; private final Logger logger; private final NinjaProperties ninjaProperties; private JadeConfiguration jadeConfiguration; private TemplateEngineHelper templateEngineHelper; private Jade4NinjaExceptionHandler exceptionHandler; private Messages messages; private Lang lang; @Inject public TemplateEngineJade4J(Logger logger, TemplateEngineHelper templateEngineHelper, NinjaProperties ninjaProperties, Jade4NinjaExceptionHandler exceptionHandler, Messages messages, Lang lang) { this.logger = logger; this.ninjaProperties = ninjaProperties; this.templateEngineHelper = templateEngineHelper; this.exceptionHandler = exceptionHandler; this.messages = messages; this.lang = lang; configureJade4J(); } private void configureJade4J() { jadeConfiguration = new JadeConfiguration(); String srcDir = buildSrcDir(); if ((ninjaProperties.isDev() || ninjaProperties.isTest()) && new File(srcDir).exists()) { jadeConfiguration.setTemplateLoader(new FileTemplateLoader(srcDir, "UTF-8")); jadeConfiguration.setCaching(false); jadeConfiguration.setPrettyPrint(true); } else { jadeConfiguration.setTemplateLoader(new ClasspathTemplateLoader()); jadeConfiguration.setCaching(true); jadeConfiguration.setPrettyPrint(false); } jadeConfiguration.setMode(Mode.HTML); } private String buildSrcDir() { return System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator; } @Override public void invoke(Context context, Result result) { JadeModelParamsBuilder modelBuilder = new JadeModelParamsBuilder(); modelBuilder.with(context).with(messages).with(result).with(lang); Map<String, Object> model = modelBuilder.build(); render(context, result, model); } protected final void render(Context context, Result result, Map<String, Object> model) { String templateName = templateEngineHelper.getTemplateForResult( context.getRoute(), result, SUFFIX); ResponseStreams responseStreams = context.finalizeHeaders(result); Writer out; try { out = responseStreams.getWriter(); } catch (IOException e) { logger.error("Error getting writer to render JADE template", e); return; } try { JadeTemplate template = jadeConfiguration.getTemplate(templateName); Jade4J.render(template, model, out); responseStreams.getWriter().flush(); responseStreams.getWriter().close(); } catch (JadeException | IOException e) { exceptionHandler.handleException(out, e); } } @Override public String getSuffixOfTemplatingEngine() { return SUFFIX; } @Override public String getContentType() { return CONTENT_TYPE; } }