From 55c144bddb4a4576265d82bcb2b2b24af2c5787a Mon Sep 17 00:00:00 2001 From: Colm O hEigeartaigh Date: Tue, 4 Aug 2026 15:06:28 +0100 Subject: [PATCH] Switch to Jetty 12 for JDK17+ using profiles --- pom.xml | 73 ++++++++++++++----- .../utils/HttpRequestRedirectorProxy.java | 52 +++++++++++-- 2 files changed, 98 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index cd8e44728..b63bfc056 100644 --- a/pom.xml +++ b/pom.xml @@ -94,7 +94,8 @@ 1.22.1 3.0 4.0.9 - 11.0.24 + 11.0.24 + 12.0.18 1.37 5.14.4 2.0.18 @@ -195,24 +196,6 @@ ${slf4j.version} test - - org.eclipse.jetty - jetty-server - ${jetty.version} - test - - - org.eclipse.jetty - jetty-servlet - ${jetty.version} - test - - - org.eclipse.jetty - jetty-servlets - ${jetty.version} - test - xalan xalan @@ -764,5 +747,57 @@ + + jetty11-jdk11 + + [11,17) + + + + org.eclipse.jetty + jetty-server + ${jetty11.version} + test + + + org.eclipse.jetty + jetty-servlet + ${jetty11.version} + test + + + org.eclipse.jetty + jetty-servlets + ${jetty11.version} + test + + + + + jetty12-jdk17-plus + + [17,) + + + + org.eclipse.jetty + jetty-server + ${jetty12.version} + test + + + org.eclipse.jetty.ee10 + jetty-ee10-servlet + ${jetty12.version} + test + + + org.eclipse.jetty.ee10 + jetty-ee10-servlets + ${jetty12.version} + test + + + diff --git a/src/test/java/org/apache/xml/security/test/stax/utils/HttpRequestRedirectorProxy.java b/src/test/java/org/apache/xml/security/test/stax/utils/HttpRequestRedirectorProxy.java index 53d7bcf98..c6710db7b 100644 --- a/src/test/java/org/apache/xml/security/test/stax/utils/HttpRequestRedirectorProxy.java +++ b/src/test/java/org/apache/xml/security/test/stax/utils/HttpRequestRedirectorProxy.java @@ -27,6 +27,9 @@ import java.io.InputStream; import java.lang.System.Logger; import java.lang.System.Logger.Level; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Proxy; @@ -37,8 +40,6 @@ import org.apache.xml.security.stax.ext.XMLSecurityUtils; import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; /** */ @@ -47,6 +48,7 @@ public class HttpRequestRedirectorProxy { private static final int startPort = 31280; private static Server httpServer; + private static final String JETTY_SERVLET_PACKAGE = resolveJettyServletPackage(); public static Proxy startHttpEngine() throws Exception { @@ -68,17 +70,17 @@ public static Proxy startHttpEngine() throws Exception { resourceHandler.setResourceBase("."); httpServer.setHandler(resourceHandler);*/ - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); - context.setContextPath("/"); - httpServer.setHandler(context); - context.addServlet(new ServletHolder(new TestingHttpProxyServlet()), "/*"); - httpServer.start(); + Object context = newJettyServletContextHandler(); + invoke(context, "setContextPath", new Class[] {String.class}, "/"); + invoke(httpServer, "setHandler", new Class[] {Class.forName("org.eclipse.jetty.server.Handler")}, context); + addServlet(context, new TestingHttpProxyServlet(), "/*"); + invoke(httpServer, "start"); return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByName("127.0.0.1"), port)); } public static void stopHttpEngine() throws Exception { - httpServer.stop(); + invoke(httpServer, "stop"); } static class TestingHttpProxyServlet extends HttpServlet { @@ -116,4 +118,38 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se resp.sendError(HttpServletResponse.SC_NOT_FOUND); } } + + private static String resolveJettyServletPackage() { + try { + Class.forName("org.eclipse.jetty.ee10.servlet.ServletContextHandler"); + return "org.eclipse.jetty.ee10.servlet"; + } catch (ClassNotFoundException ex) { + return "org.eclipse.jetty.servlet"; + } + } + + private static Object newJettyServletContextHandler() throws Exception { + Class contextClass = Class.forName(JETTY_SERVLET_PACKAGE + ".ServletContextHandler"); + Field noSessionsField = contextClass.getField("NO_SESSIONS"); + Constructor constructor = contextClass.getConstructor(int.class); + return constructor.newInstance(noSessionsField.getInt(null)); + } + + private static void addServlet(Object context, HttpServlet servlet, String pathSpec) throws Exception { + Class holderClass = Class.forName(JETTY_SERVLET_PACKAGE + ".ServletHolder"); + Constructor holderConstructor = holderClass.getConstructor(Class.forName("jakarta.servlet.Servlet")); + Object servletHolder = holderConstructor.newInstance(servlet); + Method addServletMethod = context.getClass().getMethod("addServlet", holderClass, String.class); + addServletMethod.invoke(context, servletHolder, pathSpec); + } + + private static Object invoke(Object target, String methodName) throws Exception { + Method method = target.getClass().getMethod(methodName); + return method.invoke(target); + } + + private static Object invoke(Object target, String methodName, Class[] parameterTypes, Object... arguments) throws Exception { + Method method = target.getClass().getMethod(methodName, parameterTypes); + return method.invoke(target, arguments); + } }