Added unload mechanism to plugin API

This commit is contained in:
RaphiMC 2024-02-16 12:29:07 +01:00
parent 94b3d7de09
commit f19d70789f
No known key found for this signature in database
GPG Key ID: 0F6BB0657A03AC94
2 changed files with 43 additions and 3 deletions

View File

@ -47,6 +47,7 @@ public class PluginManager {
public PluginManager() {
this.loadPlugins();
Runtime.getRuntime().addShutdownHook(new Thread(this::unloadPlugins));
}
public List<ViaProxyPlugin> getPlugins() {
@ -84,7 +85,7 @@ public class PluginManager {
for (ViaProxyPlugin plugin : this.plugins) {
if (!plugin.isEnabled()) {
enablePlugin(plugin);
this.enablePlugin(plugin);
}
}
}
@ -127,13 +128,13 @@ public class PluginManager {
private void enablePlugin(final ViaProxyPlugin plugin) {
for (String depend : plugin.getDepends()) {
final ViaProxyPlugin dependPlugin = getPlugin(depend);
final ViaProxyPlugin dependPlugin = this.getPlugin(depend);
if (dependPlugin == null) {
Logger.LOGGER.error("Plugin '" + plugin.getName() + "' depends on '" + depend + "' which is not loaded");
return;
}
if (!dependPlugin.isEnabled()) {
enablePlugin(dependPlugin);
this.enablePlugin(dependPlugin);
}
RStream.of(plugin.getClassLoader()).fields().by("parent").set(dependPlugin.getClassLoader());
@ -147,4 +148,32 @@ public class PluginManager {
}
}
private void unloadPlugins() {
for (ViaProxyPlugin plugin : this.plugins) {
if (plugin.isEnabled()) {
this.disablePlugin(plugin);
}
}
}
private void disablePlugin(final ViaProxyPlugin plugin) {
for (String depend : plugin.getDepends()) {
final ViaProxyPlugin dependPlugin = this.getPlugin(depend);
if (dependPlugin == null) {
Logger.LOGGER.error("Plugin '" + plugin.getName() + "' depends on '" + depend + "' which is not loaded");
return;
}
if (dependPlugin.isEnabled()) {
this.disablePlugin(dependPlugin);
}
}
try {
plugin.disable();
Logger.LOGGER.info("Disabled plugin '" + plugin.getName() + "'");
} catch (Throwable e) {
Logger.LOGGER.error("Failed to disable plugin '" + plugin.getName() + "'", e);
}
}
}

View File

@ -41,6 +41,17 @@ public abstract class ViaProxyPlugin {
public abstract void onEnable();
final void disable() {
try {
this.onDisable();
} finally {
this.enabled = false;
}
}
public void onDisable() {
}
public final String getName() {
return (String) this.viaProxyYaml.get("name");
}