content: package com.taobao.taokeeper.monitor.web;
  import static common.toolkit.java.constant.EmptyObjectConstant.EMPTY_STRING;
  import static common.toolkit.java.constant.SymbolConstant.COMMA;
  import static common.toolkit.java.constant.SymbolConstant.SQUARE_BRACKETS_LEFT;
  import static common.toolkit.java.constant.SymbolConstant.SQUARE_BRACKETS_RIGHT;
  
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.stereotype.Controller;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.servlet.ModelAndView;
  
  import com.taobao.taokeeper.common.GlobalInstance;
  import com.taobao.taokeeper.model.AlarmSettings;
  import com.taobao.taokeeper.model.ZooKeeperCluster;
  import com.taobao.taokeeper.monitor.core.ThreadPoolManager;
  import com.taobao.taokeeper.monitor.core.task.ZooKeeperALiveCheckerJob;
  import com.taobao.taokeeper.monitor.core.task.runable.ZKClusterConfigDumper;
  import common.toolkit.java.exception.DaoException;
  import common.toolkit.java.util.StringUtil;
  import common.toolkit.java.util.collection.CollectionUtil;
  import common.toolkit.java.util.collection.ListUtil;
  import common.toolkit.java.util.io.ServletUtil;
  
  /**
   * @author yinshi.nc@taobao.com
   * @since 2011-08-10
   */
  @Controller
  @RequestMapping("/zooKeeper.do")
  public class ZooKeeperController extends BaseController {
  	
  	
  	private static final Logger LOG = LoggerFactory.getLogger( ZooKeeperController.class ); 
  	
  	
  	@RequestMapping(params = "method=zooKeeperRegisterPAGE")
  	public ModelAndView zooKeeperRegisterPAGE(HttpServletRequest request, HttpServletResponse response, String handleMessage ) {
  		return new ModelAndView("monitor/zooKeeperRegisterPAGE", null );
  	}
  	
  	
  	@RequestMapping(params = "method=zooKeeperSettingsPAGE")
  	public ModelAndView zooKeeperSettingsPAGE(HttpServletRequest request, HttpServletResponse response, String clusterId, String handleMessage ) {
  
  		clusterId = StringUtil.defaultIfBlank( clusterId, 1 + EMPTY_STRING );
  		
  		try {
  			Map<Integer, ZooKeeperCluster > zooKeeperClusterMap = GlobalInstance.getAllZooKeeperCluster();
  			ZooKeeperCluster zooKeeperCluster = zooKeeperClusterMap.get( Integer.parseInt( clusterId ) );
  			if( null == zooKeeperCluster ){
  				zooKeeperCluster = zooKeeperClusterDAO.getZooKeeperClusterByCulsterId( Integer.parseInt( clusterId) );
  			}
  			
  			if( null ==  zooKeeperCluster ){
  				ServletUtil.writeToResponse( response, "目前还没有这样的ZK集群<a href='zooKeeper.do?method=zooKeeperRegisterPAGE'><font color='red'> 加入监控</font></a>" );
  				return null;
  			}
  			
  			
  			//由于serverList格式问题，因为这里要特殊处理
  			String zooKeeperClusterServerList = CollectionUtil.toString( zooKeeperCluster.getServerList() );
  			Map<String, Object> model = new HashMap<String, Object>();
  			model.put( "zooKeeperCluster", zooKeeperCluster );
  			model.put( "zooKeeperClusterMap", zooKeeperClusterMap );
  			model.put("clusterId", clusterId );
  			model.put( "zooKeeperClusterServerList", zooKeeperClusterServerList );
  			model.put( "handleMessage", handleMessage );
  			return new ModelAndView("monitor/zooKeeperSettingsPAGE", model );
  		} catch ( NumberFormatException e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		} catch ( Exception e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  		
  		return null;
  		
  	}
  
  	/**
  	 * 注意，这里更新完数据库后，还要更新缓存。
  	 */
  	@RequestMapping(params = "method=updateZooKeeperSettingsHandle")
  	public String updateZooKeeperSettingsHandle(HttpServletRequest request, HttpServletResponse response, 
  			String clusterId,
  			String clusterName,
  			String serverListString,
  			String description ) {
  		
  		try {
  			if( StringUtil.isBlank( clusterId ) )
  				throw new Exception( "clusterId 不能为空" );
  			
  			ZooKeeperCluster zooKeeperCluster = new ZooKeeperCluster();
  			zooKeeperCluster.setClusterId( Integer.parseInt( clusterId ) );
  			zooKeeperCluster.setClusterName( clusterName );
  			zooKeeperCluster.setDescription( description );
  			if( !StringUtil.isBlank( serverListString ) ){
  				zooKeeperCluster.setServerList( ListUtil.parseList( serverListString.replace( SQUARE_BRACKETS_LEFT, EMPTY_STRING ).replace( SQUARE_BRACKETS_RIGHT, EMPTY_STRING ), COMMA ) );
  			}
  			
  			//进行Update
  			String handleMessage = null;
  			if( zooKeeperClusterDAO.updateZooKeeperSettingsByClusterId( zooKeeperCluster ) ){
  				LOG.info( "完成zooKeeper集群更新：" + zooKeeperCluster );
  				//Update zk cluster config info of memory
  				ThreadPoolManager.addJobToZKClusterDumperExecutor( new ZKClusterConfigDumper() );
  				
  				handleMessage = "[Update Success], and update cache success.";
  			}else{
  				handleMessage = "Update Fail";
  				LOG.warn( "对zooKeeper集群信息更新失败-" + zooKeeperCluster );
  			}
  			return "redirect:/zooKeeper.do?method=zooKeeperSettingsPAGE&clusterId=" + clusterId + "&handleMessage=" + handleMessage;
  		} catch ( NumberFormatException e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		} catch ( DaoException e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		} catch ( Exception e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  		return null;
  	}
  	
  	
  	
  	
  	/**
  	 * 注册ZooKeeper集群, 并且自动完成缓存更新，插入一个默认报警设置
  	 */
  	@RequestMapping(params = "method=registerZooKeeperHandle")
  	public String registerZooKeeperHandle(HttpServletRequest request, HttpServletResponse response, 
  			String clusterName,
  			String serverListString,
  			String description ) {
  		
  		try {
  			
  			ZooKeeperCluster zooKeeperCluster = new ZooKeeperCluster();
  			zooKeeperCluster.setClusterName( clusterName );
  			zooKeeperCluster.setDescription( description );
  			if( !StringUtil.isBlank( serverListString ) ){
  				zooKeeperCluster.setServerList( ListUtil.parseList( serverListString.replace( SQUARE_BRACKETS_LEFT, EMPTY_STRING ).replace( SQUARE_BRACKETS_RIGHT, EMPTY_STRING ), COMMA ) );
  			}
  			
  			//进行Add
  			String handleMessage = null;
  			
  			int clusterId = zooKeeperClusterDAO.addZooKeeper( zooKeeperCluster );
  			
  			if( 0< clusterId ){
  				LOG.warn( "完成zooKeeper集群添加：" + zooKeeperCluster );
  
  				//Update zk cluster config info of memory
  				ThreadPoolManager.addJobToZKClusterDumperExecutor( new ZKClusterConfigDumper() );
  				
  				//现在要加入一个默认的报警
  				alarmSettingsDAO.addAlarmSettings( new AlarmSettings( clusterId, "5", "60", "70", "2", "银时", "15869027928", "yinshi.nc@taobao.com", "200","1000","/home/yinshi.nc","/home/yinshi.nc","70","" ) );
  				
  				//启动自检
  				if( null != zooKeeperCluster.getServerList() && !zooKeeperCluster.getServerList().isEmpty() ){
  					final List<String> serverList = zooKeeperCluster.getServerList();
  					Thread aliveCheckThread = new Thread( new Runnable() {
  						@Override
  						public void run() {
  							ZooKeeperALiveCheckerJob job = new ZooKeeperALiveCheckerJob();
  							for( String server : serverList ){
  								job.checkAliveNoAlarm( server );
  							}
  						}
  					});
  					aliveCheckThread.start();
  				}
  				
  				handleMessage = "Register Success, and add a default alarm settings for you.";
  			}else{
  				handleMessage = "Register Fail";
  				clusterId = 1;
  			}
  			return "redirect:/zooKeeper.do?method=zooKeeperSettingsPAGE&clusterId=" + clusterId + "&handleMessage=" + handleMessage;
  		} catch ( NumberFormatException e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		} catch ( DaoException e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		} catch ( Exception e ) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  		return null;
  	}
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
  