From 304867c1f835b9dd0f5aad103b5914891fb5b096 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 2 May 2020 18:49:58 -0700 Subject: [PATCH] Prevents duplicate addon loading. https://github.com/BentoBoxWorld/BentoBox/issues/1339 --- .../bentobox/api/addons/AddonDescription.java | 9 ++++++++ .../bentobox/managers/AddonsManager.java | 23 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java b/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java index efa00fa85..1ad76c777 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java @@ -269,4 +269,13 @@ public final class AddonDescription { return this; } } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "AddonDescription [" + (name != null ? "name=" + name + ", " : "") + + (version != null ? "version=" + version : "") + "]"; + } } diff --git a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java index 3584dbcfd..23a9bc701 100644 --- a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java @@ -98,7 +98,17 @@ public class AddonsManager { // try loading the addon // Get description in the addon.yml file YamlConfiguration data = addonDescription(jar); - + // Check if the addon is already loaded (duplicate version?) + String main = data.getString("main"); + if (main != null) { + if (this.getAddonByMainClassName(main).isPresent()) { + getAddonByMainClassName(main).ifPresent(a -> { + plugin.logError("Duplicate addon! Addon " + a.getDescription().getName() + " " + a.getDescription().getVersion() + " has already been loaded!"); + plugin.logError("Remove the duplicate and restart!"); + }); + return; + } + } // Load the addon addonClassLoader = new AddonClassLoader(this, data, f, this.getClass().getClassLoader()); @@ -341,6 +351,17 @@ public class AddonsManager { return addons.stream().filter(a -> a.getDescription().getName().equalsIgnoreCase(name)).map(a -> (T) a).findFirst(); } + /** + * Gets the addon by main class name + * @param name - main class name + * @return Optional addon object + */ + @NonNull + @SuppressWarnings("unchecked") + public Optional getAddonByMainClassName(@NonNull String name){ + return addons.stream().filter(a -> a.getDescription().getMain().equalsIgnoreCase(name)).map(a -> (T) a).findFirst(); + } + @NonNull private YamlConfiguration addonDescription(@NonNull JarFile jar) throws InvalidAddonFormatException, IOException, InvalidConfigurationException { // Obtain the addon.yml file