From f9fe144a213457c84304e3ff60554a5566982d68 Mon Sep 17 00:00:00 2001 From: Stanislav Usenkov Date: Mon, 1 Aug 2016 21:43:02 +0700 Subject: [PATCH] End of day commit. --- pom.xml | 8 +- .../rscPermissions/API/Destination.java | 10 +- .../Bukkit/BukkitDatabaseFetcher.java | 1 - .../Bukkit/Commands/BukkitCommands.java | 19 ++- .../Bukkit/Commands/CommandEntity.java | 151 ++++++++++++++++++ .../Bukkit/Commands/CommandGroup.java | 124 -------------- .../Bukkit/Commands/CommandUser.java | 122 -------------- .../rscPermissions/Bukkit/VaultChat.java | 21 ++- .../rscPermissions/BukkitPluginMain.java | 4 +- .../Engine/Backends/DatabaseContents.java | 4 +- .../Engine/Backends/DatabaseEditor.java | 88 +++++++--- .../rscPermissions/Engine/InternalCache.java | 14 +- .../Engine/InternalStorage.java | 16 +- .../Engine/ResolutionResult.java | 5 +- 14 files changed, 276 insertions(+), 311 deletions(-) create mode 100644 src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java delete mode 100644 src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java delete mode 100644 src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandUser.java diff --git a/pom.xml b/pom.xml index cd0b84e..b7e8775 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ru.simsonic rscPermissions - 0.10.4b-SNAPSHOT + 0.10.5b-SNAPSHOT jar rscPermissions @@ -12,10 +12,10 @@ - + spigot-repo @@ -100,7 +100,7 @@ net.milkbowl.vault VaultAPI - 1.5 + 1.6 compile diff --git a/src/main/java/ru/simsonic/rscPermissions/API/Destination.java b/src/main/java/ru/simsonic/rscPermissions/API/Destination.java index f01f608..375b553 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/Destination.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/Destination.java @@ -89,6 +89,14 @@ public class Destination @Override public String toString() { - return String.format("%s:%s@%s", region, world, serverId); + final StringBuilder sb = new StringBuilder(); + if(region != null && !"".equals(region) && !"*".equals(region)) + sb.append(region).append(":"); + if(world != null && !"".equals(world) && !"*".equals(world)) + sb.append(world); + if(serverId != null && !"".equals(serverId) && !"*".equals(serverId)) + sb.append("@").append(serverId); + return sb.toString(); + // return String.format("%s:%s@%s", region, world, serverId); } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java index f307b1d..0e6210a 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java @@ -78,7 +78,6 @@ public class BukkitDatabaseFetcher extends RestartableThread final DatabaseContents contents = rscp.connection.retrieveContents(); if(contents != null) { - contents.normalize(); rscp.localStorage.cleanup(); rscp.localStorage.saveContents(contents); contents.filterServerId(rscp.getServer().getServerId()); 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 ce288d7..70a325f 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java @@ -15,8 +15,7 @@ import ru.simsonic.rscPermissions.Engine.Phrases; public class BukkitCommands { private final BukkitPluginMain rscp; - private final CommandUser cmdUser; - private final CommandGroup cmdGroup; + private final CommandEntity cmdEntity; private final CommandLock cmdLock; private final CommandFetch cmdFetch; private final CommandDebug cmdDebug; @@ -26,8 +25,7 @@ public class BukkitCommands public BukkitCommands(final BukkitPluginMain plugin) { this.rscp = plugin; - cmdUser = new CommandUser(rscp); - cmdGroup = new CommandGroup(rscp); + cmdEntity = new CommandEntity(rscp); cmdLock = new CommandLock(rscp); cmdFetch = new CommandFetch(rscp); cmdDebug = new CommandDebug(rscp); @@ -52,10 +50,10 @@ public class BukkitCommands @Override public void run() { - sender.sendMessage(GenericChatCodes.processStringStatic(Settings.CHAT_PREFIX - + "Migration from PermissionsEx (MySQL backend) done!")); - sender.sendMessage(GenericChatCodes.processStringStatic(Settings.CHAT_PREFIX - + "Check the latest database row for new data.")); + sender.sendMessage(GenericChatCodes.processStringStatic( + Settings.CHAT_PREFIX + "Migration from PermissionsEx (MySQL backend) done!")); + sender.sendMessage(GenericChatCodes.processStringStatic( + Settings.CHAT_PREFIX + "Check the latest database rows for new data.")); } }); } catch(InterruptedException ex) { @@ -123,10 +121,11 @@ public class BukkitCommands switch(args[0].toLowerCase()) { case "user": - cmdUser.onUserCommandHub(sender, args); + case "player": + cmdEntity.onEntityCommandHub(sender, true, args); return; case "group": - cmdGroup.onGroupCommandHub(sender, args); + cmdEntity.onEntityCommandHub(sender, false, args); return; case "lock": cmdLock.executeLock(sender, args); diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java new file mode 100644 index 0000000..1c97b57 --- /dev/null +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java @@ -0,0 +1,151 @@ +package ru.simsonic.rscPermissions.Bukkit.Commands; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; +import ru.simsonic.rscPermissions.API.EntityType; +import ru.simsonic.rscPermissions.API.RowEntity; +import ru.simsonic.rscPermissions.Bukkit.BukkitUtilities; +import ru.simsonic.rscPermissions.BukkitPluginMain; +import ru.simsonic.rscPermissions.Engine.Backends.DatabaseEditor; +import ru.simsonic.rscPermissions.Engine.Matchers; +import ru.simsonic.rscPermissions.Engine.ResolutionResult; + +public class CommandEntity +{ + private final BukkitPluginMain rscp; + CommandEntity(BukkitPluginMain plugin) + { + this.rscp = plugin; + } + public void onEntityCommandHub(CommandSender sender, boolean type, String[] args) throws CommandAnswerException + { + if(sender.hasPermission("rscp.admin")) + throw new CommandAnswerException("Not enough permissions."); + args = Arrays.copyOfRange(args, 1, args.length); + if(args.length == 0) + throw new CommandAnswerException("Read help."); + RowEntity entity = null; + Player player = null; + if(type) + { + player = BukkitUtilities.findOnlinePlayer(args[0]); + if(player != null) + args[1] = player.getName(); + } else + entity = rscp.internalCache.findGroupEntity(args[0]); + final ResolutionResult result = (player != null) + ? rscp.permissionManager.getResult(player) + : rscp.permissionManager.getResult(args[0]); + if(player == null && entity == null) + throw new CommandAnswerException("I don't know him."); + switch(args[1].toLowerCase()) + { + case "prefix": + case "p": + if(player != null) + viewCalculatedPrefix(result, args[1]); + else + viewEntityPrefix(entity); + break; + case "suffix": + case "s": + if(player != null) + viewCalculatedSuffix(result, args[1]); + else + viewEntitySuffix(entity); + break; + case "listpermissions": + case "lp": + listFinalPlayerPermissions(result, args[1]); + break; + case "listgroups": + case "lg": + listUserGroupsTree(result, args[1]); + break; + case "addparent": + case "addgroup": + case "ap": + case "ag": + // TO DO HERE + addGroup(result, args[1], null, null, null); + break; + case "removeparent": + case "removegroup": + case "rp": + case "rg": + // TO DO HERE + removeGroup(result, args[1], null); + break; + default: + break; + } + } + private void viewEntityPrefix(RowEntity entity) throws CommandAnswerException + { + final ArrayList answer = new ArrayList<>(); + answer.add("Own prefix for " + (entity.entityType == EntityType.GROUP ? "group" : "user") + + " {_YL}" + entity.entity + "{_LS} is:"); + answer.add("{_R}\"" + (entity.prefix != null ? entity.prefix : "") + "{_R}\""); + throw new CommandAnswerException(answer); + } + private void viewEntitySuffix(RowEntity entity) throws CommandAnswerException + { + final ArrayList answer = new ArrayList<>(); + answer.add("Own suffix for " + (entity.entityType == EntityType.GROUP ? "group" : "user") + + " {_YL}" + entity.entity + "{_LS} is:"); + answer.add("{_R}\"" + (entity.suffix != null ? entity.suffix : "") + "{_R}\""); + throw new CommandAnswerException(answer); + } + private void viewCalculatedPrefix(ResolutionResult result, String user) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(user)) + user = Matchers.uuidAddDashes(user); + final ArrayList answer = new ArrayList<>(); + answer.add("Calculated prefix for user {_YL}" + user + "{_LS} is:"); + answer.add("{_R}\"" + result.getPrefix() + "{_R}\""); + throw new CommandAnswerException(answer); + } + private void viewCalculatedSuffix(ResolutionResult result, String user) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(user)) + user = Matchers.uuidAddDashes(user); + final ArrayList answer = new ArrayList<>(); + answer.add("Calculated suffix for user {_YL}" + user + "{_LS} is:"); + answer.add("{_R}\"" + result.getSuffix() + "{_R}\""); + throw new CommandAnswerException(answer); + } + private void listFinalPlayerPermissions(ResolutionResult result, String user) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(user)) + user = Matchers.uuidAddDashes(user); + final ArrayList answer = new ArrayList<>(); + answer.add("Permission list for user {_YL}" + user + "{_LS}:"); + for(Map.Entry entry : result.getPermissions().entrySet()) + answer.add((entry.getValue() ? "{_LG}" : "{_LR}") + entry.getKey()); + throw new CommandAnswerException(answer); + } + private void listUserGroupsTree(ResolutionResult result, String user) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(user)) + user = Matchers.uuidAddDashes(user); + final ArrayList answer = new ArrayList<>(); + answer.add("Group list for user {_YL}" + user + "{_LS}:"); + for(String group : result.getOrderedGroups()) + answer.add("{_LG}" + group); + throw new CommandAnswerException(answer); + } + private void addGroup(ResolutionResult result, String user, String parent, String destination, Integer seconds) throws CommandAnswerException + { + final ArrayList answer = new ArrayList<>(); + throw new CommandAnswerException(answer); + } + private void removeGroup(ResolutionResult result, String user, String parent) throws CommandAnswerException + { + final ArrayList answer = new ArrayList<>(); + throw new CommandAnswerException(answer); + } +} diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java deleted file mode 100644 index 38bd5b1..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java +++ /dev/null @@ -1,124 +0,0 @@ -package ru.simsonic.rscPermissions.Bukkit.Commands; - -import java.util.ArrayList; -import org.bukkit.command.CommandSender; -import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; -import ru.simsonic.rscPermissions.BukkitPluginMain; -import ru.simsonic.rscPermissions.Engine.Backends.DatabaseEditor; -import ru.simsonic.rscPermissions.Engine.ResolutionResult; - -public class CommandGroup -{ - private final BukkitPluginMain rscp; - CommandGroup(BukkitPluginMain plugin) - { - this.rscp = plugin; - } - public void onGroupCommandHub(CommandSender sender, String[] args) throws CommandAnswerException - { - /* - /rscp - command - group - 0 - - 1 - */ - if(sender.hasPermission("rscp.admin")) - { - /* - if(args.length < 3) - return; - final Player player = BukkitUtilities.findOnlinePlayer(args[1]); - if(player != null) - args[1] = player.getName(); - final ResolutionResult result = (player != null) - ? rscp.permissionManager.getResult(player) - : rscp.permissionManager.getResult(args[1]); - switch(args[2].toLowerCase()) - { - case "prefix": - case "p": - viewPrefix(result, args[1]); - break; - case "suffix": - case "s": - viewSuffix(result, args[1]); - break; - case "listpermissions": - case "lp": - listPermissions(result, args[1]); - break; - case "listgroups": - case "lg": - listGroups(result, args[1]); - break; - case "addgroup": - case "ag": - // TO DO HERE - addGroup(result, args[1], null, null, null); - break; - case "removegroup": - case "rg": - // TO DO HERE - removeGroup(result, args[1], null); - break; - default: - break; - } - */ - } else - throw new CommandAnswerException("Not enough permissions."); - } - /* - private void viewPrefix(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Calculated prefix for user {_YL}" + user + "{_LS} is:"); - answer.add("{_R}\"" + result.prefix + "{_R}\""); - throw new CommandAnswerException(answer); - } - private void viewSuffix(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Calculated suffix for user {_YL}" + user + "{_LS} is:"); - answer.add("{_R}\"" + result.suffix + "{_R}\""); - throw new CommandAnswerException(answer); - } - private void listPermissions(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Permission list for user {_YL}" + user + "{_LS}:"); - final ArrayList sorted_keys = new ArrayList<>(result.permissions.keySet()); - Collections.sort(sorted_keys); - for(String perm : sorted_keys) - answer.add((result.permissions.get(perm) ? "{_LG}" : "{_LR}") + perm); - throw new CommandAnswerException(answer); - } - private void listGroups(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Group list for user {_YL}" + user + "{_LS}:"); - for(String group : result.getOrderedGroups()) - answer.add("{_LG}" + group); - throw new CommandAnswerException(answer); - } - */ - private void addGroup(ResolutionResult result, String group, String parent, String destination, Integer seconds) throws CommandAnswerException - { - final ArrayList answer = new ArrayList<>(); - final DatabaseEditor databaseTransaction = new DatabaseEditor(rscp); - databaseTransaction.apply(); - throw new CommandAnswerException(answer); - } - private void removeGroup(ResolutionResult result, String group, String parent) throws CommandAnswerException - { - final ArrayList answer = new ArrayList<>(); - throw new CommandAnswerException(answer); - } -} diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandUser.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandUser.java deleted file mode 100644 index ea5637d..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandUser.java +++ /dev/null @@ -1,122 +0,0 @@ -package ru.simsonic.rscPermissions.Bukkit.Commands; - -import java.util.ArrayList; -import java.util.Map; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; -import ru.simsonic.rscPermissions.Bukkit.BukkitUtilities; -import ru.simsonic.rscPermissions.BukkitPluginMain; -import ru.simsonic.rscPermissions.Engine.Backends.DatabaseEditor; -import ru.simsonic.rscPermissions.Engine.Matchers; -import ru.simsonic.rscPermissions.Engine.ResolutionResult; - -public class CommandUser -{ - private final BukkitPluginMain rscp; - CommandUser(BukkitPluginMain plugin) - { - this.rscp = plugin; - } - public void onUserCommandHub(CommandSender sender, String[] args) throws CommandAnswerException - { - /* - /rscp - command - user - 0 - - 1 // -u; --by-uuid / -n (--by-name) - */ - if(sender.hasPermission("rscp.admin")) - { - if(args.length < 3) - return; - final Player player = BukkitUtilities.findOnlinePlayer(args[1]); - if(player != null) - args[1] = player.getName(); - final ResolutionResult result = (player != null) - ? rscp.permissionManager.getResult(player) - : rscp.permissionManager.getResult(args[1]); - switch(args[2].toLowerCase()) - { - case "prefix": - case "p": - viewPrefix(result, args[1]); - break; - case "suffix": - case "s": - viewSuffix(result, args[1]); - break; - case "listpermissions": - case "lp": - listPermissions(result, args[1]); - break; - case "listgroups": - case "lg": - listGroups(result, args[1]); - break; - case "addgroup": - case "ag": - // TO DO HERE - addGroup(result, args[1], null, null, null); - break; - case "removegroup": - case "rg": - // TO DO HERE - removeGroup(result, args[1], null); - break; - default: - break; - } - } else - throw new CommandAnswerException("Not enough permissions."); - } - private void viewPrefix(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Calculated prefix for user {_YL}" + user + "{_LS} is:"); - answer.add("{_R}\"" + result.getPrefix() + "{_R}\""); - throw new CommandAnswerException(answer); - } - private void viewSuffix(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Calculated suffix for user {_YL}" + user + "{_LS} is:"); - answer.add("{_R}\"" + result.getSuffix() + "{_R}\""); - throw new CommandAnswerException(answer); - } - private void listPermissions(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Permission list for user {_YL}" + user + "{_LS}:"); - for(Map.Entry entry : result.getPermissions().entrySet()) - answer.add((entry.getValue() ? "{_LG}" : "{_LR}") + entry.getKey()); - throw new CommandAnswerException(answer); - } - private void listGroups(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Group list for user {_YL}" + user + "{_LS}:"); - for(String group : result.getOrderedGroups()) - answer.add("{_LG}" + group); - throw new CommandAnswerException(answer); - } - private void addGroup(ResolutionResult result, String user, String parent, String destination, Integer seconds) throws CommandAnswerException - { - final ArrayList answer = new ArrayList<>(); - final DatabaseEditor databaseTransaction = new DatabaseEditor(rscp); - databaseTransaction.apply(); - throw new CommandAnswerException(answer); - } - private void removeGroup(ResolutionResult result, String user, String parent) throws CommandAnswerException - { - final ArrayList answer = new ArrayList<>(); - throw new CommandAnswerException(answer); - } -} diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java index e47b0a3..2663fc8 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java @@ -3,6 +3,7 @@ package ru.simsonic.rscPermissions.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Player; +import ru.simsonic.rscPermissions.API.RowEntity; import ru.simsonic.rscPermissions.BridgeForBukkitAPI; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.Engine.ResolutionResult; @@ -120,52 +121,56 @@ public final class VaultChat extends VaultDeprecatedChat public String getGroupPrefix(String world, String group) { rscp.bridgeForBukkit.printDebugStackTrace(); - return rscp.internalCache.findGroupRow(group).prefix; + final RowEntity entity = rscp.internalCache.findGroupEntity(group); + return entity != null ? entity.prefix : null; } @Override public String getGroupPrefix(World world, String group) { rscp.bridgeForBukkit.printDebugStackTrace(); - return rscp.internalCache.findGroupRow(group).prefix; + final RowEntity entity = rscp.internalCache.findGroupEntity(group); + return entity != null ? entity.prefix : null; } // ***** GET GROUP SUFFIX ***** @Override public String getGroupSuffix(String world, String group) { rscp.bridgeForBukkit.printDebugStackTrace(); - return rscp.internalCache.findGroupRow(group).suffix; + final RowEntity entity = rscp.internalCache.findGroupEntity(group); + return entity != null ? entity.suffix : null; } @Override public String getGroupSuffix(World world, String group) { rscp.bridgeForBukkit.printDebugStackTrace(); - return rscp.internalCache.findGroupRow(group).suffix; + final RowEntity entity = rscp.internalCache.findGroupEntity(group); + return entity != null ? entity.suffix : null; } // ***** 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."); + throw new UnsupportedOperationException("This method is still 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."); + throw new UnsupportedOperationException("This method is still 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."); + throw new UnsupportedOperationException("This method is still 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."); + throw new UnsupportedOperationException("This method is still unsupported by rscPermissions."); } // ***** DELEGATED TO PERMISSION ***** @Override diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index ca38bf9..be51902 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -22,9 +22,9 @@ import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders; import ru.simsonic.rscPermissions.Bukkit.Commands.BukkitCommands; import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver; -import ru.simsonic.rscPermissions.Engine.Backends.BackendDatabase; import ru.simsonic.rscPermissions.Engine.Backends.BackendJson; import ru.simsonic.rscPermissions.Engine.Backends.DatabaseContents; +import ru.simsonic.rscPermissions.Engine.Backends.DatabaseEditor; import ru.simsonic.rscPermissions.Engine.InternalCache; import ru.simsonic.rscPermissions.Engine.Phrases; @@ -34,7 +34,7 @@ public final class BukkitPluginMain extends JavaPlugin public final Settings settings = new BukkitPluginConfiguration(this); public final BukkitUpdater updating = new BukkitUpdater(this, Settings.UPDATER_URL, Settings.CHAT_PREFIX, Settings.UPDATE_CMD); public final BackendJson localStorage = new BackendJson(getDataFolder()); - public final BackendDatabase connection = new BackendDatabase(consoleLog); + public final DatabaseEditor connection = new DatabaseEditor(this); public final InternalCache internalCache = new InternalCache(); public final BukkitCommands commandHelper = new BukkitCommands(this); public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this); diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java index 899b07f..d5b440c 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java @@ -131,7 +131,7 @@ public class DatabaseContents permissions = new RowPermission[] {}; if(inheritance == null) inheritance = new RowInheritance[] {}; - final ArrayList lp = new ArrayList<>(); + final ArrayList lp = new ArrayList<>(); final ArrayList li = new ArrayList<>(); // Permissions for(RowPermission row : permissions) @@ -146,7 +146,7 @@ public class DatabaseContents } public boolean isEmpty() { - return !((entities != null && entities.length > 0) + return !((entities != null && entities.length > 0) && (permissions != null && permissions.length > 0) && (inheritance != null && inheritance.length > 0)); } diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java index 77c8dfe..52530a3 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java @@ -5,14 +5,16 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.bukkit.Bukkit; import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; +import ru.simsonic.rscPermissions.API.EntityType; import ru.simsonic.rscPermissions.API.RowEntity; import ru.simsonic.rscPermissions.API.RowInheritance; import ru.simsonic.rscPermissions.API.RowPermission; import ru.simsonic.rscPermissions.BukkitPluginMain; -public class DatabaseEditor +public class DatabaseEditor extends BackendDatabase { private final BukkitPluginMain plugin; private final Map entities = new HashMap<>(); @@ -20,13 +22,22 @@ public class DatabaseEditor private final Map inheritance = new HashMap<>(); public DatabaseEditor(BukkitPluginMain rscp) { + super(Bukkit.getLogger()); this.plugin = rscp; } - public void fill(DatabaseContents contents) + @Override + public DatabaseContents retrieveContents() + { + final DatabaseContents result = super.retrieveContents(); + result.normalize(); + storeRowsIDs(result); + return result; + } + private void storeRowsIDs(DatabaseContents contents) { clear(); for(RowEntity row : contents.entities) - entities.put(row.splittedId, row); + entities.put (row.splittedId, row); for(RowPermission row : contents.permissions) permissions.put(row.splittedId, row); for(RowInheritance row : contents.inheritance) @@ -38,26 +49,29 @@ public class DatabaseEditor permissions.clear(); inheritance.clear(); } - public void removeEntity(String splittedId) + public void removePermission(RowPermission row) { - // Do I know something about such row? - final RowEntity row = entities.get(splittedId); - if(row == null) - return; - // Find if it is part of a multidata row - final List fromSameRow = new LinkedList<>(); - for(RowEntity test : entities.values()) - if(test != row && test.id == row.id) - fromSameRow.add(test); - - // TO DO : REMOVE ENTITY ROW HERE - - // Restore all data that contained in that row - if(!fromSameRow.isEmpty()) + final RowPermission replacement = restorePermissionsAfterDelete(null, row); + // delete row + super.removePermissionsById(row.id); + // restore replacement + if(replacement != null) { - // DO RESTORE + addPermission(replacement); } } + public void addPermission(RowPermission row) + { + super.insertPermissions( + (row.id != 0 ? Long.valueOf(row.id) : null), + row.entity, + row.entityType, + row.permission, + row.value, + row.destination.toString(), + (row.expirience != 0 ? row.expirience : null), + /* FIX LIFETIME */ 0); + } public void apply() throws CommandAnswerException { final DatabaseContents contents = prepareChanges(); @@ -137,8 +151,8 @@ public class DatabaseEditor { final RowPermission merged = remove.clone(); merged.entity = GenericChatCodes.glue(names.toArray(new String[names.size()]), "; \n"); - merged.permission = GenericChatCodes.glue(perms.toArray(new String[names.size()]), "; \n"); - merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[names.size()]), "; \n"); + merged.permission = GenericChatCodes.glue(perms.toArray(new String[perms.size()]), "; \n"); + merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[dests.size()]), "; \n"); return merged; } catch(CloneNotSupportedException ex) { // IMPOSSIBLE @@ -146,8 +160,38 @@ public class DatabaseEditor } return null; } - private RowPermission restoreInheritanceAfterDelete(DatabaseContents contents, RowInheritance remove) + private RowInheritance restoreInheritanceAfterDelete(DatabaseContents contents, RowInheritance remove) { + final LinkedList sameIDs = new LinkedList<>(); + for(RowInheritance row : contents.inheritance) + if(row.id == remove.id) + sameIDs.add(row); + if(sameIDs.isEmpty() == false) + { + final HashSet names = new HashSet<>(); + final HashSet prnts = new HashSet<>(); + final HashSet dests = new HashSet<>(); + for(RowInheritance row : sameIDs) + { + // assert remove.value == row.value; + // assert remove.expirience == row.expirience; + // assert remove.entityType.equals(row.entityType); + // assert remove.lifetime.equals(row.lifetime); + names.add(row.entity); + prnts.add(row.parent); + dests.add(row.destination.toString()); + } + try + { + final RowInheritance merged = remove.clone(); + merged.entity = GenericChatCodes.glue(names.toArray(new String[names.size()]), "; \n"); + merged.parent = GenericChatCodes.glue(prnts.toArray(new String[prnts.size()]), "; \n"); + merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[dests.size()]), "; \n"); + return merged; + } catch(CloneNotSupportedException ex) { + // IMPOSSIBLE + } + } return null; } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java index 50221b2..bca06da 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java @@ -3,11 +3,11 @@ package ru.simsonic.rscPermissions.Engine; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; import ru.simsonic.rscPermissions.API.EntityType; import ru.simsonic.rscPermissions.API.RowEntity; @@ -26,19 +26,9 @@ public class InternalCache extends InternalStorage this.alwaysInheritDefaultGroup = alwaysInheritDefaultGroup; this.groupsInheritParentPrefixes = groupsInheritParentPrefixes; } - public synchronized RowEntity findGroupRow(String group) - { - if(group != null && !"".equals(group)) - { - final RowEntity row = entities_g.get(group.toLowerCase()); - if(row != null) - return row; - } - return new RowEntity(); - } public synchronized Set getKnownGroups() { - final HashSet result = new HashSet<>(entities_g.size()); + final Set result = new TreeSet<>(); for(RowEntity row : entities_g.values()) result.add(row.entity); return result; diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalStorage.java b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalStorage.java index af01e91..1857529 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalStorage.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalStorage.java @@ -30,7 +30,7 @@ class InternalStorage implicit_g = entities_g.get(""); implicit_u = entities_u.get(""); } - public boolean isFreshData() + public synchronized boolean isFreshData() { return freshRemoteData; } @@ -151,6 +151,20 @@ class InternalStorage defaultInheritance.childType = EntityType.PLAYER; defaultInheritance.entityParent = entities_g.get(defaultInheritance.parent.toLowerCase()); } + public synchronized RowEntity findUserEntity(String entity) + { + final RowEntity result = entities_u.get(entity); + if(result != null) + return result; + for(RowEntity row : entities_u.values()) + if(row.entity.equalsIgnoreCase(entity)) + return row; + return null; + } + public synchronized RowEntity findGroupEntity(String entity) + { + return entities_g.get(entity.toLowerCase()); + } public synchronized void clear() { entities_g.clear(); diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java index 217e4f1..19747c0 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; import ru.simsonic.rscPermissions.API.Settings; @@ -47,10 +48,10 @@ public class ResolutionResult extends IntermediateResult public String[] getDeorderedGroups() { final ArrayList list = new ArrayList(groups.size()); - final String separator = new String(new char[] { Settings.SHOW_GROUP_LEVEL }); + final String separator = Pattern.quote(new String(new char[] { Settings.SHOW_GROUP_LEVEL })); for(String group : groups) { - String[] splitted = group.split(separator); + final String[] splitted = group.split(separator); list.add(splitted[splitted.length - 1]); } return list.toArray(new String[list.size()]);