|
@@ -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
|
|