01: // $Id: VIEW_ENFORCER.java,v 1.4 2005/05/30 14:31:24 belaban Exp $
02:
03: package org.jgroups.protocols;
04:
05: import org.jgroups.Address;
06: import org.jgroups.Event;
07: import org.jgroups.View;
08: import org.jgroups.stack.Protocol;
09:
10: import java.util.Vector;
11:
12: /**
13: * Used by a client until it becomes a member: all up messages are discarded until a VIEW_CHANGE
14: * is encountered. From then on, this layer just acts as a pass-through layer. Later, we may
15: * add some functionality that checks for the VIDs of messages and discards messages accordingly.
16: */
17:
18: public class VIEW_ENFORCER extends Protocol {
19: Address local_addr = null;
20: boolean is_member = false;
21:
22: /**
23: * All protocol names have to be unique !
24: */
25: public String getName() {
26: return "VIEW_ENFORCER";
27: }
28:
29: public void up(Event evt) {
30:
31: switch (evt.getType()) {
32:
33: case Event.VIEW_CHANGE:
34: if (is_member) // pass the view change up if we are already a member of the group
35: break;
36:
37: Vector new_members = ((View) evt.getArg()).getMembers();
38: if (new_members == null || new_members.size() == 0)
39: break;
40: if (local_addr == null) {
41: log
42: .error("VIEW_ENFORCER.up(VIEW_CHANGE): local address is null; cannot check "
43: + "whether I'm a member of the group; discarding view change");
44: return;
45: }
46:
47: if (new_members.contains(local_addr))
48: is_member = true;
49: else
50: return;
51:
52: break;
53:
54: case Event.SET_LOCAL_ADDRESS:
55: local_addr = (Address) evt.getArg();
56: break;
57:
58: case Event.MSG:
59: if (!is_member) { // drop message if we are not yet member of the group
60: if (log.isInfoEnabled())
61: log.info("dropping message " + evt.getArg());
62: return;
63: }
64: break;
65:
66: }
67: passUp(evt); // Pass up to the layer above us
68: }
69:
70: }
|