From 7ee5fc9b4032cc43b2c3b310df07306053101e52 Mon Sep 17 00:00:00 2001 From: 502647092 Date: Mon, 17 Oct 2016 00:41:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=BD=AC=E6=8D=A2=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 502647092 --- .../pw/yumc/YumCore/config/FileConfig.java | 137 ++++++------------ .../exception/ConfigParseException.java | 22 +++ .../config/inject/AbstractInjectConfig.java | 30 ++-- .../YumCore/config/inject/InjectParse.java | 90 ++++++++++++ .../java/pw/yumc/YumCore/sql/DataBase.java | 60 +++++--- 5 files changed, 209 insertions(+), 130 deletions(-) create mode 100644 src/main/java/pw/yumc/YumCore/config/exception/ConfigParseException.java create mode 100644 src/main/java/pw/yumc/YumCore/config/inject/InjectParse.java diff --git a/src/main/java/pw/yumc/YumCore/config/FileConfig.java b/src/main/java/pw/yumc/YumCore/config/FileConfig.java index 7ebbee6..715553a 100644 --- a/src/main/java/pw/yumc/YumCore/config/FileConfig.java +++ b/src/main/java/pw/yumc/YumCore/config/FileConfig.java @@ -30,7 +30,7 @@ import pw.yumc.YumCore.bukkit.Log; * @version 1.0 * @since 2015年11月7日 下午2:36:07 */ -@SuppressWarnings({ "unchecked" }) +@SuppressWarnings({"unchecked"}) public class FileConfig extends AbstractConfig { protected static String VERSION = "Version"; @@ -67,8 +67,7 @@ public class FileConfig extends AbstractConfig { /** * 从文件载入配置 * - * @param file - * 配置文件名称 + * @param file 配置文件名称 */ public FileConfig(File file) { Validate.notNull(file, FILE_NOT_BE_NULL); @@ -78,10 +77,8 @@ public class FileConfig extends AbstractConfig { /** * 从文件载入配置 * - * @param parent - * 文件夹 - * @param filename - * 配置文件名称 + * @param parent 文件夹 + * @param filename 配置文件名称 */ public FileConfig(File parent, String filename) { init(new File(parent, filename), true); @@ -90,8 +87,7 @@ public class FileConfig extends AbstractConfig { /** * 从数据流载入配置文件 * - * @param stream - * 数据流 + * @param stream 数据流 */ public FileConfig(InputStream stream) { init(stream); @@ -100,8 +96,7 @@ public class FileConfig extends AbstractConfig { /** * 从文件载入配置 * - * @param filename - * 配置文件名称 + * @param filename 配置文件名称 */ public FileConfig(String filename) { init(new File(plugin.getDataFolder(), filename), true); @@ -110,10 +105,8 @@ public class FileConfig extends AbstractConfig { /** * 从文件载入配置 * - * @param parent - * 文件夹 - * @param filename - * 配置文件名称 + * @param parent 文件夹 + * @param filename 配置文件名称 */ public FileConfig(String parent, String filename) { init(new File(parent, filename), true); @@ -122,12 +115,9 @@ public class FileConfig extends AbstractConfig { /** * 添加到List末尾 * - * @param - * List内容类型 - * @param path - * 路径 - * @param obj - * 对象 + * @param List内容类型 + * @param path 路径 + * @param obj 对象 * @return {@link FileConfig} */ public FileConfig addToList(String path, E obj) { @@ -142,10 +132,8 @@ public class FileConfig extends AbstractConfig { /** * 添加到StringList末尾 * - * @param path - * 路径 - * @param obj - * 字符串 + * @param path 路径 + * @param obj 字符串 * @return {@link FileConfig} */ public FileConfig addToStringList(String path, String obj) { @@ -156,12 +144,9 @@ public class FileConfig extends AbstractConfig { /** * 添加到StringList末尾 * - * @param path - * 路径 - * @param obj - * 字符串 - * @param allowrepeat - * 是否允许重复 + * @param path 路径 + * @param obj 字符串 + * @param allowrepeat 是否允许重复 * @return {@link FileConfig} */ public FileConfig addToStringList(String path, String obj, boolean allowrepeat) { @@ -179,8 +164,7 @@ public class FileConfig extends AbstractConfig { /** * 获得已颜色转码的文本 * - * @param cfgmsg - * 待转码的List + * @param cfgmsg 待转码的List * @return 颜色转码后的文本 */ public List getColorList(List cfgmsg) { @@ -206,8 +190,7 @@ public class FileConfig extends AbstractConfig { /** * 获得Location * - * @param key - * 键 + * @param key 键 * @return {@link Location} */ public Location getLocation(String key) { @@ -217,10 +200,8 @@ public class FileConfig extends AbstractConfig { /** * 获得Location * - * @param path - * 键 - * @param def - * 默认地点 + * @param path 键 + * @param def 默认地点 * @return {@link Location} */ public Location getLocation(String path, Location def) { @@ -231,8 +212,7 @@ public class FileConfig extends AbstractConfig { /** * 获得已颜色转码的文本 * - * @param path - * 配置路径 + * @param path 配置路径 * @return 颜色转码后的文本 */ public String getMessage(String path) { @@ -242,10 +222,8 @@ public class FileConfig extends AbstractConfig { /** * 获得已颜色转码的文本 * - * @param path - * 配置路径 - * @param def - * 默认文本 + * @param path 配置路径 + * @param def 默认文本 * @return 颜色转码后的文本 */ public String getMessage(String path, String def) { @@ -259,8 +237,7 @@ public class FileConfig extends AbstractConfig { /** * 获得已颜色转码的文本 * - * @param path - * 配置路径 + * @param path 配置路径 * @return 颜色转码后的文本 */ public List getMessageList(String path) { @@ -277,8 +254,7 @@ public class FileConfig extends AbstractConfig { /** * 获得字符串数组 * - * @param path - * 配置路径 + * @param path 配置路径 * @return 字符串数组 */ public String[] getStringArray(String path) { @@ -300,10 +276,8 @@ public class FileConfig extends AbstractConfig { /** * 比较版本号 * - * @param newver - * 新版本 - * @param oldver - * 旧版本 + * @param newver 新版本 + * @param oldver 旧版本 * @return 是否需要更新 */ public boolean needUpdate(String newver, String oldver) { @@ -340,12 +314,9 @@ public class FileConfig extends AbstractConfig { /** * 从List移除对象 * - * @param - * List内容对象类型 - * @param path - * 路径 - * @param obj - * 对象 + * @param List内容对象类型 + * @param path 路径 + * @param obj 对象 * @return {@link FileConfig} */ public FileConfig removeFromList(String path, E obj) { @@ -359,10 +330,8 @@ public class FileConfig extends AbstractConfig { /** * 从StringList移除对象 * - * @param path - * 路径 - * @param obj - * 对象 + * @param path 路径 + * @param obj 对象 * @return {@link FileConfig} */ public FileConfig removeFromStringList(String path, String obj) { @@ -436,8 +405,7 @@ public class FileConfig extends AbstractConfig { /** * 备份配置文件 * - * @param oldcfg - * 配置文件 + * @param oldcfg 配置文件 */ protected void backupConfig(FileConfig oldcfg) { String filename = oldcfg.getConfigName(); @@ -455,8 +423,7 @@ public class FileConfig extends AbstractConfig { /** * 检查配置文件 * - * @param file - * 配置文件 + * @param file 配置文件 */ protected void check(File file) { String filename = file.getName(); @@ -509,8 +476,7 @@ public class FileConfig extends AbstractConfig { /** * 初始化FileConfig * - * @param file - * 配置文件 + * @param file 配置文件 * @return FileConfig */ protected FileConfig init(File file) { @@ -521,10 +487,8 @@ public class FileConfig extends AbstractConfig { /** * 初始化FileConfig * - * @param file - * 配置文件 - * @param check - * 是否检查文件 + * @param file 配置文件 + * @param check 是否检查文件 * @return FileConfig */ protected FileConfig init(File file, boolean check) { @@ -544,8 +508,7 @@ public class FileConfig extends AbstractConfig { /** * 初始化FileConfig * - * @param stream - * 输入流 + * @param stream 输入流 * @return FileConfig */ protected FileConfig init(InputStream stream) { @@ -571,10 +534,8 @@ public class FileConfig extends AbstractConfig { /** * 检查配置文件版本 * - * @param newcfg - * 新配置文件 - * @param oldcfg - * 旧配置文件 + * @param newcfg 新配置文件 + * @param oldcfg 旧配置文件 * @return 是否需要升级 */ protected boolean needUpdate(FileConfig newcfg, FileConfig oldcfg) { @@ -584,10 +545,8 @@ public class FileConfig extends AbstractConfig { /** * 更新配置文件 * - * @param newcfg - * 新配置文件 - * @param oldcfg - * 旧配置文件 + * @param newcfg 新配置文件 + * @param oldcfg 旧配置文件 * @return 更新以后的配置文件 */ protected FileConfig updateConfig(FileConfig newCfg, FileConfig oldCfg) { @@ -597,12 +556,9 @@ public class FileConfig extends AbstractConfig { /** * 更新配置文件 * - * @param newCfg - * 新的配置文件 - * @param oldCfg - * 老的配置文件 - * @param force - * 是否强制更新 + * @param newCfg 新的配置文件 + * @param oldCfg 老的配置文件 + * @param force 是否强制更新 * @return 更新以后的配置文件 */ protected FileConfig updateConfig(FileConfig newCfg, FileConfig oldCfg, boolean force) { @@ -621,7 +577,8 @@ public class FileConfig extends AbstractConfig { // 复制旧的数据 for (String string : oldConfigKeys) { Object var = oldCfg.get(string); - if (var != null && !(var instanceof MemorySection)) { + // 需要进行节点检查 还有类型检查 不同类型情况下 使用新配置 + if (var != null && !(var instanceof MemorySection) && newCfg.get(string).getClass().equals(var.getClass())) { Log.debug(String.format(CONFIG_UPDATE_VALUE, string, var)); newCfg.set(string, var); } diff --git a/src/main/java/pw/yumc/YumCore/config/exception/ConfigParseException.java b/src/main/java/pw/yumc/YumCore/config/exception/ConfigParseException.java new file mode 100644 index 0000000..6bfeb36 --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/config/exception/ConfigParseException.java @@ -0,0 +1,22 @@ +package pw.yumc.YumCore.config.exception; + +/** + * 配置注入解析异常 + * + * @author 喵♂呜 + * @since 2016年10月5日 下午5:15:43 + */ +public class ConfigParseException extends RuntimeException { + + public ConfigParseException(Exception e) { + super(e); + } + + public ConfigParseException(String string) { + super(string); + } + + public ConfigParseException(String string, Exception e) { + super(string, e); + } +} diff --git a/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java b/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java index 9ddcbfd..96e54ca 100644 --- a/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java +++ b/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java @@ -12,23 +12,27 @@ import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import pw.yumc.YumCore.bukkit.Log; +import pw.yumc.YumCore.commands.exception.CommandParseException; import pw.yumc.YumCore.config.annotation.ConfigNode; import pw.yumc.YumCore.config.annotation.Default; import pw.yumc.YumCore.config.annotation.Nullable; +import pw.yumc.YumCore.config.exception.ConfigParseException; /** * 抽象注入配置 * - * @since 2016年7月5日 上午10:11:22 * @author 喵♂呜 + * @since 2016年7月5日 上午10:11:22 */ public abstract class AbstractInjectConfig { private static String INJECT_TYPE_ERROR = "配置节点 %s 数据类型不匹配 应该为: %s 但实际为: %s!"; private static String INJECT_ERROR = "自动注入配置失败 可能造成插件运行错误 %s: %s!"; - private static String DATE_PARSE_ERROR = "配置节点 {0} 日期解析失败 格式应该为: {1} 但输入值为: {2}!"; private static String PATH_NOT_FOUND = "配置节点 %s 丢失 将使用默认值!"; private static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; private static SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); + static { + + } private ConfigurationSection config; /** @@ -122,17 +126,9 @@ public abstract class AbstractInjectConfig { * @throws NoSuchMethodException * @throws SecurityException */ - private Object convertType(Class type, String path, 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); - case "java.util.Map": - return config.getConfigurationSection(path).getValues(true); - default: - return hanldeDefault(type, path, value); - } + private Object convertType(Class type, String path, Object value) throws CommandParseException, IllegalAccessException, IllegalArgumentException, InstantiationException, InvocationTargetException, NoSuchMethodException, SecurityException { + Object result = InjectParse.parse(type, config, path); + return result == null ? hanldeDefault(type, path, value) : result; } /** @@ -179,7 +175,7 @@ public abstract class AbstractInjectConfig { * @throws IllegalArgumentException * @throws IllegalAccessException */ - private void hanldeValue(String path, Field field, Object value) throws IllegalAccessException, IllegalArgumentException, InstantiationException, InvocationTargetException, NoSuchMethodException, SecurityException, ParseException { + private void hanldeValue(String path, Field field, Object value) throws IllegalAccessException, IllegalArgumentException, InstantiationException, InvocationTargetException, NoSuchMethodException, SecurityException, ConfigParseException { Class type = field.getType(); if (!type.equals(value.getClass())) { value = convertType(type, path, value); @@ -232,10 +228,10 @@ public abstract class AbstractInjectConfig { } hanldeValue(path, field, value); } catch (IllegalArgumentException ex) { - Log.w(INJECT_TYPE_ERROR, path, field.getType().getName(), value.getClass().getName()); + Log.w(INJECT_TYPE_ERROR, path, field.getType().getName(), value != null ? value.getClass().getName() : "空指针"); Log.debug(ex); - } catch (ParseException e) { - Log.w(DATE_PARSE_ERROR, path, DATE_FORMAT, value); + } catch (ConfigParseException e) { + Log.w(e.getMessage()); } catch (InstantiationException | InvocationTargetException | NoSuchMethodException | SecurityException | IllegalAccessException ex) { Log.w(INJECT_ERROR, ex.getClass().getName(), ex.getMessage()); Log.debug(ex); diff --git a/src/main/java/pw/yumc/YumCore/config/inject/InjectParse.java b/src/main/java/pw/yumc/YumCore/config/inject/InjectParse.java new file mode 100644 index 0000000..d0a8964 --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/config/inject/InjectParse.java @@ -0,0 +1,90 @@ +package pw.yumc.YumCore.config.inject; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bukkit.configuration.ConfigurationSection; + +import pw.yumc.YumCore.config.exception.ConfigParseException; + +/** + * 注入配置类解析 + * + * @author 喵♂呜 + * @since 2016年10月16日 下午3:26:48 + */ +public class InjectParse { + private static String DATE_PARSE_ERROR = "配置节点 {0} 日期解析失败 格式应该为: {1} 但输入值为: {2}!"; + private static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private static SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); + private static Map allparse = new HashMap<>(); + + static { + new ListParse(); + new MapParse(); + new DateParse(); + } + + public static Object parse(Class clazz, ConfigurationSection config, String path) { + return allparse.containsKey(clazz) ? allparse.get(clazz).parse(config, path) : null; + } + + /** + * 配置解析注册 + * + * @param clazz + * 类 + * @param parse + * 解析类 + */ + public static void register(Class clazz, Parse parse) { + allparse.put(clazz, parse); + } + + public static class DateParse implements Parse { + public DateParse() { + allparse.put(Date.class, this); + } + + @Override + public Date parse(ConfigurationSection config, String path) { + String value = "0000-00-00 00:00:00"; + try { + value = config.getString(path); + return df.parse(value); + } catch (ParseException e) { + throw new ConfigParseException(String.format(DATE_PARSE_ERROR, path, DATE_FORMAT, value), e); + } + } + } + + public static class ListParse implements Parse { + public ListParse() { + allparse.put(List.class, this); + } + + @Override + public List parse(ConfigurationSection config, String path) { + return config.getList(path); + } + } + + public static class MapParse implements Parse { + public MapParse() { + allparse.put(Map.class, this); + } + + @Override + public Map parse(ConfigurationSection config, String path) { + return config.getConfigurationSection(path).getValues(true); + } + } + + public static interface Parse { + public FC parse(ConfigurationSection config, String path); + } +} diff --git a/src/main/java/pw/yumc/YumCore/sql/DataBase.java b/src/main/java/pw/yumc/YumCore/sql/DataBase.java index b112980..df07d32 100644 --- a/src/main/java/pw/yumc/YumCore/sql/DataBase.java +++ b/src/main/java/pw/yumc/YumCore/sql/DataBase.java @@ -15,6 +15,9 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.plugin.Plugin; import pw.yumc.YumCore.bukkit.Log; +import pw.yumc.YumCore.bukkit.P; +import pw.yumc.YumCore.config.inject.InjectParse; +import pw.yumc.YumCore.config.inject.InjectParse.Parse; import pw.yumc.YumCore.sql.core.DataBaseCore; import pw.yumc.YumCore.sql.core.KeyValue; import pw.yumc.YumCore.sql.core.MySQLCore; @@ -231,29 +234,6 @@ public class DataBase { } - // @SuppressWarnings("unchecked") - // public List dbSelect( Class> model, KeyValue selCondition) { - // List modellist = new ArrayList<>(); - // String sql = "SELECT " + toKeys(model) + " FROM `" + model.getAnnotation(Entity.class).name() + "`" + (selCondition == null ? "" : " WHERE " + selCondition.toWhereString()); - // try { - // ResultSet dbresult = this.dataBaseCore.execute(sql); - // while (dbresult.next()) { - // M m = (M) model.newInstance(); - // Field[] fields = model.getDeclaredFields(); - // for ( Field col : fields) { - // col.set(m, dbresult.getObject(col.getName())); - // } - // modellist.add(m); - // } - // } catch ( InstantiationException e) { - // info("模型类实例化失败!"); - // e.printStackTrace(); - // } catch ( Exception e) { - // sqlerr(sql, e); - // } - // return modellist; - // } - /** * 对数据库表进行选择操作! * @@ -283,6 +263,29 @@ public class DataBase { return kvlist; } + // @SuppressWarnings("unchecked") + // public List dbSelect( Class> model, KeyValue selCondition) { + // List modellist = new ArrayList<>(); + // String sql = "SELECT " + toKeys(model) + " FROM `" + model.getAnnotation(Entity.class).name() + "`" + (selCondition == null ? "" : " WHERE " + selCondition.toWhereString()); + // try { + // ResultSet dbresult = this.dataBaseCore.execute(sql); + // while (dbresult.next()) { + // M m = (M) model.newInstance(); + // Field[] fields = model.getDeclaredFields(); + // for ( Field col : fields) { + // col.set(m, dbresult.getObject(col.getName())); + // } + // modellist.add(m); + // } + // } catch ( InstantiationException e) { + // info("模型类实例化失败!"); + // e.printStackTrace(); + // } catch ( Exception e) { + // sqlerr(sql, e); + // } + // return modellist; + // } + /** * 对数据库表进行选择操作! * @@ -489,6 +492,17 @@ public class DataBase { Log.info(info); } + public static class DataBaseParse implements Parse { + public DataBaseParse() { + InjectParse.register(DataBase.class, this); + } + + @Override + public DataBase parse(ConfigurationSection config, String path) { + return DataBase.create(P.instance, config.getConfigurationSection(path)); + } + } + // private String toKeys( Class> model) { // Field[] fields = model.getDeclaredFields(); // StringBuilder sb = new StringBuilder();