
com.baidu.disconf.client.scan.inner.dynamic.ScanDynamicStoreAdapter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of disconf-client Show documentation
Show all versions of disconf-client Show documentation
https://github.com/knightliao/disconf/tree/master/disconf-client
package com.baidu.disconf.client.scan.inner.dynamic;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
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.common.annotations.DisconfFile;
import com.baidu.disconf.client.common.annotations.DisconfUpdateService;
import com.baidu.disconf.client.common.model.DisconfKey;
import com.baidu.disconf.client.common.update.IDisconfUpdate;
import com.baidu.disconf.client.common.update.IDisconfUpdatePipeline;
import com.baidu.disconf.client.config.DisClientConfig;
import com.baidu.disconf.client.scan.inner.common.ScanVerify;
import com.baidu.disconf.client.scan.inner.dynamic.model.ScanDynamicModel;
import com.baidu.disconf.client.scan.inner.statically.model.ScanStaticModel;
import com.baidu.disconf.client.store.DisconfStorePipelineProcessor;
import com.baidu.disconf.client.store.DisconfStoreProcessor;
import com.baidu.disconf.client.store.DisconfStoreProcessorFactory;
import com.baidu.disconf.client.support.registry.Registry;
import com.baidu.disconf.core.common.constants.DisConfigTypeEnum;
/**
* 动态扫描 与 Store模块的转换器
*
* @author liaoqiqi
* @version 2014-6-18
*/
public class ScanDynamicStoreAdapter {
protected static final Logger LOGGER = LoggerFactory.getLogger(ScanDynamicStoreAdapter.class);
/**
* 扫描更新回调函数
*/
public static void scanUpdateCallbacks(ScanStaticModel scanModel, Registry registry) {
// 扫描出来
ScanDynamicModel scanDynamicModel = analysis4DisconfUpdate(scanModel, registry);
// 写到仓库中
transformUpdateService(scanDynamicModel.getDisconfUpdateServiceInverseIndexMap());
transformPipelineService(scanDynamicModel.getDisconfUpdatePipeline());
}
/**
* 第二次扫描, 获取更新 回调的实例
*
* 分析出更新操作的相关配置文件内容
*/
private static ScanDynamicModel analysis4DisconfUpdate(ScanStaticModel scanModel, Registry registry) {
// 配置项或文件
Map> inverseMap = new HashMap>();
Set> disconfUpdateServiceSet = scanModel.getDisconfUpdateService();
for (Class> disconfUpdateServiceClass : disconfUpdateServiceSet) {
// 回调对应的参数
DisconfUpdateService disconfUpdateService =
disconfUpdateServiceClass.getAnnotation(DisconfUpdateService.class);
//
// 校验是否有继承正确,是否继承IDisconfUpdate
if (!ScanVerify.hasIDisconfUpdate(disconfUpdateServiceClass)) {
continue;
}
//
// 获取回调接口实例
IDisconfUpdate iDisconfUpdate = getIDisconfUpdateInstance(disconfUpdateServiceClass, registry);
if (iDisconfUpdate == null) {
continue;
}
//
// 配置项
processItems(inverseMap, disconfUpdateService, iDisconfUpdate);
//
// 配置文件
processFiles(inverseMap, disconfUpdateService, iDisconfUpdate);
}
// set data
ScanDynamicModel scanDynamicModel = new ScanDynamicModel();
scanDynamicModel.setDisconfUpdateServiceInverseIndexMap(inverseMap);
//
// set update pipeline
//
if (scanModel.getiDisconfUpdatePipeline() != null) {
IDisconfUpdatePipeline iDisconfUpdatePipeline = getIDisconfUpdatePipelineInstance(scanModel
.getiDisconfUpdatePipeline(), registry);
if (iDisconfUpdatePipeline != null) {
scanDynamicModel.setDisconfUpdatePipeline(iDisconfUpdatePipeline);
}
}
return scanDynamicModel;
}
/**
* 获取回调对应配置项列表
*/
private static void processItems(Map> inverseMap,
DisconfUpdateService disconfUpdateService, IDisconfUpdate iDisconfUpdate) {
List itemKeys = Arrays.asList(disconfUpdateService.itemKeys());
// 反索引
for (String key : itemKeys) {
DisconfKey disconfKey = new DisconfKey(DisConfigTypeEnum.ITEM, key);
addOne2InverseMap(disconfKey, inverseMap, iDisconfUpdate);
}
}
/**
* 获取回调对应的配置文件列表
*/
private static void processFiles(Map> inverseMap,
DisconfUpdateService disconfUpdateService, IDisconfUpdate iDisconfUpdate) {
// 反索引
List> classes = Arrays.asList(disconfUpdateService.classes());
for (Class> curClass : classes) {
// 获取其注解
DisconfFile disconfFile = curClass.getAnnotation(DisconfFile.class);
if (disconfFile == null) {
LOGGER.error("cannot find DisconfFile annotation for class when set callback: {} ",
curClass.toString());
continue;
}
DisconfKey disconfKey = new DisconfKey(DisConfigTypeEnum.FILE, disconfFile.filename());
addOne2InverseMap(disconfKey, inverseMap, iDisconfUpdate);
}
// 反索引
List fileKeyList = Arrays.asList(disconfUpdateService.confFileKeys());
for (String fileKey : fileKeyList) {
DisconfKey disconfKey = new DisconfKey(DisConfigTypeEnum.FILE, fileKey);
addOne2InverseMap(disconfKey, inverseMap, iDisconfUpdate);
}
}
/**
* 获取回调接口的实现
*
* // 回调函数需要实例化出来,这里
* // 非Spring直接New
* // Spring要GetBean
* //
*/
private static IDisconfUpdate getIDisconfUpdateInstance(Class> disconfUpdateServiceClass, Registry registry) {
Object iDisconfUpdate = registry.getFirstByType(disconfUpdateServiceClass, true);
if (iDisconfUpdate == null) {
return null;
}
return (IDisconfUpdate) iDisconfUpdate;
}
/**
* 获取回调接口的实现
* //
*/
private static IDisconfUpdatePipeline getIDisconfUpdatePipelineInstance(
Class disconfUpdateServiceClass,
Registry registry) {
Object iDisconfUpdate = registry.getFirstByType(disconfUpdateServiceClass, true);
if (iDisconfUpdate == null) {
return null;
}
return (IDisconfUpdatePipeline) iDisconfUpdate;
}
/**
* 将一个配置回调item写到map里
*/
private static void addOne2InverseMap(DisconfKey disconfKey, Map> inverseMap,
IDisconfUpdate iDisconfUpdate) {
// 忽略的key 应该忽略掉
if (DisClientConfig.getInstance().getIgnoreDisconfKeySet().contains(disconfKey.getKey())) {
return;
}
List serviceList;
if (inverseMap.containsKey(disconfKey)) {
inverseMap.get(disconfKey).add(iDisconfUpdate);
} else {
serviceList = new ArrayList();
serviceList.add(iDisconfUpdate);
inverseMap.put(disconfKey, serviceList);
}
}
/**
* 第二次扫描
* 转换 pipeline 回调函数,将其写到 仓库中
*/
private static void transformPipelineService(IDisconfUpdatePipeline iDisconfUpdatePipeline) {
DisconfStorePipelineProcessor disconfStorePipelineProcessor = DisconfStoreProcessorFactory
.getDisconfStorePipelineProcessor();
disconfStorePipelineProcessor.setDisconfUpdatePipeline(iDisconfUpdatePipeline);
}
/**
* 第二次扫描
* 转换 更新 回调函数,将其写到 仓库中
*/
private static void transformUpdateService(Map> disconfUpdateServiceInverseIndexMap) {
DisconfStoreProcessor disconfStoreProcessorFile = DisconfStoreProcessorFactory.getDisconfStoreFileProcessor();
DisconfStoreProcessor disconfStoreProcessorItem = DisconfStoreProcessorFactory.getDisconfStoreItemProcessor();
for (DisconfKey disconfKey : disconfUpdateServiceInverseIndexMap.keySet()) {
//
//
//
try {
if (disconfKey.getDisConfigTypeEnum().equals(DisConfigTypeEnum.FILE)) {
if (!disconfStoreProcessorFile.hasThisConf(disconfKey.getKey())) {
throw new Exception();
}
disconfStoreProcessorFile.addUpdateCallbackList(disconfKey.getKey(),
disconfUpdateServiceInverseIndexMap
.get(disconfKey));
} else if (disconfKey.getDisConfigTypeEnum().equals(DisConfigTypeEnum.ITEM)) {
if (!disconfStoreProcessorItem.hasThisConf(disconfKey.getKey())) {
throw new Exception();
}
disconfStoreProcessorItem.addUpdateCallbackList(disconfKey.getKey(),
disconfUpdateServiceInverseIndexMap
.get(disconfKey));
}
} catch (Exception e) {
// 找不到回调对应的配置,这是用户配置 错误了
StringBuffer sb = new StringBuffer();
sb.append("cannot find " + disconfKey + "for: ");
for (IDisconfUpdate serClass : disconfUpdateServiceInverseIndexMap.get(disconfKey)) {
sb.append(serClass.toString() + "\t");
}
LOGGER.error(sb.toString());
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy