From a6a56cd8b27574dcadc0b5a27f7ab70c2d18e6f9 Mon Sep 17 00:00:00 2001
From: gewuyou <1063891901@qq.com>
Date: Tue, 19 Sep 2023 19:25:48 +0800
Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=20=E6=8F=92?=
=?UTF-8?q?=E4=BB=B6=E4=B8=8D=E5=AD=98=E5=9C=A8=E6=97=B6=E7=9A=84=E5=8A=A0?=
=?UTF-8?q?=E8=BD=BD=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
src/main/java/org/jcnc/jnotepad/LunchApp.java | 2 +
.../jcnc/jnotepad/plugin/PluginLoader.java | 58 ++++++++++++++++---
.../jcnc/jnotepad/plugin/PluginManager.java | 11 ++++
4 files changed, 65 insertions(+), 8 deletions(-)
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();
+ }
+ }
+ }
+
/**
* 获取按类别分类的已加载插件
*