diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java index 8a1bf1c3bec1..d81c7f9af21e 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java @@ -696,6 +696,27 @@ else if (handler instanceof ServletHandler) relinkHandlers(); } + /** + * Utility Method to allow for manual execution of {@link javax.servlet.ServletContainerInitializer} when using Embedded Jetty. + * @param containerInitializer the ServletContainerInitializer to register. + * @see Initializer + */ + public void addServletContainerInitializer(ServletContainerInitializer containerInitializer) + { + addManaged(new Initializer(this, containerInitializer)); + } + + /** + * Utility Method to allow for manual execution of {@link javax.servlet.ServletContainerInitializer} when using Embedded Jetty. + * @param containerInitializer the ServletContainerInitializer to register. + * @param classes the Set of application classes. + * @see Initializer + */ + public void addServletContainerInitializer(ServletContainerInitializer containerInitializer, Set> classes) + { + addManaged(new Initializer(this, containerInitializer, classes)); + } + /** * The DecoratedObjectFactory for use by IoC containers (weld / spring / etc) * diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/listener/ContainerInitializer.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/listener/ContainerInitializer.java index 474f9b3bfcfd..a58ad05abd09 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/listener/ContainerInitializer.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/listener/ContainerInitializer.java @@ -25,7 +25,9 @@ /** * Utility Methods for manual execution of {@link javax.servlet.ServletContainerInitializer} when * using Embedded Jetty. + * @deprecated use {@link org.eclipse.jetty.servlet.ServletContextHandler#addServletContainerInitializer(ServletContainerInitializer)}. */ +@Deprecated public final class ContainerInitializer { /** diff --git a/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java b/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java index f0e27b3cd168..6043082d3896 100644 --- a/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java +++ b/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java @@ -15,6 +15,7 @@ import java.util.HashSet; import java.util.Set; +import java.util.function.Consumer; import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -28,7 +29,6 @@ import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.listener.ContainerInitializer; import org.eclipse.jetty.util.TypeUtil; import org.eclipse.jetty.util.thread.ThreadClassLoaderScope; import org.eclipse.jetty.websocket.core.WebSocketComponents; @@ -52,6 +52,8 @@ public class JavaxWebSocketServletContainerInitializer implements ServletContain public static final String HTTPCLIENT_ATTRIBUTE = "org.eclipse.jetty.websocket.javax.HttpClient"; private static final Logger LOG = LoggerFactory.getLogger(JavaxWebSocketServletContainerInitializer.class); + private Consumer afterStartupConsumer; + /** * Test a ServletContext for {@code init-param} or {@code attribute} at {@code keyName} for * true or false setting that determines if the specified feature is enabled (or not). @@ -102,7 +104,7 @@ public static void configure(ServletContextHandler context, Configurator configu // the initialization phase is over. (important for this SCI to function) context.getServletContext().setExtendedListenerTypes(true); - context.addEventListener(ContainerInitializer.asContextListener(new JavaxWebSocketServletContainerInitializer()) + context.addServletContainerInitializer(new JavaxWebSocketServletContainerInitializer() .afterStartup((servletContext) -> { JavaxWebSocketServerContainer serverContainer = JavaxWebSocketServerContainer.getContainer(servletContext); @@ -270,6 +272,9 @@ public void onStartup(Set> c, ServletContext context) throws ServletExc } } } + + if (afterStartupConsumer != null) + afterStartupConsumer.accept(context); } @SuppressWarnings("unchecked") @@ -296,4 +301,17 @@ private void filterClasses(Set> c, Set> disco } } } + + /** + * Add a optional consumer to execute once the {@link ServletContainerInitializer#onStartup(Set, ServletContext)} has + * been called successfully. + * + * @param consumer the consumer to execute after the SCI has executed + * @return this configured {@link JavaxWebSocketServletContainerInitializer} instance. + */ + public JavaxWebSocketServletContainerInitializer afterStartup(Consumer consumer) + { + this.afterStartupConsumer = consumer; + return this; + } } diff --git a/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/ClientInWebappTest.java b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/ClientInWebappTest.java index a85793ea76ab..5973ee59456e 100644 --- a/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/ClientInWebappTest.java +++ b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/ClientInWebappTest.java @@ -30,7 +30,6 @@ import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.servlet.listener.ContainerInitializer; import org.eclipse.jetty.websocket.javax.client.JavaxWebSocketClientShutdown; import org.eclipse.jetty.websocket.javax.client.internal.JavaxWebSocketClientContainer; import org.junit.jupiter.api.AfterEach; @@ -73,8 +72,7 @@ public void before() throws Exception server.setHandler(contextHandler); // Because we are using embedded we must manually add the Javax WS Client Shutdown SCI. - // TODO: fix to not use ContainerInitializer.asContextListener - contextHandler.addEventListener(ContainerInitializer.asContextListener(new JavaxWebSocketClientShutdown())); + contextHandler.addServletContainerInitializer(new JavaxWebSocketClientShutdown()); server.start(); serverUri = WSURI.toWebsocket(server.getURI()); diff --git a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java index 37a86b318096..d81763b37656 100644 --- a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java +++ b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java @@ -14,11 +14,11 @@ package org.eclipse.jetty.websocket.server.config; import java.util.Set; +import java.util.function.Consumer; import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.listener.ContainerInitializer; import org.eclipse.jetty.websocket.core.WebSocketComponents; import org.eclipse.jetty.websocket.core.server.WebSocketMappings; import org.eclipse.jetty.websocket.core.server.WebSocketServerComponents; @@ -32,6 +32,7 @@ public class JettyWebSocketServletContainerInitializer implements ServletContainerInitializer { private static final Logger LOG = LoggerFactory.getLogger(JettyWebSocketServletContainerInitializer.class); + private Consumer afterStartupConsumer; public interface Configurator { @@ -51,17 +52,15 @@ public static void configure(ServletContextHandler context, Configurator configu if (!context.isStopped()) throw new IllegalStateException("configure should be called before starting"); - context.addEventListener( - ContainerInitializer - .asContextListener(new JettyWebSocketServletContainerInitializer()) - .afterStartup((servletContext) -> + context.addServletContainerInitializer(new JettyWebSocketServletContainerInitializer() + .afterStartup((servletContext) -> + { + if (configurator != null) { - if (configurator != null) - { - JettyWebSocketServerContainer container = JettyWebSocketServerContainer.getContainer(servletContext); - configurator.accept(servletContext, container); - } - })); + JettyWebSocketServerContainer container = JettyWebSocketServerContainer.getContainer(servletContext); + configurator.accept(servletContext, container); + } + })); } /** @@ -101,5 +100,21 @@ public void onStartup(Set> c, ServletContext context) JettyWebSocketServerContainer container = JettyWebSocketServletContainerInitializer.initialize(contextHandler); if (LOG.isDebugEnabled()) LOG.debug("onStartup {}", container); + + if (afterStartupConsumer != null) + afterStartupConsumer.accept(context); + } + + /** + * Add a optional consumer to execute once the {@link ServletContainerInitializer#onStartup(Set, ServletContext)} has + * been called successfully. + * + * @param consumer the consumer to execute after the SCI has executed + * @return this configured {@link JettyWebSocketServletContainerInitializer} instance. + */ + public JettyWebSocketServletContainerInitializer afterStartup(Consumer consumer) + { + this.afterStartupConsumer = consumer; + return this; } }