diff --git a/src/main/java/me/clip/placeholderapi/expansion/ExpansionManager.java b/src/main/java/me/clip/placeholderapi/expansion/ExpansionManager.java index 5040d86..2a497ff 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/ExpansionManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/ExpansionManager.java @@ -20,6 +20,12 @@ */ package me.clip.placeholderapi.expansion; +import java.io.File; +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.PlaceholderHook; @@ -29,171 +35,168 @@ import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.Listener; -import java.lang.reflect.Constructor; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - public final class ExpansionManager { - private PlaceholderAPIPlugin plugin; + private PlaceholderAPIPlugin plugin; + private final Map cache = new HashMap<>(); - private final Map cache = new HashMap<>(); + public ExpansionManager(PlaceholderAPIPlugin instance) { + plugin = instance; + File f = new File(PlaceholderAPIPlugin.getInstance().getDataFolder(), "expansions"); + if (!f.exists()) { + if (!f.mkdir()) { + PlaceholderAPIPlugin.getInstance().getLogger() + .severe("Failed to create expansions folder!"); + } + } + } - public ExpansionManager(PlaceholderAPIPlugin instance) { - plugin = instance; - } + public void clean() { + cache.clear(); + } - public void clean() { - cache.clear(); - } + public PlaceholderExpansion getCachedExpansion(String plugin) { + return cache.getOrDefault(plugin, null); + } - public PlaceholderExpansion getCachedExpansion(String plugin) { - return cache.getOrDefault(plugin, null); - } + public boolean removeCachedExpansion(String identifier) { + return cache.remove(identifier) != null; + } - public boolean removeCachedExpansion(String identifier) { - return cache.remove(identifier) != null; - } + public PlaceholderExpansion getRegisteredExpansion(String name) { + for (Entry hook : PlaceholderAPI.getPlaceholders().entrySet()) { + if (hook.getValue() instanceof PlaceholderExpansion) { + if (name.equalsIgnoreCase(hook.getKey())) { + return (PlaceholderExpansion) hook.getValue(); + } + } + } + return null; + } - public PlaceholderExpansion getRegisteredExpansion(String name) { - for (Entry hook : PlaceholderAPI.getPlaceholders().entrySet()) { - if (hook.getValue() instanceof PlaceholderExpansion) { - if (name.equalsIgnoreCase(hook.getKey())) { - return (PlaceholderExpansion) hook.getValue(); - } - } - } - return null; - } + public boolean registerExpansion(PlaceholderExpansion expansion) { + if (expansion == null || expansion.getIdentifier() == null) { + return false; + } + if (expansion instanceof Configurable) { + Map defaults = ((Configurable) expansion).getDefaults(); + String pre = "expansions." + expansion.getIdentifier() + "."; + FileConfiguration cfg = plugin.getConfig(); + boolean save = false; + for (Entry entries : defaults.entrySet()) { + if (entries.getKey() == null || entries.getKey().isEmpty()) { + continue; + } + if (entries.getValue() == null) { + if (cfg.contains(pre + entries.getKey())) { + save = true; + cfg.set(pre + entries.getKey(), null); + } + } else { + if (!cfg.contains(pre + entries.getKey())) { + save = true; + cfg.set(pre + entries.getKey(), entries.getValue()); + } + } + } + if (save) { + plugin.saveConfig(); + plugin.reloadConfig(); + } + } + if (expansion instanceof VersionSpecific) { + VersionSpecific nms = (VersionSpecific) expansion; + if (!nms.isCompatibleWith(PlaceholderAPIPlugin.getServerVersion())) { + plugin.getLogger() + .info("Your server version is not compatible with expansion: " + expansion.getIdentifier() + + " version: " + expansion.getVersion()); + return false; + } + } + if (!expansion.canRegister()) { + if (expansion.getRequiredPlugin() != null) { + cache.put(expansion.getRequiredPlugin().toLowerCase(), expansion); + } + return false; + } + if (!expansion.register()) { + return false; + } + if (expansion instanceof Listener) { + Listener l = (Listener) expansion; + Bukkit.getPluginManager().registerEvents(l, plugin); + } + plugin.getLogger().info("Successfully registered expansion: " + expansion.getIdentifier()); + if (expansion instanceof Taskable) { + ((Taskable) expansion).start(); + } + if (plugin.getExpansionCloud() != null) { + CloudExpansion ce = plugin.getExpansionCloud().getCloudExpansion(expansion.getIdentifier()); + if (ce != null) { + ce.setHasExpansion(true); + if (!ce.getLatestVersion().equals(expansion.getVersion())) { + ce.setShouldUpdate(true); + } + } + } + return true; + } - public boolean registerExpansion(PlaceholderExpansion c) { - if (c == null || c.getIdentifier() == null) { - return false; - } + public PlaceholderExpansion registerExpansion(String fileName) { + List> subs = FileUtil.getClasses("expansions", fileName, PlaceholderExpansion.class); + if (subs == null || subs.isEmpty()) { + return null; + } + // only register the first instance found as an expansion jar should only have 1 class + // extending PlaceholderExpansion + PlaceholderExpansion ex = createInstance(subs.get(0)); + if (registerExpansion(ex)) { + return ex; + } + return null; + } - if (c instanceof Configurable) { + public void registerAllExpansions() { + if (plugin == null) { + return; + } + List> subs = FileUtil.getClasses("expansions", null, PlaceholderExpansion.class); + if (subs == null || subs.isEmpty()) { + return; + } + for (Class klass : subs) { + PlaceholderExpansion ex = createInstance(klass); + if (ex != null) { + registerExpansion(ex); + } + } + } - Map defaults = ((Configurable) c).getDefaults(); - String pre = "expansions." + c.getIdentifier() + "."; - FileConfiguration cfg = plugin.getConfig(); - - boolean save = false; - - for (Entry entries : defaults.entrySet()) { - if (entries.getKey() == null || entries.getKey().isEmpty()) { - continue; - } - - if (entries.getValue() == null) { - if (cfg.contains(pre + entries.getKey())) { - save = true; - cfg.set(pre + entries.getKey(), null); - } - } else { - if (!cfg.contains(pre + entries.getKey())) { - save = true; - cfg.set(pre + entries.getKey(), entries.getValue()); - } - } - } - - if (save) { - plugin.saveConfig(); - plugin.reloadConfig(); - } - } - - if (c instanceof VersionSpecific) { - VersionSpecific nms = (VersionSpecific) c; - if (!nms.isCompatibleWith(PlaceholderAPIPlugin.getServerVersion())) { - plugin.getLogger().info("Your server version is not compatible with expansion: " + c.getIdentifier() - + " version: " + c.getVersion()); - return false; - } - } - - if (!c.canRegister()) { - if (c.getRequiredPlugin() != null) { - cache.put(c.getRequiredPlugin().toLowerCase(), c); - } - return false; - } - - if (!c.register()) { - return false; - } - - if (c instanceof Listener) { - Listener l = (Listener) c; - Bukkit.getPluginManager().registerEvents(l, plugin); - } - - plugin.getLogger().info("Successfully registered expansion: " + c.getIdentifier()); - - if (c instanceof Taskable) { - ((Taskable) c).start(); - } - return true; - } - - public void registerAllExpansions() { - - if (plugin == null) { - return; - } - - List> subs = FileUtil.getClasses("expansions", PlaceholderExpansion.class); - - if (subs == null || subs.isEmpty()) { - return; - } - - for (Class klass : subs) { - - if (klass == null) { - continue; - } - - try { - - PlaceholderExpansion ex = null; - - Constructor[] c = klass.getConstructors(); - - if (c.length == 0) { - ex = (PlaceholderExpansion) klass.newInstance(); - } else { - for (Constructor con : c) { - if (con.getParameterTypes().length == 0) { - ex = (PlaceholderExpansion) klass.newInstance(); - break; - } - } - } - - if (ex == null) { - continue; - } - - if (registerExpansion(ex)) { - if (plugin.getExpansionCloud() != null) { - CloudExpansion ce = plugin.getExpansionCloud().getCloudExpansion(ex.getIdentifier()); - if (ce != null) { - ce.setHasExpansion(true); - if (!ce.getVersion().equals(ex.getVersion())) { - ce.setShouldUpdate(true); - } - } - } - } - - } catch (Throwable t) { - plugin.getLogger().severe("Failed to load placeholder expansion from class: " + klass.getName()); - plugin.getLogger().severe(t.getMessage()); - } - } - } + private PlaceholderExpansion createInstance(Class klass) { + if (klass == null) { + return null; + } + PlaceholderExpansion ex = null; + if (!klass.isAssignableFrom(PlaceholderExpansion.class)) { + return null; + } + try { + Constructor[] c = klass.getConstructors(); + if (c.length == 0) { + ex = (PlaceholderExpansion) klass.newInstance(); + } else { + for (Constructor con : c) { + if (con.getParameterTypes().length == 0) { + ex = (PlaceholderExpansion) klass.newInstance(); + break; + } + } + } + } catch (Throwable t) { + plugin.getLogger().severe("Failed to init placeholder expansion from class: " + klass.getName()); + plugin.getLogger().severe(t.getMessage()); + } + return ex; + } }