01 /*
02 * @COPYRIGHT@
03 */
04 package demo.chatter;
05
06 import com.tc.cluster.DsoClusterTopology;
07 import com.tcclient.cluster.DsoNode;
08
09 import java.util.Map;
10 import java.util.TreeMap;
11
12 /**
13 * Description of the Class
14 *
15 * @author Terracotta, Inc.
16 */
17 class ChatManager {
18
19 private final Map<DsoNode, User> users;
20 private volatile transient ChatListener listener;
21
22 public ChatManager() {
23 this.users = new TreeMap<DsoNode, User>();
24 init();
25 }
26
27 private void init() {
28 this.listener = new NullChatListener();
29 }
30
31 public User[] getCurrentUsers() {
32 synchronized (users) {
33 return users.values().toArray(new User[] {});
34 }
35 }
36
37 public void send(final Message msg) {
38 sendNewMessageEvent(msg);
39 }
40
41 public void registerUser(final User user) {
42 synchronized (users) {
43 users.put(user.getNode(), user);
44 }
45 sendNewUserEvent(user.getName());
46 }
47
48 public void removeUser(final DsoNode node) {
49 synchronized (users) {
50 users.remove(node);
51 }
52 }
53
54 /**
55 * Normally the user list is maintained via cluster events received in each node. This method will ensure that the
56 * list is consistent even if all clients crash simultaneously
57 */
58 public void retainNodes(final DsoClusterTopology topology) {
59 synchronized (users) {
60 users.keySet().retainAll(topology.getNodes());
61 }
62 }
63
64 private void sendNewUserEvent(final String username) {
65 this.listener.newUser(username);
66 }
67
68 private void sendNewMessageEvent(final Message message) {
69 this.listener.newMessage(message);
70 }
71
72 public void setLocalListener(final ChatListener listener) {
73 this.listener = listener;
74 }
75
76 private static class NullChatListener implements ChatListener {
77 public void newMessage(final Message message) {
78 //
79 }
80
81 public void newUser(final String username) {
82 //
83 }
84 }
85
86 }
|