Bläddra i källkod

Merge pull request #478 from csmith/master

Web UI work.
pull/479/head
Greg Holmes 7 år sedan
förälder
incheckning
1ece091d03

+ 1
- 1
build.gradle Visa fil

@@ -103,7 +103,7 @@ subprojects {
103 103
         }
104 104
 
105 105
         from { configurations.bundle.minus(configurations.provided).collect { it.isDirectory() ? it : zipTree(it) } } {
106
-            exclude 'META-INF/**'
106
+            exclude 'META-INF/*'
107 107
         }
108 108
     }
109 109
 

+ 6
- 2
ui_web2/build.gradle Visa fil

@@ -1,4 +1,8 @@
1 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
 }

+ 4
- 2
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/InitialStateProducer.java Visa fil

@@ -22,7 +22,7 @@
22 22
 
23 23
 package com.dmdirc.addons.ui_web2;
24 24
 
25
-import com.dmdirc.addons.ui_web2.serialisers.BackBufferSerializer;
25
+import com.dmdirc.addons.ui_web2.serialisers.BackBufferSimpleSerializer;
26 26
 import com.dmdirc.addons.ui_web2.serialisers.WindowModelSerialiser;
27 27
 import com.dmdirc.interfaces.WindowModel;
28 28
 import com.dmdirc.ui.WindowManager;
@@ -50,7 +50,7 @@ public class InitialStateProducer {
50 50
             final WindowModelSerialiser windowSerialiser) {
51 51
         serialiser = new GsonBuilder()
52 52
                 .registerTypeHierarchyAdapter(WindowModel.class, windowSerialiser)
53
-                .registerTypeAdapter(BackBuffer.class, new BackBufferSerializer())
53
+                .registerTypeAdapter(BackBuffer.class, new BackBufferSimpleSerializer())
54 54
                 .create();
55 55
         this.windowManager = windowManager;
56 56
     }
@@ -60,6 +60,7 @@ public class InitialStateProducer {
60 60
         return serialiser.toJson(state);
61 61
     }
62 62
 
63
+    /** Class to serialize and pass to the client with initial state. */
63 64
     private static class InitialState {
64 65
 
65 66
         private final Collection<WindowModel> windows;
@@ -71,6 +72,7 @@ public class InitialStateProducer {
71 72
         public Collection<WindowModel> getWindows() {
72 73
             return Collections.unmodifiableCollection(windows);
73 74
         }
75
+
74 76
     }
75 77
 
76 78
 }

+ 73
- 6
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/WebServer.java Visa fil

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

+ 1
- 2
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/serialisers/BackBufferSerializer.java Visa fil

@@ -38,8 +38,7 @@ import java.lang.reflect.Type;
38 38
 public class BackBufferSerializer implements JsonSerializer<BackBuffer> {
39 39
 
40 40
     @Override
41
-    public JsonElement serialize(final BackBuffer src, final Type typeOfSrc,
42
-            final JsonSerializationContext context) {
41
+    public JsonElement serialize(final BackBuffer src, final Type typeOfSrc, final JsonSerializationContext context) {
43 42
         final JsonArray res = new JsonArray();
44 43
         final IRCDocument document = src.getDocument();
45 44
         for (int i = 0; i < document.getNumLines(); i++) {

+ 24
- 0
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/serialisers/BackBufferSimpleSerializer.java Visa fil

@@ -0,0 +1,24 @@
1
+package com.dmdirc.addons.ui_web2.serialisers;
2
+
3
+import com.dmdirc.ui.messages.BackBuffer;
4
+
5
+import com.google.gson.JsonElement;
6
+import com.google.gson.JsonObject;
7
+import com.google.gson.JsonSerializationContext;
8
+import com.google.gson.JsonSerializer;
9
+
10
+import java.lang.reflect.Type;
11
+
12
+/**
13
+ * Serializes a {@link BackBuffer} without including the full content.
14
+ */
15
+public class BackBufferSimpleSerializer implements JsonSerializer<BackBuffer> {
16
+
17
+    @Override
18
+    public JsonElement serialize(final BackBuffer src, final Type typeOfSrc, final JsonSerializationContext context) {
19
+        final JsonObject res = new JsonObject();
20
+        res.addProperty("lines", src.getDocument().getNumLines());
21
+        return res;
22
+    }
23
+
24
+}

+ 2
- 2
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/serialisers/WindowModelSerialiser.java Visa fil

@@ -47,9 +47,9 @@ public class WindowModelSerialiser implements JsonSerializer<WindowModel> {
47 47
     }
48 48
 
49 49
     @Override
50
-    public JsonElement serialize(final WindowModel src, final Type typeOfSrc,
51
-            final JsonSerializationContext context) {
50
+    public JsonElement serialize(final WindowModel src, final Type typeOfSrc, final JsonSerializationContext context) {
52 51
         final JsonObject res = new JsonObject();
52
+        res.addProperty("id", src.getId());
53 53
         res.addProperty("name", src.getName());
54 54
         res.addProperty("icon", src.getIcon());
55 55
         res.addProperty("title", src.getTitle());

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

@@ -1 +0,0 @@
1
-org.eclipse.jetty.http.Http1FieldPreEncoder

Laddar…
Avbryt
Spara