From 9a725bac314420d4e32e56ca05d3221f323476af Mon Sep 17 00:00:00 2001 From: SimSonic Date: Tue, 31 Mar 2015 12:33:01 +0600 Subject: [PATCH] All ResolutionResult objects are now stored in separate ConcurrentHashMap. The keys are all available player identitifiers including Player.toString() and OfflinePlayer.toString(). This helped to implement deprecated Vault methods. --- pom.xml | 4 +- .../rscPermissions/BridgeForBukkitAPI.java | 3 +- .../Bukkit/BukkitEventListener.java | 3 +- .../Bukkit/BukkitPermissionManager.java | 77 +++++++++++++++---- .../Bukkit/Commands/BukkitCommands.java | 2 +- .../rscPermissions/Bukkit/VaultChat.java | 21 +++-- .../Bukkit/VaultPermission.java | 43 ++++++----- 7 files changed, 104 insertions(+), 49 deletions(-) diff --git a/pom.xml b/pom.xml index ec1c2d0..0717194 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ru.simsonic rscPermissions - 0.9.7a + 0.9.8a jar rscPermissions @@ -66,7 +66,7 @@ ru.simsonic rscUtilityLibrary - 2.0.3 + 2.0.4 compile jar diff --git a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java index 17d8c6e..5fc79e3 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java +++ b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java @@ -5,6 +5,7 @@ import org.bukkit.plugin.ServicePriority; import ru.simsonic.rscPermissions.Bukkit.VaultChat; import ru.simsonic.rscPermissions.Bukkit.VaultPermission; import ru.simsonic.rscPermissions.Engine.Phrases; +import ru.simsonic.rscUtilityLibrary.Bukkit.Tools; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; public class BridgeForBukkitAPI @@ -46,7 +47,7 @@ public class BridgeForBukkitAPI } public Player findPlayer(String player) { - for(Player online : rscp.getServer().getOnlinePlayers()) + for(Player online : Tools.getOnlinePlayers()) if(online.getName().equals(player)) return online; return null; diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java index fdf6b21..2e3c9d7 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java @@ -14,6 +14,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.ServerListPingEvent; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.Engine.ResolutionResult; +import ru.simsonic.rscUtilityLibrary.Bukkit.Tools; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; public class BukkitEventListener implements Listener @@ -109,7 +110,7 @@ public class BukkitEventListener implements Listener @Override public void run() { - for(Player player : Bukkit.getServer().getOnlinePlayers()) + for(Player player : Tools.getOnlinePlayers()) { if(player.hasPermission("rscp.maintenance.*")) continue; diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java index dc122b6..8649553 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java @@ -8,12 +8,14 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionAttachment; import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.Engine.ResolutionParams; import ru.simsonic.rscPermissions.Engine.ResolutionResult; +import ru.simsonic.rscUtilityLibrary.Bukkit.Tools; import ru.simsonic.rscUtilityLibrary.RestartableThread; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; @@ -24,6 +26,7 @@ public class BukkitPermissionManager extends RestartableThread { this.rscp = plugin; } + private final Map resolutions = new ConcurrentHashMap<>(); private final LinkedBlockingQueue updateQueue = new LinkedBlockingQueue<>(); private final Map attachments = new HashMap<>(); private final Map> persistentPermissions = new HashMap<>(); @@ -34,7 +37,7 @@ public class BukkitPermissionManager extends RestartableThread private final Set debug = new HashSet<>(); public void recalculateOnlinePlayers() { - updateQueue.addAll(rscp.getServer().getOnlinePlayers()); + updateQueue.addAll(Tools.getOnlinePlayers()); rscp.scheduleAutoUpdate(); } public void recalculatePlayer(Player player) @@ -45,27 +48,32 @@ public class BukkitPermissionManager extends RestartableThread } catch(InterruptedException ex) { } } - public Map listPlayerPermissions(Player player) + public ResolutionResult getResult(String playerIdentifier) { - final PermissionAttachment attachment = rscp.permissionManager.attachments.get(player); - if(attachment != null) - return attachment.getPermissions(); - return Collections.EMPTY_MAP; + return (resolutions.containsKey(playerIdentifier)) + ? resolutions.get(playerIdentifier) + : resolvePlayerIdentifier(playerIdentifier); } - public String getPlayerPrefix(Player player) + public ResolutionResult getResult(OfflinePlayer offline) { - final String prefix = prefixes.get(player); - return prefix != null ? prefix : ""; + final String key = offline.toString(); + return (resolutions.containsKey(key)) + ? resolutions.get(key) + : resolveOfflinePlayer(offline); } - public String getPlayerSuffix(Player player) + public ResolutionResult getResult(Player player) { - final String suffix = suffixes.get(player); - return suffix != null ? suffix : ""; + final String key = player.toString(); + return (resolutions.containsKey(key)) + ? resolutions.get(key) + : resolvePlayer(player); } - public Set getPlayerGroups(Player player) + public Map listPlayerPermissions(Player player) { - final Set result = groups.get(player); - return result != null ? result : Collections.EMPTY_SET; + final PermissionAttachment attachment = rscp.permissionManager.attachments.get(player); + if(attachment != null) + return attachment.getPermissions(); + return Collections.EMPTY_MAP; } public void removePlayer(Player player) { @@ -131,6 +139,24 @@ public class BukkitPermissionManager extends RestartableThread } updateQueue.clear(); } + public synchronized ResolutionResult resolvePlayerIdentifier(String playerIdentifier) + { + final ResolutionParams params = new ResolutionParams(); + params.applicableIdentifiers = new String[] { playerIdentifier }; + final ResolutionResult result = rscp.internalCache.resolvePlayer(params); + resolutions.put(playerIdentifier, result); + return result; + } + public synchronized ResolutionResult resolveOfflinePlayer(OfflinePlayer offline) + { + final ResolutionParams params = new ResolutionParams(); + params.applicableIdentifiers = getOfflinePlayerIdentifiers(offline); + final ResolutionResult result = rscp.internalCache.resolvePlayer(params); + for(String id : params.applicableIdentifiers) + resolutions.put(id, result); + resolutions.put(offline.toString(), result); + return result; + } public synchronized ResolutionResult resolvePlayer(Player player) { final ResolutionParams params = new ResolutionParams(); @@ -143,7 +169,26 @@ public class BukkitPermissionManager extends RestartableThread params.destRegions = new String[] {}; params.destWorld = player.getLocation().getWorld().getName(); params.expirience = player.getLevel(); - return rscp.internalCache.resolvePlayer(params); + final ResolutionResult result = rscp.internalCache.resolvePlayer(params); + for(String id : params.applicableIdentifiers) + resolutions.put(id, result); + resolutions.put(player.toString(), result); + return result; + } + private static String[] getOfflinePlayerIdentifiers(OfflinePlayer offline) + { + final ArrayList result = new ArrayList<>(); + try + { + result.add(offline.getName()); + } catch(RuntimeException | NoSuchMethodError ex) { + } + try + { + result.add(offline.getUniqueId().toString().toLowerCase()); + } catch(RuntimeException | NoSuchMethodError ex) { + } + return result.toArray(new String[result.size()]); } private static String[] getPlayerIdentifiers(Player player) { diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java index f08eede..a5c8f05 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java @@ -316,7 +316,7 @@ public class BukkitCommands throw new CommandAnswerException(list); case "groups": list.add("{MAGENTA}Group list for {_YL}" + player.getName() + "{MAGENTA}:"); - for(String group : rscp.permissionManager.getPlayerGroups(player)) + for(String group : rscp.bridgeForBukkit.getPermission().getPlayerGroups(player)) list.add("{_LG}" + group); throw new CommandAnswerException(list); /* diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java index 38bc8ad..926bb14 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java @@ -4,6 +4,7 @@ import org.bukkit.World; import org.bukkit.entity.Player; import ru.simsonic.rscPermissions.BridgeForBukkitAPI; import ru.simsonic.rscPermissions.BukkitPluginMain; +import ru.simsonic.rscPermissions.Engine.ResolutionResult; public final class VaultChat extends VaultDeprecatedChat { @@ -31,37 +32,41 @@ public final class VaultChat extends VaultDeprecatedChat @Override public String getPlayerPrefix(String world, OfflinePlayer player) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.prefix; } @Override public String getPlayerPrefix(Player player) { - return rscp.permissionManager.getPlayerPrefix(player); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.prefix; } @Override @Deprecated public String getPlayerPrefix(String world, String player) { - final Player online = bridge.findPlayer(player); - return online != null ? rscp.permissionManager.getPlayerPrefix(online) : null; + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.prefix; } // ***** GET PLAYER SUFFIX ***** @Override public String getPlayerSuffix(String world, OfflinePlayer player) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.suffix; } @Override public String getPlayerSuffix(Player player) { - return rscp.permissionManager.getPlayerSuffix(player); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.suffix; } @Override @Deprecated public String getPlayerSuffix(String world, String player) { - final Player online = bridge.findPlayer(player); - return online != null ? rscp.permissionManager.getPlayerSuffix(online) : null; + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.suffix; } // ***** SET PLAYER PREFIX ***** @Override diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java index bd2027a..a7daf2a 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java @@ -1,11 +1,11 @@ package ru.simsonic.rscPermissions.Bukkit; -import java.util.Set; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import ru.simsonic.rscPermissions.BridgeForBukkitAPI; import ru.simsonic.rscPermissions.BukkitPluginMain; +import ru.simsonic.rscPermissions.Engine.ResolutionResult; public final class VaultPermission extends net.milkbowl.vault.permission.Permission { @@ -83,18 +83,6 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - @Deprecated - public String[] getPlayerGroups(String world, String player) - { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); - } - @Override - @Deprecated - public String getPrimaryGroup(String world, String player) - { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); - } - @Override public String[] getGroups() { throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); @@ -236,26 +224,41 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override + @Deprecated + public String[] getPlayerGroups(String world, String player) + { + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.groups.toArray(new String[result.groups.size()]); + } + @Override public String[] getPlayerGroups(String world, OfflinePlayer player) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.groups.toArray(new String[result.groups.size()]); } @Override public String[] getPlayerGroups(Player player) { - final Set result = rscp.permissionManager.getPlayerGroups(player); - return result.toArray(new String[result.size()]); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.groups.toArray(new String[result.groups.size()]); + } + @Override + @Deprecated + public String getPrimaryGroup(String world, String player) + { + final String[] groups = getPlayerGroups(world, player); + return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup(); } @Override public String getPrimaryGroup(String world, OfflinePlayer player) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + final String[] groups = getPlayerGroups(world, player); + return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup(); } @Override public String getPrimaryGroup(Player player) { - final Set result = rscp.permissionManager.getPlayerGroups(player); - final String[] array = result.toArray(new String[result.size()]); - return array.length > 0 ? array[array.length - 1] : rscp.settings.getDefaultGroup(); + final String[] groups = getPlayerGroups(player); + return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup(); } }