package org.goldenorb.server; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.goldenorb.zookeeper.OrbZKFailure; import org.goldenorb.zookeeper.ZookeeperUtils; /** * An implementation of Watcher that watches the LeaderGroup node in ZooKeeper and notifies an * OrbTrackermemberDataServiceImpl servlet when ever the number of child nodes change. */ public class LeaderGroupMonitor implements Watcher { private ZooKeeper zk; private List<String> members; private String path; private OrbTrackerMemberDataServiceImpl statusServer; public boolean dead; private Map<String,LeaderGroupMemberMonitor> memberWatchers; public LeaderGroupMonitor(String path, OrbTrackerMemberDataServiceImpl statusServer, ZooKeeper zk) throws OrbZKFailure { this.zk = zk; this.path = path; this.statusServer = statusServer; memberWatchers = new HashMap<String,LeaderGroupMemberMonitor>(); members = ZookeeperUtils.getChildren(zk, path, this); for (String node : members) { memberWatchers.put(node, new LeaderGroupMemberMonitor(path + "/" + node, zk, node, statusServer)); } } @Override public void process(WatchedEvent event) { if (event.getType() != Event.EventType.NodeDeleted) { try { members = ZookeeperUtils.getChildren(zk, path, this); } catch (OrbZKFailure e) { // TODO Auto-generated catch block e.printStackTrace(); } if (event.getType() == Event.EventType.NodeChildrenChanged) { for (String node : members) { if (!memberWatchers.containsKey(node)) { try { memberWatchers.put(node, new LeaderGroupMemberMonitor(path + "/" + node, zk, node, statusServer)); } catch (OrbZKFailure e) { System.err.println("ERROR CREATING WATCHER FOR : " + path + "/" + node); e.printStackTrace(); } } } Set<String> watcherSet = memberWatchers.keySet(); List<String> toRemove = new ArrayList<String>(); for (String watcher : watcherSet) { if (!members.contains(watcher)) { toRemove.add(watcher); } } for (String nodeToRemove : toRemove) { memberWatchers.remove(nodeToRemove); } } } else { statusServer.watcherNodeDeleted("OrbTrackerLeaderGroup"); } } }