Adds a generic event to expose addon info via K,V pairs.

https://github.com/BentoBoxWorld/bentobox/issues/352#issuecomment-441471105

See addon-event branch for Level addon.
This commit is contained in:
tastybento 2018-11-25 22:31:15 -08:00
parent 5f57417ccc
commit d9da30e866
3 changed files with 64 additions and 39 deletions

View File

@ -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<String, Object> keyValues;
public AddonBaseEvent(Addon addon) {
public AddonBaseEvent(Addon addon, Map<String, Object> keyValues) {
super();
this.addon = addon;
this.keyValues = keyValues;
}
public Addon getAddon() {
return addon;
}
/**
* @return the keyValues
*/
public Map<String, Object> getKeyValues() {
return keyValues;
}
}

View File

@ -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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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);
}
}
}

View File

@ -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<Addon> addons;
private List<AddonClassLoader> loaders;
private Map<Addon, AddonClassLoader> loaders;
private final Map<String, Class<?>> 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<AddonClassLoader> getLoaders() {
return loaders;
}
public void setLoaders(List<AddonClassLoader> 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());
}
}