package com.baidu.disconf.client.common.model;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baidu.disconf.client.common.constants.SupportFileTypeEnum;
import com.baidu.disconf.client.config.DisClientConfig;
import com.baidu.disconf.client.support.utils.ClassUtils;
import com.baidu.disconf.core.common.utils.ClassLoaderUtil;
import com.baidu.disconf.core.common.utils.OsUtil;
/**
* 配置文件表示
*
* @author liaoqiqi
* @version 2014-5-20
*/
public class DisconfCenterFile extends DisconfCenterBaseModel {
protected static final Logger LOGGER = LoggerFactory.getLogger(DisconfCenterFile.class);
// -----key: 配置文件中的项名
// -----value: 默认值
private Map<String, FileItemValue> keyMaps = new HashMap<String, FileItemValue>();
// 额外的配置数据,非注解式使用它来存储
private Map<String, Object> additionalKeyMaps = new HashMap<String, Object>();
// 是否是非注解注入方式
private boolean isTaggedWithNonAnnotationFile = false;
// 配置文件类
private Class<?> cls;
// 文件名
private String fileName;
// 配置文件 指定路径下
private String targetDirPath;
// 文件类型
private SupportFileTypeEnum supportFileTypeEnum = SupportFileTypeEnum.ANY;
public Class<?> getCls() {
return cls;
}
public void setCls(Class<?> cls) {
this.cls = cls;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public Map<String, FileItemValue> getKeyMaps() {
return keyMaps;
}
public void setKeyMaps(Map<String, FileItemValue> keyMaps) {
this.keyMaps = keyMaps;
}
public Map<String, Object> getAdditionalKeyMaps() {
return additionalKeyMaps;
}
public void setAdditionalKeyMaps(Map<String, Object> additionalKeyMaps) {
this.additionalKeyMaps = additionalKeyMaps;
}
public SupportFileTypeEnum getSupportFileTypeEnum() {
return supportFileTypeEnum;
}
public void setSupportFileTypeEnum(SupportFileTypeEnum supportFileTypeEnum) {
this.supportFileTypeEnum = supportFileTypeEnum;
}
public boolean isTaggedWithNonAnnotationFile() {
return isTaggedWithNonAnnotationFile;
}
public void setIsTaggedWithNonAnnotationFile(boolean isTaggedWithNonAnnotationFile) {
this.isTaggedWithNonAnnotationFile = isTaggedWithNonAnnotationFile;
}
public String getTargetDirPath() {
return targetDirPath;
}
public void setTargetDirPath(String targetDirPath) {
this.targetDirPath = targetDirPath;
}
@Override
public String toString() {
return "\n\tDisconfCenterFile [\n\tkeyMaps=" + keyMaps + "\n\tcls=" + cls + "\n\tfileName=" + fileName
+ "\n\ttargetDirPath=" + targetDirPath +
super.toString() + "]";
}
@Override
public String infoString() {
return "\n\tDisconfCenterFile [\n\tkeyMaps=" + keyMaps + "\n" +
"\tadditionalKeyMaps=" + additionalKeyMaps + "\n\tcls=" + cls + super.infoString() + "]";
}
/**
* 获取可以表示的KeyMap对
*/
public Map<String, Object> getKV() {
// 非注解式的
if (keyMaps.size() == 0) {
return additionalKeyMaps;
}
//
// 注解式的
//
Map<String, Object> map = new HashMap<String, Object>();
for (String key : keyMaps.keySet()) {
map.put(key, keyMaps.get(key).getValue());
}
return map;
}
/**
* 配置文件的路径
*/
public String getFilePath() {
// 不放到classpath, 则文件路径根据 userDefineDownloadDir 来设置
if (!DisClientConfig.getInstance().enableLocalDownloadDirInClassPath) {
return OsUtil.pathJoin(DisClientConfig.getInstance().userDefineDownloadDir, fileName);
}
if (targetDirPath != null) {
if (targetDirPath.startsWith("/")) {
return OsUtil.pathJoin(targetDirPath, fileName);
}
return OsUtil.pathJoin(ClassLoaderUtil.getClassPath(), targetDirPath, fileName);
}
return OsUtil.pathJoin(ClassLoaderUtil.getClassPath(), fileName);
}
/**
* 配置文件的路径
*/
public String getFileDir() {
// 获取相对于classpath的路径
if (targetDirPath != null) {
if (targetDirPath.startsWith("/")) {
return OsUtil.pathJoin(targetDirPath);
}
return OsUtil.pathJoin(ClassLoaderUtil.getClassPath(), targetDirPath);
}
return ClassLoaderUtil.getClassPath();
}
/**
* 配置文件Item项表示,包括了值,还有其类型
*
* @author liaoqiqi
* @version 2014-6-16
*/
public static class FileItemValue {
private Object value;
private Field field;
private Method setMethod;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public void setField(Field field) {
this.field = field;
}
/**
* 是否是静态域
*
* @return
*/
public boolean isStatic() {
return Modifier.isStatic(field.getModifiers());
}
/**
* 设置value, 优先使用 setter method, 然后其次是反射
*
* @param value
*/
public Object setValue4StaticFileItem(Object value) throws Exception {
try {
if (setMethod != null) {
setMethod.invoke(null, value);
} else {
field.set(null, value);
}
} catch (Exception e) {
LOGGER.warn(e.toString());
}
return value;
}
public Object setValue4FileItem(Object object, Object value) throws Exception {
try {
if (setMethod != null) {
setMethod.invoke(object, value);
} else {
field.set(object, value);
}
} catch (Exception e) {
LOGGER.warn(e.toString());
}
return value;
}
/**
* 返回值
*
* @param fieldValue
*
* @return
*
* @throws Exception
*/
public Object getFieldValueByType(Object fieldValue) throws Exception {
return ClassUtils.getValeByType(field.getType(), fieldValue);
}
public Object getFieldDefaultValue(Object object) throws Exception {
return field.get(object);
}
@Override
public String toString() {
return "FileItemValue{" +
"value=" + value +
", field=" + field +
", setMethod=" + setMethod +
'}';
}
public FileItemValue(Object value, Field field) {
super();
this.value = value;
this.field = field;
}
public FileItemValue(Object value, Field field, Method setMethod) {
super();
this.value = value;
this.field = field;
this.setMethod = setMethod;
}
}
}