Browse Source

Make the WebSocketController subscribe to events.

pull/479/head
Chris Smith 7 years ago
parent
commit
06f4c1ff6b

+ 42
- 5
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/WebSocketController.java View File

@@ -22,9 +22,12 @@
22 22
 
23 23
 package com.dmdirc.addons.ui_web2;
24 24
 
25
+import com.dmdirc.DMDircMBassador;
26
+
25 27
 import java.io.IOException;
26 28
 import java.util.Collection;
27 29
 import java.util.concurrent.CopyOnWriteArrayList;
30
+import java.util.concurrent.atomic.AtomicBoolean;
28 31
 
29 32
 import javax.inject.Inject;
30 33
 import javax.inject.Singleton;
@@ -41,22 +44,56 @@ import org.eclipse.jetty.websocket.api.Session;
41 44
 public class WebSocketController {
42 45
 
43 46
     private final Collection<Session> sessions = new CopyOnWriteArrayList<>();
47
+    private final Object sessionLock = new Object();
48
+    private final AtomicBoolean subscribed = new AtomicBoolean(false);
49
+    private final DMDircMBassador eventBus;
44 50
     private final InitialStateProducer initialStateProducer;
45 51
 
46 52
     @Inject
47
-    public WebSocketController(final InitialStateProducer initialStateProducer) {
53
+    public WebSocketController(final DMDircMBassador eventBus, final InitialStateProducer initialStateProducer) {
54
+        this.eventBus = eventBus;
48 55
         this.initialStateProducer = initialStateProducer;
49 56
     }
50 57
 
58
+    /**
59
+     * Handles a session connected event raised by a {@link WebSocketHandler}.
60
+     *
61
+     * @param session The session that is now connected.
62
+     */
51 63
     void sessionConnected(final Session session) {
52
-        sessions.add(session);
64
+        synchronized (sessionLock) {
65
+            if (!subscribed.getAndSet(true)) {
66
+                eventBus.subscribe(this);
67
+            }
68
+
69
+            sessions.add(session);
70
+        }
71
+
53 72
         sendMessage(session, initialStateProducer.getInitialState());
54 73
     }
55 74
 
75
+    /**
76
+     * Handles a session closed event raised by a {@link WebSocketHandler}.
77
+     *
78
+     * @param session The session that is now closed.
79
+     * @param statusCode The status code returned.
80
+     * @param reason The reason for quitting.
81
+     */
56 82
     void sessionClosed(final Session session, final int statusCode, final String reason) {
57
-        sessions.remove(session);
83
+        synchronized (sessionLock) {
84
+            sessions.remove(session);
85
+            if (sessions.isEmpty() && subscribed.getAndSet(false)) {
86
+                eventBus.unsubscribe(this);
87
+            }
88
+        }
58 89
     }
59 90
 
91
+    /**
92
+     * Handles a message received event raised by a {@link WebSocketHandler}.
93
+     *
94
+     * @param session The session that the message is sent on.
95
+     * @param message The message that was received.
96
+     */
60 97
     void messageReceived(final Session session, final String message) {
61 98
         // Echo the message back for testing
62 99
         sendMessage(session, message);
@@ -68,7 +105,7 @@ public class WebSocketController {
68 105
      * @param session The session to send a message to.
69 106
      * @param message The message to be sent.
70 107
      */
71
-    public void sendMessage(final Session session, final String message) {
108
+    private void sendMessage(final Session session, final String message) {
72 109
         try {
73 110
             WebSocketHandler.sendMessage(session, message);
74 111
         } catch (IOException ex) {
@@ -81,7 +118,7 @@ public class WebSocketController {
81 118
      *
82 119
      * @param message The message to be sent.
83 120
      */
84
-    public void sendMessage(final String message) {
121
+    private void sendMessage(final String message) {
85 122
         sessions.forEach(s -> sendMessage(s, message));
86 123
     }
87 124
 

Loading…
Cancel
Save