content: /*
   * Copyright 1999-2012 Alibaba Group.
   *  
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *  
   *      http://www.apache.org/licenses/LICENSE-2.0
   *  
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.alibaba.cobar.manager.web.ajax;
  
  import static com.alibaba.cobar.manager.util.ConstantDefine.COBAR_LIST;
  import static com.alibaba.cobar.manager.util.ConstantDefine.KILL_CONNECTION;
  
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import net.sf.json.JSONArray;
  import net.sf.json.JSONObject;
  
  import org.springframework.beans.factory.InitializingBean;
  import org.springframework.web.HttpRequestHandler;
  
  import com.alibaba.cobar.manager.dao.CobarAdapterDAO;
  import com.alibaba.cobar.manager.dataobject.xml.CobarDO;
  import com.alibaba.cobar.manager.service.CobarAccesser;
  import com.alibaba.cobar.manager.service.XmlAccesser;
  import com.alibaba.cobar.manager.util.ConstantDefine;
  import com.alibaba.cobar.manager.util.ListSortUtil;
  import com.alibaba.cobar.manager.util.Pair;
  
  /**
   * @author haiqing.zhuhq 2011-8-11
   */
  public class CobarControlAjax implements HttpRequestHandler, InitializingBean {
  
      private XmlAccesser xmlAccesser;
      private CobarAccesser cobarAccesser;
  
      public void setCobarAccesser(CobarAccesser cobarAccesser) {
          this.cobarAccesser = cobarAccesser;
      }
  
      public void setXmlAccesser(XmlAccesser xmlAccesser) {
          this.xmlAccesser = xmlAccesser;
      }
  
      @Override
      public void afterPropertiesSet() throws Exception {
          if (null == xmlAccesser) {
              throw new IllegalArgumentException("property 'xmlAccesser' is null!");
          }
          if (null == cobarAccesser) {
              throw new IllegalArgumentException("property 'cobarAccesser' is null!");
          }
      }
  
      private boolean killConnections(AjaxParams params) {
          long cobarId = params.getCobarNodeId();
          long connecId = params.getConnectionId();
          CobarDO cobar = xmlAccesser.getCobarDAO().getCobarById(cobarId);
          if (!cobar.getStatus().equals(ConstantDefine.ACTIVE)) {
              return false;
          }
          CobarAdapterDAO control = cobarAccesser.getAccesser(cobarId);
          if (control.checkConnection()) {
              control.killConnection(connecId);
              return true;
          }
          return false;
      }
  
      private List<Map<String, Object>> getCobarList(AjaxParams params) {
          long clusterId = params.getClusterId();
          List<CobarDO> cobarList = xmlAccesser.getCobarDAO().getCobarList(clusterId, ConstantDefine.ACTIVE);
          ListSortUtil.sortCobarByName(cobarList);
          List<Map<String, Object>> cobarViewList = new ArrayList<Map<String, Object>>();
          for (CobarDO c : cobarList) {
              CobarAdapterDAO perf = cobarAccesser.getAccesser(c.getId());
              if (perf.checkConnection()) {
                  Map<String, Object> cobarMap = new HashMap<String, Object>();
                  cobarMap.put("id", c.getId());
                  cobarMap.put("name", c.getName());
                  cobarViewList.add(cobarMap);
              }
          }
          return cobarViewList;
      }
  
      @Override
      public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException,
              IOException {
          AjaxParams params = new AjaxParams(request);
          JSONArray array = null;
          String jsonRst = null;
          String st = params.getValueType();
          if (null == st || st.equals("")) {
              throw new IllegalArgumentException("parameter 'cobarControlValueType' is unknown: " + st);
          }
          int type = typeMap.get(st);
          switch (type) {
          case COBAR_LIST:
              List<Map<String, Object>> cobarList = getCobarList(params);
              array = JSONArray.fromObject(cobarList);
              jsonRst = array.toString(2);
              break;
          case KILL_CONNECTION:
              Pair<String, Boolean> kill = new Pair<String, Boolean>("result", killConnections(params));
              jsonRst = JSONObject.fromObject(kill).toString(2);
              break;
          default:
              throw new IllegalArgumentException("parameter 'cobarControlValueType' is unknown: " + params.getValueType());
          }
  
          response.setHeader("Content-Type", "text/json; charset=utf-8");
          OutputStream out = response.getOutputStream();
          out.write(jsonRst.getBytes("utf-8"));
          out.flush();
      }
  
      private static final Map<String, Integer> typeMap = new HashMap<String, Integer>();
      static {
          typeMap.put("cobarList", COBAR_LIST);
          typeMap.put("killconnection", KILL_CONNECTION);
      }
  }
  