package com.baidu.disconf.client.store.processor.impl;
import static com.baidu.disconf.client.store.inner.DisconfCenterStore.getInstance;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baidu.disconf.client.addons.properties.ReloadConfigurationMonitor;
import com.baidu.disconf.client.common.constants.SupportFileTypeEnum;
import com.baidu.disconf.client.common.model.DisConfCommonModel;
import com.baidu.disconf.client.common.model.DisconfCenterBaseModel;
import com.baidu.disconf.client.common.model.DisconfCenterFile;
import com.baidu.disconf.client.common.model.DisconfCenterFile.FileItemValue;
import com.baidu.disconf.client.common.update.IDisconfUpdate;
import com.baidu.disconf.client.store.DisconfStoreProcessor;
import com.baidu.disconf.client.store.processor.model.DisconfValue;
/**
* 配置文件仓库实现器
*
* @author liaoqiqi
* @version 2014-8-4
*/
public class DisconfStoreFileProcessorImpl implements DisconfStoreProcessor {
protected static final Logger LOGGER = LoggerFactory.getLogger(DisconfStoreFileProcessorImpl.class);
/**
*
*/
@Override
public void addUpdateCallbackList(String keyName, List<IDisconfUpdate> iDisconfUpdateList) {
if (getInstance().getConfFileMap().containsKey(keyName)) {
getInstance().getConfFileMap().get(keyName).getDisconfCommonCallbackModel().getDisconfConfUpdates()
.addAll(iDisconfUpdateList);
}
}
/**
*
*/
@Override
public List<IDisconfUpdate> getUpdateCallbackList(String keyName) {
if (getInstance().getConfFileMap().containsKey(keyName)) {
return getInstance().getConfFileMap().get(keyName).getDisconfCommonCallbackModel().getDisconfConfUpdates();
}
return new ArrayList<IDisconfUpdate>();
}
/**
*
*/
@Override
public DisConfCommonModel getCommonModel(String keyName) {
DisconfCenterFile disconfCenterFile = getInstance().getConfFileMap().get(keyName);
// 校验是否存在
if (disconfCenterFile == null) {
LOGGER.error("cannot find " + keyName + " in store....");
return null;
}
return disconfCenterFile.getDisConfCommonModel();
}
/**
*
*/
@Override
public boolean hasThisConf(String keyName) {
// 配置文件
if (!getInstance().getConfFileMap().containsKey(keyName)) {
return false;
}
return true;
}
/**
*
*/
@Override
public void inject2Instance(Object object, String fileName) {
DisconfCenterFile disconfCenterFile = getInstance().getConfFileMap().get(fileName);
// 校验是否存在
if (disconfCenterFile == null) {
LOGGER.error("cannot find " + fileName + " in store....");
return;
}
//
// 静态类
//
if (object != null) {
// 设置object
disconfCenterFile.setObject(object);
}
// 根据类型设置值
//
// 注入实体
//
Map<String, FileItemValue> keMap = disconfCenterFile.getKeyMaps();
for (String fileItem : keMap.keySet()) {
// 根据类型设置值
try {
//
// 静态类
//
if (object == null) {
if (keMap.get(fileItem).isStatic()) {
LOGGER.debug(fileItem + " is a static field. ");
keMap.get(fileItem).setValue4StaticFileItem(keMap.get(fileItem).getValue());
}
//
// 非静态类
//
} else {
LOGGER.debug(fileItem + " is a non-static field. ");
if (keMap.get(fileItem).getValue() == null) {
// 如果仓库值为空,则实例 直接使用默认值
Object defaultValue = keMap.get(fileItem).getFieldDefaultValue(object);
keMap.get(fileItem).setValue(defaultValue);
} else {
// 如果仓库里的值为非空,则实例使用仓库里的值
keMap.get(fileItem).setValue4FileItem(object, keMap.get(fileItem).getValue());
}
}
} catch (Exception e) {
LOGGER.error("inject2Instance fileName " + fileName + " " + e.toString(), e);
}
}
}
/**
*
*/
@Override
public Object getConfig(String fileName, String keyName) {
DisconfCenterFile disconfCenterFile = getInstance().getConfFileMap().get(fileName);
// 校验是否存在
if (disconfCenterFile == null) {
LOGGER.debug("cannot find " + fileName + " in store....");
return null;
}
if (disconfCenterFile.getKeyMaps().get(keyName) == null) {
LOGGER.debug("cannot find " + fileName + ", " + keyName + " in store....");
return null;
}
return disconfCenterFile.getKeyMaps().get(keyName).getValue();
}
/**
*
*/
@Override
public void inject2Store(String fileName, DisconfValue disconfValue) {
DisconfCenterFile disconfCenterFile = getInstance().getConfFileMap().get(fileName);
// 校验是否存在
if (disconfCenterFile == null) {
LOGGER.error("cannot find " + fileName + " in store....");
return;
}
if (disconfValue == null || disconfValue.getFileData() == null) {
LOGGER.error("value is null for {}", fileName);
return;
}
// 存储
Map<String, FileItemValue> keMap = disconfCenterFile.getKeyMaps();
if (keMap.size() > 0) {
for (String fileItem : keMap.keySet()) {
Object object = disconfValue.getFileData().get(fileItem);
if (object == null) {
LOGGER.error("cannot find {} to be injected. file content is: {}", fileItem,
disconfValue.getFileData().toString());
continue;
}
// 根据类型设置值
try {
Object value = keMap.get(fileItem).getFieldValueByType(object);
keMap.get(fileItem).setValue(value);
} catch (Exception e) {
LOGGER.error("inject2Store filename: " + fileName + " " + e.toString(), e);
}
}
}
// 使用过 XML式配置
if (disconfCenterFile.isTaggedWithNonAnnotationFile()) {
if (disconfCenterFile.getSupportFileTypeEnum().equals(SupportFileTypeEnum.PROPERTIES)) {
// 如果是采用XML进行配置的,则需要利用spring的reload将数据reload到bean里
ReloadConfigurationMonitor.reload();
}
disconfCenterFile.setAdditionalKeyMaps(disconfValue.getFileData());
}
}
/**
*
*/
@Override
public void transformScanData(List<DisconfCenterBaseModel> disconfCenterBaseModels) {
for (DisconfCenterBaseModel disconfCenterFile : disconfCenterBaseModels) {
transformScanData(disconfCenterFile);
}
}
/**
*
*/
@Override
public void transformScanData(DisconfCenterBaseModel disconfCenterBaseModel) {
getInstance().storeOneFile(disconfCenterBaseModel);
}
/**
*
*/
@Override
public DisconfCenterBaseModel getConfData(String key) {
if (getInstance().getConfFileMap().containsKey(key)) {
return getInstance().getConfFileMap().get(key);
} else {
return null;
}
}
/**
*
*/
@Override
public Set<String> getConfKeySet() {
return getInstance().getConfFileMap().keySet();
}
/**
*
*/
@Override
public String confToString() {
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("\n");
Map<String, DisconfCenterFile> disMap = getInstance().getConfFileMap();
for (String file : disMap.keySet()) {
sBuffer.append("disconf-file:\t" + file + "\t");
if (LOGGER.isDebugEnabled()) {
sBuffer.append(disMap.get(file).toString());
} else {
sBuffer.append(disMap.get(file).infoString());
}
sBuffer.append("\n");
}
return sBuffer.toString();
}
@Override
public void exclude(Set<String> keySet) {
for (String key : keySet) {
getInstance().excludeOneFile(key);
}
}
}