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
/**
* $RCSfile$
* $Revision: $
* $Date: $
*
* Copyright (C) 2006 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.wildfire.roster;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Dispatches roster events. The following events are supported:
* <ul>
* <li><b>rosterLoaded</b> --> A roster has just been loaded.</li>
* <li><b>contactAdded</b> --> A contact has been added to a roster.</li>
* <li><b>contactUpdated</b> --> A contact has been updated of a roster.</li>
* <li><b>contactDeleted</b> --> A contact has been deleted from a roster.</li>
* </ul>
* Use {@link #addListener(RosterEventListener)} and {@link #removeListener(RosterEventListener)}
* to add or remove {@link RosterEventListener}.
*
* @author Gaston Dombiak
*/
public class RosterEventDispatcher {
private static List<RosterEventListener> listeners =
new CopyOnWriteArrayList<RosterEventListener>();
/**
* Registers a listener to receive events.
*
* @param listener the listener.
*/
public static void addListener(RosterEventListener listener) {
if (listener == null) {
throw new NullPointerException();
}
listeners.add(listener);
}
/**
* Unregisters a listener to receive events.
*
* @param listener the listener.
*/
public static void removeListener(RosterEventListener listener) {
listeners.remove(listener);
}
/**
* Notifies the listeners that a roster has just been loaded.
*
* @param roster the loaded roster.
*/
public static void rosterLoaded(Roster roster) {
if (!listeners.isEmpty()) {
for (RosterEventListener listener : listeners) {
listener.rosterLoaded(roster);
}
}
}
/**
* Notifies listeners that a contact is about to be added to a roster. New contacts
* may be persisted to the database or not. Listeners may indicate that contact about
* to be persisted should not be persisted. Only one listener is needed to return
* <tt>false</tt> so that the contact is not persisted.
*
* @param roster the roster that was updated.
* @param item the new roster item.
* @param persistent true if the new contact is going to be saved to the database.
* @return false if the contact should not be persisted to the database.
*/
public static boolean addingContact(Roster roster, RosterItem item, boolean persistent) {
boolean answer = persistent;
if (!listeners.isEmpty()) {
for (RosterEventListener listener : listeners) {
if (!listener.addingContact(roster, item, persistent)) {
answer = false;
}
}
}
return answer;
}
/**
* Notifies the listeners that a contact has been added to a roster.
*
* @param roster the roster that was updated.
* @param item the new roster item.
*/
public static void contactAdded(Roster roster, RosterItem item) {
if (!listeners.isEmpty()) {
for (RosterEventListener listener : listeners) {
listener.contactAdded(roster, item);
}
}
}
/**
* Notifies the listeners that a contact has been updated.
*
* @param roster the roster that was updated.
* @param item the updated roster item.
*/
public static void contactUpdated(Roster roster, RosterItem item) {
if (!listeners.isEmpty()) {
for (RosterEventListener listener : listeners) {
listener.contactUpdated(roster, item);
}
}
}
/**
* Notifies the listeners that a contact has been deleted from a roster.
*
* @param roster the roster that was updated.
* @param item the roster item that was deleted.
*/
public static void contactDeleted(Roster roster, RosterItem item) {
if (!listeners.isEmpty()) {
for (RosterEventListener listener : listeners) {
listener.contactDeleted(roster, item);
}
}
}
}