From 4dcca3d923ba1a6ee9aba4d99c0bf083fc9ec3c7 Mon Sep 17 00:00:00 2001 From: HyKurtis Date: Sun, 16 Dec 2018 23:58:15 +0000 Subject: [PATCH] Added addon request system to request data from an addon in spigot plugins --- .../bentobox/bentobox/api/addons/Addon.java | 28 ++++++++ .../exceptions/AddonRequestException.java | 14 ++++ .../addons/request/AddonRequestBuilder.java | 64 +++++++++++++++++++ .../addons/request/AddonRequestHandler.java | 31 +++++++++ 4 files changed, 137 insertions(+) create mode 100644 src/main/java/world/bentobox/bentobox/api/addons/exceptions/AddonRequestException.java create mode 100644 src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestBuilder.java create mode 100644 src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestHandler.java diff --git a/src/main/java/world/bentobox/bentobox/api/addons/Addon.java b/src/main/java/world/bentobox/bentobox/api/addons/Addon.java index f95c46c52..63ae49a06 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/Addon.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/Addon.java @@ -3,6 +3,8 @@ package world.bentobox.bentobox.api.addons; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -15,6 +17,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.event.Listener; import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.request.AddonRequestHandler; import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.managers.PlayersManager; @@ -32,6 +35,7 @@ public abstract class Addon { private FileConfiguration config; private File dataFolder; private File file; + private Map requestHandlers = new HashMap<>(); public Addon() { state = State.DISABLED; @@ -359,4 +363,28 @@ public abstract class Addon { public String getPermissionPrefix() { return this.getDescription().getName().toLowerCase() + "."; } + + /** + * Register request handler to answer requests from plugins. + * @param handler + */ + public void registerRequestHandler(AddonRequestHandler handler) { + requestHandlers.put(handler.getLabel(), handler); + } + + /** + * Send request to addon. + * @param label + * @param metaData + * @return request response, null if no response. + */ + public Object request(String label, Map metaData) { + label = label.toLowerCase(); + AddonRequestHandler handler = requestHandlers.get(label); + if(handler != null) { + return handler.handle(metaData); + } else { + return null; + } + } } diff --git a/src/main/java/world/bentobox/bentobox/api/addons/exceptions/AddonRequestException.java b/src/main/java/world/bentobox/bentobox/api/addons/exceptions/AddonRequestException.java new file mode 100644 index 000000000..eb5f8e264 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/addons/exceptions/AddonRequestException.java @@ -0,0 +1,14 @@ +package world.bentobox.bentobox.api.addons.exceptions; + +import world.bentobox.bentobox.api.addons.request.AddonRequestBuilder; + +import java.util.UUID; + +public class AddonRequestException extends AddonException +{ + private static final long serialVersionUID = -5698456013070166174L; + + public AddonRequestException(String errorMessage) { + super(errorMessage); + } +} diff --git a/src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestBuilder.java b/src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestBuilder.java new file mode 100644 index 000000000..5abfdea9c --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestBuilder.java @@ -0,0 +1,64 @@ +package world.bentobox.bentobox.api.addons.request; + +import org.apache.commons.lang.Validate; +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.Addon; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class AddonRequestBuilder +{ + private String addonName; + private String requestLabel; + private Map metaData = new HashMap<>(); + + /** + * Define the addon you wish to request. + * + * @param addonName + */ + public AddonRequestBuilder addon(String addonName) { + this.addonName = addonName; + return this; + } + + /** + * Define label for addon request. + * + * @param requestLabel + */ + public AddonRequestBuilder label(String requestLabel) { + this.requestLabel = requestLabel; + return this; + } + + /** + * Add meta data to addon request. + * + * @param key + * @param value + */ + public AddonRequestBuilder addMetaData(String key, Object value) { + metaData.put(key, value); + return this; + } + + /** + * Send request to addon. + * + * @return request response, null if no response. + */ + public Object request() { + Validate.notNull(addonName); + Validate.notNull(requestLabel); + + Optional addonOptional = BentoBox.getInstance().getAddonsManager().getAddonByName(addonName); + if(addonOptional.isPresent()) { + Addon addon = addonOptional.get(); + return addon.request(requestLabel, metaData); + } + return null; + } +} diff --git a/src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestHandler.java b/src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestHandler.java new file mode 100644 index 000000000..e4b517b4f --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/addons/request/AddonRequestHandler.java @@ -0,0 +1,31 @@ +package world.bentobox.bentobox.api.addons.request; + +import java.util.Map; + +public abstract class AddonRequestHandler +{ + private String label; + + public AddonRequestHandler(String label) { + this.label = label.toLowerCase(); + } + + /** + * Get request handler label. + * + * @return label + */ + public String getLabel() { + return label; + } + + /** + * Handle an addon request. + * This is used only for Addons to respond to addon requests from plugins. + * Example: request island level from Levels addon. + * + * @param metaData + * @return request response + */ + public abstract Object handle(Map metaData); +}