content: package com.sohu.cache.web.controller;
  
  import com.sohu.cache.alert.InstanceAlertService;
  import com.sohu.cache.entity.*;
  import com.sohu.cache.redis.RedisCenter;
  import com.sohu.cache.stats.app.AppStatsCenter;
  import com.sohu.cache.stats.instance.InstanceStatsCenter;
  import com.sohu.cache.util.ConstUtils;
  import com.sohu.cache.web.vo.RedisSlowLog;
  import com.sohu.cache.web.chart.key.ChartKeysUtil;
  import com.sohu.cache.web.chart.model.SplineChartEntity;
  import com.sohu.cache.web.util.DateUtil;
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.lang.math.NumberUtils;
  import org.apache.commons.lang.time.DateUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.stereotype.Controller;
  import org.springframework.ui.Model;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.servlet.ModelAndView;
  
  import javax.annotation.Resource;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.text.ParseException;
  import java.util.*;
  
  /**
   * Created by hym on 14-7-27.
   */
  @Controller
  @RequestMapping("/admin/instance")
  public class InstanceController {
      private final Logger logger = LoggerFactory.getLogger(this.getClass());
  
      @Resource(name = "instanceStatsCenter")
      private InstanceStatsCenter instanceStatsCenter;
  
      @Resource(name = "appStatsCenter")
      private AppStatsCenter appStatsCenter;
  
      @Resource(name = "redisCenter")
      private RedisCenter redisCenter;
  
      @Resource
      private InstanceAlertService instanceAlertService;
  
      @RequestMapping("/index")
      public ModelAndView index(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId, String tabTag) {
  
          String startDateParam = request.getParameter("startDate");
          String endDateParam = request.getParameter("endDate");
  
          if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) {
              Date endDate = new Date();
              Date startDate = DateUtils.addDays(endDate, -1);
              startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd");
              endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd");
          }
          model.addAttribute("startDate", startDateParam);
          model.addAttribute("endDate", endDateParam);
  
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
              InstanceInfo instanceInfo = instanceStatsCenter.getInstanceInfo(instanceId);
  
              if (instanceInfo == null) {
                  model.addAttribute("type", -1);
              } else {
                  if (appId != null && appId > 0) {
                      model.addAttribute("appId", appId);
                  } else {
                      model.addAttribute("appId", instanceInfo.getAppId());
                  }
                  model.addAttribute("type", instanceInfo.getType());
              }
          } else {
  
          }
          if (tabTag != null) {
              model.addAttribute("tabTag", tabTag);
          }
          return new ModelAndView("instance/instanceIndex");
      }
  
      @RequestMapping("/stat")
      public ModelAndView stat(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) {
  
          String startDateParam = request.getParameter("startDate");
          String endDateParam = request.getParameter("endDate");
  
          if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) {
              Date endDate = new Date();
              Date startDate = DateUtils.addDays(endDate, -1);
              startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd");
              endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd");
          }
          model.addAttribute("startDate", startDateParam);
          model.addAttribute("endDate", endDateParam);
  
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
              InstanceInfo instanceInfo = instanceStatsCenter.getInstanceInfo(instanceId);
              model.addAttribute("instanceInfo", instanceInfo);
              model.addAttribute("appId", instanceInfo.getAppId());
              model.addAttribute("appDetail", appStatsCenter.getAppDetail(instanceInfo.getAppId()));
              InstanceStats instanceStats = instanceStatsCenter.getInstanceStats(instanceId);
              model.addAttribute("instanceStats", instanceStats);
              List<AppCommandStats> topLimitAppCommandStatsList = appStatsCenter.getTopLimitAppCommandStatsList(instanceInfo.getAppId(), Long.parseLong(startDateParam) * 10000, Long.parseLong(endDateParam) * 10000, 5);
              model.addAttribute("appCommandStats", topLimitAppCommandStatsList);
          }
          return new ModelAndView("instance/instanceStat");
      }
  
      @RequestMapping("/advancedAnalysis")
      public ModelAndView advancedAnalysis(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) {
  
          String startDateParam = request.getParameter("startDate");
          String endDateParam = request.getParameter("endDate");
  
          if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) {
              Date endDate = new Date();
              Date startDate = DateUtils.addDays(endDate, -1);
              startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd");
              endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd");
          }
          model.addAttribute("startDate", startDateParam);
          model.addAttribute("endDate", endDateParam);
  
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
              InstanceInfo instanceInfo = instanceStatsCenter.getInstanceInfo(instanceId);
              model.addAttribute("instanceInfo", instanceInfo);
              model.addAttribute("appId", instanceInfo.getAppId());
              List<AppCommandStats> topLimitAppCommandStatsList = appStatsCenter.getTopLimitAppCommandStatsList(instanceInfo.getAppId(), Long.parseLong(startDateParam) * 10000, Long.parseLong(endDateParam) * 10000, 5);
              model.addAttribute("appCommandStats", topLimitAppCommandStatsList);
          } else {
  
          }
          return new ModelAndView("instance/instanceAdvancedAnalysis");
      }
  
      /**
       * 获取某个命令时间分布图
       *
       * @param instanceId  实例id
       * @param commandName 命令名称
       * @throws java.text.ParseException
       */
      @RequestMapping("/getCommandStats")
      public ModelAndView getCommandStats(HttpServletRequest request,
                                          HttpServletResponse response, Model model, Long instanceId,
                                          String commandName) throws ParseException {
          String startDateParam = request.getParameter("startDate");
          String endDateParam = request.getParameter("endDate");
  
          if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) {
              Date endDate = new Date();
              Date startDate = DateUtils.addDays(endDate, -1);
              startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd");
              endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd");
          }
          model.addAttribute("startDate", startDateParam);
          model.addAttribute("endDate", endDateParam);
  
          Date startDate = DateUtil.parseYYYYMMdd(startDateParam);
          Date endDate = DateUtil.parseYYYYMMdd(endDateParam);
          if (instanceId != null) {
              long firstDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "0000");
              long firstDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "2359");
              long secondDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "0000");
              long secondDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "2359");
              long bt = System.currentTimeMillis();
              List<InstanceCommandStats> instanceCommandStatsListFirst = instanceStatsCenter
                      .getCommandStatsList(instanceId, firstDayBegin, firstDayEnd, commandName);
              List<InstanceCommandStats> instanceCommandStatsListSecond = instanceStatsCenter
                      .getCommandStatsList(instanceId, secondDayBegin, secondDayEnd, commandName);
              long et = System.currentTimeMillis() - bt;
              Map<String, InstanceCommandStats> cmdStatsFirst = new HashMap<String, InstanceCommandStats>();
              Map<String, InstanceCommandStats> cmdStatsSecond = new HashMap<String, InstanceCommandStats>();
  
              for (InstanceCommandStats first : instanceCommandStatsListFirst) {
                  cmdStatsFirst.put(first.getCollectTime() + "", first);
              }
              for (InstanceCommandStats second : instanceCommandStatsListSecond) {
                  cmdStatsSecond.put(second.getCollectTime() + "", second);
              }
  
              SplineChartEntity splineChartEntity = new SplineChartEntity();
              String container = request.getParameter("container");
              if (container != null) {
                  splineChartEntity.renderTo(container);
              }
              model.addAttribute("chart", splineChartEntity);
              splineChartEntity.putTitle(ChartKeysUtil.TitleKey.TEXT.getKey(), "命令:" + commandName + " 的比较曲线【" + startDateParam + "】-【" + endDateParam + "】");
              splineChartEntity.setYAxisTitle("y");
              List<Long> data1 = new ArrayList<Long>();
              List<Long> data2 = new ArrayList<Long>();
              Map<String, Object> serie1 = new HashMap<String, Object>();
              serie1.put("name", startDateParam);
              serie1.put("data", data1);
  //            serie1.put("type", "area");
              Map<String, Object> serie2 = new HashMap<String, Object>();
              serie2.put("name", endDateParam);
              serie2.put("data", data2);
  //            serie2.put("type", "area");
              splineChartEntity.putSeries(serie1);
              splineChartEntity.putSeries(serie2);
              List<Object> x = new LinkedList<Object>();
              for (int i = 0; i < 1440; i += 1) {
                  Date date = DateUtils.addMinutes(startDate, i);
                  String s = DateUtil.formatHHMM(date);
                  if (cmdStatsFirst.containsKey(startDateParam + s)) {
                      data1.add(cmdStatsFirst.get(startDateParam + s).getCommandCount());
                  } else {
                      data1.add(0l);
                  }
                  if (cmdStatsSecond.containsKey(endDateParam + s)) {
                      data2.add(cmdStatsSecond.get(endDateParam + s).getCommandCount());
                  } else {
                      data2.add(0l);
                  }
  
                  x.add(s);
              }
              splineChartEntity.setXAxisCategories(x);
          }
          return new ModelAndView("");
      }
  
      /**
       * 获取某个命令时间分布图
       *
       * @param instanceId  实例id
       * @param commandName 命令名称
       * @throws java.text.ParseException
       */
      @RequestMapping("/getCommandStatsV2")
      public ModelAndView getCommandStatsV2(HttpServletRequest request,
                                            HttpServletResponse response, Model model, Long instanceId,
                                            String commandName) throws ParseException {
          String startDateParam = request.getParameter("startDate");
          String endDateParam = request.getParameter("endDate");
  
          if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) {
              Date endDate = new Date();
              Date startDate = DateUtils.addDays(endDate, -1);
              startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd");
              endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd");
          }
          model.addAttribute("startDate", startDateParam);
          model.addAttribute("endDate", endDateParam);
  
          Date startDate = DateUtil.parseYYYYMMdd(startDateParam);
          Date endDate = DateUtil.parseYYYYMMdd(endDateParam);
          if (instanceId != null) {
              long firstDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "0000");
              long firstDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "2359");
              long secondDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "0000");
              long secondDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "2359");
              long bt = System.currentTimeMillis();
              List<InstanceCommandStats> instanceCommandStatsListFirst = instanceStatsCenter
                      .getCommandStatsList(instanceId, firstDayBegin, firstDayEnd, commandName);
              List<InstanceCommandStats> instanceCommandStatsListSecond = instanceStatsCenter
                      .getCommandStatsList(instanceId, secondDayBegin, secondDayEnd, commandName);
              long et = System.currentTimeMillis() - bt;
              Map<String, InstanceCommandStats> cmdStatsFirst = new HashMap<String, InstanceCommandStats>();
              Map<String, InstanceCommandStats> cmdStatsSecond = new HashMap<String, InstanceCommandStats>();
  
              for (InstanceCommandStats first : instanceCommandStatsListFirst) {
                  cmdStatsFirst.put(first.getCollectTime() + "", first);
              }
              for (InstanceCommandStats second : instanceCommandStatsListSecond) {
                  cmdStatsSecond.put(second.getCollectTime() + "", second);
              }
  
              SplineChartEntity splineChartEntity = new SplineChartEntity();
              String container = request.getParameter("container");
              if (container != null) {
                  splineChartEntity.renderTo(container);
              }
              model.addAttribute("chart", splineChartEntity);
              splineChartEntity.putTitle(ChartKeysUtil.TitleKey.TEXT.getKey(), "命令:" + commandName + " 的比较曲线【" + startDateParam + "】-【" + endDateParam + "】");
              splineChartEntity.setYAxisTitle("y");
              List<Long> data1 = new ArrayList<Long>();
              List<Long> data2 = new ArrayList<Long>();
              Map<String, Object> marker = new HashMap<String, Object>();
              marker.put("radius", 1);
              Map<String, Object> serie1 = new HashMap<String, Object>();
              serie1.put("name", startDateParam);
              serie1.put("data", data1);
              serie1.put("marker", marker);
              Map<String, Object> serie2 = new HashMap<String, Object>();
              serie2.put("name", endDateParam);
              serie2.put("data", data2);
              serie2.put("marker", marker);
              splineChartEntity.putSeries(serie1);
              splineChartEntity.putSeries(serie2);
              List<Object> x = new LinkedList<Object>();
              for (int i = 0; i < 1440; i += 1) {
                  Date date = DateUtils.addMinutes(startDate, i);
                  String s = DateUtil.formatHHMM(date);
                  if (cmdStatsFirst.containsKey(startDateParam + s)) {
                      data1.add(cmdStatsFirst.get(startDateParam + s).getCommandCount());
                  } else {
                      data1.add(0l);
                  }
                  if (cmdStatsSecond.containsKey(endDateParam + s)) {
                      data2.add(cmdStatsSecond.get(endDateParam + s).getCommandCount());
                  } else {
                      data2.add(0l);
                  }
  
                  x.add(s);
              }
              splineChartEntity.setXAxisCategories(x);
          }
          return new ModelAndView("");
      }
  
      @RequestMapping("/fault")
      public ModelAndView fault(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Integer instanceId, Long appId) {
          //String startDateParam = request.getParameter("startDate");
          //String endDateParam = request.getParameter("endDate");
          List<InstanceFault> list = null;
          try {
              list = instanceAlertService.getListByInstId(instanceId);
          } catch (Exception e) {
              logger.error(e.getMessage(), e);
          }
          if (list == null) {
              list = new ArrayList<InstanceFault>();
          }
          model.addAttribute("list", list);
          return new ModelAndView("instance/instanceFault");
      }
  
      @RequestMapping("/configSelect")
      public ModelAndView configSelect(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId) {
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
              Map<String, String> redisConfigList = redisCenter.getRedisConfigList(instanceId.intValue());
              model.addAttribute("redisConfigList", redisConfigList);
          }
          if (appId != null && appId > 0) {
              model.addAttribute("appId", appId);
          }
          return new ModelAndView("instance/instanceConfigSelect");
      }
  
      @RequestMapping("/slowSelect")
      public ModelAndView slowSelect(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) {
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
              List<RedisSlowLog> redisSlowLogs = redisCenter.getRedisSlowLogs(instanceId.intValue(), -1);
              model.addAttribute("redisSlowLogs", redisSlowLogs);
          }
          return new ModelAndView("instance/instanceSlowSelect");
      }
  
      @RequestMapping("/clientList")
      public ModelAndView clientList(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) {
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
              List<String> clientList = redisCenter.getClientList(instanceId.intValue());
              model.addAttribute("clientList", clientList);
          }
          return new ModelAndView("instance/instanceClientList");
      }
  
      @RequestMapping("/command")
      public ModelAndView command(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId) {
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
          }
          return new ModelAndView("instance/instanceCommand");
      }
  
      @RequestMapping("/commandExecute")
      public ModelAndView commandExecute(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId) {
          if (instanceId != null && instanceId > 0) {
              model.addAttribute("instanceId", instanceId);
              String command = request.getParameter("command");
              String result = instanceStatsCenter.executeCommand(instanceId, command);
              model.addAttribute("result", result);
          } else {
              model.addAttribute("result", "error");
          }
          return new ModelAndView("instance/commandExecute");
      }
  
  }