From 0d0b2ef4252b31ae488bd0ff1e3f9af43ee91568 Mon Sep 17 00:00:00 2001 From: Xavier Date: Thu, 8 Feb 2018 15:27:50 -0500 Subject: [PATCH] =?UTF-8?q?Added=20support=20for=20loading=20message=20bun?= =?UTF-8?q?dles=20from=20other=20ClassLoaders,=20an=E2=80=A6=20(#99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added support for loading message bundles from other ClassLoaders, and made the Bukkit & Bungee locales attempt to load from the ClassLoader that ACF is apart of, and the ClassLoader that the CommandManagers plugin belongs to * Added the ability to add/register a ClassLoader to be scanned for Locales. The Locales automatically adds its own ClassLoader to the list, and the Bungee, Bukkit and Sponge implementations automatically add the plugins ClassLoader to the list * Fixes the issue with conflicting bundle names although they may belong to two different ClassLoaders --- .../java/co/aikar/commands/BukkitLocales.java | 1 + .../java/co/aikar/commands/BungeeLocales.java | 1 + .../main/java/co/aikar/commands/Locales.java | 44 ++++++++++++++++--- .../java/co/aikar/commands/SpongeLocales.java | 1 + 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java b/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java index da0ee649..92ef6863 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java @@ -39,6 +39,7 @@ public class BukkitLocales extends Locales { public BukkitLocales(BukkitCommandManager manager) { super(manager); this.manager = manager; + this.addBundleClassLoader(this.manager.getPlugin().getClass().getClassLoader()); } @Override diff --git a/bungee/src/main/java/co/aikar/commands/BungeeLocales.java b/bungee/src/main/java/co/aikar/commands/BungeeLocales.java index e77a7d17..12bd6d5e 100644 --- a/bungee/src/main/java/co/aikar/commands/BungeeLocales.java +++ b/bungee/src/main/java/co/aikar/commands/BungeeLocales.java @@ -7,6 +7,7 @@ public class BungeeLocales extends Locales { super(manager); this.manager = manager; + this.addBundleClassLoader(this.manager.getPlugin().getClass().getClassLoader()); } @Override diff --git a/core/src/main/java/co/aikar/commands/Locales.java b/core/src/main/java/co/aikar/commands/Locales.java index d0651e33..ce3fabbb 100644 --- a/core/src/main/java/co/aikar/commands/Locales.java +++ b/core/src/main/java/co/aikar/commands/Locales.java @@ -31,7 +31,9 @@ import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -75,11 +77,13 @@ public class Locales { private final CommandManager manager; private final LocaleManager localeManager; - private final SetMultimap loadedBundles = HashMultimap.create(); + private final Map> loadedBundles = new HashMap<>(); + private final List registeredClassLoaders = new ArrayList<>(); public Locales(CommandManager manager) { this.manager = manager; this.localeManager = LocaleManager.create(manager::getIssuerLocale); + this.addBundleClassLoader(this.getClass().getClassLoader()); } public void loadLanguages() { @@ -101,9 +105,12 @@ public class Locales { //noinspection unchecked Set supportedLanguages = manager.getSupportedLanguages(); for (Locale locale : supportedLanguages) { - for (String bundleName : Sets.newHashSet(loadedBundles.keys())) { - addMessageBundle(bundleName, locale); + for(SetMultimap localeData: this.loadedBundles.values()) { + for (String bundleName : Sets.newHashSet(localeData.keys())) { + addMessageBundle(bundleName, locale); + } } + } } @@ -117,11 +124,28 @@ public class Locales { } } - public void addMessageBundle(String bundleName, Locale locale) { - if (!loadedBundles.containsEntry(bundleName, locale)) { - loadedBundles.put(bundleName, locale); - this.localeManager.addMessageBundle(bundleName, locale); + public boolean addMessageBundle(String bundleName, Locale locale) { + boolean found = false; + for(ClassLoader classLoader: this.registeredClassLoaders) { + if(this.addMessageBundle(classLoader, bundleName, locale)) { + found = true; + } } + + return found; + } + + public boolean addMessageBundle(ClassLoader classLoader, String bundleName, Locale locale) { + SetMultimap classLoadersLocales = this.loadedBundles.getOrDefault(classLoader, HashMultimap.create()); + if(!classLoadersLocales.containsEntry(bundleName, locale)) { + if(this.localeManager.addMessageBundle(classLoader, bundleName, locale)) { + classLoadersLocales.put(bundleName, locale); + this.loadedBundles.put(classLoader, classLoadersLocales); + return true; + } + } + + return false; } public void addMessageStrings(Locale locale, @NotNull Map messages) { @@ -129,6 +153,7 @@ public class Locales { messages.forEach((key, value) -> map.put(MessageKey.of(key), value)); addMessages(locale, map); } + public void addMessages(Locale locale, @NotNull Map messages) { this.localeManager.addMessages(locale, messages); } @@ -167,4 +192,9 @@ public class Locales { matcher.appendTail(sb); return sb.toString(); } + + public boolean addBundleClassLoader(ClassLoader classLoader) { + return !this.registeredClassLoaders.contains(classLoader) && this.registeredClassLoaders.add(classLoader); + + } } diff --git a/sponge/src/main/java/co/aikar/commands/SpongeLocales.java b/sponge/src/main/java/co/aikar/commands/SpongeLocales.java index a0889998..f0d5b9c2 100644 --- a/sponge/src/main/java/co/aikar/commands/SpongeLocales.java +++ b/sponge/src/main/java/co/aikar/commands/SpongeLocales.java @@ -6,6 +6,7 @@ public class SpongeLocales extends Locales{ public SpongeLocales(SpongeCommandManager manager) { super(manager); this.manager = manager; + this.addBundleClassLoader(this.manager.getPlugin().getClass().getClassLoader()); } @Override