From 48fcb874a9283769426e42256b35fdfa4001f292 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 12 Aug 2012 21:01:22 +0200 Subject: [PATCH] added freemarker template engine --- .../main/java/sonia/scm/ScmServletModule.java | 9 +- .../scm/template/FreemarkerTemplate.java | 92 ++++++++++++ .../template/FreemarkerTemplateEngine.java | 139 ++++++++++++++++++ 3 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplate.java create mode 100644 scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplateEngine.java diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index ba69ae947f..738e1fdbbe 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -88,6 +88,7 @@ import sonia.scm.store.JAXBStoreFactory; import sonia.scm.store.ListenableStoreFactory; import sonia.scm.store.StoreFactory; import sonia.scm.template.DefaultEngine; +import sonia.scm.template.FreemarkerTemplateEngine; import sonia.scm.template.FreemarkerTemplateHandler; import sonia.scm.template.MustacheTemplateEngine; import sonia.scm.template.TemplateEngine; @@ -337,8 +338,12 @@ public class ScmServletModule extends ServletModule // template bind(TemplateHandler.class).to(FreemarkerTemplateHandler.class); serve(PATTERN_INDEX, "/").with(TemplateServlet.class); - Multibinder.newSetBinder(binder(), - TemplateEngine.class).addBinding().to(MustacheTemplateEngine.class); + + Multibinder engineBinder = + Multibinder.newSetBinder(binder(), TemplateEngine.class); + + engineBinder.addBinding().to(MustacheTemplateEngine.class); + engineBinder.addBinding().to(FreemarkerTemplateEngine.class); bind(TemplateEngine.class).annotatedWith(DefaultEngine.class).to( MustacheTemplateEngine.class); bind(TemplateEngineFactory.class); diff --git a/scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplate.java b/scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplate.java new file mode 100644 index 0000000000..6467527e97 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplate.java @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.template; + +//~--- non-JDK imports -------------------------------------------------------- + +import freemarker.template.TemplateException; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; +import java.io.Writer; + +import java.util.Map; + +/** + * + * @author Sebastian Sdorra + */ +public class FreemarkerTemplate implements Template +{ + + /** + * Constructs ... + * + * + * @param template + */ + public FreemarkerTemplate(freemarker.template.Template template) + { + this.template = template; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param writer + * @param environment + * + * @throws IOException + */ + @Override + public void execute(Writer writer, Map environment) + throws IOException + { + try + { + template.process(environment, writer); + } + catch (TemplateException ex) + { + throw new TemplateRenderException("could not render template", ex); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private freemarker.template.Template template; +} diff --git a/scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplateEngine.java b/scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplateEngine.java new file mode 100644 index 0000000000..31deba1ede --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/template/FreemarkerTemplateEngine.java @@ -0,0 +1,139 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.template; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.Inject; + +import freemarker.cache.ClassTemplateLoader; +import freemarker.cache.MultiTemplateLoader; +import freemarker.cache.TemplateLoader; +import freemarker.cache.WebappTemplateLoader; + +import freemarker.template.Configuration; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +import java.util.Locale; + +import javax.servlet.ServletContext; + +/** + * + * @author Sebastian Sdorra + */ +public class FreemarkerTemplateEngine implements TemplateEngine +{ + + /** Field description */ + public static final String DIRECTORY_ROOT = "/"; + + /** Field description */ + public static final String ENCODING = "UTF-8"; + + /** Field description */ + public static final TemplateType TYPE = new TemplateType("freemarker", + "Freemarker", "ftl", "freemarker"); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param servletContext + */ + @Inject + public FreemarkerTemplateEngine(ServletContext servletContext) + { + configuration = new Configuration(); + configuration.setEncoding(Locale.ENGLISH, ENCODING); + //J- + configuration.setTemplateLoader( + new MultiTemplateLoader( + new TemplateLoader[] { + new WebappTemplateLoader(servletContext, DIRECTORY_ROOT), + new ClassTemplateLoader(FreemarkerTemplateHandler.class, + DIRECTORY_ROOT) + } + ) + ); + //J+ + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param templatePath + * + * @return + * + * @throws IOException + */ + @Override + public FreemarkerTemplate getTemplate(String templatePath) throws IOException + { + FreemarkerTemplate template = null; + freemarker.template.Template t = configuration.getTemplate(templatePath, + ENCODING); + + if (t != null) + { + template = new FreemarkerTemplate(t); + } + + return template; + } + + /** + * Method description + * + * + * @return + */ + @Override + public TemplateType getType() + { + return TYPE; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Configuration configuration; +}