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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/**
* $RCSfile$
* $Revision: 1705 $
* $Date: 2005-07-26 14:10:33 -0300 (Tue, 26 Jul 2005) $
*
* Copyright (C) 2004-2005 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.openfire.event;
import org.jivesoftware.util.Log;
import org.jivesoftware.openfire.group.Group;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Dispatches group events. Each event has a {@link EventType type}
* and optional parameters, as follows:<p>
*
* <table border="1">
* <tr><th>Event Type</th><th>Extra Params</th></tr>
* <tr><td>{@link EventType#group_created group_created}</td><td><i>None</i></td></tr>
* <tr><td>{@link EventType#group_deleting group_deleting}</td><td><i>None</i></td></tr>
* <tr><td>{@link EventType#member_added member_added}</td><td>A param named <tt>member</tt> with a String username as a
* payload</td></tr>
* <tr><td>{@link EventType#member_removed member_removed}</td><td>A param named <tt>member</tt> with a String username as a
* payload</td></tr>
* <tr><td>{@link EventType#admin_added admin_added}</td><td>A param named <tt>admin</tt> with a String username
* as a payload</td></tr>
* <tr><td>{@link EventType#admin_removed admin_removed}</td><td>A param named <tt>admin</tt> with a String username
* as a payload</td></tr>
* <tr valign="top"><td>{@link EventType#group_modified group_modified}</td><td>
* <table><tr><td><b>Reason</b></td><td><b>Key</b></td><td><b>Value</b></td></tr>
* <tr><td colspan="3">Name modified</td></tr>
* <tr><td> </td><td>type</td><td>nameModified</td></tr>
* <tr><td> </td><td>originalValue</td><td><i>(Name before it was modified)</i>
* </td></tr>
* <tr><td colspan="3"><hr></td></tr>
* <tr><td colspan="3">Description modified</td></tr>
* <tr><td> </td><td>type</td><td>descriptionModified</td></tr>
* <tr><td> </td><td>originalValue</td><td><i>(Description before it was
* modified)</i></td></tr>
* <tr><td colspan="3"><hr></td></tr>
* <tr><td colspan="3">Property modified</td></tr>
* <tr><td> </td><td>type</td><td>propertyModified</td></tr>
* <tr><td> </td><td>propertyKey</td><td><i>(Name of the property)</i></td>
* </tr>
* <tr><td> </td><td>originalValue</td><td><i>(Property value before it was
* modified)</i></td></tr>
* <tr><td colspan="3"><hr></td></tr>
* <tr><td colspan="3">Property added</td></tr>
* <tr><td> </td><td>type</td><td>propertyAdded</td></tr>
* <tr><td> </td><td>propertyKey</td><td><i>(Name of the new property)</i></td>
* </tr>
* <tr><td colspan="3"><hr></td></tr>
* <tr><td colspan="3">Property deleted</td></tr>
* <tr><td> </td><td>type</td><td>propertyDeleted</td></tr>
* <tr><td> </td><td>propertyKey</td><td><i>(Name of the property deleted)</i></td></tr></table></td></tr>
* </table>
*
* @author Matt Tucker
*/
public class GroupEventDispatcher {
private static List<GroupEventListener> listeners =
new CopyOnWriteArrayList<GroupEventListener>();
private GroupEventDispatcher() {
// Not instantiable.
}
/**
* Registers a listener to receive events.
*
* @param listener the listener.
*/
public static void addListener(GroupEventListener listener) {
if (listener == null) {
throw new NullPointerException();
}
listeners.add(listener);
}
/**
* Unregisters a listener to receive events.
*
* @param listener the listener.
*/
public static void removeListener(GroupEventListener listener) {
listeners.remove(listener);
}
/**
* Dispatches an event to all listeners.
*
* @param group the group.
* @param eventType the event type.
* @param params event parameters.
*/
public static void dispatchEvent(Group group, EventType eventType, Map params) {
for (GroupEventListener listener : listeners) {
try {
switch (eventType) {
case group_created: {
listener.groupCreated(group, params);
break;
}
case group_deleting: {
listener.groupDeleting(group, params);
break;
}
case member_added: {
listener.memberAdded(group, params);
break;
}
case member_removed: {
listener.memberRemoved(group, params);
break;
}
case admin_added: {
listener.adminAdded(group, params);
break;
}
case admin_removed: {
listener.adminRemoved(group, params);
break;
}
case group_modified: {
listener.groupModified(group, params);
break;
}
default:
break;
}
}
catch (Exception e) {
Log.error(e);
}
}
}
/**
* Represents valid event types.
*/
public enum EventType {
/**
* A new group was created.
*/
group_created,
/**
* A group is about to be deleted. Note that this event is fired before
* a group is actually deleted. This allows for referential cleanup
* before the group is gone.
*/
group_deleting,
/**
* The name, description, or extended property of a group was changed.
*/
group_modified,
/**
* A member was added to a group.
*/
member_added,
/**
* A member was removed from a group.
*/
member_removed,
/**
* An administrator was added to a group.
*/
admin_added,
/**
* An administrator was removed from a group.
*/
admin_removed;
}
}