You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2017/03/07 17:45:55 UTC
[4/5] cxf git commit: Update to jetty 9.3.14,
update websocket code to remove most reflection
Update to jetty 9.3.14, update websocket code to remove most reflection
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/81f8c3b6
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/81f8c3b6
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/81f8c3b6
Branch: refs/heads/master
Commit: 81f8c3b6c0c283ec2370e4987d21f600a80b19d0
Parents: 97a8751
Author: Daniel Kulp <dk...@apache.org>
Authored: Tue Mar 7 11:36:01 2017 -0500
Committer: Daniel Kulp <dk...@apache.org>
Committed: Tue Mar 7 12:45:35 2017 -0500
----------------------------------------------------------------------
parent/pom.xml | 7 +-
rt/transports/websocket/pom.xml | 5 +
.../jetty9/Jetty9WebSocketDestination.java | 107 ++++++++++---------
.../websocket/jetty9/JettyWebSocketHandler.java | 13 ++-
.../jaxrs/JAXRSClientServerBookTest.java | 5 +-
5 files changed, 79 insertions(+), 58 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/81f8c3b6/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 1ff076d..569a0bd 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -118,9 +118,12 @@
<cxf.joda.time.version>2.9.4</cxf.joda.time.version>
<cxf.jdom.version>1.0</cxf.jdom.version>
<cxf.jettison.version>1.3.8</cxf.jettison.version>
- <cxf.jetty9.version>9.3.5.v20151012</cxf.jetty9.version>
+ <cxf.jetty9.version>9.3.14.v20161028</cxf.jetty9.version>
+ <!-- Jetty 9.3.15 breaks atmosphere, don't upgrade until new version of
+ atmosphere is available -->
+ <!--cxf.jetty9.version>9.3.16.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>[9.2,10)</cxf.jetty.osgi.version>
<cxf.undertow.version>1.4.11.Final</cxf.undertow.version>
<cxf.undertow.osgi.version>[1.3, 1.5)</cxf.undertow.osgi.version>
<cxf.junit.version>4.12</cxf.junit.version>
http://git-wip-us.apache.org/repos/asf/cxf/blob/81f8c3b6/rt/transports/websocket/pom.xml
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/pom.xml b/rt/transports/websocket/pom.xml
index b476c85..e14afb1 100644
--- a/rt/transports/websocket/pom.xml
+++ b/rt/transports/websocket/pom.xml
@@ -135,6 +135,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>
<optional>true</optional>
</dependency>
http://git-wip-us.apache.org/repos/asf/cxf/blob/81f8c3b6/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 1b49d95..2c332ff 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,43 +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 == null ? null : new URL(getNonWSAddress(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
- }
executor = bus.getExtension(WorkQueueManager.class).getAutomaticWorkQueue();
}
@@ -125,13 +98,17 @@ 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);
}
+
private static String getNonWSAddress(EndpointInfo endpointInfo) {
String address = endpointInfo.getAddress();
if (address.startsWith("ws")) {
@@ -143,29 +120,54 @@ public class Jetty9WebSocketDestination extends JettyHTTPDestination implements
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) {
@@ -182,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) {
@@ -346,4 +348,5 @@ public class Jetty9WebSocketDestination extends JettyHTTPDestination implements
}
}
+
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/81f8c3b6/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 cd9dd28..03cb2b4 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
@@ -33,12 +33,19 @@ import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
* The extended version of JettyHTTPHandler that can support websocket.
*/
class JettyWebSocketHandler extends JettyHTTPHandler {
- final WebSocketServletFactory webSocketFactory;
+ final Jetty9WebSocketDestination webSocketDestination;
+ WebSocketServletFactory webSocketFactory;
JettyWebSocketHandler(JettyHTTPDestination jhd, boolean cmExact,
- WebSocketServletFactory webSocketFactory) {
+ 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/81f8c3b6/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 e41b3b3..0b8792b 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.ext.logging.LoggingFeature;
import org.apache.cxf.ext.logging.LoggingInInterceptor;
import org.apache.cxf.helpers.IOUtils;
@@ -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();
}