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();
         }