Update to jetty 9.3.14, update websocket code to remove most reflection # Conflicts: # parent/pom.xml # rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/Jetty9WebSocketDestination.java # rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/JettyWebSocketHandler.java # systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/4b71edb6 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/4b71edb6 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/4b71edb6 Branch: refs/heads/3.1.x-fixes Commit: 4b71edb65b4e24f390b222dbb0cad6f1b533ce66 Parents: 7b8145e Author: Daniel Kulp <[email protected]> Authored: Tue Mar 7 11:36:01 2017 -0500 Committer: Daniel Kulp <[email protected]> Committed: Tue Mar 7 14:11:08 2017 -0500 ---------------------------------------------------------------------- parent/pom.xml | 4 +- rt/transports/websocket/pom.xml | 5 + .../jetty9/Jetty9WebSocketDestination.java | 120 ++++++++++--------- .../websocket/jetty9/JettyWebSocketHandler.java | 19 ++- .../jaxrs/JAXRSClientServerBookTest.java | 5 +- 5 files changed, 88 insertions(+), 65 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/4b71edb6/parent/pom.xml ---------------------------------------------------------------------- diff --git a/parent/pom.xml b/parent/pom.xml index d1eb561..692e15c 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -120,9 +120,9 @@ <cxf.jdom.version>1.0</cxf.jdom.version> <cxf.jettison.version>1.3.8</cxf.jettison.version> <cxf.jetty8.version>8.1.19.v20160209</cxf.jetty8.version> - <cxf.jetty9.version>9.2.15.v20160210</cxf.jetty9.version> + <cxf.jetty9.version>9.2.21.v20170120</cxf.jetty9.version> <cxf.jetty.version>${cxf.jetty9.version}</cxf.jetty.version> - <cxf.jetty.osgi.version>[8.1,10)</cxf.jetty.osgi.version> + <cxf.jetty.osgi.version>[8.1,9.4)</cxf.jetty.osgi.version> <cxf.jibx.version>1.2.6</cxf.jibx.version> <cxf.junit.version>4.12</cxf.junit.version> <cxf.hamcrest.version>1.3</cxf.hamcrest.version> http://git-wip-us.apache.org/repos/asf/cxf/blob/4b71edb6/rt/transports/websocket/pom.xml ---------------------------------------------------------------------- diff --git a/rt/transports/websocket/pom.xml b/rt/transports/websocket/pom.xml index 24f640e..b1afc70 100644 --- a/rt/transports/websocket/pom.xml +++ b/rt/transports/websocket/pom.xml @@ -138,6 +138,11 @@ </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-webapp</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jmx</artifactId> <version>${cxf.jetty8.version}</version> <optional>true</optional> http://git-wip-us.apache.org/repos/asf/cxf/blob/4b71edb6/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/Jetty9WebSocketDestination.java ---------------------------------------------------------------------- diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/Jetty9WebSocketDestination.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/Jetty9WebSocketDestination.java index b0f450b..38006a7 100644 --- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/Jetty9WebSocketDestination.java +++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/Jetty9WebSocketDestination.java @@ -22,9 +22,6 @@ package org.apache.cxf.transport.websocket.jetty9; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.net.URL; import java.nio.ByteBuffer; import java.security.Principal; @@ -43,9 +40,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.cxf.Bus; -import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.logging.LogUtils; -import org.apache.cxf.common.util.ReflectionUtil; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.transport.http.DestinationRegistry; import org.apache.cxf.transport.http_jetty.JettyHTTPDestination; @@ -59,10 +54,12 @@ import org.apache.cxf.transport.websocket.jetty.WebSocketVirtualServletRequest; import org.apache.cxf.transport.websocket.jetty.WebSocketVirtualServletResponse; import org.apache.cxf.workqueue.WorkQueueManager; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.WebSocketAdapter; -import org.eclipse.jetty.websocket.api.WebSocketPolicy; +import org.eclipse.jetty.websocket.server.WebSocketHandler; import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest; import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse; import org.eclipse.jetty.websocket.servlet.WebSocketCreator; @@ -76,41 +73,19 @@ public class Jetty9WebSocketDestination extends JettyHTTPDestination implements private static final Logger LOG = LogUtils.getL7dLogger(Jetty9WebSocketDestination.class); //REVISIT make these keys configurable - private String requestIdKey = WebSocketConstants.DEFAULT_REQUEST_ID_KEY; - private String responseIdKey = WebSocketConstants.DEFAULT_RESPONSE_ID_KEY; + private static final String REQUEST_ID_KEY = WebSocketConstants.DEFAULT_REQUEST_ID_KEY; + private static final String RESPONSE_ID_KEY = WebSocketConstants.DEFAULT_RESPONSE_ID_KEY; - private WebSocketServletFactory webSocketFactory; private final Executor executor; + private WebSocketHandler webSockethandler; + private WebSocketServletFactory webSocketFactory; + public Jetty9WebSocketDestination(Bus bus, DestinationRegistry registry, EndpointInfo ei, JettyHTTPServerEngineFactory serverEngineFactory) throws IOException { - super(bus, registry, ei, serverEngineFactory); - try { - webSocketFactory = (WebSocketServletFactory)ClassLoaderUtils - .loadClass("org.eclipse.jetty.websocket.server.WebSocketServerFactory", - WebSocketServletFactory.class).newInstance(); - - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { - try { - //jetty >9.3.14 - yes.. they change API's in a patch release - Method m = ReflectionUtil.getDeclaredMethod(WebSocketServletFactory.Loader.class, "load", - ServletContext.class, WebSocketPolicy.class); - ReflectionUtil.setAccessible(m); - webSocketFactory = (WebSocketServletFactory)m.invoke(null, new ContextHandler.StaticContext(), null); - } catch (NoSuchMethodException | IllegalAccessException - | IllegalArgumentException | InvocationTargetException e2) { - throw new RuntimeException(e); - } - } - webSocketFactory.setCreator(new Creator()); - - try { - Field f = webSocketFactory.getClass().getDeclaredField("objectFactory"); - f.setAccessible(true); - f.set(webSocketFactory, f.getType().newInstance()); - } catch (Throwable t) { - //ignore, on Jetty <=9.2 this field doesn't exist - } + super(bus, registry, ei, + serverEngineFactory == null ? null : new URL(getNonWSAddress(ei)), + serverEngineFactory); executor = bus.getExtension(WorkQueueManager.class).getAutomaticWorkQueue(); } @@ -123,44 +98,76 @@ public class Jetty9WebSocketDestination extends JettyHTTPDestination implements final ServletContext context, final HttpServletRequest request, final HttpServletResponse response) throws IOException { - if (webSocketFactory.isUpgradeRequest(request, response) - && webSocketFactory.acceptWebSocket(request, response)) { + + WebSocketServletFactory wsf = getWebSocketFactory(config, context); + + if (wsf.isUpgradeRequest(request, response) + && wsf.acceptWebSocket(request, response)) { ((Request)request).setHandled(true); return; } super.invoke(config, context, request, response); } - @Override - protected String getAddress(EndpointInfo endpointInfo) { + + private static String getNonWSAddress(EndpointInfo endpointInfo) { String address = endpointInfo.getAddress(); if (address.startsWith("ws")) { address = "http" + address.substring(2); } return address; } - + @Override + protected String getAddress(EndpointInfo endpointInfo) { + return getNonWSAddress(endpointInfo); + } + + Server getServer(ServletConfig config, ServletContext context) { + WebAppContext.Context c = (WebAppContext.Context)context; + ContextHandler h = c.getContextHandler(); + return h.getServer(); + } + + private WebSocketServletFactory getWebSocketFactory(ServletConfig config, ServletContext context) { + if (webSocketFactory == null) { + Server server = getServer(config, context); + return getWebSocketFactory(server); + } + return webSocketFactory; + } + + public synchronized WebSocketServletFactory getWebSocketFactory(Server server) { + if (webSocketFactory == null) { + webSockethandler = new WebSocketHandler() { + @Override + public void configure(WebSocketServletFactory factory) { + } + }; + try { + webSockethandler.setServer(server); + webSockethandler.start(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + webSocketFactory = webSockethandler.getWebSocketFactory(); + webSocketFactory.setCreator(new Creator()); + } + return webSocketFactory; + } + @Override protected JettyHTTPHandler createJettyHTTPHandler(JettyHTTPDestination jhd, boolean cmExact) { - return new JettyWebSocketHandler(jhd, cmExact, webSocketFactory); + return new JettyWebSocketHandler(jhd, cmExact, this); } @Override public void shutdown() { try { - Method m; - try { - //jetty <9.3.14 - m = ReflectionUtil.getDeclaredMethod(webSocketFactory.getClass(), "cleanup"); - } catch (Throwable t) { - //jetty >= 9.3.14 - m = ReflectionUtil.getDeclaredMethod(webSocketFactory.getClass(), "stop"); - } - m.invoke(webSocketFactory); + webSockethandler.stop(); } catch (Exception e) { - // ignore - } finally { - super.shutdown(); + //nothing needed } + super.shutdown(); } private void invoke(final byte[] data, final int offset, final int length, final Session session) { @@ -177,9 +184,9 @@ public class Jetty9WebSocketDestination extends JettyHTTPDestination implements WebSocketServletHolder holder = new Jetty9WebSocketHolder(session); response = createServletResponse(holder); request = createServletRequest(data, offset, length, holder); - String reqid = request.getHeader(requestIdKey); + String reqid = request.getHeader(REQUEST_ID_KEY); if (reqid != null) { - response.setHeader(responseIdKey, reqid); + response.setHeader(RESPONSE_ID_KEY, reqid); } invoke(null, null, request, response); } catch (InvalidPathException ex) { @@ -341,4 +348,5 @@ public class Jetty9WebSocketDestination extends JettyHTTPDestination implements } } + } http://git-wip-us.apache.org/repos/asf/cxf/blob/4b71edb6/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/JettyWebSocketHandler.java ---------------------------------------------------------------------- diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/JettyWebSocketHandler.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/JettyWebSocketHandler.java index cc24cd0..8e2f478 100644 --- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/JettyWebSocketHandler.java +++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty9/JettyWebSocketHandler.java @@ -32,13 +32,20 @@ import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; /** * The extended version of JettyHTTPHandler that can support websocket. */ -class JettyWebSocketHandler extends JettyHTTPHandler { - final WebSocketServletFactory webSocketFactory; - - JettyWebSocketHandler(JettyHTTPDestination jhd, boolean cmExact, - WebSocketServletFactory webSocketFactory) { +class JettyWebSocketHandler extends JettyHTTPHandler { + final Jetty9WebSocketDestination webSocketDestination; + WebSocketServletFactory webSocketFactory; + + JettyWebSocketHandler(JettyHTTPDestination jhd, boolean cmExact, + Jetty9WebSocketDestination wsd) { super(jhd, cmExact); - this.webSocketFactory = webSocketFactory; + this.webSocketDestination = wsd; + } + + @Override + public void doStart() throws Exception { + webSocketFactory = webSocketDestination.getWebSocketFactory(this.getServer()); + super.doStart(); } @Override http://git-wip-us.apache.org/repos/asf/cxf/blob/4b71edb6/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java ---------------------------------------------------------------------- diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java index f7e78b7..c458902 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java @@ -60,6 +60,7 @@ import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.PutMethod; import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.commons.lang3.StringUtils; import org.apache.cxf.feature.LoggingFeature; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.interceptor.LoggingInInterceptor; @@ -960,7 +961,9 @@ public class JAXRSClientServerBookTest extends AbstractBusClientServerTestBase { int result = httpClient.executeMethod(get); assertEquals(500, result); String content = getStringFromInputStream(get.getResponseBodyAsStream()); - assertTrue(content.contains("Error") && content.contains("500")); + if (!StringUtils.isEmpty(content)) { + assertTrue(content, content.contains("Error") && content.contains("500")); + } } finally { get.releaseConnection(); }
