From 9de33362bd08e43f5704a0a78e225dd3d8ac15f8 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 18 Aug 2012 13:52:17 +0200 Subject: [PATCH] throw io exception if template is not parse able --- .../scm/template/TemplateParseException.java | 92 +++++++++++++++++++ .../scm/template/MustacheTemplateEngine.java | 23 ++++- .../FreemarkerTemplateEngineTest.java | 12 +++ .../template/MustacheTemplateEngineTest.java | 12 +++ .../scm/template/TemplateEngineTestBase.java | 23 +++++ .../resources/sonia/scm/template/005.mustache | 1 + .../test/resources/sonia/scm/template/006.ftl | 1 + 7 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/template/TemplateParseException.java create mode 100644 scm-webapp/src/test/resources/sonia/scm/template/005.mustache create mode 100644 scm-webapp/src/test/resources/sonia/scm/template/006.ftl diff --git a/scm-core/src/main/java/sonia/scm/template/TemplateParseException.java b/scm-core/src/main/java/sonia/scm/template/TemplateParseException.java new file mode 100644 index 0000000000..f374b43b27 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/template/TemplateParseException.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; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +/** + * This exception is thrown, if an error during the template parse + * phase occurs. + * + * @author Sebastian Sdorra + * @since 1.19 + */ +public class TemplateParseException extends IOException +{ + + /** Field description */ + private static final long serialVersionUID = 3583405534141707032L; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + */ + public TemplateParseException() {} + + /** + * Constructs ... + * + * + * @param message + */ + public TemplateParseException(String message) + { + super(message); + } + + /** + * Constructs ... + * + * + * @param cause + */ + public TemplateParseException(Throwable cause) + { + super(cause); + } + + /** + * Constructs ... + * + * + * @param message + * @param cause + */ + public TemplateParseException(String message, Throwable cause) + { + super(message, cause); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java b/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java index 58ec01b5a5..e0b56cd824 100644 --- a/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java +++ b/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java @@ -37,6 +37,7 @@ package sonia.scm.template; import com.github.mustachejava.Mustache; +import com.google.common.base.Throwables; import com.google.common.util.concurrent.UncheckedExecutionException; import com.google.inject.Inject; @@ -135,17 +136,29 @@ public class MustacheTemplateEngine implements TemplateEngine } catch (UncheckedExecutionException ex) { - if (ex.getCause() instanceof MustacheTemplateNotFoundException) + Throwable cause = ex.getCause(); + + if (cause instanceof MustacheTemplateNotFoundException) { if (logger.isWarnEnabled()) { logger.warn("could not find mustache template at {}", templatePath); } - else - { - throw ex; - } } + else + { + Throwables.propagateIfInstanceOf(cause, IOException.class); + + throw new TemplateParseException( + "could not parse template for resource ".concat(templatePath), cause); + } + } + catch (Exception ex) + { + Throwables.propagateIfInstanceOf(ex, IOException.class); + + throw new TemplateParseException( + "could not parse template for resource ".concat(templatePath), ex); } return template; diff --git a/scm-webapp/src/test/java/sonia/scm/template/FreemarkerTemplateEngineTest.java b/scm-webapp/src/test/java/sonia/scm/template/FreemarkerTemplateEngineTest.java index b4655eeff6..afc29bc487 100644 --- a/scm-webapp/src/test/java/sonia/scm/template/FreemarkerTemplateEngineTest.java +++ b/scm-webapp/src/test/java/sonia/scm/template/FreemarkerTemplateEngineTest.java @@ -58,6 +58,18 @@ public class FreemarkerTemplateEngineTest extends TemplateEngineTestBase //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + @Override + public String getDefectTemplateResource() + { + return "sonia/scm/template/006.ftl"; + } + /** * Method description * diff --git a/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateEngineTest.java b/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateEngineTest.java index bb07e8b827..b48082c660 100644 --- a/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateEngineTest.java +++ b/scm-webapp/src/test/java/sonia/scm/template/MustacheTemplateEngineTest.java @@ -58,6 +58,18 @@ public class MustacheTemplateEngineTest extends TemplateEngineTestBase //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + @Override + public String getDefectTemplateResource() + { + return "sonia/scm/template/005.mustache"; + } + /** * Method description * diff --git a/scm-webapp/src/test/java/sonia/scm/template/TemplateEngineTestBase.java b/scm-webapp/src/test/java/sonia/scm/template/TemplateEngineTestBase.java index 12ddfa4653..f3d9714863 100644 --- a/scm-webapp/src/test/java/sonia/scm/template/TemplateEngineTestBase.java +++ b/scm-webapp/src/test/java/sonia/scm/template/TemplateEngineTestBase.java @@ -69,6 +69,14 @@ public abstract class TemplateEngineTestBase //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + public abstract String getDefectTemplateResource(); + /** * Method description * @@ -79,6 +87,21 @@ public abstract class TemplateEngineTestBase //~--- methods -------------------------------------------------------------- + /** + * Method description + * + * + * @throws IOException + */ + @Test(expected = IOException.class) + public void testGetDefectTemplate() throws IOException + { + ServletContext context = mock(ServletContext.class); + TemplateEngine engine = createEngine(context); + + engine.getTemplate(getDefectTemplateResource()); + } + /** * Method description * diff --git a/scm-webapp/src/test/resources/sonia/scm/template/005.mustache b/scm-webapp/src/test/resources/sonia/scm/template/005.mustache new file mode 100644 index 0000000000..251e4519c7 --- /dev/null +++ b/scm-webapp/src/test/resources/sonia/scm/template/005.mustache @@ -0,0 +1 @@ +Hello {{/test}}! \ No newline at end of file diff --git a/scm-webapp/src/test/resources/sonia/scm/template/006.ftl b/scm-webapp/src/test/resources/sonia/scm/template/006.ftl new file mode 100644 index 0000000000..99d266c61a --- /dev/null +++ b/scm-webapp/src/test/resources/sonia/scm/template/006.ftl @@ -0,0 +1 @@ +Hello ! \ No newline at end of file