Revisit ScriptTemplateView resource loading

Resources are now retrieved using the application context in order to
support natively non-classpath locations like /WEB-INF/...

As a consequence of this refactoring, ScriptTemplateView#createClassLoader()
protected method as been removed, since it did not make sense anymore with
this new resource loading implementation.

Issue: SPR-14210
This commit is contained in:
Sebastien Deleuze
2016-04-26 14:40:39 +02:00
parent 9412f7a094
commit 15138ed96f
2 changed files with 52 additions and 59 deletions

View File

@@ -16,10 +16,8 @@
package org.springframework.web.servlet.view.script;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -29,8 +27,6 @@ import java.util.concurrent.Future;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
@@ -62,8 +58,6 @@ public class ScriptTemplateViewTests {
private StaticWebApplicationContext wac;
private static final String RESOURCE_LOADER_PATH = "classpath:org/springframework/web/servlet/view/script/";
@Before
public void setup() {
@@ -71,7 +65,6 @@ public class ScriptTemplateViewTests {
this.wac = new StaticWebApplicationContext();
this.wac.getBeanFactory().registerSingleton("scriptTemplateConfigurer", this.configurer);
this.view = new ScriptTemplateView();
this.view.setUrl(RESOURCE_LOADER_PATH + "empty.txt");
}
@Test
@@ -211,26 +204,35 @@ public class ScriptTemplateViewTests {
fail();
}
@Test
@SuppressWarnings("resource")
public void parentLoader() {
this.view.setEngine(mock(InvocableScriptEngine.class));
@Test // SPR-14210
public void resourceLoaderPath() throws Exception {
MockServletContext servletContext = new MockServletContext();
this.wac.setServletContext(servletContext);
this.wac.refresh();
MockHttpServletRequest request = new MockHttpServletRequest();
request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.wac);
MockHttpServletResponse response = new MockHttpServletResponse();
Map<String, Object> model = new HashMap<String, Object>();
InvocableScriptEngine engine = mock(InvocableScriptEngine.class);
when(engine.invokeFunction(any(), any(), any(), any())).thenReturn("foo");
this.view.setEngine(engine);
this.view.setRenderFunction("render");
this.view.setResourceLoaderPath(RESOURCE_LOADER_PATH);
this.view.setApplicationContext(this.wac);
ClassLoader classLoader = this.view.createClassLoader();
assertNotNull(classLoader);
URLClassLoader urlClassLoader = (URLClassLoader) classLoader;
assertThat(Arrays.asList(urlClassLoader.getURLs()), Matchers.hasSize(1));
assertThat(Arrays.asList(urlClassLoader.getURLs()).get(0).toString(),
Matchers.endsWith("org/springframework/web/servlet/view/script/"));
this.view.setResourceLoaderPath(RESOURCE_LOADER_PATH + ",classpath:org/springframework/web/servlet/view/");
classLoader = this.view.createClassLoader();
assertNotNull(classLoader);
urlClassLoader = (URLClassLoader) classLoader;
assertThat(Arrays.asList(urlClassLoader.getURLs()), Matchers.hasSize(2));
assertThat(Arrays.asList(urlClassLoader.getURLs()).get(0).toString(), Matchers.endsWith("org/springframework/web/servlet/view/script/"));
assertThat(Arrays.asList(urlClassLoader.getURLs()).get(1).toString(), Matchers.endsWith("org/springframework/web/servlet/view/"));
this.view.setUrl("org/springframework/web/servlet/view/script/empty.txt");
this.view.render(model, request, response);
assertEquals("foo", response.getContentAsString());
response = new MockHttpServletResponse();
this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script/");
this.view.setUrl("empty.txt");
this.view.render(model, request, response);
assertEquals("foo", response.getContentAsString());
response = new MockHttpServletResponse();
this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script");
this.view.setUrl("empty.txt");
this.view.render(model, request, response);
assertEquals("foo", response.getContentAsString());
}
@Test // SPR-13379
@@ -244,7 +246,8 @@ public class ScriptTemplateViewTests {
Map<String, Object> model = new HashMap<String, Object>();
this.view.setEngine(mock(InvocableScriptEngine.class));
this.view.setRenderFunction("render");
this.view.setResourceLoaderPath(RESOURCE_LOADER_PATH);
this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script/");
this.view.setUrl("empty.txt");
this.view.setApplicationContext(this.wac);
this.view.render(model, request, response);