1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.framework.message;
35
36 import info.magnolia.cms.security.SecuritySupport;
37 import info.magnolia.cms.security.User;
38 import info.magnolia.context.MgnlContext;
39 import info.magnolia.ui.api.message.Message;
40 import info.magnolia.ui.api.message.MessageType;
41
42 import java.util.Collection;
43 import java.util.LinkedList;
44 import java.util.List;
45 import java.util.Map;
46
47 import javax.inject.Inject;
48 import javax.inject.Provider;
49 import javax.inject.Singleton;
50
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54 import com.google.common.collect.ArrayListMultimap;
55 import com.google.common.collect.ListMultimap;
56 import com.google.common.collect.Multimaps;
57
58
59
60
61 @Singleton
62 public class MessagesManagerImpl implements MessagesManager {
63
64 private final Logger logger = LoggerFactory.getLogger(getClass());
65
66 private final ListMultimap<String, MessageListener> listeners = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
67
68 private Provider<SecuritySupport> securitySupportProvider;
69
70 private MessageStore messageStore;
71
72 @Inject
73 public MessagesManagerImpl(Provider<SecuritySupport> securitySupportProvider, MessageStore messageStore) {
74 this.securitySupportProvider = securitySupportProvider;
75 this.messageStore = messageStore;
76 }
77
78 @Override
79 public void broadcastMessage(Message message) {
80
81 Collection<User> users;
82 try {
83 users = securitySupportProvider.get().getUserManager().getAllUsers();
84 } catch (UnsupportedOperationException e) {
85 logger.error("Unable to broadcast message because UserManager does not support enumerating its users", e);
86 return;
87 }
88
89 for (User user : users) {
90 sendMessage(user.getName(), message);
91 }
92
93
94 message.setId(null);
95 }
96
97 @Override
98 public void sendMessage(String userName, Message message) {
99
100
101
102 message.setId(null);
103
104 messageStore.saveMessage(userName, message);
105
106 sendMessageSentEvent(userName, message);
107 }
108
109 @Override
110 public void sendGroupMessage(final String groupName, final Message message) {
111 Collection<String> userNames = securitySupportProvider.get().getUserManager().getUsersWithGroup(groupName, true);
112 for (String userName : userNames) {
113 sendMessage(userName, message);
114 }
115
116 message.setId(null);
117 }
118
119 @Override
120 public void sendRoleMessage(final String roleName, final Message message) {
121 Collection<String> userNames = securitySupportProvider.get().getUserManager().getUsersWithRole(roleName);
122 for (String userName : userNames) {
123 sendMessage(userName, message);
124 }
125
126 message.setId(null);
127 }
128
129 @Override
130 public void sendLocalMessage(Message message) {
131 sendMessage(MgnlContext.getUser().getName(), message);
132 }
133
134 @Override
135 public void clearMessage(final String userName, final String messageId) {
136 final Message message = messageStore.findMessageById(userName, messageId);
137 if (message != null && !message.isCleared()) {
138 message.setCleared(true);
139 messageStore.saveMessage(userName, message);
140 sendMessageClearedEvent(userName, message);
141 }
142 }
143
144 @Override
145 public int getNumberOfUnclearedMessagesForUser(String userName) {
146 return messageStore.getNumberOfUnclearedMessagesForUser(userName);
147 }
148
149 @Override
150 public List<Message> getMessagesForUser(String userName) {
151 return messageStore.findAllMessagesForUser(userName);
152 }
153
154 @Override
155 public List<Message> getMessageBatch(String userName, List<MessageType> types, Map<String, Boolean> sortCriteria, int limit, int offset) {
156 return messageStore.getMessages(userName, types, sortCriteria, limit, offset);
157 }
158
159 @Override
160 public long getMessagesAmount(final String userName, final List<MessageType> types) {
161 return messageStore.getMessageAmount(userName, types);
162 }
163
164 @Override
165 public Message getMessageById(String userName, String messageId) {
166 return messageStore.findMessageById(userName, messageId);
167 }
168
169 @Override
170 public void registerMessagesListener(String userName, MessageListener listener) {
171 listeners.put(userName, listener);
172 }
173
174 @Override
175 public void unregisterMessagesListener(String userName, MessageListener listener) {
176 listeners.remove(userName, listener);
177 }
178
179 @Override
180 public void removeMessage(String userName, String messageId) {
181 messageStore.removeMessageById(userName, messageId);
182 sendMessageRemovedEvent(userName, messageId);
183 }
184
185 @Override
186 public int getNumberOfUnclearedMessagesForUserAndByType(String userName, MessageType type) {
187 return messageStore.getNumberOfUnclearedMessagesForUserAndByType(userName, type);
188 }
189
190 private void sendMessageClearedEvent(String userName, Message message) {
191 final List<MessageListener> userListener = new LinkedList<MessageListener>(listeners.get(userName));
192 for (final MessageListener listener : userListener) {
193 listener.messageCleared(message);
194 }
195 }
196
197 private void sendMessageRemovedEvent(String userName, String id) {
198 final List<MessageListener> userListener = new LinkedList<MessageListener>(listeners.get(userName));
199 for (final MessageListener listener : userListener) {
200 listener.messageRemoved(id);
201 }
202 }
203
204 private void sendMessageSentEvent(String userName, Message message) {
205 final List<MessageListener> userListener = new LinkedList<MessageListener>(listeners.get(userName));
206 for (final MessageListener listener : userListener) {
207 try {
208 listener.messageSent(cloneMessage(message));
209 } catch (CloneNotSupportedException e) {
210 logger.warn("Exception caught when dispatching event: " + e.getMessage(), e);
211 }
212 }
213 }
214
215 private Message cloneMessage(Message message) throws CloneNotSupportedException {
216 return message.clone();
217 }
218
219 @Override
220 public void saveMessage(String userName, Message message) {
221 messageStore.saveMessage(userName, message);
222 }
223 }