ChatManager.java
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 }