diff --git a/spring-context/src/test/java/org/springframework/scripting/support/StandardScriptFactoryTests.java b/spring-context/src/test/java/org/springframework/scripting/support/StandardScriptFactoryTests.java
deleted file mode 100644
index a3679ef6662..00000000000
--- a/spring-context/src/test/java/org/springframework/scripting/support/StandardScriptFactoryTests.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2002-2020 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
- *
- * https://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 org.springframework.scripting.support;
-
-import java.util.Arrays;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.DisabledForJreRange;
-
-import org.springframework.aop.support.AopUtils;
-import org.springframework.aop.target.dynamic.Refreshable;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-import org.springframework.scripting.Messenger;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.condition.JRE.JAVA_15;
-
-/**
- * {@link StandardScriptFactory} (lang:std) tests for JavaScript.
- *
- * @author Juergen Hoeller
- * @since 4.2
- */
-@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15
-public class StandardScriptFactoryTests {
-
- @Test
- public void testJsr223FromTagWithInterface() throws Exception {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("jsr223-with-xsd.xml", getClass());
- assertThat(Arrays.asList(ctx.getBeanNamesForType(Messenger.class)).contains("messengerWithInterface")).isTrue();
- Messenger messenger = (Messenger) ctx.getBean("messengerWithInterface");
- assertThat(AopUtils.isAopProxy(messenger)).isFalse();
- assertThat(messenger.getMessage()).isEqualTo("Hello World!");
- }
-
- @Test
- public void testRefreshableJsr223FromTagWithInterface() throws Exception {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("jsr223-with-xsd.xml", getClass());
- assertThat(Arrays.asList(ctx.getBeanNamesForType(Messenger.class)).contains("refreshableMessengerWithInterface")).isTrue();
- Messenger messenger = (Messenger) ctx.getBean("refreshableMessengerWithInterface");
- assertThat(AopUtils.isAopProxy(messenger)).isTrue();
- boolean condition = messenger instanceof Refreshable;
- assertThat(condition).isTrue();
- assertThat(messenger.getMessage()).isEqualTo("Hello World!");
- }
-
- @Test
- public void testInlineJsr223FromTagWithInterface() throws Exception {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("jsr223-with-xsd.xml", getClass());
- assertThat(Arrays.asList(ctx.getBeanNamesForType(Messenger.class)).contains("inlineMessengerWithInterface")).isTrue();
- Messenger messenger = (Messenger) ctx.getBean("inlineMessengerWithInterface");
- assertThat(AopUtils.isAopProxy(messenger)).isFalse();
- assertThat(messenger.getMessage()).isEqualTo("Hello World!");
- }
-
-}
diff --git a/spring-context/src/test/resources/org/springframework/scripting/support/Messenger.js b/spring-context/src/test/resources/org/springframework/scripting/support/Messenger.js
deleted file mode 100644
index 5277c3c73ae..00000000000
--- a/spring-context/src/test/resources/org/springframework/scripting/support/Messenger.js
+++ /dev/null
@@ -1 +0,0 @@
-function getMessage() { return "Hello World!" }
diff --git a/spring-context/src/test/resources/org/springframework/scripting/support/jsr223-with-xsd.xml b/spring-context/src/test/resources/org/springframework/scripting/support/jsr223-with-xsd.xml
deleted file mode 100644
index 3346aa07884..00000000000
--- a/spring-context/src/test/resources/org/springframework/scripting/support/jsr223-with-xsd.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- function getMessage() { return "Hello World!" }
-
-
-
-
diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java
deleted file mode 100644
index 3e6ce64a3f1..00000000000
--- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2002-2020 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
- *
- * https://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 org.springframework.web.reactive.result.view.script;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.DisabledForJreRange;
-
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.MediaType;
-import org.springframework.http.codec.ServerCodecConfigurer;
-import org.springframework.web.reactive.result.view.ZeroDemandResponse;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.adapter.DefaultServerWebExchange;
-import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
-import org.springframework.web.server.session.DefaultWebSessionManager;
-import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
-import org.springframework.web.testfixture.http.server.reactive.MockServerHttpResponse;
-import org.springframework.web.testfixture.server.MockServerWebExchange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.condition.JRE.JAVA_15;
-
-/**
- * Unit tests for pure JavaScript templates running on Nashorn engine.
- *
- * @author Sebastien Deleuze
- */
-@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15
-public class NashornScriptTemplateTests {
-
- @Test
- public void renderTemplate() throws Exception {
- Map model = new HashMap<>();
- model.put("title", "Layout example");
- model.put("body", "This is the body");
- String url = "org/springframework/web/reactive/result/view/script/nashorn/template.html";
- MockServerHttpResponse response = render(url, model, ScriptTemplatingConfiguration.class);
- assertThat(response.getBodyAsString().block()).isEqualTo("Layout exampleThis is the body
");
- }
-
- @Test // SPR-13453
- public void renderTemplateWithUrl() throws Exception {
- String url = "org/springframework/web/reactive/result/view/script/nashorn/template.html";
- Class> configClass = ScriptTemplatingWithUrlConfiguration.class;
- MockServerHttpResponse response = render(url, null, configClass);
- assertThat(response.getBodyAsString().block()).isEqualTo(("Check url parameter" + url + "
"));
- }
-
- @Test // gh-22754
- public void subscribeWithoutDemand() throws Exception {
- ZeroDemandResponse response = new ZeroDemandResponse();
- ServerWebExchange exchange = new DefaultServerWebExchange(
- MockServerHttpRequest.get("/path").build(), response,
- new DefaultWebSessionManager(), ServerCodecConfigurer.create(),
- new AcceptHeaderLocaleContextResolver());
-
- Map model = new HashMap<>();
- model.put("title", "Layout example");
- model.put("body", "This is the body");
- String viewUrl = "org/springframework/web/reactive/result/view/script/nashorn/template.html";
- ScriptTemplateView view = createViewWithUrl(viewUrl, ScriptTemplatingConfiguration.class);
- view.render(model, null, exchange).subscribe();
-
- response.cancelWrite();
- response.checkForLeaks();
- }
-
- private MockServerHttpResponse render(String viewUrl, Map model,
- Class> configuration) throws Exception {
-
- ScriptTemplateView view = createViewWithUrl(viewUrl, configuration);
- MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/"));
- view.renderInternal(model, MediaType.TEXT_HTML, exchange).block();
- return exchange.getResponse();
- }
-
- private ScriptTemplateView createViewWithUrl(String viewUrl, Class> configuration) throws Exception {
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
- ctx.register(configuration);
- ctx.refresh();
-
- ScriptTemplateView view = new ScriptTemplateView();
- view.setApplicationContext(ctx);
- view.setUrl(viewUrl);
- view.afterPropertiesSet();
- return view;
- }
-
-
- @Configuration
- static class ScriptTemplatingConfiguration {
-
- @Bean
- public ScriptTemplateConfigurer nashornConfigurer() {
- ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer();
- configurer.setEngineName("nashorn");
- configurer.setScripts("org/springframework/web/reactive/result/view/script/nashorn/render.js");
- configurer.setRenderFunction("render");
- return configurer;
- }
- }
-
-
- @Configuration
- static class ScriptTemplatingWithUrlConfiguration {
-
- @Bean
- public ScriptTemplateConfigurer nashornConfigurer() {
- ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer();
- configurer.setEngineName("nashorn");
- configurer.setScripts("org/springframework/web/reactive/result/view/script/nashorn/render.js");
- configurer.setRenderFunction("renderWithUrl");
- return configurer;
- }
- }
-
-}
diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/ScriptTemplateViewTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/ScriptTemplateViewTests.java
deleted file mode 100644
index e583e4abbd2..00000000000
--- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/ScriptTemplateViewTests.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2002-2022 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
- *
- * https://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 org.springframework.web.reactive.result.view.script;
-
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-import javax.script.Invocable;
-import javax.script.ScriptEngine;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.DisabledForJreRange;
-
-import org.springframework.beans.DirectFieldAccessor;
-import org.springframework.context.ApplicationContextException;
-import org.springframework.context.support.StaticApplicationContext;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
-import static org.assertj.core.api.InstanceOfAssertFactories.BOOLEAN;
-import static org.junit.jupiter.api.condition.JRE.JAVA_15;
-import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
-
-/**
- * Unit tests for {@link ScriptTemplateView}.
- *
- * @author Sebastien Deleuze
- */
-@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15
-public class ScriptTemplateViewTests {
-
- private ScriptTemplateView view;
-
- private ScriptTemplateConfigurer configurer;
-
- private StaticApplicationContext context;
-
-
- @BeforeEach
- public void setup() {
- this.configurer = new ScriptTemplateConfigurer();
- this.context = new StaticApplicationContext();
- this.context.getBeanFactory().registerSingleton("scriptTemplateConfigurer", this.configurer);
- this.view = new ScriptTemplateView();
- }
-
-
- @Test
- public void missingTemplate() throws Exception {
- this.context.refresh();
- this.view.setResourceLoaderPath("classpath:org/springframework/web/reactive/result/view/script/");
- this.view.setUrl("missing.txt");
- this.view.setEngine(mock(InvocableScriptEngine.class));
- this.configurer.setRenderFunction("render");
- this.view.setApplicationContext(this.context);
- assertThat(this.view.checkResourceExists(Locale.ENGLISH)).isFalse();
- }
-
- @Test
- public void missingScriptTemplateConfig() throws Exception {
- assertThatExceptionOfType(ApplicationContextException.class).isThrownBy(() ->
- this.view.setApplicationContext(new StaticApplicationContext()))
- .withMessageContaining("ScriptTemplateConfig");
- }
-
- @Test
- public void detectScriptTemplateConfigWithEngine() {
- InvocableScriptEngine engine = mock(InvocableScriptEngine.class);
- this.configurer.setEngine(engine);
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
- this.configurer.setCharset(StandardCharsets.ISO_8859_1);
- this.configurer.setSharedEngine(true);
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.context);
- assertThat(accessor.getPropertyValue("engine")).isEqualTo(engine);
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("defaultCharset")).isEqualTo(StandardCharsets.ISO_8859_1);
- assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue();
- }
-
- @Test
- public void detectScriptTemplateConfigWithEngineName() {
- this.configurer.setEngineName("nashorn");
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.context);
- assertThat(accessor.getPropertyValue("engineName")).isEqualTo("nashorn");
- assertThat(accessor.getPropertyValue("engine")).isNotNull();
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("defaultCharset")).isEqualTo(StandardCharsets.UTF_8);
- }
-
- @Test
- public void customEngineAndRenderFunction() throws Exception {
- ScriptEngine engine = mock(InvocableScriptEngine.class);
- given(engine.get("key")).willReturn("value");
- this.view.setEngine(engine);
- this.view.setRenderFunction("render");
- this.view.setApplicationContext(this.context);
- engine = this.view.getEngine();
- assertThat(engine).isNotNull();
- assertThat(engine.get("key")).isEqualTo("value");
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- assertThat(accessor.getPropertyValue("renderObject")).isNull();
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("defaultCharset")).isEqualTo(StandardCharsets.UTF_8);
- }
-
- @Test
- public void nonSharedEngine() throws Exception {
- int iterations = 20;
- this.view.setEngineName("nashorn");
- this.view.setRenderFunction("render");
- this.view.setSharedEngine(false);
- this.view.setApplicationContext(this.context);
- ExecutorService executor = Executors.newFixedThreadPool(4);
- List> results = new ArrayList<>();
- for (int i = 0; i < iterations; i++) {
- results.add(executor.submit(() -> view.getEngine() != null));
- }
- assertThat(results.size()).isEqualTo(iterations);
- for (int i = 0; i < iterations; i++) {
- assertThat((boolean) results.get(i).get()).isTrue();
- }
- executor.shutdown();
- }
-
- @Test
- public void nonInvocableScriptEngine() throws Exception {
- this.view.setEngine(mock(ScriptEngine.class));
- this.view.setApplicationContext(this.context);
- }
-
- @Test
- public void nonInvocableScriptEngineWithRenderFunction() throws Exception {
- this.view.setEngine(mock(ScriptEngine.class));
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.context));
- }
-
- @Test
- public void engineAndEngineNameBothDefined() {
- this.view.setEngine(mock(InvocableScriptEngine.class));
- this.view.setEngineName("test");
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.context))
- .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'.");
- }
-
- @Test // gh-23258
- public void engineAndEngineSupplierBothDefined() {
- ScriptEngine engine = mock(InvocableScriptEngine.class);
- this.view.setEngineSupplier(() -> engine);
- this.view.setEngine(engine);
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.context))
- .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'.");
- }
-
- @Test // gh-23258
- public void engineNameAndEngineSupplierBothDefined() {
- this.view.setEngineSupplier(() -> mock(InvocableScriptEngine.class));
- this.view.setEngineName("test");
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.context))
- .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'.");
- }
-
- @Test
- public void engineSetterAndNonSharedEngine() {
- this.view.setEngine(mock(InvocableScriptEngine.class));
- this.view.setRenderFunction("render");
- this.view.setSharedEngine(false);
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.context))
- .withMessageContaining("sharedEngine");
- }
-
- @Test // gh-23258
- public void engineSupplierWithSharedEngine() {
- this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class));
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
- this.configurer.setSharedEngine(true);
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.context);
- ScriptEngine engine1 = this.view.getEngine();
- ScriptEngine engine2 = this.view.getEngine();
- assertThat(engine1).isNotNull();
- assertThat(engine2).isNotNull();
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue();
- }
-
- @SuppressWarnings("unchecked")
- @Test // gh-23258
- public void engineSupplierWithNonSharedEngine() {
- this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class));
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
- this.configurer.setSharedEngine(false);
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.context);
- ScriptEngine engine1 = this.view.getEngine();
- ScriptEngine engine2 = this.view.getEngine();
- assertThat(engine1).isNotNull();
- assertThat(engine2).isNotNull();
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isFalse();
- }
-
- private interface InvocableScriptEngine extends ScriptEngine, Invocable {
- }
-
-}
diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/render.js b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/render.js
deleted file mode 100644
index f995bd5a9ba..00000000000
--- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/render.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function render(template, model) {
- return template.replace("{{title}}", model.title).replace("{{body}}", model.body);
-}
-
-function renderWithUrl(template, model, renderingContext) {
- return template.replace("{{title}}", "Check url parameter").replace("{{body}}", renderingContext.url);
-}
diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/template.html b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/template.html
deleted file mode 100644
index 9110e3181b0..00000000000
--- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/template.html
+++ /dev/null
@@ -1 +0,0 @@
-{{title}}{{body}}
\ No newline at end of file
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java
deleted file mode 100644
index e0ddf181397..00000000000
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2002-2020 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
- *
- * https://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 org.springframework.web.servlet.view.script;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import jakarta.servlet.ServletContext;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.DisabledForJreRange;
-
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
-import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
-import org.springframework.web.testfixture.servlet.MockServletContext;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.condition.JRE.JAVA_15;
-import static org.mockito.Mockito.mock;
-
-/**
- * Unit tests for pure JavaScript templates running on Nashorn engine.
- *
- * @author Sebastien Deleuze
- */
-@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15
-public class NashornScriptTemplateTests {
-
- private WebApplicationContext webAppContext;
-
- private ServletContext servletContext;
-
-
- @BeforeEach
- public void setup() {
- this.webAppContext = mock(WebApplicationContext.class);
- this.servletContext = new MockServletContext();
- this.servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.webAppContext);
- }
-
- @Test
- public void renderTemplate() throws Exception {
- Map model = new HashMap<>();
- model.put("title", "Layout example");
- model.put("body", "This is the body");
- String url = "org/springframework/web/servlet/view/script/nashorn/template.html";
- MockHttpServletResponse response = render(url, model, ScriptTemplatingConfiguration.class);
- assertThat(response.getContentAsString()).isEqualTo("Layout exampleThis is the body
");
- }
-
- @Test // SPR-13453
- public void renderTemplateWithUrl() throws Exception {
- String url = "org/springframework/web/servlet/view/script/nashorn/template.html";
- MockHttpServletResponse response = render(url, null, ScriptTemplatingWithUrlConfiguration.class);
- assertThat(response.getContentAsString()).isEqualTo(("Check url parameter" + url + "
"));
- }
-
- private MockHttpServletResponse render(String viewUrl, Map model,
- Class> configuration) throws Exception {
-
- ScriptTemplateView view = createViewWithUrl(viewUrl, configuration);
- MockHttpServletResponse response = new MockHttpServletResponse();
- MockHttpServletRequest request = new MockHttpServletRequest();
- view.renderMergedOutputModel(model, request, response);
- return response;
- }
-
- private ScriptTemplateView createViewWithUrl(String viewUrl, Class> configuration) throws Exception {
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
- ctx.register(configuration);
- ctx.refresh();
-
- ScriptTemplateView view = new ScriptTemplateView();
- view.setApplicationContext(ctx);
- view.setUrl(viewUrl);
- view.afterPropertiesSet();
- return view;
- }
-
-
- @Configuration
- static class ScriptTemplatingConfiguration {
-
- @Bean
- public ScriptTemplateConfigurer nashornConfigurer() {
- ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer();
- configurer.setEngineName("nashorn");
- configurer.setScripts("org/springframework/web/servlet/view/script/nashorn/render.js");
- configurer.setRenderFunction("render");
- return configurer;
- }
- }
-
-
- @Configuration
- static class ScriptTemplatingWithUrlConfiguration {
-
- @Bean
- public ScriptTemplateConfigurer nashornConfigurer() {
- ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer();
- configurer.setEngineName("nashorn");
- configurer.setScripts("org/springframework/web/servlet/view/script/nashorn/render.js");
- configurer.setRenderFunction("renderWithUrl");
- return configurer;
- }
- }
-
-}
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
deleted file mode 100644
index d546737cb80..00000000000
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright 2002-2022 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
- *
- * https://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 org.springframework.web.servlet.view.script;
-
-import java.nio.charset.StandardCharsets;
-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;
-import java.util.concurrent.Future;
-
-import javax.script.Invocable;
-import javax.script.ScriptEngine;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.DisabledForJreRange;
-
-import org.springframework.beans.DirectFieldAccessor;
-import org.springframework.context.ApplicationContextException;
-import org.springframework.context.support.StaticApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.web.context.support.StaticWebApplicationContext;
-import org.springframework.web.servlet.DispatcherServlet;
-import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
-import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
-import org.springframework.web.testfixture.servlet.MockServletContext;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
-import static org.assertj.core.api.InstanceOfAssertFactories.BOOLEAN;
-import static org.junit.jupiter.api.condition.JRE.JAVA_15;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
-
-/**
- * Unit tests for {@link ScriptTemplateView}.
- *
- * @author Sebastien Deleuze
- */
-@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15
-public class ScriptTemplateViewTests {
-
- private ScriptTemplateView view;
-
- private ScriptTemplateConfigurer configurer;
-
- private StaticWebApplicationContext wac;
-
-
- @BeforeEach
- public void setup() {
- this.configurer = new ScriptTemplateConfigurer();
- this.wac = new StaticWebApplicationContext();
- this.wac.getBeanFactory().registerSingleton("scriptTemplateConfigurer", this.configurer);
- this.view = new ScriptTemplateView();
- }
-
-
- @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);
- assertThat(this.view.checkResource(Locale.ENGLISH)).isFalse();
- }
-
- @Test
- public void missingScriptTemplateConfig() {
- assertThatExceptionOfType(ApplicationContextException.class).isThrownBy(() ->
- this.view.setApplicationContext(new StaticApplicationContext()))
- .withMessageContaining("ScriptTemplateConfig");
- }
-
- @Test
- public void detectScriptTemplateConfigWithEngine() {
- InvocableScriptEngine engine = mock(InvocableScriptEngine.class);
- this.configurer.setEngine(engine);
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
- this.configurer.setContentType(MediaType.TEXT_PLAIN_VALUE);
- this.configurer.setCharset(StandardCharsets.ISO_8859_1);
- this.configurer.setSharedEngine(true);
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.wac);
- assertThat(accessor.getPropertyValue("engine")).isEqualTo(engine);
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("contentType")).isEqualTo(MediaType.TEXT_PLAIN_VALUE);
- assertThat(accessor.getPropertyValue("charset")).isEqualTo(StandardCharsets.ISO_8859_1);
- assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue();
- }
-
- @Test
- public void detectScriptTemplateConfigWithEngineName() {
- this.configurer.setEngineName("nashorn");
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.wac);
- assertThat(accessor.getPropertyValue("engineName")).isEqualTo("nashorn");
- assertThat(accessor.getPropertyValue("engine")).isNotNull();
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("contentType")).isEqualTo(MediaType.TEXT_HTML_VALUE);
- assertThat(accessor.getPropertyValue("charset")).isEqualTo(StandardCharsets.UTF_8);
- }
-
- @Test
- public void customEngineAndRenderFunction() {
- ScriptEngine engine = mock(InvocableScriptEngine.class);
- given(engine.get("key")).willReturn("value");
- this.view.setEngine(engine);
- this.view.setRenderFunction("render");
- this.view.setApplicationContext(this.wac);
- engine = this.view.getEngine();
- assertThat(engine).isNotNull();
- assertThat(engine.get("key")).isEqualTo("value");
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- assertThat(accessor.getPropertyValue("renderObject")).isNull();
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("charset")).isEqualTo(StandardCharsets.UTF_8);
- }
-
- @Test
- public void nonSharedEngine() throws Exception {
- int iterations = 20;
- this.view.setEngineName("nashorn");
- this.view.setRenderFunction("render");
- this.view.setSharedEngine(false);
- this.view.setApplicationContext(this.wac);
- ExecutorService executor = Executors.newFixedThreadPool(4);
- List> results = new ArrayList<>();
- for (int i = 0; i < iterations; i++) {
- results.add(executor.submit(() -> view.getEngine() != null));
- }
- assertThat(results.size()).isEqualTo(iterations);
- for (int i = 0; i < iterations; i++) {
- assertThat((boolean) results.get(i).get()).isTrue();
- }
- executor.shutdown();
- }
-
- @Test
- public void nonInvocableScriptEngine() {
- this.view.setEngine(mock(ScriptEngine.class));
- this.view.setApplicationContext(this.wac);
- }
-
- @Test
- public void nonInvocableScriptEngineWithRenderFunction() {
- this.view.setEngine(mock(ScriptEngine.class));
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.wac));
- }
-
- @Test
- public void engineAndEngineNameBothDefined() {
- this.view.setEngine(mock(InvocableScriptEngine.class));
- this.view.setEngineName("test");
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.wac))
- .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'.");
- }
-
- @Test // gh-23258
- public void engineAndEngineSupplierBothDefined() {
- ScriptEngine engine = mock(InvocableScriptEngine.class);
- this.view.setEngineSupplier(() -> engine);
- this.view.setEngine(engine);
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.wac))
- .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'.");
- }
-
- @Test // gh-23258
- public void engineNameAndEngineSupplierBothDefined() {
- this.view.setEngineSupplier(() -> mock(InvocableScriptEngine.class));
- this.view.setEngineName("test");
- this.view.setRenderFunction("render");
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.wac))
- .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'.");
- }
-
- @Test
- public void engineSetterAndNonSharedEngine() {
- this.view.setEngine(mock(InvocableScriptEngine.class));
- this.view.setRenderFunction("render");
- this.view.setSharedEngine(false);
- assertThatIllegalArgumentException().isThrownBy(() ->
- this.view.setApplicationContext(this.wac))
- .withMessageContaining("sharedEngine");
- }
-
- @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 model = new HashMap<>();
- InvocableScriptEngine engine = mock(InvocableScriptEngine.class);
- given(engine.invokeFunction(any(), any(), any(), any())).willReturn("foo");
- this.view.setEngine(engine);
- this.view.setRenderFunction("render");
- this.view.setApplicationContext(this.wac);
- this.view.setUrl("org/springframework/web/servlet/view/script/empty.txt");
- this.view.render(model, request, response);
- assertThat(response.getContentAsString()).isEqualTo("foo");
-
- response = new MockHttpServletResponse();
- this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script/");
- this.view.setUrl("empty.txt");
- this.view.render(model, request, response);
- assertThat(response.getContentAsString()).isEqualTo("foo");
-
- response = new MockHttpServletResponse();
- this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script");
- this.view.setUrl("empty.txt");
- this.view.render(model, request, response);
- assertThat(response.getContentAsString()).isEqualTo("foo");
- }
-
- @Test // SPR-13379
- public void contentType() 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 model = new HashMap<>();
- this.view.setEngine(mock(InvocableScriptEngine.class));
- this.view.setRenderFunction("render");
- 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);
- assertThat(response.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo((MediaType.TEXT_HTML_VALUE + ";charset=" +
- StandardCharsets.UTF_8));
-
- response = new MockHttpServletResponse();
- this.view.setContentType(MediaType.TEXT_PLAIN_VALUE);
- this.view.render(model, request, response);
- assertThat(response.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo((MediaType.TEXT_PLAIN_VALUE + ";charset=" +
- StandardCharsets.UTF_8));
-
- response = new MockHttpServletResponse();
- this.view.setCharset(StandardCharsets.ISO_8859_1);
- this.view.render(model, request, response);
- assertThat(response.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo((MediaType.TEXT_PLAIN_VALUE + ";charset=" +
- StandardCharsets.ISO_8859_1));
-
- }
-
- @Test // gh-23258
- public void engineSupplierWithSharedEngine() {
- this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class));
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
- this.configurer.setSharedEngine(true);
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.wac);
- ScriptEngine engine1 = this.view.getEngine();
- ScriptEngine engine2 = this.view.getEngine();
- assertThat(engine1).isNotNull();
- assertThat(engine2).isNotNull();
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue();
- }
-
- @Test // gh-23258
- public void engineSupplierWithNonSharedEngine() {
- this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class));
- this.configurer.setRenderObject("Template");
- this.configurer.setRenderFunction("render");
- this.configurer.setSharedEngine(false);
-
- DirectFieldAccessor accessor = new DirectFieldAccessor(this.view);
- this.view.setApplicationContext(this.wac);
- ScriptEngine engine1 = this.view.getEngine();
- ScriptEngine engine2 = this.view.getEngine();
- assertThat(engine1).isNotNull();
- assertThat(engine2).isNotNull();
- assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template");
- assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render");
- assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isFalse();
- }
-
- private interface InvocableScriptEngine extends ScriptEngine, Invocable {
- }
-
-}
diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/render.js b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/render.js
deleted file mode 100644
index f995bd5a9ba..00000000000
--- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/render.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function render(template, model) {
- return template.replace("{{title}}", model.title).replace("{{body}}", model.body);
-}
-
-function renderWithUrl(template, model, renderingContext) {
- return template.replace("{{title}}", "Check url parameter").replace("{{body}}", renderingContext.url);
-}
diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/template.html b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/template.html
deleted file mode 100644
index 9110e3181b0..00000000000
--- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/template.html
+++ /dev/null
@@ -1 +0,0 @@
-{{title}}{{body}}
\ No newline at end of file