diff --git a/pom.xml b/pom.xml index 9b6996a..c8c96a5 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.jcnc JNotepad - 1.1.3-bate + 1.1.3-beta JNotepad jar diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index 76161c8..0c37f4a 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -102,6 +102,8 @@ public class LunchApp extends Application { // 刷新插件配置文件 instance.getConfig().setPlugins(PluginManager.getInstance().getPluginInfos()); instance.writeConfig(); + // 销毁插件可能申请的资源 + PluginManager.getInstance().destroyPlugins(); // 关闭线程池 threadPool.shutdownNow(); } diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java index 672d6ec..4778787 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java @@ -1,5 +1,6 @@ package org.jcnc.jnotepad.plugin; +import org.jcnc.jnotepad.common.manager.ThreadPoolManager; import org.jcnc.jnotepad.controller.config.PluginConfigController; import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.model.entity.PluginDescriptor; @@ -13,6 +14,7 @@ import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.net.URLClassLoader; import java.util.*; +import java.util.concurrent.ExecutorService; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.ZipEntry; @@ -24,6 +26,8 @@ import java.util.zip.ZipEntry; */ public class PluginLoader { private static final PluginLoader INSTANCE = new PluginLoader(); + + private static final ExecutorService THREAD_POOL = ThreadPoolManager.getThreadPool(); Logger logger = LogUtil.getLogger(this.getClass()); /** @@ -64,9 +68,14 @@ public class PluginLoader { * @since 2023/9/16 14:04 */ private static boolean checkPlugin(List configPluginDescriptors, PluginDescriptor pluginDescriptor, List pluginDescriptors) { - // 如果应用程序配置文件为空则默认插件被禁用 - if (configPluginDescriptors.isEmpty()) { - return disabledByDefault(configPluginDescriptors, pluginDescriptor, pluginDescriptors); + // 如果应用程序配置文件中没有该插件则默认禁用 + if (pluginDoesNotExist(pluginDescriptor, configPluginDescriptors)) { + disabledByDefault(configPluginDescriptors, pluginDescriptor, pluginDescriptors); + THREAD_POOL.submit(() -> { + PluginConfigController.getInstance().writeConfig(); + ThreadPoolManager.threadContSelfSubtracting(); + }); + return true; } // 如果应用程序配置文件中该插件禁用则不加载 for (PluginDescriptor configPluginDescriptor : configPluginDescriptors) { @@ -78,6 +87,24 @@ public class PluginLoader { return loaded(pluginDescriptor, pluginDescriptors); } + /** + * 插件不存在 + * + * @param pluginDescriptor 插件描述类 + * @param configPluginDescriptors 配置文件插件信息集合 + * @return boolean 插件不存在 + * @apiNote + * @since 2023/9/19 19:16 + */ + private static boolean pluginDoesNotExist(PluginDescriptor pluginDescriptor, List configPluginDescriptors) { + for (PluginDescriptor configPluginDescriptor : configPluginDescriptors) { + if ((configPluginDescriptor.getName() + configPluginDescriptor.getAuthor()).equals(pluginDescriptor.getName() + pluginDescriptor.getAuthor())) { + return false; + } + } + return true; + } + private static boolean loaded(PluginDescriptor pluginDescriptor, List pluginDescriptors) { Iterator iterator = pluginDescriptors.iterator(); while (iterator.hasNext()) { @@ -98,6 +125,16 @@ public class PluginLoader { return false; } + /** + * 如果插件被禁用则不加载 + * + * @param pluginDescriptor 插件描述类 + * @param pluginDescriptors 插件描述类集合 + * @param configPluginDescriptor 配置文件插件信息 + * @return boolean + * @apiNote + * @since 2023/9/19 18:45 + */ private static boolean disableDoNotLoad(PluginDescriptor pluginDescriptor, List pluginDescriptors, PluginDescriptor configPluginDescriptor) { if ((configPluginDescriptor.getName() + configPluginDescriptor.getAuthor()).equals(pluginDescriptor.getName() + pluginDescriptor.getAuthor()) && !configPluginDescriptor.isEnabled()) { pluginDescriptor.setEnabled(false); @@ -107,12 +144,19 @@ public class PluginLoader { return false; } - private static boolean disabledByDefault(List configPluginDescriptors, PluginDescriptor pluginDescriptor, List pluginDescriptors) { + /** + * 默认禁用 + * + * @param configPluginDescriptors 配置文件插件信息 + * @param pluginDescriptor 插件描述类 + * @param pluginDescriptors 插件描述类集合 + * @apiNote + * @since 2023/9/19 18:48 + */ + private static void disabledByDefault(List configPluginDescriptors, PluginDescriptor pluginDescriptor, List pluginDescriptors) { pluginDescriptor.setEnabled(false); pluginDescriptors.add(pluginDescriptor); configPluginDescriptors.add(pluginDescriptor); - PluginConfigController.getInstance().writeConfig(); - return true; } /** @@ -128,7 +172,7 @@ public class PluginLoader { /** * 根据文件加载插件 * - * @param pluginJar 插件jar包 + * @param pluginJar 插件jar包 * @param configPluginDescriptors 配置文件插件信息集合 * @apiNote * @since 2023/9/16 14:05 diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java index 8b0a498..fc50053 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java @@ -136,6 +136,17 @@ public class PluginManager { } } + /** + * 销毁插件可能申请的资源 + */ + public void destroyPlugins() { + for (PluginDescriptor pluginDescriptor : pluginDescriptors) { + if (pluginDescriptor.isEnabled()) { + pluginDescriptor.getPlugin().destroyed(); + } + } + } + /** * 获取按类别分类的已加载插件 *