package com.liveramp.hank.coordinator.zk; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.KeeperState; import com.liveramp.hank.zookeeper.ZkPath; import com.liveramp.hank.zookeeper.ZooKeeperPlus; import com.liveramp.hank.zookeeper.WatchedMap.CompletionAwaiter; import com.liveramp.hank.zookeeper.WatchedMap.CompletionDetector; public class DotComplete implements CompletionDetector { public static final String NODE_NAME = ".complete"; public static final class CreationWatcher implements Watcher { private final String relPath; private final CompletionAwaiter awaiter; public CreationWatcher(String relPath, CompletionAwaiter awaiter) { this.relPath = relPath; this.awaiter = awaiter; } @Override public void process(WatchedEvent event) { if (event.getState() != KeeperState.SyncConnected) { return; } switch (event.getType()) { case NodeCreated: awaiter.completed(relPath); } } } @Override public void detectCompletion(ZooKeeperPlus zk, String basePath, String relPath, CompletionAwaiter awaiter) throws KeeperException, InterruptedException { if (zk.exists(ZkPath.append(basePath, relPath, NODE_NAME), new CreationWatcher(relPath, awaiter)) != null) { awaiter.completed(relPath); } } }