01: package org.jgroups.blocks;
02:
03: import org.jgroups.Address;
04: import org.jgroups.MembershipListener;
05: import org.jgroups.View;
06: import org.jgroups.ExtendedMembershipListener;
07:
08: import java.util.HashSet;
09:
10: /**
11: * This class provides multiplexing possibilities for {@link MembershipListener}
12: * instances. Usually, we have more than one instance willing to listen to
13: * membership messages. {@link PullPushAdapter} allows only one instance of
14: * {@link MembershipListener} to be registered for message notification. With
15: * help of this class you can overcome this limitation.
16: *
17: * @author Roman Rokytskyy (rrokytskyy@acm.org)
18: */
19:
20: public class MembershipListenerAdapter implements MembershipListener {
21:
22: protected final HashSet membershipListeners = new HashSet();
23: protected MembershipListener[] membershipListenersCache = new MembershipListener[0];
24:
25: /**
26: * Notify membership listeners to temporarily stop sending messages into
27: * a channel. This method in turn calls same method of all registered
28: * membership listener.
29: */
30: public void block() {
31: for (int i = 0; i < membershipListenersCache.length; i++)
32: membershipListenersCache[i].block();
33: }
34:
35: public void unblock() {
36: for (int i = 0; i < membershipListenersCache.length; i++) {
37: if (membershipListenersCache[i] instanceof ExtendedMembershipListener)
38: ((ExtendedMembershipListener) membershipListenersCache[i])
39: .unblock();
40: }
41: }
42:
43: /**
44: * Notify membership listener that some node was suspected. This method
45: * in turn passes suspected member address to all registered membership
46: * listeners.
47: */
48: public void suspect(Address suspected_mbr) {
49: for (int i = 0; i < membershipListenersCache.length; i++)
50: membershipListenersCache[i].suspect(suspected_mbr);
51: }
52:
53: /**
54: * Notify membership listener that new view was accepted. This method in
55: * turn passes new view to all registered membership listeners.
56: */
57: public void viewAccepted(View new_view) {
58: for (int i = 0; i < membershipListenersCache.length; i++)
59: membershipListenersCache[i].viewAccepted(new_view);
60: }
61:
62: /**
63: * Add membership listener to this adapter. This method registers
64: * <code>listener</code> to be notified when membership event is generated.
65: *
66: * @param listener instance of {@link MembershipListener} that should be
67: * added to this adapter.
68: */
69: public synchronized void addMembershipListener(
70: MembershipListener listener) {
71: if (membershipListeners.add(listener))
72: membershipListenersCache = (MembershipListener[]) membershipListeners
73: .toArray(new MembershipListener[membershipListeners
74: .size()]);
75: }
76:
77: /**
78: * Remove membership listener from this adapter. This method deregisters
79: * <code>listener</code> from notification when membership event is generated.
80: *
81: * @param listener instance of {@link MembershipListener} that should be
82: * removed from this adapter.
83: */
84: public synchronized void removeMembershipListener(
85: MembershipListener listener) {
86: if (membershipListeners.remove(listener))
87: membershipListenersCache = (MembershipListener[]) membershipListeners
88: .toArray(new MembershipListener[membershipListeners
89: .size()]);
90:
91: }
92:
93: }
|