mirror of
https://e.coding.net/circlecloud/YumCore.git
synced 2024-11-25 02:18:50 +00:00
refactor: 拆分值处理逻辑
Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
parent
5d8b1eb430
commit
6c819839cd
@ -1,10 +1,10 @@
|
|||||||
package pw.yumc.YumCore.config;
|
package pw.yumc.YumCore.config;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
|
||||||
@ -16,12 +16,12 @@ import pw.yumc.YumCore.bukkit.Log;
|
|||||||
* @author 喵♂呜
|
* @author 喵♂呜
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractInjectConfig {
|
public abstract class AbstractInjectConfig {
|
||||||
private static final String DATA_FORMAT_ERROR = "配置节点 {0} 数据类型不匹配 应该为: {1} 但实际为: {2}!";
|
private static final String INJECT_TYPE_ERROR = "配置节点 %s 数据类型不匹配 应该为: %s 但实际为: %s!";
|
||||||
private static final String INJECT_ERROR = "自动注入配置错误!";
|
private static final String INJECT_ERROR = "自动注入配置失败 可能造成插件运行错误 %s: %s!";
|
||||||
private static final String DATE_PARSE_ERROR = "配置节点 {0} 日期解析失败 格式应该为: {1} 但输入值为: {2}!";
|
private static final String DATE_PARSE_ERROR = "配置节点 {0} 日期解析失败 格式应该为: {1} 但输入值为: {2}!";
|
||||||
private static final String PATH_NOT_FOUND = "配置节点 %s 丢失!";
|
private static final String PATH_NOT_FOUND = "配置节点 %s 丢失 可能造成插件运行错误!";
|
||||||
private static final String DATA_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||||
private static final SimpleDateFormat df = new SimpleDateFormat(DATA_FORMAT);
|
private static final SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT);
|
||||||
private ConfigurationSection config;
|
private ConfigurationSection config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,6 +47,90 @@ public abstract class AbstractInjectConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换字段值类型
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* 字段类型
|
||||||
|
* @param path
|
||||||
|
* 配置路径
|
||||||
|
* @param value
|
||||||
|
* 字段值
|
||||||
|
* @return 转换后的值
|
||||||
|
* @throws ParseException
|
||||||
|
* @throws IllegalAccessException
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
* @throws InstantiationException
|
||||||
|
* @throws InvocationTargetException
|
||||||
|
* @throws NoSuchMethodException
|
||||||
|
* @throws SecurityException
|
||||||
|
*/
|
||||||
|
private Object convertType(final Class<?> type, final String path, final Object value) throws ParseException, IllegalAccessException, IllegalArgumentException, InstantiationException, InvocationTargetException, NoSuchMethodException, SecurityException {
|
||||||
|
switch (type.getName()) {
|
||||||
|
case "java.util.Date":
|
||||||
|
return df.parse((String) value);
|
||||||
|
case "java.util.List":
|
||||||
|
return config.getList(path);
|
||||||
|
default:
|
||||||
|
return hanldeDefault(type, path, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认类型处理流程
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
* 路径
|
||||||
|
* @param field
|
||||||
|
* 字段
|
||||||
|
* @param value
|
||||||
|
* 值
|
||||||
|
* @return 解析后的Value
|
||||||
|
* @throws IllegalAccessException
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
* @throws InstantiationException
|
||||||
|
* @throws InvocationTargetException
|
||||||
|
* @throws NoSuchMethodException
|
||||||
|
* @throws SecurityException
|
||||||
|
*/
|
||||||
|
private Object hanldeDefault(final Class<?> field, final String path, final Object value) throws IllegalAccessException, IllegalArgumentException, InstantiationException, InvocationTargetException, NoSuchMethodException, SecurityException {
|
||||||
|
if (InjectConfigurationSection.class.isAssignableFrom(field)) {
|
||||||
|
if (config.isConfigurationSection(path)) {
|
||||||
|
return field.getConstructor(ConfigurationSection.class).newInstance(config.getConfigurationSection(path));
|
||||||
|
}
|
||||||
|
Log.w(INJECT_TYPE_ERROR, path, ConfigurationSection.class.getName(), value.getClass().getName());
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理值
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
* 路径
|
||||||
|
* @param field
|
||||||
|
* 字段
|
||||||
|
* @param value
|
||||||
|
* 值
|
||||||
|
*/
|
||||||
|
private void hanldeValue(final String path, final Field field, Object value) {
|
||||||
|
try {
|
||||||
|
final Class<?> type = field.getType();
|
||||||
|
if (!type.equals(value.getClass())) {
|
||||||
|
value = convertType(type, path, value);
|
||||||
|
}
|
||||||
|
field.set(this, value);
|
||||||
|
} catch (final IllegalArgumentException ex) {
|
||||||
|
Log.w(INJECT_TYPE_ERROR, path, field.getType().getName(), value.getClass().getName());
|
||||||
|
Log.debug(ex);
|
||||||
|
} catch (final ParseException e) {
|
||||||
|
Log.w(DATE_PARSE_ERROR, path, DATE_FORMAT, value);
|
||||||
|
} catch (final InstantiationException | InvocationTargetException | NoSuchMethodException | SecurityException | IllegalAccessException ex) {
|
||||||
|
Log.w(INJECT_ERROR, ex.getClass().getName(), ex.getMessage());
|
||||||
|
Log.debug(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用解析流程
|
* 通用解析流程
|
||||||
*
|
*
|
||||||
@ -61,36 +145,15 @@ public abstract class AbstractInjectConfig {
|
|||||||
protected void setField(final String path, final Field field) {
|
protected void setField(final String path, final Field field) {
|
||||||
Object value = config.get(path);
|
Object value = config.get(path);
|
||||||
final Default def = field.getAnnotation(Default.class);
|
final Default def = field.getAnnotation(Default.class);
|
||||||
if (value == null) {
|
if (value == null && def != null) {
|
||||||
if (def != null) {
|
|
||||||
value = def.value();
|
value = def.value();
|
||||||
} else {
|
}
|
||||||
|
if (value == null) {
|
||||||
if (field.getAnnotation(Nullable.class) == null) {
|
if (field.getAnnotation(Nullable.class) == null) {
|
||||||
Log.warning(String.format(PATH_NOT_FOUND, path));
|
Log.w(PATH_NOT_FOUND, path);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
hanldeValue(path, field, value);
|
||||||
try {
|
|
||||||
final String typeName = field.getType().getName();
|
|
||||||
switch (typeName) {
|
|
||||||
case "java.util.Date":
|
|
||||||
try {
|
|
||||||
value = df.parse((String) value);
|
|
||||||
} catch (final ParseException e) {
|
|
||||||
final Object[] obj = new Object[] { path, DATA_FORMAT, value };
|
|
||||||
Log.log(Level.INFO, DATE_PARSE_ERROR, obj);
|
|
||||||
}
|
|
||||||
case "java.util.List":
|
|
||||||
value = config.getList(path);
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
field.set(this, value);
|
|
||||||
} catch (final IllegalArgumentException ex) {
|
|
||||||
final Object[] obj = new Object[] { path, field.getType().getName(), value.getClass().getName() };
|
|
||||||
Log.log(Level.INFO, DATA_FORMAT_ERROR, obj);
|
|
||||||
} catch (final IllegalAccessException ex) {
|
|
||||||
Log.log(Level.SEVERE, INJECT_ERROR, ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user