@SuppressWarnings("unchecked")
  @RequestMapping(value = "client/version/view")
  public String viewVersionInfo(Model model)
      throws JsonParseException, JsonMappingException, IOException {

    for (ClientTypeEnum clientType : ClientTypeEnum.values()) {

      for (OsTypeEnum osType : OsTypeEnum.values()) {
        String finalKey =
            clientHelper.toFinalKey(clientType.toString().charAt(0), osType.toString().charAt(0));
        Map<String, Object> para = new HashMap<String, Object>();
        para.put("key", finalKey);
        List<KeyValueEntity> keyValues = keyValueDao.select("selectByKey", para);

        if (CollectionUtils.isNotEmpty(keyValues)) {
          KeyValueEntity entity = keyValues.get(0);
          Map<String, String> value = mapper.readValue(entity.getValue(), Map.class);

          model.addAttribute(
              ClientHelper.ATTR_CURRENT_VERSION, value.get(ClientHelper.ATTR_CURRENT_VERSION));
          model.addAttribute(
              ClientHelper.ATTR_CURRENT_VERSION_INFO,
              value.get(ClientHelper.ATTR_CURRENT_VERSION_INFO));
          model.addAttribute(
              ClientHelper.ATTR_REQUIRED_VERSION, value.get(ClientHelper.ATTR_REQUIRED_VERSION));

          model.addAttribute(finalKey, value);
        }
      }
    }

    return ("client/version");
  }
  @RequestMapping(value = "client/version/update")
  public ModelAndView updateVersionInfo(
      Model model,
      @RequestParam String currentVersion,
      @RequestParam String requiredVersion,
      @RequestParam String currentVersionInfo,
      @RequestParam char osType,
      @RequestParam char clientType)
      throws JsonGenerationException, JsonMappingException, IOException {

    if (StringUtils.isBlank(currentVersion) || StringUtils.isBlank(requiredVersion)) {
      return new ModelAndView(new RedirectView("/client/version/view.controller"));
    }

    String finalKey = clientHelper.toFinalKey(clientType, osType);
    Map<String, Object> para = new HashMap<String, Object>();
    para.put("key", finalKey);
    List<KeyValueEntity> keyValues = keyValueDao.select("selectByKey", para);

    if (CollectionUtils.isEmpty(keyValues)) {
      Map<String, String> value = new HashMap<String, String>();
      value.put(ClientHelper.ATTR_CURRENT_VERSION, currentVersion);
      value.put(ClientHelper.ATTR_CURRENT_VERSION_INFO, currentVersionInfo);
      value.put(ClientHelper.ATTR_REQUIRED_VERSION, requiredVersion);

      KeyValueEntity entity = new KeyValueEntity();
      entity.setKey(finalKey);
      entity.setValue(mapper.writeValueAsString(value));
      entity.setAddTime(new Date());
      entity.setUpdateTime(new Date());
      keyValueDao.add("addKeyValue", entity);

    } else {
      Map<String, String> value = new HashMap<String, String>();
      value.put(ClientHelper.ATTR_CURRENT_VERSION, currentVersion);
      value.put(ClientHelper.ATTR_CURRENT_VERSION_INFO, currentVersionInfo);
      value.put(ClientHelper.ATTR_REQUIRED_VERSION, requiredVersion);

      KeyValueEntity entity = keyValues.get(0);
      entity.setValue(mapper.writeValueAsString(value));
      entity.setUpdateTime(new Date());
      keyValueDao.update("updateById", entity);
    }

    model.addAttribute(ClientHelper.ATTR_CURRENT_VERSION, currentVersion);
    model.addAttribute(ClientHelper.ATTR_CURRENT_VERSION_INFO, currentVersionInfo);
    model.addAttribute(ClientHelper.ATTR_REQUIRED_VERSION, requiredVersion);

    return new ModelAndView(new RedirectView("/client/version/view.controller"));
  }