From 9303b023f24846682ce32d12e97eb5662d81d879 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Sun, 17 Sep 2023 11:20:48 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/jcnc/jnotepad/LunchApp.java | 8 +- .../jcnc/jnotepad/app/config/AppConfig.java | 12 -- .../jnotepad/app/config/PluginConfig.java | 36 ++++ .../common/constants/AppConstants.java | 6 + .../controller/ResourceController.java | 4 +- .../config/AppConfigController.java | 155 +++++------------- .../config/BaseConfigController.java | 150 +++++++++++++++++ .../config/PluginConfigController.java | 95 +++++++++++ .../interfaces/ConfigController.java | 47 ++++++ .../jcnc/jnotepad/plugin/PluginLoader.java | 6 +- .../jcnc/jnotepad/plugin/PluginManager.java | 14 +- 11 files changed, 393 insertions(+), 140 deletions(-) create mode 100644 src/main/java/org/jcnc/jnotepad/app/config/PluginConfig.java create mode 100644 src/main/java/org/jcnc/jnotepad/controller/config/BaseConfigController.java create mode 100644 src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java create mode 100644 src/main/java/org/jcnc/jnotepad/controller/interfaces/ConfigController.java diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index ddb45f8..25b5825 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -11,7 +11,7 @@ import org.jcnc.jnotepad.common.constants.AppConstants; import org.jcnc.jnotepad.common.constants.TextConstants; import org.jcnc.jnotepad.common.manager.ThreadPoolManager; import org.jcnc.jnotepad.controller.ResourceController; -import org.jcnc.jnotepad.controller.config.AppConfigController; +import org.jcnc.jnotepad.controller.config.PluginConfigController; import org.jcnc.jnotepad.controller.i18n.LocalizationController; import org.jcnc.jnotepad.controller.manager.Controller; import org.jcnc.jnotepad.plugin.PluginManager; @@ -96,10 +96,10 @@ public class LunchApp extends Application { @Override public void stop() { - AppConfigController instance = AppConfigController.getInstance(); + PluginConfigController instance = PluginConfigController.getInstance(); // 刷新插件配置文件 - instance.getAppConfig().setPlugins(PluginManager.getInstance().getPluginInfos()); - instance.writeAppConfig(); + instance.getConfig().setPlugins(PluginManager.getInstance().getPluginInfos()); + instance.writeConfig(); // 关闭线程池 threadPool.shutdownNow(); } diff --git a/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java index 5f85ab2..60a4610 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java @@ -1,7 +1,6 @@ package org.jcnc.jnotepad.app.config; import com.fasterxml.jackson.annotation.JsonIgnore; -import org.jcnc.jnotepad.model.entity.PluginInfo; import org.jcnc.jnotepad.model.entity.ShortcutKey; import java.util.ArrayList; @@ -25,8 +24,6 @@ public class AppConfig { private boolean textWrap; private List shortcutKey; - private List plugins; - /** * 生成默认应用配置对象。 * @@ -47,18 +44,9 @@ public class AppConfig { shortcutKeys.add(createShortcutKey("addItem", "")); shortcutKeys.add(createShortcutKey("countItem", "")); myData.setShortcutKey(shortcutKeys); - myData.setPlugins(new ArrayList<>()); return myData; } - public List getPlugins() { - return plugins; - } - - public void setPlugins(List plugins) { - this.plugins = plugins; - } - /** * 创建 ShortcutKey 对象。 * diff --git a/src/main/java/org/jcnc/jnotepad/app/config/PluginConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/PluginConfig.java new file mode 100644 index 0000000..ac113d9 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/app/config/PluginConfig.java @@ -0,0 +1,36 @@ +package org.jcnc.jnotepad.app.config; + +import org.jcnc.jnotepad.model.entity.PluginInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * 插件配置文件 + * + * @author gewuyou + */ +public class PluginConfig { + private List plugins; + + /** + * 生成默认的插件配置文件 + * + * @return org.jcnc.jnotepad.app.config.PluginConfig 插件配置文件 + * @apiNote + * @since 2023/9/17 0:57 + */ + public static PluginConfig generateDefaultPluginConfig() { + PluginConfig pluginConfig = new PluginConfig(); + pluginConfig.setPlugins(new ArrayList<>()); + return pluginConfig; + } + + public List getPlugins() { + return plugins; + } + + public void setPlugins(List plugins) { + this.plugins = plugins; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/common/constants/AppConstants.java b/src/main/java/org/jcnc/jnotepad/common/constants/AppConstants.java index 2e2d5e2..9cb5f62 100644 --- a/src/main/java/org/jcnc/jnotepad/common/constants/AppConstants.java +++ b/src/main/java/org/jcnc/jnotepad/common/constants/AppConstants.java @@ -28,6 +28,12 @@ public class AppConstants { */ public static final Pattern TABNAME_PATTERN = Pattern.compile("^" + Pattern.quote(UiResourceBundle.getContent(TextConstants.NEW_FILE)) + "\\d+$"); + /** + * 默认属性 + */ + public static final String DEFAULT_PROPERTY = "user.home"; + + /** * 私有构造函数,防止该类被实例化。 */ diff --git a/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java b/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java index 95749c6..1f07708 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java @@ -1,6 +1,6 @@ package org.jcnc.jnotepad.controller; -import org.jcnc.jnotepad.controller.config.AppConfigController; +import org.jcnc.jnotepad.controller.config.PluginConfigController; import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.plugin.PluginLoader; import org.jcnc.jnotepad.util.LogUtil; @@ -39,7 +39,7 @@ public class ResourceController { */ public void loadPlugins() { // 扫描并装载插件 - scanLoadPlugins(AppConfigController.getInstance().getPlungsPath()); + scanLoadPlugins(PluginConfigController.getInstance().getPlungsPath()); } diff --git a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java index 8e3f061..466af46 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java @@ -1,21 +1,13 @@ package org.jcnc.jnotepad.controller.config; import org.jcnc.jnotepad.app.config.AppConfig; -import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.model.entity.ShortcutKey; -import org.jcnc.jnotepad.util.JsonUtil; -import org.jcnc.jnotepad.util.LogUtil; -import org.jcnc.jnotepad.util.PopUpUtil; -import org.slf4j.Logger; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +import static org.jcnc.jnotepad.common.constants.AppConstants.DEFAULT_PROPERTY; + /** * 应用程序配置控制器 * @@ -23,22 +15,17 @@ import java.util.List; * * @author songdragon */ -public class AppConfigController { +public class AppConfigController extends BaseConfigController { /** * 配置文件名 */ public static final String CONFIG_NAME = "jnotepadConfig.json"; - private static final Logger logger = LogUtil.getLogger(AppConfigController.class); private static final AppConfigController INSTANCE = new AppConfigController(); - private AppConfig appConfig; - private static final String DEFAULT_PROPERTY = "user.home"; - private String appConfigDir; - private String pluginsDir; + private String configDir; private AppConfigController() { - setAppConfigDir(Paths.get(System.getProperty(DEFAULT_PROPERTY), ".jnotepad").toString()); - setPluginsDir(Paths.get(System.getProperty(DEFAULT_PROPERTY), ".jnotepad", "plugins").toString()); + configDir = Paths.get(System.getProperty(DEFAULT_PROPERTY), ".jnotepad").toString(); loadConfig(); } @@ -52,79 +39,48 @@ public class AppConfigController { } /** - * 加载配置文件内容。 - */ - public void loadConfig() { - createConfigIfNotExists(); - Path configPath = getConfigPath(); - try { - logger.info("正在加载配置文件..."); - // 存在则加载 - String configContent = Files.readString(configPath); - appConfig = JsonUtil.OBJECT_MAPPER.readValue(configContent, AppConfig.class); - } catch (Exception e) { - logger.error("加载配置文件错误", e); - throw new AppException(e); - } - } - - /** - * 配置文件持久化。 - */ - public void writeAppConfig() { - createConfigIfNotExists(); - writeAppConfig(this.appConfig); - } - - /** - * 将 appConfig 对象持久化到配置文件中。 + * 获取配置文件Class类 * - * @param appConfig 应用配置对象 + * @return 配置文件Class类 */ - private void writeAppConfig(AppConfig appConfig) { - try (BufferedWriter writer = new BufferedWriter(new FileWriter(getConfigPath().toString()))) { - if (appConfig == null) { - appConfig = createConfigJson(); - } - writer.write(JsonUtil.toJsonString(appConfig)); - } catch (Exception e) { - logger.error("", e); - PopUpUtil.errorAlert("错误", "读写错误", "配置文件读写错误!", null, null); - } + @Override + protected Class getConfigClass() { + return AppConfig.class; } /** - * 创建配置文件如果不存在。 - */ - public void createConfigIfNotExists() { - Path configPath = getConfigPath(); - if (configPath.toFile().exists()) { - return; - } - File directory = new File(appConfigDir); - if (!directory.exists()) { - directory.mkdirs(); - } - writeAppConfig(null); - } - - /** - * 获取配置文件的路径。 + * 生成默认的配置文件 * - * @return 配置文件的路径 + * @return 默认的配置文件 */ - public Path getConfigPath() { - return Paths.get(getAppConfigDir(), CONFIG_NAME); - } - - public Path getPlungsPath() { - return Paths.get(getPluginsDir()); - } - - private AppConfig createConfigJson() { + @Override + protected AppConfig generateDefaultConfig() { return AppConfig.generateDefaultAppConfig(); } + /** + * 获取配置文件名称 + * + * @return 配置文件名称 + */ + @Override + protected String getConfigName() { + return CONFIG_NAME; + } + + /** + * 获取配置文件文件夹路径 + * + * @return 配置文件夹路径 + */ + @Override + protected String getConfigDir() { + return configDir; + } + + public void setConfigDir(String configDir) { + this.configDir = configDir; + } /** * 获取自动换行设置,默认自动换行。 @@ -132,11 +88,11 @@ public class AppConfigController { * @return true,自动换行;false,不自动换行 */ public boolean getAutoLineConfig() { - return getAppConfig().isTextWrap(); + return getConfig().isTextWrap(); } public void setAutoLineConfig(boolean isAutoLine) { - getAppConfig().setTextWrap(isAutoLine); + getConfig().setTextWrap(isAutoLine); } /** @@ -148,8 +104,8 @@ public class AppConfigController { if (getLanguage().equals(language)) { return; } - this.appConfig.setLanguage(language); - writeAppConfig(); + getConfig().setLanguage(language); + writeConfig(); } /** @@ -158,7 +114,7 @@ public class AppConfigController { * @return 语言设置 */ public String getLanguage() { - return this.appConfig.getLanguage(); + return getConfig().getLanguage(); } /** @@ -167,31 +123,6 @@ public class AppConfigController { * @return 快捷键设置列表 */ public List getShortcutKey() { - return this.appConfig.getShortcutKey(); - } - - /** - * 获取当前配置文件所在目录。 - * - * @return 所在目录 - */ - public String getAppConfigDir() { - return appConfigDir; - } - - public void setAppConfigDir(String appConfigDir) { - this.appConfigDir = appConfigDir; - } - - public String getPluginsDir() { - return pluginsDir; - } - - public void setPluginsDir(String pluginsDir) { - this.pluginsDir = pluginsDir; - } - - public AppConfig getAppConfig() { - return appConfig; + return getConfig().getShortcutKey(); } } diff --git a/src/main/java/org/jcnc/jnotepad/controller/config/BaseConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/config/BaseConfigController.java new file mode 100644 index 0000000..134ded9 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/controller/config/BaseConfigController.java @@ -0,0 +1,150 @@ +package org.jcnc.jnotepad.controller.config; + +import org.jcnc.jnotepad.controller.interfaces.ConfigController; +import org.jcnc.jnotepad.exception.AppException; +import org.jcnc.jnotepad.util.JsonUtil; +import org.jcnc.jnotepad.util.LogUtil; +import org.jcnc.jnotepad.util.PopUpUtil; +import org.slf4j.Logger; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * 基本配置文件控制器抽象类 + * + * @author gewuyou + */ +public abstract class BaseConfigController implements ConfigController { + + protected T config; + Logger logger = LogUtil.getLogger(this.getClass()); + + /** + * 获取配置文件Class类 + * + * @return 配置文件Class类 + */ + protected abstract Class getConfigClass(); + + /** + * 生成默认的配置文件 + * + * @return 默认的配置文件 + */ + protected abstract T generateDefaultConfig(); + + /** + * 获取配置文件名称 + * + * @return 配置文件名称 + */ + protected abstract String getConfigName(); + + /** + * 获取配置文件文件夹路径 + * + * @return 配置文件夹路径 + */ + protected abstract String getConfigDir(); + + /** + * 获取配置文件类 + * + * @return 获取配置文件类 + */ + public T getConfig() { + return config; + } + + public void setConfig(T config) { + this.config = config; + } + + /** + * 加载配置文件内容 + */ + @Override + public void loadConfig() { + createConfigIfNotExists(); + // 存在则加载 + try { + logger.info("正在加载配置文件:{}...", getConfigClass()); + String configContent = Files.readString(getConfigPath()); + config = JsonUtil.OBJECT_MAPPER.readValue(configContent, getConfigClass()); + } catch (IOException e) { + logger.error("加载配置文件错误", e); + PopUpUtil.errorAlert("错误", "读写错误", "加载配置文件错误!", null, null); + throw new AppException(e); + } + } + + /** + * 配置文件持久化 + */ + @Override + public void writeConfig() { + createConfigIfNotExists(); + writeConfig(getConfig()); + } + + /** + * 配置文件持久化 + * + * @param config 配置文件对象 + */ + @Override + public void writeConfig(T config) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(getConfigPath().toString()))) { + if (config == null) { + config = createConfigJson(); + } + writer.write(JsonUtil.toJsonString(config)); + } catch (Exception e) { + logger.error("", e); + PopUpUtil.errorAlert("错误", "读写错误", "配置文件读写错误!", null, null); + } + } + + /** + * 如果配置文件不存在则创建 + */ + @Override + public void createConfigIfNotExists() { + Path configPath = getConfigPath(); + if (configPath.toFile().exists()) { + return; + } + File directory = new File(getConfigDir()); + if (!directory.exists()) { + directory.mkdirs(); + } + writeConfig(null); + } + + /** + * 创建配置文件json实体 + * + * @return 默认的配置文件实体 + * @apiNote 返回默认的配置文件实体用于序列化jso + */ + @Override + public T createConfigJson() { + return generateDefaultConfig(); + } + + /** + * 获取配置文件路径 + * + * @return 配置文件路径 + */ + @Override + public Path getConfigPath() { + return Paths.get(getConfigDir(), getConfigName()); + } +} diff --git a/src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java new file mode 100644 index 0000000..d26531a --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java @@ -0,0 +1,95 @@ +package org.jcnc.jnotepad.controller.config; + +import org.jcnc.jnotepad.app.config.PluginConfig; + +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.jcnc.jnotepad.common.constants.AppConstants.DEFAULT_PROPERTY; + +/** + * 插件控制器 + * + * @author gewuyou + */ +public class PluginConfigController extends BaseConfigController { + /** + * 插件配置文件 + */ + public static final String CONFIG_NAME = "pluginConfig.json"; + private static final PluginConfigController INSTANCE = new PluginConfigController(); + + private String configDir; + private String pluginsDir; + + private PluginConfigController() { + configDir = Paths.get(System.getProperty(DEFAULT_PROPERTY), ".jnotepad").toString(); + setPluginsDir(Paths.get(System.getProperty(DEFAULT_PROPERTY), ".jnotepad", "plugins").toString()); + loadConfig(); + } + + public static PluginConfigController getInstance() { + return INSTANCE; + } + + /** + * 获取配置文件Class类 + * + * @return 配置文件Class类 + */ + @Override + protected Class getConfigClass() { + return PluginConfig.class; + } + + /** + * 生成默认的配置文件 + * + * @return 默认的配置文件 + */ + @Override + protected PluginConfig generateDefaultConfig() { + return PluginConfig.generateDefaultPluginConfig(); + } + + /** + * 获取配置文件名称 + * + * @return 配置文件名称 + */ + @Override + protected String getConfigName() { + return CONFIG_NAME; + } + + /** + * 获取配置文件文件夹路径 + * + * @return 配置文件夹路径 + */ + @Override + protected String getConfigDir() { + return configDir; + } + + public void setConfigDir(String configDir) { + this.configDir = configDir; + } + + /** + * 获取插件路径 + * + * @return 插件路径 + */ + public Path getPlungsPath() { + return Paths.get(getPluginsDir()); + } + + public String getPluginsDir() { + return pluginsDir; + } + + public void setPluginsDir(String pluginsDir) { + this.pluginsDir = pluginsDir; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/controller/interfaces/ConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/interfaces/ConfigController.java new file mode 100644 index 0000000..42e4621 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/controller/interfaces/ConfigController.java @@ -0,0 +1,47 @@ +package org.jcnc.jnotepad.controller.interfaces; + +import java.nio.file.Path; + +/** + * 配置文件控制器接口 + * + * @author gewuyou + */ +public interface ConfigController { + /** + * 加载配置文件内容 + */ + void loadConfig(); + + /** + * 配置文件持久化 + */ + void writeConfig(); + + /** + * 配置文件持久化 + * + * @param config 配置文件对象 + */ + void writeConfig(T config); + + /** + * 如果配置文件不存在则创建 + */ + void createConfigIfNotExists(); + + /** + * 创建配置文件json实体 + * + * @return 默认的配置文件实体 + * @apiNote 返回默认的配置文件实体用于序列化jso + */ + T createConfigJson(); + + /** + * 获取配置文件路径 + * + * @return 配置文件路径 + */ + Path getConfigPath(); +} diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java index eab9154..a74cb7f 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java @@ -1,6 +1,6 @@ package org.jcnc.jnotepad.plugin; -import org.jcnc.jnotepad.controller.config.AppConfigController; +import org.jcnc.jnotepad.controller.config.PluginConfigController; import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.model.entity.PluginInfo; import org.jcnc.jnotepad.plugin.interfaces.Plugin; @@ -113,7 +113,7 @@ public class PluginLoader { pluginInfo.setEnabled(false); pluginInfos.add(pluginInfo); configPluginInfos.add(pluginInfo); - AppConfigController.getInstance().writeAppConfig(); + PluginConfigController.getInstance().writeConfig(); return true; } @@ -124,7 +124,7 @@ public class PluginLoader { */ public void loadPluginByPath(String pluginFilePath) { File file = new File(pluginFilePath); - loadPluginByFile(file, AppConfigController.getInstance().getAppConfig().getPlugins()); + loadPluginByFile(file, PluginConfigController.getInstance().getConfig().getPlugins()); } /** diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java index 0ff5fe6..79150c2 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java @@ -1,7 +1,7 @@ package org.jcnc.jnotepad.plugin; import org.jcnc.jnotepad.common.manager.ThreadPoolManager; -import org.jcnc.jnotepad.controller.config.AppConfigController; +import org.jcnc.jnotepad.controller.config.PluginConfigController; import org.jcnc.jnotepad.model.entity.PluginInfo; import org.jcnc.jnotepad.util.LogUtil; import org.slf4j.Logger; @@ -56,10 +56,10 @@ public class PluginManager { public void unloadPlugin(PluginInfo pluginInfo) { // 删除集合中的插件信息 pluginInfos.remove(pluginInfo); - AppConfigController instance = AppConfigController.getInstance(); - instance.getAppConfig().getPlugins().remove(pluginInfo); + PluginConfigController instance = PluginConfigController.getInstance(); + instance.getConfig().getPlugins().remove(pluginInfo); // 刷新配置 - instance.writeAppConfig(); + instance.writeConfig(); // 删除本地插件jar包 Path plungsPath = instance.getPlungsPath(); try (Stream pathStream = Files.walk(plungsPath)) { @@ -91,13 +91,13 @@ public class PluginManager { pluginInfo.setEnabled(false); pluginInfo.setPlugin(null); ThreadPoolManager.getThreadPool().submit(() -> { - AppConfigController instance = AppConfigController.getInstance(); - instance.getAppConfig().getPlugins().forEach(plugin -> { + PluginConfigController instance = PluginConfigController.getInstance(); + instance.getConfig().getPlugins().forEach(plugin -> { if ((pluginInfo.getName() + pluginInfo.getAuthor()).equals(plugin.getName() + plugin.getAuthor())) { plugin.setEnabled(false); } }); - instance.writeAppConfig(); + instance.writeConfig(); ThreadPoolManager.threadContSelfSubtracting(); }); }