🐛 修复 插件不存在时的加载逻辑

This commit is contained in:
gewuyou 2023-09-19 19:25:48 +08:00
parent 399ef925a5
commit a6a56cd8b2
4 changed files with 65 additions and 8 deletions

View File

@ -6,7 +6,7 @@
<groupId>org.jcnc</groupId> <groupId>org.jcnc</groupId>
<artifactId>JNotepad</artifactId> <artifactId>JNotepad</artifactId>
<version>1.1.3-bate</version> <version>1.1.3-beta</version>
<name>JNotepad</name> <name>JNotepad</name>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -102,6 +102,8 @@ public class LunchApp extends Application {
// 刷新插件配置文件 // 刷新插件配置文件
instance.getConfig().setPlugins(PluginManager.getInstance().getPluginInfos()); instance.getConfig().setPlugins(PluginManager.getInstance().getPluginInfos());
instance.writeConfig(); instance.writeConfig();
// 销毁插件可能申请的资源
PluginManager.getInstance().destroyPlugins();
// 关闭线程池 // 关闭线程池
threadPool.shutdownNow(); threadPool.shutdownNow();
} }

View File

@ -1,5 +1,6 @@
package org.jcnc.jnotepad.plugin; package org.jcnc.jnotepad.plugin;
import org.jcnc.jnotepad.common.manager.ThreadPoolManager;
import org.jcnc.jnotepad.controller.config.PluginConfigController; import org.jcnc.jnotepad.controller.config.PluginConfigController;
import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.exception.AppException;
import org.jcnc.jnotepad.model.entity.PluginDescriptor; import org.jcnc.jnotepad.model.entity.PluginDescriptor;
@ -13,6 +14,7 @@ import java.lang.reflect.InvocationTargetException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
@ -24,6 +26,8 @@ import java.util.zip.ZipEntry;
*/ */
public class PluginLoader { public class PluginLoader {
private static final PluginLoader INSTANCE = new PluginLoader(); private static final PluginLoader INSTANCE = new PluginLoader();
private static final ExecutorService THREAD_POOL = ThreadPoolManager.getThreadPool();
Logger logger = LogUtil.getLogger(this.getClass()); Logger logger = LogUtil.getLogger(this.getClass());
/** /**
@ -64,9 +68,14 @@ public class PluginLoader {
* @since 2023/9/16 14:04 * @since 2023/9/16 14:04
*/ */
private static boolean checkPlugin(List<PluginDescriptor> configPluginDescriptors, PluginDescriptor pluginDescriptor, List<PluginDescriptor> pluginDescriptors) { private static boolean checkPlugin(List<PluginDescriptor> configPluginDescriptors, PluginDescriptor pluginDescriptor, List<PluginDescriptor> pluginDescriptors) {
// 如果应用程序配置文件为空则默认插件被禁用 // 如果应用程序配置文件中没有该插件则默认禁用
if (configPluginDescriptors.isEmpty()) { if (pluginDoesNotExist(pluginDescriptor, configPluginDescriptors)) {
return disabledByDefault(configPluginDescriptors, pluginDescriptor, pluginDescriptors); disabledByDefault(configPluginDescriptors, pluginDescriptor, pluginDescriptors);
THREAD_POOL.submit(() -> {
PluginConfigController.getInstance().writeConfig();
ThreadPoolManager.threadContSelfSubtracting();
});
return true;
} }
// 如果应用程序配置文件中该插件禁用则不加载 // 如果应用程序配置文件中该插件禁用则不加载
for (PluginDescriptor configPluginDescriptor : configPluginDescriptors) { for (PluginDescriptor configPluginDescriptor : configPluginDescriptors) {
@ -78,6 +87,24 @@ public class PluginLoader {
return loaded(pluginDescriptor, pluginDescriptors); return loaded(pluginDescriptor, pluginDescriptors);
} }
/**
* 插件不存在
*
* @param pluginDescriptor 插件描述类
* @param configPluginDescriptors 配置文件插件信息集合
* @return boolean 插件不存在
* @apiNote
* @since 2023/9/19 19:16
*/
private static boolean pluginDoesNotExist(PluginDescriptor pluginDescriptor, List<PluginDescriptor> 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<PluginDescriptor> pluginDescriptors) { private static boolean loaded(PluginDescriptor pluginDescriptor, List<PluginDescriptor> pluginDescriptors) {
Iterator<PluginDescriptor> iterator = pluginDescriptors.iterator(); Iterator<PluginDescriptor> iterator = pluginDescriptors.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
@ -98,6 +125,16 @@ public class PluginLoader {
return false; return false;
} }
/**
* 如果插件被禁用则不加载
*
* @param pluginDescriptor 插件描述类
* @param pluginDescriptors 插件描述类集合
* @param configPluginDescriptor 配置文件插件信息
* @return boolean
* @apiNote
* @since 2023/9/19 18:45
*/
private static boolean disableDoNotLoad(PluginDescriptor pluginDescriptor, List<PluginDescriptor> pluginDescriptors, PluginDescriptor configPluginDescriptor) { private static boolean disableDoNotLoad(PluginDescriptor pluginDescriptor, List<PluginDescriptor> pluginDescriptors, PluginDescriptor configPluginDescriptor) {
if ((configPluginDescriptor.getName() + configPluginDescriptor.getAuthor()).equals(pluginDescriptor.getName() + pluginDescriptor.getAuthor()) && !configPluginDescriptor.isEnabled()) { if ((configPluginDescriptor.getName() + configPluginDescriptor.getAuthor()).equals(pluginDescriptor.getName() + pluginDescriptor.getAuthor()) && !configPluginDescriptor.isEnabled()) {
pluginDescriptor.setEnabled(false); pluginDescriptor.setEnabled(false);
@ -107,12 +144,19 @@ public class PluginLoader {
return false; return false;
} }
private static boolean disabledByDefault(List<PluginDescriptor> configPluginDescriptors, PluginDescriptor pluginDescriptor, List<PluginDescriptor> pluginDescriptors) { /**
* 默认禁用
*
* @param configPluginDescriptors 配置文件插件信息
* @param pluginDescriptor 插件描述类
* @param pluginDescriptors 插件描述类集合
* @apiNote
* @since 2023/9/19 18:48
*/
private static void disabledByDefault(List<PluginDescriptor> configPluginDescriptors, PluginDescriptor pluginDescriptor, List<PluginDescriptor> pluginDescriptors) {
pluginDescriptor.setEnabled(false); pluginDescriptor.setEnabled(false);
pluginDescriptors.add(pluginDescriptor); pluginDescriptors.add(pluginDescriptor);
configPluginDescriptors.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 配置文件插件信息集合 * @param configPluginDescriptors 配置文件插件信息集合
* @apiNote * @apiNote
* @since 2023/9/16 14:05 * @since 2023/9/16 14:05

View File

@ -136,6 +136,17 @@ public class PluginManager {
} }
} }
/**
* 销毁插件可能申请的资源
*/
public void destroyPlugins() {
for (PluginDescriptor pluginDescriptor : pluginDescriptors) {
if (pluginDescriptor.isEnabled()) {
pluginDescriptor.getPlugin().destroyed();
}
}
}
/** /**
* 获取按类别分类的已加载插件 * 获取按类别分类的已加载插件
* *