Browse Source

Switch to using Jetty directly.

Spark doesn't work with recent versions, old versions of Jetty
have nasty bugs, and spark doesn't really give us much benefit.
pull/478/head
Chris Smith 8 years ago
parent
commit
f2598af651

+ 6
- 2
ui_web2/build.gradle View File

1
 dependencies {
1
 dependencies {
2
-  bundle group: 'com.sparkjava', name: 'spark-core', version: '2.5'
3
-  bundle group: 'com.google.code.gson', name: 'gson', 'version': '2.5'
2
+    bundle group: 'com.google.code.gson', name: 'gson', version: '2.5'
3
+
4
+    bundle group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.3.9.v20160517'
5
+    bundle group: 'org.eclipse.jetty.websocket', name: 'websocket-server', version: '9.3.9.v20160517'
6
+    bundle group: 'org.eclipse.jetty.websocket', name: 'websocket-servlet', version: '9.3.9.v20160517'
7
+
4
 }
8
 }

+ 62
- 6
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/WebServer.java View File

22
 
22
 
23
 package com.dmdirc.addons.ui_web2;
23
 package com.dmdirc.addons.ui_web2;
24
 
24
 
25
-import spark.Spark;
25
+import com.dmdirc.util.LogUtils;
26
+
27
+import org.eclipse.jetty.server.Handler;
28
+import org.eclipse.jetty.server.Server;
29
+import org.eclipse.jetty.server.handler.DefaultHandler;
30
+import org.eclipse.jetty.server.handler.HandlerList;
31
+import org.eclipse.jetty.server.handler.ResourceHandler;
32
+import org.eclipse.jetty.servlet.ServletContextHandler;
33
+import org.eclipse.jetty.util.resource.Resource;
34
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
35
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
36
+import org.slf4j.Logger;
37
+import org.slf4j.LoggerFactory;
26
 
38
 
27
 /**
39
 /**
28
  * Web server used by the web UI.
40
  * Web server used by the web UI.
29
  */
41
  */
30
 public class WebServer {
42
 public class WebServer {
31
 
43
 
44
+    private static final Logger LOG = LoggerFactory.getLogger(WebServer.class);
45
+
32
     private final int port;
46
     private final int port;
47
+    private Server server;
33
 
48
 
34
     public WebServer(final int port) {
49
     public WebServer(final int port) {
35
         this.port = port;
50
         this.port = port;
36
     }
51
     }
37
 
52
 
38
     public void start() {
53
     public void start() {
39
-        Spark.port(port);
40
-        Spark.webSocket("/ws", WebSocketHandler.class);
41
-        Spark.staticFileLocation("/www");
42
-        Spark.get("/test", (request, response) -> "HELLO");
54
+        server = new Server(port);
55
+
56
+        // Override the context classloader, so that Jetty uses the plugin classloader not the main DMDirc loader.
57
+        final Thread currentThread = Thread.currentThread();
58
+        final ClassLoader classLoader = currentThread.getContextClassLoader();
59
+        currentThread.setContextClassLoader(getClass().getClassLoader());
60
+
61
+        try {
62
+            final ResourceHandler resourceHandler = new ResourceHandler();
63
+            resourceHandler.setWelcomeFiles(new String[]{ "index.html" });
64
+            resourceHandler.setBaseResource(Resource.newClassPathResource("/www"));
65
+
66
+            final ServletContextHandler wsHandler = new ServletContextHandler();
67
+            wsHandler.setContextPath("/");
68
+            wsHandler.addServlet(WebUiWebSocketServlet.class, "/ws");
69
+
70
+            HandlerList handlers = new HandlerList();
71
+            handlers.setHandlers(new Handler[] { resourceHandler, wsHandler, new DefaultHandler() });
72
+            server.setHandler(handlers);
73
+
74
+            server.start();
75
+        } catch (Exception ex) {
76
+            LOG.error(LogUtils.USER_ERROR, "Unable to start web server", ex);
77
+            server = null;
78
+        } finally {
79
+            // Restore the usual context class loader.
80
+            currentThread.setContextClassLoader(classLoader);
81
+        }
43
     }
82
     }
44
 
83
 
45
     public void stop() {
84
     public void stop() {
46
-        Spark.stop();
85
+        try {
86
+            server.stop();
87
+        } catch (Exception ex) {
88
+            LOG.error(LogUtils.USER_ERROR, "Unable to stop web server", ex);
89
+        }
90
+
91
+        server = null;
47
     }
92
     }
48
 
93
 
94
+    /**
95
+     * Web Socket Servlet that creates a {@link WebSocketHandler} for each connection.
96
+     */
97
+    public static class WebUiWebSocketServlet extends WebSocketServlet {
98
+
99
+        @Override
100
+        public void configure(final WebSocketServletFactory factory) {
101
+            factory.register(WebSocketHandler.class);
102
+        }
103
+
104
+    }
49
 }
105
 }

+ 0
- 1
ui_web2/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder View File

1
-org.eclipse.jetty.http.Http1FieldPreEncoder

Loading…
Cancel
Save