package cn.uncode.schedule.zk;

import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;

/**
 * zk工具类
 * 
 * @author juny.ye
 *
 */
public class ZKTools {
	static void createPath(ZooKeeper zk, String path, CreateMode createMode, List<ACL> acl) throws Exception {
		String[] list = path.split("/");
		String zkPath = "";
		for (String str : list) {
			if (StringUtils.isNotEmpty(str)) {
				zkPath = zkPath + "/" + str;
				if (zk.exists(zkPath, false) == null) {
					zk.create(zkPath, null, acl, createMode);
				}
			}
		}
	}

   public static void printTree(ZooKeeper zk,String path,Writer writer,String lineSplitChar) throws Exception{
	   String[] list = getTree(zk,path);
	   Stat stat = new Stat();
	   for(String name:list){
		   byte[] value = zk.getData(name, false, stat);
		   if(value == null){
			   writer.write(name + lineSplitChar);
		   }else{
			   writer.write(name+"[v."+ stat.getVersion() +"]"+"["+ new String(value) +"]"  + lineSplitChar);
		   }
	   }
   }  
   public static void deleteTree(ZooKeeper zk,String path) throws Exception{
	   String[] list = getTree(zk,path);
	   for(int i= list.length -1;i>=0; i--){
		   zk.delete(list[i],-1);
	   }
   }
   
   private static String[] getTree(ZooKeeper zk, String path) throws Exception{
	   if(zk.exists(path, false) == null){
		   return new String[0];
	   }
	   List<String> dealList = new ArrayList<String>();
	   dealList.add(path);
	   int index =0;
	   while(index < dealList.size()){
		   String tempPath = dealList.get(index);
		   List<String> children = zk.getChildren(tempPath, false);
		   if(!tempPath.equalsIgnoreCase("/")){
			   tempPath = tempPath +"/";
		   }
		   Collections.sort(children);
		   for (int i = children.size() - 1; i >= 0; i--) {
			   dealList.add(index + 1, tempPath + children.get(i));
		   }
		   index++;
	   }
	   return dealList.toArray(new String[0]);
   }
}