From 66b370e103dbd73a6a8c6e322c418de23eebbd9e Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Sat, 17 Sep 2016 22:18:55 +0200 Subject: [PATCH] Check template availability in ScriptTemplateView This commit overrides the `checkResource` implementation in `ScriptTemplateView` in order to check if the template file resource is available and if the resolver can then proceed with rendering the template. Issue: SPR-14729 Cherry-picked from: 97c9b05c15037a75a9 --- .../view/script/ScriptTemplateView.java | 15 ++++ .../view/script/ScriptTemplateViewTests.java | 68 +++++++++---------- 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java index ac8298a8aa3..66a60040437 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java @@ -16,11 +16,13 @@ package org.springframework.web.servlet.view.script; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.Arrays; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import javax.script.Invocable; import javax.script.ScriptEngine; @@ -191,6 +193,19 @@ public class ScriptTemplateView extends AbstractUrlBasedView { } } + @Override + public boolean checkResource(Locale locale) throws Exception { + try { + getTemplate(getUrl()); + return true; + } + catch (IllegalStateException exc) { + if (logger.isDebugEnabled()) { + logger.debug("No ScriptTemplate view found for URL: " + getUrl()); + } + return false; + } + } @Override protected void initApplicationContext(ApplicationContext context) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java index a652d7e9826..d15531260f6 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java @@ -20,6 +20,7 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -28,7 +29,9 @@ import javax.script.Invocable; import javax.script.ScriptEngine; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.springframework.beans.DirectFieldAccessor; import org.springframework.context.ApplicationContextException; @@ -58,6 +61,8 @@ public class ScriptTemplateViewTests { private StaticWebApplicationContext wac; + @Rule + public ExpectedException expectedException = ExpectedException.none(); @Before public void setup() { @@ -68,15 +73,24 @@ public class ScriptTemplateViewTests { } + @Test + public void missingTemplate() throws Exception { + MockServletContext servletContext = new MockServletContext(); + this.wac.setServletContext(servletContext); + this.wac.refresh(); + this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script/"); + this.view.setUrl("missing.txt"); + this.view.setEngine(mock(InvocableScriptEngine.class)); + this.configurer.setRenderFunction("render"); + this.view.setApplicationContext(this.wac); + assertFalse(this.view.checkResource(Locale.ENGLISH)); + } + @Test public void missingScriptTemplateConfig() throws Exception { - try { - this.view.setApplicationContext(new StaticApplicationContext()); - fail("Should have thrown ApplicationContextException"); - } - catch (ApplicationContextException ex) { - assertTrue(ex.getMessage().contains("ScriptTemplateConfig")); - } + this.expectedException.expect(ApplicationContextException.class); + this.view.setApplicationContext(new StaticApplicationContext()); + this.expectedException.expectMessage(contains("ScriptTemplateConfig")); } @Test @@ -152,25 +166,17 @@ public class ScriptTemplateViewTests { @Test public void nonInvocableScriptEngine() throws Exception { - try { - this.view.setEngine(mock(ScriptEngine.class)); - fail("Should have thrown IllegalArgumentException"); - } - catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), containsString("instance")); - } + this.expectedException.expect(IllegalArgumentException.class); + this.view.setEngine(mock(ScriptEngine.class)); + this.expectedException.expectMessage(contains("instance")); } @Test public void noRenderFunctionDefined() { this.view.setEngine(mock(InvocableScriptEngine.class)); - try { - this.view.setApplicationContext(this.wac); - fail("Should have thrown IllegalArgumentException"); - } - catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), containsString("renderFunction")); - } + this.expectedException.expect(IllegalArgumentException.class); + this.view.setApplicationContext(this.wac); + this.expectedException.expectMessage(contains("renderFunction")); } @Test @@ -178,13 +184,9 @@ public class ScriptTemplateViewTests { this.view.setEngine(mock(InvocableScriptEngine.class)); this.view.setEngineName("test"); this.view.setRenderFunction("render"); - try { - this.view.setApplicationContext(this.wac); - fail("Should have thrown IllegalArgumentException"); - } - catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), containsString("'engine' or 'engineName'")); - } + this.expectedException.expect(IllegalArgumentException.class); + this.view.setApplicationContext(this.wac); + this.expectedException.expectMessage(contains("'engine' or 'engineName'")); } @Test @@ -192,13 +194,9 @@ public class ScriptTemplateViewTests { this.view.setEngine(mock(InvocableScriptEngine.class)); this.view.setRenderFunction("render"); this.view.setSharedEngine(false); - try { - this.view.setApplicationContext(this.wac); - fail("Should have thrown IllegalArgumentException"); - } - catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), containsString("sharedEngine")); - } + this.expectedException.expect(IllegalArgumentException.class); + this.view.setApplicationContext(this.wac); + this.expectedException.expectMessage(contains("sharedEngine")); } @Test // SPR-14210