Updated Jetty version used in JUnit tests, because the old one can't run on Java 16. Also some adjustments in Jetty setup was needed.
diff --git a/ivy.xml b/ivy.xml
index 8a5afea..b379f16 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -21,7 +21,7 @@
AFTER CHANGING THIS FILE don't forget to issue: ant update-deps
-->
<!DOCTYPE ivy-module [
- <!ENTITY jetty.version "7.6.21.v20160908">
+ <!ENTITY jetty.version "9.4.53.v20231009">
<!ENTITY slf4j.version "1.6.1">
<!ENTITY spring.version "2.5.6.SEC03">
]>
@@ -143,9 +143,12 @@
<dependency org="org.eclipse.jetty" name="jetty-server" rev="&jetty.version;" conf="test->default" />
<dependency org="org.eclipse.jetty" name="jetty-webapp" rev="&jetty.version;" conf="test->default" />
- <dependency org="org.eclipse.jetty" name="jetty-jsp" rev="&jetty.version;" conf="test->default" />
<dependency org="org.eclipse.jetty" name="jetty-util" rev="&jetty.version;" conf="test->default" />
-
+ <dependency org="org.eclipse.jetty" name="apache-jsp" rev="&jetty.version;" conf="test->default" />
+ <!-- JPS JSTL: -->
+ <dependency org="org.apache.taglibs" name="taglibs-standard-impl" rev="1.2.5" conf="test->default" />
+ <dependency org="org.apache.taglibs" name="taglibs-standard-spec" rev="1.2.5" conf="test->default" />
+
<dependency org="displaytag" name="displaytag" rev="1.2" conf="test->default">
<exclude org="com.lowagie" name="itext" />
<exclude org="org.slf4j" name="slf4j-log4j12" />
diff --git a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java b/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
index ad0c7b6..8c3982e 100644
--- a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
+++ b/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
@@ -207,15 +207,13 @@
public void tldDiscoveryRelative() throws Exception {
assertExpectedEqualsOutput(WEBAPP_TLD_DISCOVERY, "subdir/test-rel.txt", "tester?view=subdir/test-rel.ftl");
}
-
+
@Test
public void errorStatusCodes() throws Exception {
assertEquals(404, getResponseStatusCode(WEBAPP_ERRORS, "missing.jsp"));
assertEquals(500, getResponseStatusCode(WEBAPP_ERRORS, "failing-runtime.jsp"));
assertEquals(500, getResponseStatusCode(WEBAPP_ERRORS, "failing-parsetime.jsp"));
- assertEquals(200, getResponseStatusCode(WEBAPP_ERRORS,
- "tester?view=not-failing.ftl&viewServlet=freemarker-default-dev"));
assertEquals(404, getResponseStatusCode(WEBAPP_ERRORS,
"tester?view=missing.ftl&viewServlet=freemarker-default-dev"));
assertEquals(200, getResponseStatusCode(WEBAPP_ERRORS,
diff --git a/src/test/java/freemarker/template/MockServletContext.java b/src/test/java/freemarker/template/MockServletContext.java
index f833bec..0ed47ec 100644
--- a/src/test/java/freemarker/template/MockServletContext.java
+++ b/src/test/java/freemarker/template/MockServletContext.java
@@ -22,12 +22,20 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.Map;
import java.util.Set;
+import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.descriptor.JspConfigDescriptor;
public class MockServletContext implements ServletContext {
@@ -55,6 +63,11 @@
return null;
}
+ @Override
+ public boolean setInitParameter(String s, String s1) {
+ return false;
+ }
+
public int getMajorVersion() {
return 0;
}
@@ -67,6 +80,16 @@
return 0;
}
+ @Override
+ public int getEffectiveMajorVersion() {
+ return 0;
+ }
+
+ @Override
+ public int getEffectiveMinorVersion() {
+ return 0;
+ }
+
public RequestDispatcher getNamedDispatcher(String arg0) {
return null;
}
@@ -103,6 +126,126 @@
return "MyApp";
}
+ @Override
+ public ServletRegistration.Dynamic addServlet(String s, String s1) {
+ return null;
+ }
+
+ @Override
+ public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) {
+ return null;
+ }
+
+ @Override
+ public ServletRegistration.Dynamic addServlet(String s, Class<? extends Servlet> aClass) {
+ return null;
+ }
+
+ @Override
+ public <T extends Servlet> T createServlet(Class<T> aClass) throws ServletException {
+ return null;
+ }
+
+ @Override
+ public ServletRegistration getServletRegistration(String s) {
+ return null;
+ }
+
+ @Override
+ public Map<String, ? extends ServletRegistration> getServletRegistrations() {
+ return null;
+ }
+
+ @Override
+ public FilterRegistration.Dynamic addFilter(String s, String s1) {
+ return null;
+ }
+
+ @Override
+ public FilterRegistration.Dynamic addFilter(String s, Filter filter) {
+ return null;
+ }
+
+ @Override
+ public FilterRegistration.Dynamic addFilter(String s, Class<? extends Filter> aClass) {
+ return null;
+ }
+
+ @Override
+ public <T extends Filter> T createFilter(Class<T> aClass) throws ServletException {
+ return null;
+ }
+
+ @Override
+ public FilterRegistration getFilterRegistration(String s) {
+ return null;
+ }
+
+ @Override
+ public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
+ return null;
+ }
+
+ @Override
+ public SessionCookieConfig getSessionCookieConfig() {
+ return null;
+ }
+
+ @Override
+ public void setSessionTrackingModes(Set<SessionTrackingMode> set) {
+
+ }
+
+ @Override
+ public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
+ return null;
+ }
+
+ @Override
+ public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
+ return null;
+ }
+
+ @Override
+ public void addListener(String s) {
+
+ }
+
+ @Override
+ public <T extends EventListener> void addListener(T t) {
+
+ }
+
+ @Override
+ public void addListener(Class<? extends EventListener> aClass) {
+
+ }
+
+ @Override
+ public <T extends EventListener> T createListener(Class<T> aClass) throws ServletException {
+ return null;
+ }
+
+ @Override
+ public JspConfigDescriptor getJspConfigDescriptor() {
+ return null;
+ }
+
+ @Override
+ public ClassLoader getClassLoader() {
+ return null;
+ }
+
+ @Override
+ public void declareRoles(String... strings) {
+
+ }
+
+ @Override
+ public String getVirtualServerName() {
+ return null;
+ }
+
public Enumeration getServletNames() {
return null;
}
diff --git a/src/test/java/freemarker/test/servlet/WebAppTestCase.java b/src/test/java/freemarker/test/servlet/WebAppTestCase.java
index 0366bde..ab14fb2 100644
--- a/src/test/java/freemarker/test/servlet/WebAppTestCase.java
+++ b/src/test/java/freemarker/test/servlet/WebAppTestCase.java
@@ -34,6 +34,10 @@
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
+import org.eclipse.jetty.annotations.ServletContainerInitializersStarter;
+import org.eclipse.jetty.apache.jsp.JettyJasperInitializer;
+import org.eclipse.jetty.plus.annotation.ContainerInitializer;
+import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.webapp.WebAppContext;
@@ -111,7 +115,7 @@
ensureWebAppIsDeployed(webAppName);
- final URI uri = new URI("http://localhost:" + server.getConnectors()[0].getLocalPort()
+ final URI uri = new URI("http://localhost:" + ((NetworkConnector) server.getConnectors()[0]).getLocalPort()
+ "/" + webAppName + "/" + webAppRelURL);
final HttpURLConnection httpCon = (HttpURLConnection) uri.toURL().openConnection();
@@ -234,6 +238,9 @@
context.setAttribute(
ATTR_JETTY_CONTAINER_INCLUDE_JAR_PATTERN,
".*taglib.*\\.jar$");
+
+ addJasperInitializer(context);
+
contextHandlers.addHandler(context);
// As we add this after the Server was started, it has to be started manually:
context.start();
@@ -242,6 +249,20 @@
LOG.info("Deployed web app.: {}", webAppName);
}
+ /**
+ * Without this, we will have this error when loading a taglib:
+ * NullPointerException: Cannot invoke "org.apache.jasper.compiler.TldCache.getTldResourcePath(String)" because the
+ * return value of "org.apache.jasper.Options.getTldCache()" is null
+ */
+ private static void addJasperInitializer(WebAppContext context) {
+ JettyJasperInitializer jettyJasperInitializer = new JettyJasperInitializer();
+ ServletContainerInitializersStarter servletContainerInitializersStarter
+ = new ServletContainerInitializersStarter(context);
+ ContainerInitializer containerInitializer = new ContainerInitializer(jettyJasperInitializer, null);
+ context.setAttribute("org.eclipse.jetty.containerInitializers", List.of(containerInitializer));
+ context.addBean(servletContainerInitializersStarter, true);
+ }
+
private static void deleteTemporaryDirectories() throws IOException {
if (testTempDirectory.getParentFile() == null) {
throw new IOException("Won't delete the root directory");
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index e3876ec..2ddfb82 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -26,6 +26,8 @@
</appender>
<logger name="org.eclipse.jetty" level="INFO" />
+ <logger name="org.apache.tomcat" level="INFO" />
+ <logger name="org.apache.jasper" level="INFO" />
<root level="debug">
<appender-ref ref="STDOUT" />