Browse Source

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.
master
SimSonic 10 years ago
parent
commit
9a725bac31
  1. 4
      pom.xml
  2. 3
      src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java
  3. 3
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java
  4. 77
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
  5. 2
      src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
  6. 21
      src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java
  7. 43
      src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java

4
pom.xml

@ -4,7 +4,7 @@
<groupId>ru.simsonic</groupId> <groupId>ru.simsonic</groupId>
<artifactId>rscPermissions</artifactId> <artifactId>rscPermissions</artifactId>
<version>0.9.7a</version> <version>0.9.8a</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>rscPermissions</name> <name>rscPermissions</name>
@ -66,7 +66,7 @@
<dependency> <dependency>
<groupId>ru.simsonic</groupId> <groupId>ru.simsonic</groupId>
<artifactId>rscUtilityLibrary</artifactId> <artifactId>rscUtilityLibrary</artifactId>
<version>2.0.3</version> <version>2.0.4</version>
<scope>compile</scope> <scope>compile</scope>
<type>jar</type> <type>jar</type>
</dependency> </dependency>

3
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.VaultChat;
import ru.simsonic.rscPermissions.Bukkit.VaultPermission; import ru.simsonic.rscPermissions.Bukkit.VaultPermission;
import ru.simsonic.rscPermissions.Engine.Phrases; import ru.simsonic.rscPermissions.Engine.Phrases;
import ru.simsonic.rscUtilityLibrary.Bukkit.Tools;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
public class BridgeForBukkitAPI public class BridgeForBukkitAPI
@ -46,7 +47,7 @@ public class BridgeForBukkitAPI
} }
public Player findPlayer(String player) public Player findPlayer(String player)
{ {
for(Player online : rscp.getServer().getOnlinePlayers()) for(Player online : Tools.getOnlinePlayers())
if(online.getName().equals(player)) if(online.getName().equals(player))
return online; return online;
return null; return null;

3
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 org.bukkit.event.server.ServerListPingEvent;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Engine.ResolutionResult; import ru.simsonic.rscPermissions.Engine.ResolutionResult;
import ru.simsonic.rscUtilityLibrary.Bukkit.Tools;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
public class BukkitEventListener implements Listener public class BukkitEventListener implements Listener
@ -109,7 +110,7 @@ public class BukkitEventListener implements Listener
@Override @Override
public void run() public void run()
{ {
for(Player player : Bukkit.getServer().getOnlinePlayers()) for(Player player : Tools.getOnlinePlayers())
{ {
if(player.hasPermission("rscp.maintenance.*")) if(player.hasPermission("rscp.maintenance.*"))
continue; continue;

77
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java

@ -8,12 +8,14 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachment;
import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Engine.ResolutionParams; import ru.simsonic.rscPermissions.Engine.ResolutionParams;
import ru.simsonic.rscPermissions.Engine.ResolutionResult; import ru.simsonic.rscPermissions.Engine.ResolutionResult;
import ru.simsonic.rscUtilityLibrary.Bukkit.Tools;
import ru.simsonic.rscUtilityLibrary.RestartableThread; import ru.simsonic.rscUtilityLibrary.RestartableThread;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
@ -24,6 +26,7 @@ public class BukkitPermissionManager extends RestartableThread
{ {
this.rscp = plugin; this.rscp = plugin;
} }
private final Map<String, ResolutionResult> resolutions = new ConcurrentHashMap<>();
private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>(); private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>();
private final Map<Player, PermissionAttachment> attachments = new HashMap<>(); private final Map<Player, PermissionAttachment> attachments = new HashMap<>();
private final Map<Player, Map<String, Boolean>> persistentPermissions = new HashMap<>(); private final Map<Player, Map<String, Boolean>> persistentPermissions = new HashMap<>();
@ -34,7 +37,7 @@ public class BukkitPermissionManager extends RestartableThread
private final Set<Player> debug = new HashSet<>(); private final Set<Player> debug = new HashSet<>();
public void recalculateOnlinePlayers() public void recalculateOnlinePlayers()
{ {
updateQueue.addAll(rscp.getServer().getOnlinePlayers()); updateQueue.addAll(Tools.getOnlinePlayers());
rscp.scheduleAutoUpdate(); rscp.scheduleAutoUpdate();
} }
public void recalculatePlayer(Player player) public void recalculatePlayer(Player player)
@ -45,27 +48,32 @@ public class BukkitPermissionManager extends RestartableThread
} catch(InterruptedException ex) { } catch(InterruptedException ex) {
} }
} }
public Map<String, Boolean> listPlayerPermissions(Player player) public ResolutionResult getResult(String playerIdentifier)
{ {
final PermissionAttachment attachment = rscp.permissionManager.attachments.get(player); return (resolutions.containsKey(playerIdentifier))
if(attachment != null) ? resolutions.get(playerIdentifier)
return attachment.getPermissions(); : resolvePlayerIdentifier(playerIdentifier);
return Collections.EMPTY_MAP;
} }
public String getPlayerPrefix(Player player) public ResolutionResult getResult(OfflinePlayer offline)
{ {
final String prefix = prefixes.get(player); final String key = offline.toString();
return prefix != null ? prefix : ""; 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); final String key = player.toString();
return suffix != null ? suffix : ""; return (resolutions.containsKey(key))
? resolutions.get(key)
: resolvePlayer(player);
} }
public Set<String> getPlayerGroups(Player player) public Map<String, Boolean> listPlayerPermissions(Player player)
{ {
final Set<String> result = groups.get(player); final PermissionAttachment attachment = rscp.permissionManager.attachments.get(player);
return result != null ? result : Collections.EMPTY_SET; if(attachment != null)
return attachment.getPermissions();
return Collections.EMPTY_MAP;
} }
public void removePlayer(Player player) public void removePlayer(Player player)
{ {
@ -131,6 +139,24 @@ public class BukkitPermissionManager extends RestartableThread
} }
updateQueue.clear(); 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) public synchronized ResolutionResult resolvePlayer(Player player)
{ {
final ResolutionParams params = new ResolutionParams(); final ResolutionParams params = new ResolutionParams();
@ -143,7 +169,26 @@ public class BukkitPermissionManager extends RestartableThread
params.destRegions = new String[] {}; params.destRegions = new String[] {};
params.destWorld = player.getLocation().getWorld().getName(); params.destWorld = player.getLocation().getWorld().getName();
params.expirience = player.getLevel(); 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<String> 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) private static String[] getPlayerIdentifiers(Player player)
{ {

2
src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java

@ -316,7 +316,7 @@ public class BukkitCommands
throw new CommandAnswerException(list); throw new CommandAnswerException(list);
case "groups": case "groups":
list.add("{MAGENTA}Group list for {_YL}" + player.getName() + "{MAGENTA}:"); 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); list.add("{_LG}" + group);
throw new CommandAnswerException(list); throw new CommandAnswerException(list);
/* /*

21
src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java

@ -4,6 +4,7 @@ import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.BridgeForBukkitAPI; import ru.simsonic.rscPermissions.BridgeForBukkitAPI;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Engine.ResolutionResult;
public final class VaultChat extends VaultDeprecatedChat public final class VaultChat extends VaultDeprecatedChat
{ {
@ -31,37 +32,41 @@ public final class VaultChat extends VaultDeprecatedChat
@Override @Override
public String getPlayerPrefix(String world, OfflinePlayer player) 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 @Override
public String getPlayerPrefix(Player player) public String getPlayerPrefix(Player player)
{ {
return rscp.permissionManager.getPlayerPrefix(player); final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.prefix;
} }
@Override @Override
@Deprecated @Deprecated
public String getPlayerPrefix(String world, String player) public String getPlayerPrefix(String world, String player)
{ {
final Player online = bridge.findPlayer(player); final ResolutionResult result = rscp.permissionManager.getResult(player);
return online != null ? rscp.permissionManager.getPlayerPrefix(online) : null; return result.prefix;
} }
// ***** GET PLAYER SUFFIX ***** // ***** GET PLAYER SUFFIX *****
@Override @Override
public String getPlayerSuffix(String world, OfflinePlayer player) 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 @Override
public String getPlayerSuffix(Player player) public String getPlayerSuffix(Player player)
{ {
return rscp.permissionManager.getPlayerSuffix(player); final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.suffix;
} }
@Override @Override
@Deprecated @Deprecated
public String getPlayerSuffix(String world, String player) public String getPlayerSuffix(String world, String player)
{ {
final Player online = bridge.findPlayer(player); final ResolutionResult result = rscp.permissionManager.getResult(player);
return online != null ? rscp.permissionManager.getPlayerSuffix(online) : null; return result.suffix;
} }
// ***** SET PLAYER PREFIX ***** // ***** SET PLAYER PREFIX *****
@Override @Override

43
src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java

@ -1,11 +1,11 @@
package ru.simsonic.rscPermissions.Bukkit; package ru.simsonic.rscPermissions.Bukkit;
import java.util.Set;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.BridgeForBukkitAPI; import ru.simsonic.rscPermissions.BridgeForBukkitAPI;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Engine.ResolutionResult;
public final class VaultPermission extends net.milkbowl.vault.permission.Permission 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."); throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
} }
@Override @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() public String[] getGroups()
{ {
throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); 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."); throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
} }
@Override @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) 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 @Override
public String[] getPlayerGroups(Player player) public String[] getPlayerGroups(Player player)
{ {
final Set<String> result = rscp.permissionManager.getPlayerGroups(player); final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.toArray(new String[result.size()]); 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 @Override
public String getPrimaryGroup(String world, OfflinePlayer player) 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 @Override
public String getPrimaryGroup(Player player) public String getPrimaryGroup(Player player)
{ {
final Set<String> result = rscp.permissionManager.getPlayerGroups(player); final String[] groups = getPlayerGroups(player);
final String[] array = result.toArray(new String[result.size()]); return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup();
return array.length > 0 ? array[array.length - 1] : rscp.settings.getDefaultGroup();
} }
} }

Loading…
Cancel
Save