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()]);