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 d81c7f9af21e..f7b18da40181 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 @@ -703,7 +703,7 @@ else if (handler instanceof ServletHandler) */ public void addServletContainerInitializer(ServletContainerInitializer containerInitializer) { - addManaged(new Initializer(this, containerInitializer)); + addServletContainerInitializer(containerInitializer, Collections.emptySet()); } /** diff --git a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientShutdown.java b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientShutdown.java index ed73c3076420..481b2b701fc4 100644 --- a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientShutdown.java +++ b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientShutdown.java @@ -29,7 +29,7 @@ public class JavaxWebSocketClientShutdown extends ContainerLifeCycle implements @Override public void onStartup(Set> c, ServletContext ctx) throws ServletException { - JavaxWebSocketClientContainer.SHUTDOWN_CONTAINER.compareAndSet(null, this); + JavaxWebSocketClientContainer.initialize(this); ctx.addListener(this); } @@ -44,5 +44,6 @@ public void contextDestroyed(ServletContextEvent sce) { LifeCycle.stop(this); removeBeans(); + JavaxWebSocketClientContainer.initialize(null); } } diff --git a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java index 196cff6de833..bc3bd9508bc5 100644 --- a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java +++ b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java @@ -60,7 +60,12 @@ public class JavaxWebSocketClientContainer extends JavaxWebSocketContainer implements javax.websocket.WebSocketContainer { private static final Logger LOG = LoggerFactory.getLogger(JavaxWebSocketClientContainer.class); - public static final AtomicReference SHUTDOWN_CONTAINER = new AtomicReference<>(); + private static final AtomicReference SHUTDOWN_CONTAINER = new AtomicReference<>(); + + public static void initialize(ContainerLifeCycle container) + { + SHUTDOWN_CONTAINER.set(container); + } protected WebSocketCoreClient coreClient; protected Function coreClientFactory; @@ -282,6 +287,12 @@ private ClientEndpointConfig getAnnotatedConfig(Object endpoint) throws Deployme return new AnnotatedClientEndpointConfig(anno); } + @Override + protected void doStop() throws Exception + { + super.doStop(); + } + @Override protected void doStart() throws Exception { 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 6043082d3896..476b333ca6dc 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,7 +15,6 @@ 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; @@ -52,7 +51,17 @@ 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; + private final Configurator configurator; + + public JavaxWebSocketServletContainerInitializer() + { + this(null); + } + + public JavaxWebSocketServletContainerInitializer(Configurator configurator) + { + this.configurator = configurator; + } /** * Test a ServletContext for {@code init-param} or {@code attribute} at {@code keyName} for @@ -98,28 +107,7 @@ public static void configure(ServletContextHandler context, Configurator configu { if (!context.isStopped()) throw new IllegalStateException("configure should be called before starting"); - - // In this embedded-jetty usage, allow ServletContext.addListener() to - // add other ServletContextListeners (such as the ContextDestroyListener) after - // the initialization phase is over. (important for this SCI to function) - context.getServletContext().setExtendedListenerTypes(true); - - context.addServletContainerInitializer(new JavaxWebSocketServletContainerInitializer() - .afterStartup((servletContext) -> - { - JavaxWebSocketServerContainer serverContainer = JavaxWebSocketServerContainer.getContainer(servletContext); - if (configurator != null) - { - try - { - configurator.accept(servletContext, serverContainer); - } - catch (DeploymentException e) - { - throw new RuntimeException("Failed to deploy WebSocket Endpoint", e); - } - } - })); + context.addServletContainerInitializer(new JavaxWebSocketServletContainerInitializer(configurator)); } /** @@ -273,8 +261,18 @@ public void onStartup(Set> c, ServletContext context) throws ServletExc } } - if (afterStartupConsumer != null) - afterStartupConsumer.accept(context); + // Call the configurator after startup. + if (configurator != null) + { + try + { + configurator.accept(context, container); + } + catch (DeploymentException e) + { + throw new RuntimeException("Failed to deploy WebSocket Endpoint", e); + } + } } @SuppressWarnings("unchecked") @@ -301,17 +299,4 @@ 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-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 d81763b37656..d843b2c4edb3 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,7 +14,6 @@ package org.eclipse.jetty.websocket.server.config; import java.util.Set; -import java.util.function.Consumer; import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; @@ -32,7 +31,17 @@ public class JettyWebSocketServletContainerInitializer implements ServletContainerInitializer { private static final Logger LOG = LoggerFactory.getLogger(JettyWebSocketServletContainerInitializer.class); - private Consumer afterStartupConsumer; + private final Configurator configurator; + + public JettyWebSocketServletContainerInitializer() + { + this(null); + } + + public JettyWebSocketServletContainerInitializer(Configurator configurator) + { + this.configurator = configurator; + } public interface Configurator { @@ -51,16 +60,7 @@ public static void configure(ServletContextHandler context, Configurator configu { if (!context.isStopped()) throw new IllegalStateException("configure should be called before starting"); - - context.addServletContainerInitializer(new JettyWebSocketServletContainerInitializer() - .afterStartup((servletContext) -> - { - if (configurator != null) - { - JettyWebSocketServerContainer container = JettyWebSocketServerContainer.getContainer(servletContext); - configurator.accept(servletContext, container); - } - })); + context.addServletContainerInitializer(new JettyWebSocketServletContainerInitializer()); } /** @@ -101,20 +101,9 @@ public void onStartup(Set> c, ServletContext context) 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; + if (configurator != null) + { + configurator.accept(context, container); + } } } diff --git a/tests/test-cdi/src/test/java/org/eclipse/jetty/cdi/tests/EmbeddedWeldTest.java b/tests/test-cdi/src/test/java/org/eclipse/jetty/cdi/tests/EmbeddedWeldTest.java index f0d6d5271f7c..d04c062228ad 100644 --- a/tests/test-cdi/src/test/java/org/eclipse/jetty/cdi/tests/EmbeddedWeldTest.java +++ b/tests/test-cdi/src/test/java/org/eclipse/jetty/cdi/tests/EmbeddedWeldTest.java @@ -103,29 +103,29 @@ public static Server createServerWithServletContext(String mode) case "CdiServletContainerInitializer+Listener": // Expect:INFO: WELD-ENV-001213: Jetty CDI SPI support detected, CDI injection will be available in Listeners, Servlets and Filters. - context.addBean(new ServletContextHandler.Initializer(context, new CdiServletContainerInitializer())); + context.addServletContainerInitializer(new CdiServletContainerInitializer()); context.addEventListener(new org.jboss.weld.environment.servlet.Listener()); break; case "CdiServletContainerInitializer(CdiDecoratingListener)+Listener": // Expect:INFO: WELD-ENV-001212: Jetty CdiDecoratingListener support detected, CDI injection will be available in Listeners, Servlets and Filters context.setInitParameter(CdiServletContainerInitializer.CDI_INTEGRATION_ATTRIBUTE, CdiDecoratingListener.MODE); - context.addBean(new ServletContextHandler.Initializer(context, new CdiServletContainerInitializer())); + context.addServletContainerInitializer(new CdiServletContainerInitializer()); context.addEventListener(new org.jboss.weld.environment.servlet.Listener()); break; case "CdiServletContainerInitializer+EnhancedListener": // Expect:INFO: WELD-ENV-001213: Jetty CDI SPI support detected, CDI injection will be available in Listeners, Servlets and Filters. - context.addBean(new ServletContextHandler.Initializer(context, new CdiServletContainerInitializer())); - context.addBean(new ServletContextHandler.Initializer(context, new org.jboss.weld.environment.servlet.EnhancedListener())); + context.addServletContainerInitializer(new CdiServletContainerInitializer()); + context.addServletContainerInitializer(new org.jboss.weld.environment.servlet.EnhancedListener()); break; // NOTE: This is the preferred mode from the Weld team. case "CdiServletContainerInitializer(CdiDecoratingListener)+EnhancedListener": // Expect:INFO: WELD-ENV-001212: Jetty CdiDecoratingListener support detected, CDI injection will be available in Listeners, Servlets and Filters context.setInitParameter(CdiServletContainerInitializer.CDI_INTEGRATION_ATTRIBUTE, CdiDecoratingListener.MODE); - context.addBean(new ServletContextHandler.Initializer(context, new CdiServletContainerInitializer())); - context.addBean(new ServletContextHandler.Initializer(context, new org.jboss.weld.environment.servlet.EnhancedListener())); + context.addServletContainerInitializer(new CdiServletContainerInitializer()); + context.addServletContainerInitializer(new org.jboss.weld.environment.servlet.EnhancedListener()); break; } @@ -190,8 +190,8 @@ public void testWebappContext() throws Exception server.setHandler(webapp); webapp.setInitParameter(CdiServletContainerInitializer.CDI_INTEGRATION_ATTRIBUTE, CdiDecoratingListener.MODE); - webapp.addBean(new ServletContextHandler.Initializer(webapp, new CdiServletContainerInitializer())); - webapp.addBean(new ServletContextHandler.Initializer(webapp, new org.jboss.weld.environment.servlet.EnhancedListener())); + webapp.addServletContainerInitializer(new CdiServletContainerInitializer()); + webapp.addServletContainerInitializer(new org.jboss.weld.environment.servlet.EnhancedListener()); String pkg = EmbeddedWeldTest.class.getPackage().getName(); webapp.getServerClassMatcher().add("-" + pkg + ".");