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 20:03:15 UTC
[13/15] 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
# 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 <dk...@apache.org>
Authored: Tue Mar 7 11:36:01 2017 -0500
Committer: Daniel Kulp <dk...@apache.org>
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();
}