diff --git a/pom.xml b/pom.xml
index 32eaf42..978129a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
ru.simsonic
rscPermissions
- 0.9.11a
+ 0.9.12a
jar
rscPermissions
diff --git a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java
index 5fc79e3..0e1057e 100644
--- a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java
+++ b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java
@@ -2,6 +2,7 @@ package ru.simsonic.rscPermissions;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.ServicePriority;
+import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.Bukkit.VaultChat;
import ru.simsonic.rscPermissions.Bukkit.VaultPermission;
import ru.simsonic.rscPermissions.Engine.Phrases;
@@ -69,4 +70,16 @@ public class BridgeForBukkitAPI
} else
BukkitPluginMain.consoleLog.warning(GenericChatCodes.processStringStatic("[rscp] " + Phrases.INTEGRATION_V_N.toString()));
}
+ public void printDebugStackTrace()
+ {
+ if(rscp.permissionManager.isConsoleDebugging())
+ {
+ final StringBuilder sb = new StringBuilder(Settings.chatPrefix);
+ sb.append("[DEBUG] An API method was invoked from the path:\n");
+ for(StackTraceElement ste : Thread.currentThread().getStackTrace())
+ if(!ste.getClassName().equals(BridgeForBukkitAPI.class.getName()))
+ sb.append(ste.toString()).append(System.lineSeparator());
+ rscp.getServer().getConsoleSender().sendMessage(GenericChatCodes.processStringStatic(sb.toString()));
+ }
+ }
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java
index b5aa864..c0e562a 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java
@@ -1,7 +1,7 @@
package ru.simsonic.rscPermissions.Bukkit;
import java.util.Set;
import java.util.logging.Level;
-import org.bukkit.entity.Player;
+import org.bukkit.command.CommandSender;
import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.Backends.DatabaseContents;
import ru.simsonic.rscPermissions.BukkitPluginMain;
@@ -62,14 +62,14 @@ public class BukkitDatabaseFetcher extends RestartableThread
} catch(InterruptedException ex) {
}
final long queryTime = System.currentTimeMillis() - queryStartTime;
- final Set debuggers = rscp.permissionManager.getDebuggers();
+ final Set debuggers = rscp.permissionManager.getDebuggers();
if(!debuggers.isEmpty())
rscp.getServer().getScheduler().runTask(rscp, new Runnable()
{
@Override
public void run()
{
- for(Player debugger : debuggers)
+ for(CommandSender debugger : debuggers)
debugger.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix
+ "Database has been fetched in " + queryTime + " milliseconds."));
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
index 8a379bc..969ed95 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
@@ -9,6 +9,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import org.bukkit.OfflinePlayer;
+import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import ru.simsonic.rscPermissions.API.Settings;
@@ -31,7 +32,7 @@ public class BukkitPermissionManager extends RestartableThread
private final Map attachments = new HashMap<>();
private final Map> persistent = new HashMap<>();
private final Map> temporary = new HashMap<>();
- private final Set debug = new HashSet<>();
+ private final Set debug = new HashSet<>();
public void recalculateOnlinePlayers()
{
updateQueue.addAll(Tools.getOnlinePlayers());
@@ -200,21 +201,25 @@ public class BukkitPermissionManager extends RestartableThread
result.add(socketAddress.getAddress().getHostAddress());
return result.toArray(new String[result.size()]);
}
- public Set getDebuggers()
+ public Set getDebuggers()
{
synchronized(debug)
{
return new HashSet<>(debug);
}
}
- public boolean isDebugging(Player target)
+ public boolean isConsoleDebugging()
+ {
+ return isDebugging(rscp.getServer().getConsoleSender());
+ }
+ public boolean isDebugging(CommandSender target)
{
synchronized(debug)
{
return debug.contains(target);
}
}
- public void setDebugging(Player target, boolean value)
+ public void setDebugging(CommandSender target, boolean value)
{
synchronized(debug)
{
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java
index f28b4b5..bc63f0b 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java
@@ -1,7 +1,5 @@
package ru.simsonic.rscPermissions.Bukkit.Commands;
import org.bukkit.command.CommandSender;
-import org.bukkit.command.ConsoleCommandSender;
-import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Engine.Phrases;
import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException;
@@ -15,12 +13,9 @@ public class CommandDebug
}
public void execute(CommandSender sender, String args[]) throws CommandAnswerException
{
- if(sender instanceof ConsoleCommandSender)
- throw new CommandAnswerException(Phrases.PLUGIN_PLAYER_ONLY.toString());
if(sender.hasPermission("rscp.admin"))
{
- final Player player = (Player)sender;
- boolean isDebugging = rscp.permissionManager.isDebugging(player);
+ boolean isDebugging = rscp.permissionManager.isDebugging(sender);
if(args.length >= 2)
{
try
@@ -31,7 +26,7 @@ public class CommandDebug
}
} else
isDebugging = !isDebugging;
- rscp.permissionManager.setDebugging(player, isDebugging);
+ rscp.permissionManager.setDebugging(sender, isDebugging);
throw new CommandAnswerException(isDebugging ? Phrases.DEBUG_ON.toString() : Phrases.DEBUG_OFF.toString());
}
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java
index 926bb14..0dd93fe 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java
@@ -32,12 +32,14 @@ public final class VaultChat extends VaultDeprecatedChat
@Override
public String getPlayerPrefix(String world, OfflinePlayer player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.prefix;
}
@Override
public String getPlayerPrefix(Player player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.prefix;
}
@@ -45,6 +47,7 @@ public final class VaultChat extends VaultDeprecatedChat
@Deprecated
public String getPlayerPrefix(String world, String player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.prefix;
}
@@ -52,12 +55,14 @@ public final class VaultChat extends VaultDeprecatedChat
@Override
public String getPlayerSuffix(String world, OfflinePlayer player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.suffix;
}
@Override
public String getPlayerSuffix(Player player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.suffix;
}
@@ -65,6 +70,7 @@ public final class VaultChat extends VaultDeprecatedChat
@Deprecated
public String getPlayerSuffix(String world, String player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
return result.suffix;
}
@@ -72,78 +78,92 @@ public final class VaultChat extends VaultDeprecatedChat
@Override
public void setPlayerPrefix(String world, OfflinePlayer player, String prefix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public void setPlayerPrefix(Player player, String prefix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
@Deprecated
public void setPlayerPrefix(String world, String player, String prefix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
// ***** SET PLAYER SUFFIX *****
@Override
public void setPlayerSuffix(String world, OfflinePlayer player, String suffix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public void setPlayerSuffix(Player player, String suffix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
@Deprecated
public void setPlayerSuffix(String world, String player, String suffix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
// ***** GET GROUP PREFIX *****
@Override
public String getGroupPrefix(String world, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
return rscp.internalCache.getGroup(group).prefix;
}
@Override
public String getGroupPrefix(World world, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
return rscp.internalCache.getGroup(group).prefix;
}
// ***** GET GROUP SUFFIX *****
@Override
public String getGroupSuffix(String world, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
return rscp.internalCache.getGroup(group).suffix;
}
@Override
public String getGroupSuffix(World world, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
return rscp.internalCache.getGroup(group).suffix;
}
// ***** SET GROUP PREFIX *****
@Override
public void setGroupPrefix(World world, String group, String prefix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public void setGroupPrefix(String world, String group, String prefix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
// ***** SET GROUP SUFFIX *****
@Override
public void setGroupSuffix(String world, String group, String suffix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public void setGroupSuffix(World world, String group, String suffix)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
// ***** DELEGATED TO PERMISSION *****
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java
index 8b66602..f805c4e 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java
@@ -1,4 +1,5 @@
package ru.simsonic.rscPermissions.Bukkit;
+import java.util.Set;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
@@ -32,10 +33,9 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss
return true;
}
@Override
- @Deprecated
- public boolean playerHas(String world, String player, String permission)
+ public boolean hasGroupSupport()
{
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
+ return true;
}
@Override
@Deprecated
@@ -77,16 +77,6 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
- public String[] getGroups()
- {
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
- }
- @Override
- public boolean hasGroupSupport()
- {
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
- }
- @Override
public boolean has(CommandSender sender, String permission)
{
return sender.hasPermission(permission);
@@ -94,174 +84,229 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss
@Override
public boolean has(Player player, String permission)
{
- return player.hasPermission(permission);
+ rscp.bridgeForBukkit.printDebugStackTrace();
+ return rscp.permissionManager.getResult(player).hasPermission(permission);
+ }
+ @Override
+ @Deprecated
+ public boolean playerHas(String world, String player, String permission)
+ {
+ rscp.bridgeForBukkit.printDebugStackTrace();
+ return rscp.permissionManager.getResult(player).hasPermission(permission);
}
@Override
public boolean playerHas(String world, OfflinePlayer player, String permission)
{
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
+ rscp.bridgeForBukkit.printDebugStackTrace();
+ return rscp.permissionManager.getResult(player).hasPermission(permission);
}
@Override
public boolean playerHas(Player player, String permission)
{
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
+ rscp.bridgeForBukkit.printDebugStackTrace();
+ return rscp.permissionManager.getResult(player).hasPermission(permission);
}
@Override
public boolean playerAdd(String world, OfflinePlayer player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerAdd(Player player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
- public boolean playerAddTransient(OfflinePlayer player, String permission) throws UnsupportedOperationException
+ public boolean playerAddTransient(OfflinePlayer player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerAddTransient(Player player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerAddTransient(String worldName, OfflinePlayer player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerAddTransient(String worldName, Player player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemoveTransient(String worldName, OfflinePlayer player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemoveTransient(String worldName, Player player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemove(String world, OfflinePlayer player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
@Deprecated
public boolean playerRemove(World world, String player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemove(Player player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemoveTransient(OfflinePlayer player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemoveTransient(Player player, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean groupHas(World world, String group, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean groupAdd(World world, String group, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean groupRemove(World world, String group, String permission)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerAddGroup(String world, OfflinePlayer player, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerAddGroup(Player player, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemoveGroup(String world, OfflinePlayer player, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
public boolean playerRemoveGroup(Player player, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
@Deprecated
public boolean playerInGroup(String world, String player, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
- return result.groups.contains(group);
+ for(String parent : result.getDeorderedGroups())
+ if(parent.equalsIgnoreCase(group))
+ return true;
+ return false;
}
@Override
public boolean playerInGroup(String world, OfflinePlayer player, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
- return result.groups.contains(group);
+ for(String parent : result.getDeorderedGroups())
+ if(parent.equalsIgnoreCase(group))
+ return true;
+ return false;
}
@Override
public boolean playerInGroup(Player player, String group)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
- return result.groups.contains(group);
+ for(String parent : result.getDeorderedGroups())
+ if(parent.equalsIgnoreCase(group))
+ return true;
+ return false;
}
@Override
@Deprecated
public String[] getPlayerGroups(String world, String player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
- return result.groups.toArray(new String[result.groups.size()]);
+ return result.getDeorderedGroups();
}
@Override
public String[] getPlayerGroups(String world, OfflinePlayer player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
- return result.groups.toArray(new String[result.groups.size()]);
+ return result.getDeorderedGroups();
}
@Override
public String[] getPlayerGroups(Player player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final ResolutionResult result = rscp.permissionManager.getResult(player);
- return result.groups.toArray(new String[result.groups.size()]);
+ return result.getDeorderedGroups();
}
@Override
@Deprecated
public String getPrimaryGroup(String world, String player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
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)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final String[] groups = getPlayerGroups(world, player);
return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup();
}
@Override
public String getPrimaryGroup(Player player)
{
+ rscp.bridgeForBukkit.printDebugStackTrace();
final String[] groups = getPlayerGroups(player);
return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup();
}
+ @Override
+ public String[] getGroups()
+ {
+ rscp.bridgeForBukkit.printDebugStackTrace();
+ final Set groups = rscp.internalCache.getGroups();
+ return groups.toArray(new String[groups.size()]);
+ }
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
index 094fcb7..b6fc833 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
@@ -1,6 +1,8 @@
package ru.simsonic.rscPermissions.Engine;
+import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
+import ru.simsonic.rscPermissions.API.Settings;
public class ResolutionResult
{
@@ -15,4 +17,15 @@ public class ResolutionResult
return entry.getValue();
return false;
}
+ public String[] getDeorderedGroups()
+ {
+ final ArrayList list = new ArrayList(groups.size());
+ final String separator = new String(new char[] { Settings.groupLevelTab });
+ for(String group : groups)
+ {
+ String[] splitted = group.split(separator);
+ list.add(splitted[splitted.length - 1]);
+ }
+ return list.toArray(new String[list.size()]);
+ }
}