package com.baidu.disconf.web.web.config.controller;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.baidu.disconf.core.common.constants.DisConfigTypeEnum;
import com.baidu.disconf.core.common.json.ValueVo;
import com.baidu.disconf.web.service.config.bo.Config;
import com.baidu.disconf.web.service.config.form.ConfForm;
import com.baidu.disconf.web.service.config.service.ConfigFetchMgr;
import com.baidu.disconf.web.service.config.utils.ConfigUtils;
import com.baidu.disconf.web.web.config.dto.ConfigFullModel;
import com.baidu.disconf.web.web.config.validator.ConfigValidator;
import com.baidu.disconf.web.web.config.validator.ConfigValidator4Fetch;
import com.baidu.dsp.common.annotation.NoAuth;
import com.baidu.dsp.common.constant.WebConstants;
import com.baidu.dsp.common.controller.BaseController;
import com.baidu.dsp.common.exception.DocumentNotFoundException;
import com.baidu.dsp.common.vo.JsonObjectBase;
/**
* 配置获取Controller, Disconf-client专门使用的
*
* @author liaoqiqi
* @version 2014-6-16
*/
@Controller
@RequestMapping(WebConstants.API_PREFIX + "/config")
public class ConfigFetcherController extends BaseController {
protected static final Logger LOG = LoggerFactory.getLogger(ConfigFetcherController.class);
@Autowired
private ConfigValidator configValidator;
@Autowired
private ConfigValidator4Fetch configValidator4Fetch;
@Autowired
private ConfigFetchMgr configFetchMgr;
/**
* 获取指定app env version 的配置项列表
*
* @param confForm
*
* @return
*/
@NoAuth
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public JsonObjectBase getList(ConfForm confForm) {
return getListImp(confForm, true);
}
@NoAuth
@RequestMapping(value = "/simple/list", method = RequestMethod.GET)
@ResponseBody
public JsonObjectBase getSimpleList(ConfForm confForm) {
return getListImp(confForm, false);
}
/**
* 获取配置项 Item
*
* @param confForm
*
* @return
*/
@NoAuth
@RequestMapping(value = "/item", method = RequestMethod.GET)
@ResponseBody
public ValueVo getItem(ConfForm confForm) {
LOG.info(confForm.toString());
//
// 校验
//
ConfigFullModel configModel = null;
try {
configModel = configValidator4Fetch.verifyConfForm(confForm, false);
} catch (Exception e) {
LOG.warn(e.toString());
return ConfigUtils.getErrorVo(e.getMessage());
}
return configFetchMgr.getConfItemByParameter(configModel.getApp().getId(), configModel.getEnv().getId(),
configModel.getVersion(), configModel.getKey());
}
/**
* 获取配置文件
*
* @return
*/
@NoAuth
@RequestMapping(value = "/file", method = RequestMethod.GET)
@ResponseBody
public HttpEntity<byte[]> getFile(ConfForm confForm) {
boolean hasError = false;
//
// 校验
//
ConfigFullModel configModel = null;
try {
configModel = configValidator4Fetch.verifyConfForm(confForm, false);
} catch (Exception e) {
LOG.error(e.toString());
hasError = true;
}
if (hasError == false) {
try {
//
Config config = configFetchMgr
.getConfByParameter(configModel.getApp().getId(), configModel.getEnv().getId(),
configModel.getVersion(), configModel.getKey(),
DisConfigTypeEnum.FILE);
if (config == null) {
hasError = true;
throw new DocumentNotFoundException(configModel.getKey());
}
//API获取节点内容也需要同样做格式转换
return downloadDspBill(configModel.getKey(), config.getValue());
} catch (Exception e) {
LOG.error(e.toString());
}
}
if (confForm.getKey() != null) {
throw new DocumentNotFoundException(confForm.getKey());
} else {
throw new DocumentNotFoundException("");
}
}
/**
* 下载
*
* @param fileName
*
* @return
*/
public HttpEntity<byte[]> downloadDspBill(String fileName, String value) {
HttpHeaders header = new HttpHeaders();
byte[] res = value.getBytes();
String name = null;
try {
name = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
header.set("Content-Disposition", "attachment; filename=" + name);
header.setContentLength(res.length);
return new HttpEntity<byte[]>(res, header);
}
private JsonObjectBase getListImp(ConfForm confForm, boolean hasValue) {
LOG.info(confForm.toString());
//
// 校验
//
ConfigFullModel configModel = configValidator4Fetch.verifyConfForm(confForm, true);
List<Config> configs =
configFetchMgr.getConfListByParameter(configModel.getApp().getId(), configModel.getEnv().getId(),
configModel.getVersion(), hasValue);
return buildListSuccess(configs, configs.size());
}
}