public void addWatcher( long sessionId, Watcher watcher, WatchTriggerPolicy.WatchType watchType ) { ContextedWatcher contextedWatcher = new ContextedWatcher(watcher, sessionId, watchType); if (contextedWatchers.contains(contextedWatcher)) { contextedWatchers.get(contextedWatcher).merge(contextedWatcher); } else { contextedWatchers.add(contextedWatcher); } }
public synchronized Stat exists(long sessionId, String path, Watcher watcher) throws KeeperException { try { ZNode node = isRootPath(path) ? root : root.findDescendant(stripRootFromPath(path)); if (watcher != null) { node.addWatcher(sessionId, watcher, WatchTriggerPolicy.WatchType.EXISTS); } Stat stat = new Stat(); DataTree.copyStat(node.getStat(), stat); return stat; } catch (KeeperException.NoNodeException e) { if (watcher != null) { // Set a watch for this node when it gets created if (!creationWatchers.containsKey(path)) { creationWatchers.put(path, new RetrieveableSet<ContextedWatcher>()); } ContextedWatcher contextedWatcher = new ContextedWatcher( watcher, sessionId, WatchTriggerPolicy.WatchType.EXISTS ); if (!creationWatchers.get(path).contains(contextedWatcher)) { creationWatchers.get(path).add(contextedWatcher); } } return null; } }
@Override public boolean addAll(Collection<? extends T> ts) { boolean changed = false; for (T t : ts) { changed |= add(t); } return changed; }
public synchronized void clearSession(long sessionId) { for (RetrieveableSet<ContextedWatcher> pathWatchers : creationWatchers.values()) { Iterator<ContextedWatcher> iter = pathWatchers.iterator(); while (iter.hasNext()) { ContextedWatcher contextedWatcher = iter.next(); if (contextedWatcher.getSessionId() == sessionId) { iter.remove(); } } } for (ZNode zNode : root) { zNode.clearSession(sessionId); } }
public void clearSession(long sessionId) { // First remove all of your own watches Iterator<ContextedWatcher> iter = contextedWatchers.iterator(); while(iter.hasNext()) { if (iter.next().getSessionId() == sessionId) { iter.remove(); } } // Delete self if node is ephemeral if (stat.getEphemeralOwner() == sessionId) { try { delete(-1); } catch (KeeperException e) { throw new RuntimeException(e); } } // This session should not receive any callbacks as a result of clearing }
public void signalNodeEvent(EventType eventType) { assert(eventType != EventType.None); WatchedEvent watchedEvent = new WatchedEvent( eventType, KeeperState.SyncConnected, addRootToPath(getPath()) ); Iterator<ContextedWatcher> iter = contextedWatchers.iterator(); while(iter.hasNext()) { ContextedWatcher contextedWatcher = iter.next(); if (contextedWatcher.shouldTrigger(eventType)) { iter.remove(); // Remove for one use contextedWatcher.process(watchedEvent); } } }