|
20 | 20 |
|
21 | 21 | /** |
22 | 22 | * 文件配置管理器 |
| 23 | + * |
23 | 24 | * @author YangQiang |
24 | 25 | */ |
25 | 26 | public abstract class AbstractFileConfigDataManager extends AbstractConfigDataManager { |
26 | | - protected FileConfigDataManagerConfig config; |
27 | | - |
28 | | - public AbstractFileConfigDataManager() { |
29 | | - Class<?> clz = getClass(); |
30 | | - this.config = new FileConfigDataManagerConfig(clz); |
31 | | - } |
32 | | - |
33 | | - public AbstractFileConfigDataManager(Class<?> configClz) { |
34 | | - this(new FileConfigDataManagerConfig(configClz)); |
35 | | - } |
36 | | - |
37 | | - public AbstractFileConfigDataManager(FileConfigDataManagerConfig config) { |
38 | | - this.config = config; |
39 | | - } |
40 | | - |
41 | | - public AbstractFileConfigDataManager setXmlConfigFile(String file) { |
42 | | - this.config.setXmlConfigFile(file); |
43 | | - return this; |
44 | | - } |
45 | | - |
46 | | - public AbstractFileConfigDataManager setConfigPackage(String configPackage) { |
47 | | - this.config.setConfigPackage(configPackage); |
48 | | - return this; |
49 | | - } |
50 | | - |
51 | | - public AbstractFileConfigDataManager setConfigFileDir(String configFileDir) { |
52 | | - this.config.setConfigFileDir(configFileDir); |
53 | | - return this; |
54 | | - } |
55 | | - |
56 | | - public AbstractFileConfigDataManager setConfigFileSuffix(String configFileSuffix) { |
57 | | - if (configFileSuffix == null) { |
58 | | - configFileSuffix = ""; |
59 | | - } |
60 | | - this.config.setConfigFileSuffix(configFileSuffix); |
61 | | - return this; |
62 | | - } |
63 | | - |
64 | | - public String getXmlConfigFile() { |
65 | | - return config.getXmlConfigFile(); |
66 | | - } |
67 | | - |
68 | | - public String getConfigPackage() { |
69 | | - return config.getConfigPackage(); |
70 | | - } |
71 | | - |
72 | | - public String getConfigFileDir() { |
73 | | - return config.getConfigFileDir(); |
74 | | - } |
75 | | - |
76 | | - public String getConfigFileSuffix() { |
77 | | - return config.getConfigFileSuffix(); |
78 | | - } |
79 | | - |
80 | | - @Override |
81 | | - public void init() throws Exception { |
82 | | - parseFileConfig(); |
83 | | - } |
84 | | - |
85 | | - private void parseFileConfig() throws Exception { |
86 | | - String configFileDir = getConfigFileDir(); |
87 | | - Objects.requireNonNull(configFileDir, "configFileDir 不能为空!"); |
88 | | - File excelFile = new File(configFileDir); |
89 | | - if (!excelFile.isDirectory()) { |
90 | | - LOGGER.error("配置文件路径错误[%s]", configFileDir); |
91 | | - throw new RuntimeException(String.format("excel文件路径错误[%s]", configFileDir)); |
92 | | - } |
93 | | - |
94 | | - Map<String, Class> cacheClz = new HashMap<>(10); |
95 | | - Map<String, TableDesc> configTable = new HashMap<>(10); |
96 | | - |
97 | | - String configPackage = getConfigPackage(); |
98 | | - if (configPackage != null) { |
99 | | - // 获取所有的配置类和缓存类 |
100 | | - Set<Class> clzSet = ClassFileUtils.getClasses(configPackage, clz -> clz.isAnnotationPresent(Config.class) || clz.isAnnotationPresent(Cache.class)); |
101 | | - for (Class clz : clzSet) { |
102 | | - if (clz.isAnnotationPresent(Config.class)) { |
103 | | - TableDesc tableDesc = ReflectUtils.getTableDesc(clz); |
104 | | - configTable.put(clz.getName(), tableDesc); |
105 | | - } else if (clz.isAnnotationPresent(Cache.class)) { |
106 | | - cacheClz.put(clz.getName(), clz); |
107 | | - } |
108 | | - } |
109 | | - } |
110 | | - |
111 | | - String xmlConfigFile = getXmlConfigFile(); |
112 | | - if (xmlConfigFile == null) { |
113 | | - URL xmlConfigResource = ExcelConfigDataManager.class.getClassLoader().getResource(DEFAULT_XML_CONFIG_FILE); |
114 | | - if (xmlConfigResource != null) { |
115 | | - xmlConfigFile = xmlConfigResource.getFile(); |
116 | | - } |
117 | | - } |
118 | | - |
119 | | - if (xmlConfigFile != null) { |
120 | | - Map<String, TableDesc> xmlConfigs = DataConfigXmlParser.parseConfigs(xmlConfigFile); |
121 | | - configTable.putAll(xmlConfigs); |
122 | | - |
123 | | - Map<String, Class> xmlCaches = DataConfigXmlParser.parseCaches(xmlConfigFile); |
124 | | - cacheClz.putAll(xmlCaches); |
125 | | - } |
126 | | - |
127 | | - Map<String, IConfigWrapper> tempConfigs = new HashMap<>(10); |
128 | | - configTable.forEach((clzName, tableDesc) -> { |
129 | | - IConfigWrapper wrapper = parseTableDesc(tableDesc); |
130 | | - wrapper.getList().forEach(e -> { |
131 | | - if (IConfig.class.isAssignableFrom(e.getClass())) { |
132 | | - IConfig config = (IConfig) e; |
133 | | - config.afterLoad(); |
134 | | - } |
135 | | - }); |
136 | | - tempConfigs.put(clzName, wrapper); |
137 | | - }); |
138 | | - |
139 | | - Map<String, Object> tempCaches = new HashMap<>(10); |
140 | | - cacheClz.forEach((clzName, clz) -> { |
141 | | - try { |
142 | | - Object obj = clz.newInstance(); |
143 | | - if (IConfigCache.class.isAssignableFrom(clz)) { |
144 | | - IConfigCache cache = (IConfigCache) obj; |
145 | | - cache.build(); |
146 | | - } |
147 | | - LOGGER.info("加载缓存【{}】...", clz.getName()); |
148 | | - tempCaches.put(clzName, obj); |
149 | | - } catch (Exception e) { |
150 | | - throw new RuntimeException(String.format("创建对象【%s】错误", clz.getName()), e); |
151 | | - } |
152 | | - }); |
153 | | - |
154 | | - configs = tempConfigs; |
155 | | - caches = tempCaches; |
156 | | - } |
157 | | - |
158 | | - /** |
159 | | - * 转换table |
160 | | - * |
161 | | - * @param tableDesc tableDesc |
162 | | - * @return IConfigWrapper |
163 | | - */ |
164 | | - public abstract IConfigWrapper parseTableDesc(TableDesc tableDesc); |
| 27 | + protected FileConfigDataManagerConfig config; |
| 28 | + |
| 29 | + public AbstractFileConfigDataManager() { |
| 30 | + Class<?> clz = getClass(); |
| 31 | + this.config = new FileConfigDataManagerConfig(clz); |
| 32 | + } |
| 33 | + |
| 34 | + public AbstractFileConfigDataManager(Class<?> configClz) { |
| 35 | + this(new FileConfigDataManagerConfig(configClz)); |
| 36 | + } |
| 37 | + |
| 38 | + public AbstractFileConfigDataManager(FileConfigDataManagerConfig config) { |
| 39 | + this.config = config; |
| 40 | + } |
| 41 | + |
| 42 | + public AbstractFileConfigDataManager setXmlConfigFile(String file) { |
| 43 | + this.config.setXmlConfigFile(file); |
| 44 | + return this; |
| 45 | + } |
| 46 | + |
| 47 | + public AbstractFileConfigDataManager setConfigPackage(String configPackage) { |
| 48 | + this.config.setConfigPackage(configPackage); |
| 49 | + return this; |
| 50 | + } |
| 51 | + |
| 52 | + public AbstractFileConfigDataManager setConfigFileDir(String configFileDir) { |
| 53 | + this.config.setConfigFileDir(configFileDir); |
| 54 | + return this; |
| 55 | + } |
| 56 | + |
| 57 | + public AbstractFileConfigDataManager setConfigFileSuffix(String configFileSuffix) { |
| 58 | + if (configFileSuffix == null) { |
| 59 | + configFileSuffix = ""; |
| 60 | + } |
| 61 | + this.config.setConfigFileSuffix(ConfigSuffix.parse(configFileSuffix)); |
| 62 | + return this; |
| 63 | + } |
| 64 | + |
| 65 | + public String getXmlConfigFile() { |
| 66 | + return config.getXmlConfigFile(); |
| 67 | + } |
| 68 | + |
| 69 | + public String getConfigPackage() { |
| 70 | + return config.getConfigPackage(); |
| 71 | + } |
| 72 | + |
| 73 | + public String getConfigFileDir() { |
| 74 | + if (config.getConfigFileDir().isEmpty()) { |
| 75 | + return Objects.requireNonNull(AbstractConfigDataManager.class.getClassLoader().getResource("")).getPath(); |
| 76 | + } |
| 77 | + return config.getConfigFileDir(); |
| 78 | + } |
| 79 | + |
| 80 | + public String getConfigFileSuffix() { |
| 81 | + return config.getConfigFileSuffix().getSuffix(); |
| 82 | + } |
| 83 | + |
| 84 | + @Override |
| 85 | + public void init() throws Exception { |
| 86 | + parseFileConfig(); |
| 87 | + } |
| 88 | + |
| 89 | + private void parseFileConfig() throws Exception { |
| 90 | + String configFileDir = getConfigFileDir(); |
| 91 | + Objects.requireNonNull(configFileDir, "configFileDir 不能为空!"); |
| 92 | + File excelFile = new File(configFileDir); |
| 93 | + if (!excelFile.isDirectory()) { |
| 94 | + LOGGER.error("配置文件路径错误[{}]", configFileDir); |
| 95 | + throw new RuntimeException(String.format("excel文件路径错误[%s]", configFileDir)); |
| 96 | + } |
| 97 | + |
| 98 | + Map<String, Class<IConfig>> cacheClz = new HashMap<>(10); |
| 99 | + Map<String, TableDesc<IConfig>> configTable = new HashMap<>(10); |
| 100 | + |
| 101 | + String configPackage = getConfigPackage(); |
| 102 | + if (configPackage != null) { |
| 103 | + // 获取所有的配置类和缓存类 |
| 104 | + Set<Class<IConfig>> clzSet = ClassFileUtils.getClasses(configPackage, clz -> clz.isAnnotationPresent(Config.class) || clz.isAnnotationPresent(Cache.class)); |
| 105 | + for (Class<IConfig> clz : clzSet) { |
| 106 | + if (clz.isAnnotationPresent(Config.class)) { |
| 107 | + TableDesc<IConfig> tableDesc = ReflectUtils.getTableDesc(clz); |
| 108 | + configTable.put(clz.getName(), tableDesc); |
| 109 | + } else if (clz.isAnnotationPresent(Cache.class)) { |
| 110 | + cacheClz.put(clz.getName(), clz); |
| 111 | + } |
| 112 | + } |
| 113 | + } |
| 114 | + |
| 115 | + String xmlConfigFile = getXmlConfigFile(); |
| 116 | + if (xmlConfigFile == null) { |
| 117 | + URL xmlConfigResource = ExcelConfigDataManager.class.getClassLoader().getResource(DEFAULT_XML_CONFIG_FILE); |
| 118 | + if (xmlConfigResource != null) { |
| 119 | + xmlConfigFile = xmlConfigResource.getFile(); |
| 120 | + } |
| 121 | + } |
| 122 | + |
| 123 | + if (xmlConfigFile != null) { |
| 124 | + Map<String, TableDesc<IConfig>> xmlConfigs = DataConfigXmlParser.parseConfigs(xmlConfigFile); |
| 125 | + configTable.putAll(xmlConfigs); |
| 126 | + |
| 127 | + Map<String, Class<IConfig>> xmlCaches = DataConfigXmlParser.parseCaches(xmlConfigFile); |
| 128 | + cacheClz.putAll(xmlCaches); |
| 129 | + } |
| 130 | + |
| 131 | + Map<String, IConfigWrapper> tempConfigs = new HashMap<>(10); |
| 132 | + configTable.forEach((clzName, tableDesc) -> { |
| 133 | + IConfigWrapper wrapper = parseTableDesc(tableDesc); |
| 134 | + wrapper.getList().forEach(e -> { |
| 135 | + if (IConfig.class.isAssignableFrom(e.getClass())) { |
| 136 | + IConfig config = (IConfig) e; |
| 137 | + config.afterLoad(); |
| 138 | + } |
| 139 | + }); |
| 140 | + tempConfigs.put(clzName, wrapper); |
| 141 | + }); |
| 142 | + |
| 143 | + Map<String, Object> tempCaches = new HashMap<>(10); |
| 144 | + cacheClz.forEach((clzName, clz) -> { |
| 145 | + try { |
| 146 | + Object obj = clz.newInstance(); |
| 147 | + if (IConfigCache.class.isAssignableFrom(clz)) { |
| 148 | + IConfigCache cache = (IConfigCache) obj; |
| 149 | + cache.build(); |
| 150 | + } |
| 151 | + LOGGER.info("加载缓存【{}】...", clz.getName()); |
| 152 | + tempCaches.put(clzName, obj); |
| 153 | + } catch (Exception e) { |
| 154 | + throw new RuntimeException(String.format("创建对象【%s】错误", clz.getName()), e); |
| 155 | + } |
| 156 | + }); |
| 157 | + |
| 158 | + configs = tempConfigs; |
| 159 | + caches = tempCaches; |
| 160 | + } |
| 161 | + |
| 162 | + /** |
| 163 | + * 转换table |
| 164 | + * |
| 165 | + * @param tableDesc tableDesc |
| 166 | + * @return IConfigWrapper |
| 167 | + */ |
| 168 | + public abstract IConfigWrapper parseTableDesc(TableDesc<IConfig> tableDesc); |
165 | 169 | } |
0 commit comments