diff --git a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonBaseEvent.java b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonBaseEvent.java index 733191334..6deeaa1e9 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonBaseEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonBaseEvent.java @@ -1,5 +1,7 @@ package world.bentobox.bentobox.api.events.addon; +import java.util.Map; + import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.events.PremadeEvent; @@ -10,13 +12,22 @@ import world.bentobox.bentobox.api.events.PremadeEvent; public class AddonBaseEvent extends PremadeEvent { private final Addon addon; + private final Map keyValues; - public AddonBaseEvent(Addon addon) { + public AddonBaseEvent(Addon addon, Map keyValues) { super(); this.addon = addon; + this.keyValues = keyValues; } public Addon getAddon() { return addon; } + + /** + * @return the keyValues + */ + public Map getKeyValues() { + return keyValues; + } } diff --git a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java index 69039210d..2669df1b6 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java @@ -1,9 +1,13 @@ package world.bentobox.bentobox.api.events.addon; +import java.util.HashMap; +import java.util.Map; + import world.bentobox.bentobox.api.addons.Addon; public class AddonEvent { + public enum Reason { ENABLE, DISABLE, @@ -11,39 +15,51 @@ public class AddonEvent { UNKNOWN } - public static AddonEventBuilder builder() { + + public AddonEventBuilder builder() { return new AddonEventBuilder(); } - public static class AddonEnableEvent extends AddonBaseEvent { - private AddonEnableEvent(Addon addon) { - // Final variables have to be declared in the constuctor - super(addon); + public class AddonEnableEvent extends AddonBaseEvent { + private AddonEnableEvent(Addon addon, Map keyValues) { + // Final variables have to be declared in the constructor + super(addon, keyValues); } } - public static class AddonDisableEvent extends AddonBaseEvent { - private AddonDisableEvent(Addon addon) { - // Final variables have to be declared in the constuctor - super(addon); + public class AddonDisableEvent extends AddonBaseEvent { + private AddonDisableEvent(Addon addon, Map keyValues) { + // Final variables have to be declared in the constructor + super(addon, keyValues); } } - public static class AddonLoadEvent extends AddonBaseEvent { - private AddonLoadEvent(Addon addon) { - // Final variables have to be declared in the constuctor - super(addon); + public class AddonLoadEvent extends AddonBaseEvent { + private AddonLoadEvent(Addon addon, Map keyValues) { + // Final variables have to be declared in the constructor + super(addon, keyValues); } } - public static class AddonGeneralEvent extends AddonBaseEvent { - private AddonGeneralEvent(Addon addon) { - // Final variables have to be declared in the constuctor - super(addon); + public class AddonGeneralEvent extends AddonBaseEvent { + private AddonGeneralEvent(Addon addon, Map keyValues) { + // Final variables have to be declared in the constructor + super(addon, keyValues); } } - public static class AddonEventBuilder { + public class AddonEventBuilder { // Here field are NOT final. They are just used for the building. private Addon addon; private Reason reason = Reason.UNKNOWN; + private Map keyValues = new HashMap<>(); + + /** + * Add a map of key-value pairs to the event. Use this to transfer data from the addon to the external world. + * @param keyValues - map + * @return AddonEvent + */ + public AddonEventBuilder keyValues(Map keyValues) { + this.keyValues = keyValues; + return this; + } public AddonEventBuilder addon(Addon addon) { this.addon = addon; @@ -58,13 +74,13 @@ public class AddonEvent { public AddonBaseEvent build() { switch (reason) { case ENABLE: - return new AddonEnableEvent(addon); + return new AddonEnableEvent(addon, keyValues); case DISABLE: - return new AddonDisableEvent(addon); + return new AddonDisableEvent(addon, keyValues); case LOAD: - return new AddonLoadEvent(addon); + return new AddonLoadEvent(addon, keyValues); default: - return new AddonGeneralEvent(addon); + return new AddonGeneralEvent(addon, keyValues); } } } diff --git a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java index 288fedaa1..625934fe5 100644 --- a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java @@ -29,20 +29,20 @@ import world.bentobox.bentobox.api.addons.exceptions.InvalidAddonFormatException import world.bentobox.bentobox.api.events.addon.AddonEvent; /** - * @author Tastybento, ComminQ + * @author tastybento, ComminQ */ public class AddonsManager { private static final String LOCALE_FOLDER = "locales"; private List addons; - private List loaders; + private Map loaders; private final Map> classes = new HashMap<>(); private BentoBox plugin; public AddonsManager(BentoBox plugin) { this.plugin = plugin; addons = new ArrayList<>(); - loaders = new ArrayList<>(); + loaders = new HashMap<>(); } /** @@ -68,7 +68,7 @@ public class AddonsManager { addons.forEach(addon -> { try { addon.onEnable(); - Bukkit.getPluginManager().callEvent(AddonEvent.builder().addon(addon).reason(AddonEvent.Reason.ENABLE).build()); + Bukkit.getPluginManager().callEvent(new AddonEvent().builder().addon(addon).reason(AddonEvent.Reason.ENABLE).build()); addon.setState(Addon.State.ENABLED); plugin.log("Enabling " + addon.getDescription().getName() + "..."); } catch (NoClassDefFoundError | NoSuchMethodError e) { @@ -119,8 +119,6 @@ public class AddonsManager { YamlConfiguration data = addonDescription(jar); // Load the addon AddonClassLoader addonClassLoader = new AddonClassLoader(this, data, f, this.getClass().getClassLoader()); - // Add to the list of loaders - loaders.add(addonClassLoader); // Get the addon itself addon = addonClassLoader.getAddon(); @@ -135,9 +133,11 @@ public class AddonsManager { } plugin.getLocalesManager().loadLocalesFromFile(addon.getDescription().getName()); // Fire the load event - Bukkit.getPluginManager().callEvent(AddonEvent.builder().addon(addon).reason(AddonEvent.Reason.LOAD).build()); + Bukkit.getPluginManager().callEvent(new AddonEvent().builder().addon(addon).reason(AddonEvent.Reason.LOAD).build()); // Add it to the list of addons addons.add(addon); + // Add to the list of loaders + loaders.put(addon, addonClassLoader); // Run the onLoad. addon.onLoad(); } catch (Exception e) { @@ -154,12 +154,12 @@ public class AddonsManager { addons.forEach(addon -> { if (addon.isEnabled()) { addon.onDisable(); - Bukkit.getPluginManager().callEvent(AddonEvent.builder().addon(addon).reason(AddonEvent.Reason.DISABLE).build()); + Bukkit.getPluginManager().callEvent(new AddonEvent().builder().addon(addon).reason(AddonEvent.Reason.DISABLE).build()); plugin.log("Disabling " + addon.getDescription().getName() + "..."); } }); - loaders.forEach(l -> { + loaders.values().forEach(l -> { try { l.close(); } catch (IOException ignore) { @@ -173,12 +173,8 @@ public class AddonsManager { return addons; } - public List getLoaders() { - return loaders; - } - - public void setLoaders(List loaders) { - this.loaders = loaders; + public AddonClassLoader getLoader(final Addon addon) { + return loaders.get(addon); } /** @@ -187,7 +183,7 @@ public class AddonsManager { * @return Class - the class */ public Class getClassByName(final String name) { - return classes.getOrDefault(name, loaders.stream().map(l -> l.findClass(name, false)).filter(Objects::nonNull).findFirst().orElse(null)); + return classes.getOrDefault(name, loaders.values().stream().map(l -> l.findClass(name, false)).filter(Objects::nonNull).findFirst().orElse(null)); } /** @@ -268,4 +264,6 @@ public class AddonsManager { addons.clear(); addons.addAll(sortedAddons.values()); } + + }