package com.sohu.cache.client.heartbeat;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
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.bind.annotation.RequestMethod;
import com.google.common.collect.Lists;
import com.sohu.cache.client.service.ClientReportDataService;
import com.sohu.cache.constant.ClientStatusEnum;
import com.sohu.cache.util.ConstUtils;
import com.sohu.cache.util.JsonUtil;
import com.sohu.cache.web.service.AppService;
import com.sohu.cache.web.util.IpUtil;
import com.sohu.tv.jedis.stat.constant.ClientReportConstant;
import com.sohu.tv.jedis.stat.model.ClientReportBean;
/**
* cachecloud客户端上报数据接口
*
* @author leifu
* @Date 2015年1月16日
* @Time 下午2:10:25
*/
@Controller
@RequestMapping(value = "/cachecloud/client")
public class RedisClientReportDataController {
private final Logger logger = LoggerFactory.getLogger(RedisClientReportDataController.class);
@Resource(name = "appService")
private AppService appService;
@Resource(name = "clientReportDataService")
private ClientReportDataService clientReportDataService;
/**
* 上报客户端上传数据
*
* @param appId
* @param model
*/
@RequestMapping(value = "/reportData.json" , method = RequestMethod.POST)
public void reportData(HttpServletRequest request, HttpServletResponse response, Model model) {
// 1. 验证版本的正确性
String clientVersion = request.getParameter(ClientReportConstant.CLIENT_VERSION);
if (!checkClientVersion(clientVersion)) {
return;
}
// 2. 验证json的正确性
String json = request.getParameter(ClientReportConstant.JSON_PARAM);
ClientReportBean clientReportBean = checkReportJson(json);
if (clientReportBean == null) {
logger.error("reportWrong json: {}", json);
return;
}
// 3.使用访问web的ip作为客户端最终的ip
String clientIp = IpUtil.getIpAddr(request);
if(StringUtils.isNotBlank(clientIp)){
clientReportBean.setClientIp(clientIp);
}
// 4. 根据类型处理数据
boolean result = clientReportDataService.deal(clientReportBean);
if (!result) {
logger.error("ClientReportDataService deal fail, clientReportBean is {}", clientReportBean);
}
}
/**
* 检验json正确性,返回JavaBean
*
* @param json
* @return
*/
private ClientReportBean checkReportJson(String json) {
if (StringUtils.isNotBlank(json)) {
try {
return JsonUtil.fromJson(json, ClientReportBean.class);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
return null;
}
/**
* 检查客户端的版本
*
* @param clientVersion
* @return
*/
private boolean checkClientVersion(String clientVersion) {
if (StringUtils.isBlank(clientVersion)) {
return false;
}
// 获取合格的客户端版本
List<String> goodVersions = Lists.newArrayList(ConstUtils.GOOD_CLIENT_VERSIONS.split(ConstUtils.COMMA));
List<String> warnVersions = Lists.newArrayList(ConstUtils.WARN_CLIENT_VERSIONS.split(ConstUtils.COMMA));
// 错误版本
if (goodVersions.contains(clientVersion) && warnVersions.contains(clientVersion)) {
logger.error("status: {}, message: {}", ClientStatusEnum.ERROR.getStatus(),
"ERROR: client is TOO old or NOT recognized, please update NOW!");
return false;
}
return true;
}
}