content: package com.sohu.cache.web.controller;
  
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.Map.Entry;
  
  import javax.annotation.Resource;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import org.apache.commons.collections.MapUtils;
  import org.apache.commons.lang.StringUtils;
  import org.springframework.stereotype.Controller;
  import org.springframework.ui.Model;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.servlet.ModelAndView;
  
  import com.sohu.cache.entity.AppUser;
  import com.sohu.cache.entity.SystemConfig;
  import com.sohu.cache.web.enums.SuccessEnum;
  import com.sohu.cache.web.service.ConfigService;
  import com.sohu.cache.web.util.AppEmailUtil;
  
  /**
   * cachecloud配置管理
   * 
   * @author leifu
   * @Date 2016年5月23日
   * @Time 上午10:31:16
   */
  @Controller
  @RequestMapping("manage/config")
  public class ConfigManageController extends BaseController {
  
      @Resource(name = "configService")
      private ConfigService configService;
      
      @Resource(name = "appEmailUtil")
      private AppEmailUtil appEmailUtil;
  
      /**
       * 初始化配置
       * 
       * @param request
       * @param response
       * @param model
       * @return
       */
      @RequestMapping(value = "/init")
      public ModelAndView init(HttpServletRequest request, HttpServletResponse response, Model model) {
          List<SystemConfig> configList = configService.getConfigList(1);
          model.addAttribute("configList", configList);
          model.addAttribute("success", request.getParameter("success"));
          model.addAttribute("configActive", SuccessEnum.SUCCESS.value());
          return new ModelAndView("manage/config/init");
      }
  
      /**
       * 修改配置
       * 
       * @param request
       * @param response
       * @param model
       * @return
       */
      @RequestMapping(value = "/update")
      public ModelAndView update(HttpServletRequest request, HttpServletResponse response, Model model) {
          AppUser appUser = getUserInfo(request);
          logger.warn("user {} want to change config!", appUser.getName());
          List<SystemConfig> oldConfigList = configService.getConfigList(1);
          SuccessEnum successEnum;
          Map<String, String> configMap = new HashMap<String, String>();
          try {
              Map<String, String[]> paramMap = request.getParameterMap();
              for (Entry<String, String[]> entry : paramMap.entrySet()) {
                  String key = entry.getKey();
                  String value = entry.getValue()[0];
                  if (StringUtils.isNotBlank(key)) {
                      configMap.put(key, value);
                  }
              }
              if (MapUtils.isEmpty(configMap)) {
                  logger.error("params {} may be empty!!", paramMap);
              }
              successEnum = configService.updateConfig(configMap);
              if (successEnum.equals(SuccessEnum.SUCCESS)) {
                  configService.reloadSystemConfig();
              }
          } catch (Exception e) {
              successEnum = SuccessEnum.FAIL;
              logger.error(e.getMessage(), e);
          }
          Map<String, String> systemDifConfigMap = getDifConfigMap(oldConfigList, configMap);
          appEmailUtil.sendSystemConfigDifEmail(appUser, systemDifConfigMap, successEnum);
          logger.warn("user {} change config result is {}!", appUser.getName(), successEnum.value());
          return new ModelAndView("redirect:/manage/config/init?success=" + successEnum.value());
      }
  
      private Map<String, String> getDifConfigMap(List<SystemConfig> oldConfigList, Map<String, String> configMap) {
          Map<String, String> systemDifConfigMap = new HashMap<String, String>();
          for (SystemConfig systemConfig : oldConfigList) {
              String key = systemConfig.getConfigKey();
              String oldValue = systemConfig.getConfigValue();
              String newValue = configMap.get(key);
              if (newValue != null && !oldValue.equals(newValue)) {
                  systemDifConfigMap.put(systemConfig.getInfo(), String.format("old value: %s, new value: %s", oldValue, newValue));
              }
          }
          return systemDifConfigMap;
      }
  
  }
  