ChatManager.java
01 /**
02  *
03  * All content copyright (c) 2003-2008 Terracotta, Inc.,
04  * except as may otherwise be noted in a separate copyright notice.
05  * All rights reserved.
06  *
07  */
08 package demo.chatter;
09 
10 import java.util.Map;
11 import java.util.TreeMap;
12 
13 /**
14  *  Description of the Class
15  *
16  *@author    Terracotta, Inc.
17  */
18 class ChatManager {
19 
20    private final Map<String, User> users;
21    private transient volatile ChatListener listener;
22 
23    public ChatManager() {
24       this.users = new TreeMap<String, User>();
25       init();
26    }
27 
28    public void setLocalListener(ChatListener listener) {
29       this.listener = listener;
30    }
31 
32    public User[] getCurrentUsers() {
33       synchronized (users) {
34          return users.values().toArray(new User[]{});
35       }
36    }
37 
38    public void send(Message msg) {
39       sendNewMessageEvent(msg);
40    }
41 
42    public void registerUser(User user) {
43       synchronized (users) {
44          users.put(user.getNodeId(), user);
45       }
46       sendNewUserEvent(user.getName());
47    }
48 
49    public void removeUser(String nodeId) {
50       synchronized (users) {
51          users.remove(nodeId);
52       }
53    }
54 
55    /**
56     *  Normally the user list is maintained via JMX notifications received in
57     *  each node. This method will ensure that the list is consistent even if
58     *  all clients crash simultaneously
59     *
60     *@param  listProvider  Description of Parameter
61     */
62    public void retainNodes(NodeListProvider listProvider) {
63       synchronized (users) {
64          users.keySet().retainAll(listProvider.getNodeList());
65       }
66    }
67 
68    private void init() {
69       this.listener = new NullChatListener();
70    }
71 
72    private void sendNewUserEvent(String username) {
73       this.listener.newUser(username);
74    }
75 
76    private void sendNewMessageEvent(Message message) {
77       this.listener.newMessage(message);
78    }
79 
80    /**
81     *  Description of the Class
82     *
83     *@author    Terracotta, Inc.
84     */
85    private static class NullChatListener implements ChatListener {
86       public void newMessage(Message message) {
87          //
88       }
89 
90       public void newUser(String username) {
91          //
92       }
93    }
94 
95 }