import java.util.concurrent.Executors;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.RetryNTimes;
import org.apache.curator.test.TestingServer;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Test {

	static int latestIdProcessed = -1;

	public static void main(String[] argv) throws Exception {
		BasicConfigurator.configure();
		Logger.getLogger("org.apache.zookeeper").setLevel(Level.WARN);
		Logger.getLogger("org.apache.curator").setLevel(Level.WARN);

		TestingServer server = null;
		CuratorFramework client = null;
		PathChildrenCache cache = null;

		try {
			server = new TestingServer();

			client = CuratorFrameworkFactory.newClient(server
					.getConnectString(), 5000, 5000, new RetryNTimes(3, 1000));
			client.start();

			String root = "/test";
			client.create().forPath(root);

			cache = new PathChildrenCache(client, root, true, false,
					Executors.newSingleThreadExecutor());

			cache.getListenable().addListener(new PathChildrenCacheListener() {
				@Override
				public void childEvent(CuratorFramework client,
						PathChildrenCacheEvent event) throws Exception {
					// the data is the ID
					int i = Integer.valueOf(new String(event.getData()
							.getData()));

					if (i < latestIdProcessed) {
						System.out.println("Event " + i
								+ " received after event " + latestIdProcessed);
						System.exit(1);
					}
					latestIdProcessed = i;
				}
			});
			cache.start();

			// creates the nodes, ordered
			for (int i = 0; i < 100; i++) {
				// the data is the ID
				client.create().forPath(root + "/node" + i,
						String.valueOf(i).getBytes());
			}

		} finally {
			if (cache != null) {
				cache.close();
			}
			if (client != null) {
				client.close();
			}
			if (server != null) {
				server.close();
			}
		}
	}
}
