From e3bab3df22472d172ff79ca46f77da7ea4b2106b Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Fri, 19 May 2017 13:50:40 -0700 Subject: [PATCH] Issue #1528 - Use WebSocketContainer out of current context + Interrogate ServletContext, ContextHandler, and Context for an active ServerContainer before returning a new ClientContainer --- .../jsr356/JettyClientContainerProvider.java | 16 ++++++++++++++ .../jsr356/server/ServerContainer.java | 22 +++++++++++++++++++ .../DelayedStartClientOnServerTest.java | 5 ++--- .../websocket/client/HttpClientProvider.java | 2 +- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java index 56cd4731bd76..f96f15c58555 100644 --- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java +++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java @@ -18,6 +18,8 @@ package org.eclipse.jetty.websocket.jsr356; +import java.lang.reflect.Method; + import javax.websocket.ContainerProvider; import javax.websocket.WebSocketContainer; @@ -66,6 +68,20 @@ protected WebSocketContainer getContainer() { synchronized (lock) { + try + { + Class clazzServerContainer = Class.forName("org.eclipse.jetty.websocket.jsr356.server.ServerContainer"); + Method method = clazzServerContainer.getMethod("getWebSocketContainer"); + WebSocketContainer container = (WebSocketContainer) method.invoke(null); + if (container != null) + { + return container; + } + } + catch (Throwable ignore) + { + } + if (INSTANCE == null) { INSTANCE = new ClientContainer(); diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java index 6ac98ca30f2a..d5fe59018a4c 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java +++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java @@ -50,6 +50,28 @@ public class ServerContainer extends ClientContainer implements javax.websocket. { private static final Logger LOG = Log.getLogger(ServerContainer.class); + /** + * Get the WebSocketContainer out of the current ThreadLocal reference + * of the active ContextHandler. + * + * @return the WebSocketContainer if found, null if not found. + */ + public static WebSocketContainer getWebSocketContainer() + { + ContextHandler.Context context = ContextHandler.getCurrentContext(); + if (context == null) + return null; + + ContextHandler handler = ContextHandler.getContextHandler(context); + if (handler == null) + return null; + + if (!(handler instanceof ServletContextHandler)) + return null; + + return (javax.websocket.WebSocketContainer) handler.getServletContext().getAttribute("javax.websocket.server.ServerContainer"); + } + private final NativeWebSocketConfiguration configuration; private List> deferredEndpointClasses; private List deferredEndpointConfigs; diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DelayedStartClientOnServerTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DelayedStartClientOnServerTest.java index cc5a05fe7cb5..24d854187cb7 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DelayedStartClientOnServerTest.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DelayedStartClientOnServerTest.java @@ -55,7 +55,6 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.websocket.api.util.WSURI; -import org.eclipse.jetty.websocket.jsr356.ClientContainer; import org.eclipse.jetty.websocket.jsr356.JettyClientContainerProvider; import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; import org.junit.Before; @@ -254,7 +253,7 @@ public void testHttpClientThreads_AfterClientConnectTo() throws Exception assertThat("Response", response, startsWith("Connected to ws://")); List threadNames = getThreadNames(); assertNoHttpClientPoolThreads(threadNames); - assertThat("Threads", threadNames, hasItem(containsString("WebSocketContainer@"))); + assertThat("Threads", threadNames, hasItem(containsString("WebSocketClient@"))); } finally { @@ -301,7 +300,7 @@ public void testHttpClientThreads_AfterClientConfigure() throws Exception { server.start(); String response = GET(server.getURI().resolve("/configure")); - assertThat("Response", response, startsWith("Configured " + ClientContainer.class.getName())); + assertThat("Response", response, startsWith("Configured " + ServerContainer.class.getName())); List threadNames = getThreadNames(); assertNoHttpClientPoolThreads(threadNames); assertThat("Threads", threadNames, not(hasItem(containsString("WebSocketContainer@")))); diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/HttpClientProvider.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/HttpClientProvider.java index ede9dcb0eb5b..d9cc025b418a 100644 --- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/HttpClientProvider.java +++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/HttpClientProvider.java @@ -43,7 +43,7 @@ public static HttpClient get(WebSocketContainerScope scope) } catch (Throwable ignore) { - Log.getLogger(HttpClientProvider.class).warn(ignore); + Log.getLogger(HttpClientProvider.class).ignore(ignore); } return DefaultHttpClientProvider.newHttpClient(scope);