Browse Source

Merge pull request #479 from csmith/master

Make the WebSocketController subscribe to events.
pull/480/head
Greg Holmes 8 years ago
parent
commit
b2635d875f

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

22
 
22
 
23
 package com.dmdirc.addons.ui_web2;
23
 package com.dmdirc.addons.ui_web2;
24
 
24
 
25
+import com.dmdirc.DMDircMBassador;
26
+
25
 import java.io.IOException;
27
 import java.io.IOException;
26
 import java.util.Collection;
28
 import java.util.Collection;
27
 import java.util.concurrent.CopyOnWriteArrayList;
29
 import java.util.concurrent.CopyOnWriteArrayList;
30
+import java.util.concurrent.atomic.AtomicBoolean;
28
 
31
 
29
 import javax.inject.Inject;
32
 import javax.inject.Inject;
30
 import javax.inject.Singleton;
33
 import javax.inject.Singleton;
41
 public class WebSocketController {
44
 public class WebSocketController {
42
 
45
 
43
     private final Collection<Session> sessions = new CopyOnWriteArrayList<>();
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
     private final InitialStateProducer initialStateProducer;
50
     private final InitialStateProducer initialStateProducer;
45
 
51
 
46
     @Inject
52
     @Inject
47
-    public WebSocketController(final InitialStateProducer initialStateProducer) {
53
+    public WebSocketController(final DMDircMBassador eventBus, final InitialStateProducer initialStateProducer) {
54
+        this.eventBus = eventBus;
48
         this.initialStateProducer = initialStateProducer;
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
     void sessionConnected(final Session session) {
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
         sendMessage(session, initialStateProducer.getInitialState());
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
     void sessionClosed(final Session session, final int statusCode, final String reason) {
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
     void messageReceived(final Session session, final String message) {
97
     void messageReceived(final Session session, final String message) {
61
         // Echo the message back for testing
98
         // Echo the message back for testing
62
         sendMessage(session, message);
99
         sendMessage(session, message);
68
      * @param session The session to send a message to.
105
      * @param session The session to send a message to.
69
      * @param message The message to be sent.
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
         try {
109
         try {
73
             WebSocketHandler.sendMessage(session, message);
110
             WebSocketHandler.sendMessage(session, message);
74
         } catch (IOException ex) {
111
         } catch (IOException ex) {
81
      *
118
      *
82
      * @param message The message to be sent.
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
         sessions.forEach(s -> sendMessage(s, message));
122
         sessions.forEach(s -> sendMessage(s, message));
86
     }
123
     }
87
 
124
 

Loading…
Cancel
Save