From 94664286e53a6fb2846f535aa5da086bead0bb91 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Fri, 30 Jul 2021 14:19:23 +0200 Subject: [PATCH] Fix BungeeCord multi plugin management --- .../bungee/managers/BungeePluginManager.java | 47 ++++++++----------- .../bungee/reflection/RLibraryLoader.java | 16 ------- .../bungee/reflection/RPluginClassLoader.java | 22 +-------- .../bungee/reflection/RPluginManager.java | 17 +++---- .../results/CloseablePluginResults.java | 7 +-- 5 files changed, 32 insertions(+), 77 deletions(-) delete mode 100644 Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RLibraryLoader.java diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java index 8240623..00cf68f 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java @@ -4,10 +4,10 @@ import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -21,7 +21,6 @@ import net.frankheijden.serverutils.bungee.events.BungeePluginDisableEvent; import net.frankheijden.serverutils.bungee.events.BungeePluginEnableEvent; import net.frankheijden.serverutils.bungee.events.BungeePluginLoadEvent; import net.frankheijden.serverutils.bungee.events.BungeePluginUnloadEvent; -import net.frankheijden.serverutils.bungee.reflection.RLibraryLoader; import net.frankheijden.serverutils.bungee.reflection.RPluginClassLoader; import net.frankheijden.serverutils.bungee.reflection.RPluginManager; import net.frankheijden.serverutils.common.entities.ServerUtilsPluginDescription; @@ -34,6 +33,7 @@ import net.frankheijden.serverutils.common.managers.AbstractPluginManager; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.PluginDescription; +import net.md_5.bungee.api.plugin.PluginManager; import org.yaml.snakeyaml.Yaml; public class BungeePluginManager extends AbstractPluginManager { @@ -72,35 +72,25 @@ public class BungeePluginManager extends AbstractPluginManager loadPluginDescriptions(List descriptions) { PluginResults loadResults = new PluginResults<>(); + PluginManager proxyPluginManager = proxy.getPluginManager(); + Map toLoad = RPluginManager.getToLoad(proxyPluginManager); + if (toLoad == null) toLoad = new HashMap<>(descriptions.size()); + for (BungeePluginDescription description : descriptions) { PluginDescription desc = description.getDescription(); - Plugin plugin; + toLoad.put(desc.getName(), desc); + } - try { - Object libraryLoader = RPluginManager.getLibraryLoader(proxy.getPluginManager()); - ClassLoader classLoader = RLibraryLoader.createLoader(libraryLoader, desc); - URLClassLoader loader = (URLClassLoader) RPluginClassLoader.newInstance( - proxy, - desc, - desc.getFile(), - classLoader - ); + RPluginManager.setToLoad(proxyPluginManager, toLoad); + proxyPluginManager.loadPlugins(); - Class main = loader.loadClass(desc.getMain()); - plugin = (Plugin) main.getDeclaredConstructor().newInstance(); + for (BungeePluginDescription description : descriptions) { + Optional pluginOptional = getPlugin(description.getId()); + if (!pluginOptional.isPresent()) return loadResults.addResult(description.getId(), Result.ERROR); - RPluginManager.getPlugins(proxy.getPluginManager()).put(description.getId(), plugin); - proxy.getPluginManager().callEvent(new BungeePluginLoadEvent(plugin, PluginEvent.Stage.PRE)); - plugin.onLoad(); - } catch (Throwable th) { - proxy.getLogger().log(Level.WARNING, "Error loading plugin " + description.getId(), th); - return loadResults.addResult(description.getId(), Result.ERROR); - } - - proxy.getLogger().log(Level.INFO, "Loaded plugin {0} version {1} by {2}", new Object[] { - desc.getName(), desc.getVersion(), desc.getAuthor() - }); - proxy.getPluginManager().callEvent(new BungeePluginLoadEvent(plugin, PluginEvent.Stage.POST)); + Plugin plugin = pluginOptional.get(); + proxyPluginManager.callEvent(new BungeePluginLoadEvent(plugin, PluginEvent.Stage.PRE)); + proxyPluginManager.callEvent(new BungeePluginLoadEvent(plugin, PluginEvent.Stage.POST)); loadResults.addResult(description.getId(), plugin); } @@ -134,7 +124,7 @@ public class BungeePluginManager extends AbstractPluginManager closeables = new ArrayList<>(); try { RPluginManager.clearPlugin(proxy.getPluginManager(), plugin); - addIfInstance(closeables, RPluginClassLoader.getPluginClassLoader(plugin)); + addIfInstance(closeables, RPluginClassLoader.removePluginClassLoader(plugin)); addIfInstance(closeables, plugin.getClass().getClassLoader()); } catch (Exception ex) { ex.printStackTrace(); diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RLibraryLoader.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RLibraryLoader.java deleted file mode 100644 index 1f19035..0000000 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RLibraryLoader.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.frankheijden.serverutils.bungee.reflection; - -import dev.frankheijden.minecraftreflection.MinecraftReflection; -import net.md_5.bungee.api.plugin.PluginDescription; - -public class RLibraryLoader { - - private static final MinecraftReflection reflection = MinecraftReflection - .of("net.md_5.bungee.api.plugin.LibraryLoader"); - - private RLibraryLoader() {} - - public static ClassLoader createLoader(Object instance, PluginDescription desc) { - return instance == null ? null : reflection.invoke(instance, "createLoader", desc); - } -} diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginClassLoader.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginClassLoader.java index caa9bc0..b127545 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginClassLoader.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginClassLoader.java @@ -1,12 +1,8 @@ package net.frankheijden.serverutils.bungee.reflection; -import java.io.File; import java.util.Set; -import dev.frankheijden.minecraftreflection.ClassObject; import dev.frankheijden.minecraftreflection.MinecraftReflection; -import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; -import net.md_5.bungee.api.plugin.PluginDescription; public class RPluginClassLoader { @@ -16,23 +12,9 @@ public class RPluginClassLoader { private RPluginClassLoader() {} /** - * Creates a new instance of a PluginClassLoader from given parameters. + * Removes the PluginClassLoader of a specific plugin. */ - public static Object newInstance(ProxyServer proxy, PluginDescription desc, File file, ClassLoader classLoader) { - return reflection.newInstance( - ClassObject.of(ProxyServer.class, proxy), - ClassObject.of(PluginDescription.class, desc), - ClassObject.of(File.class, file), - ClassObject.of(ClassLoader.class, classLoader) - ); - } - - /** - * Retrieves the PluginClassLoader of a specific plugin. - * @param plugin The plugin to lookup the PluginClassLoader for. - * @return The PluginClassLoader. - */ - public static Object getPluginClassLoader(Plugin plugin) { + public static Object removePluginClassLoader(Plugin plugin) { Set allLoaders = reflection.get(null, "allLoaders"); if (allLoaders == null) return null; diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginManager.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginManager.java index a812ddb..c928c16 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginManager.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/reflection/RPluginManager.java @@ -6,6 +6,7 @@ import dev.frankheijden.minecraftreflection.MinecraftReflection; import net.frankheijden.serverutils.common.utils.MapUtils; import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.api.plugin.PluginDescription; import org.yaml.snakeyaml.Yaml; public class RPluginManager { @@ -26,10 +27,6 @@ public class RPluginManager { MapUtils.remove(reflection.get(instance, "toLoad"), pluginName); } - public static Map getPlugins(Object instance) { - return reflection.get(instance, "plugins"); - } - public static Yaml getYaml(Object instance) { return reflection.get(instance, "yaml"); } @@ -38,6 +35,14 @@ public class RPluginManager { return reflection.get(instance, "commandMap"); } + public static Map getToLoad(Object pluginManager) { + return reflection.get(pluginManager, "toLoad"); + } + + public static void setToLoad(Object pluginManager, Map toLoad) { + reflection.set(pluginManager, "toLoad", toLoad); + } + /** * Retrieves the registered plugin of the command. * @param instance The PluginManager instance. @@ -53,8 +58,4 @@ public class RPluginManager { } return null; } - - public static Object getLibraryLoader(Object instance) { - return reflection.get(instance, "libraryLoader"); - } } diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/entities/results/CloseablePluginResults.java b/Common/src/main/java/net/frankheijden/serverutils/common/entities/results/CloseablePluginResults.java index 10bf827..4d10121 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/entities/results/CloseablePluginResults.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/entities/results/CloseablePluginResults.java @@ -60,11 +60,7 @@ public class CloseablePluginResults extends PluginResults implements Close */ public void tryClose() { try { - for (PluginResult pluginResult : this) { - if (pluginResult instanceof CloseablePluginResult) { - ((CloseablePluginResult) pluginResult).close(); - } - } + close(); } catch (IOException ex) { ex.printStackTrace(); } @@ -77,5 +73,6 @@ public class CloseablePluginResults extends PluginResults implements Close ((CloseablePluginResult) pluginResult).close(); } } + System.gc(); } }