diff --git a/pom.xml b/pom.xml index e0ac2c2..e3ea3cd 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ru.simsonic rscPermissions - 0.10.2b-SNAPSHOT + 0.10.3b-SNAPSHOT jar rscPermissions diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java b/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java index cfe0f6b..03466bd 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java @@ -5,12 +5,12 @@ import java.sql.Timestamp; public class RowEntity implements Cloneable, Comparable { public int id; - public String splittedId; public String entity; public EntityType entityType; public String prefix; public String suffix; public Timestamp lifetime; + public transient String splittedId; public transient PlayerType playerType; public transient RowPermission[] permissions; public transient RowInheritance[] inheritance; diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java b/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java index 1d72611..d0bd44a 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java @@ -7,7 +7,6 @@ import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; public class RowInheritance implements Cloneable, Comparable { public int id; - public String splittedId; public String entity; public String parent; public String instance; @@ -16,6 +15,7 @@ public class RowInheritance implements Cloneable, Comparable public Destination destination; public int expirience; public Timestamp lifetime; + public transient String splittedId; public transient PlayerType playerType; public transient String destinationSource; public transient RowEntity entityChild; diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java b/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java index d6ed028..dc24136 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java @@ -5,7 +5,6 @@ import java.sql.Timestamp; public class RowPermission implements Cloneable { public int id; - public String splittedId; public String entity; public EntityType entityType; public String permission; @@ -13,6 +12,7 @@ public class RowPermission implements Cloneable public Destination destination; public int expirience; public Timestamp lifetime; + public transient String splittedId; public transient PlayerType playerType; public transient String destinationSource; public transient RowEntity entityObject; diff --git a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java index c29beb9..84e304b 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java +++ b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java @@ -1,9 +1,12 @@ package ru.simsonic.rscPermissions; import com.sk89q.wepif.PermissionsResolverManager; +import net.milkbowl.vault.chat.Chat; +import net.milkbowl.vault.permission.Permission; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.ServicePriority; +import org.bukkit.plugin.java.JavaPlugin; import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.Bukkit.VaultChat; @@ -28,15 +31,15 @@ public class BridgeForBukkitAPI this.vaultPermission = new VaultPermission(this); this.vaultChat = new VaultChat(this, vaultPermission); } - public org.bukkit.plugin.java.JavaPlugin getPlugin() + public JavaPlugin getPlugin() { return this.rscp; } - public net.milkbowl.vault.permission.Permission getPermission() + public Permission getPermission() { return this.vaultPermission; } - public net.milkbowl.vault.chat.Chat getChat() + public Chat getChat() { return this.vaultChat; } @@ -62,9 +65,9 @@ public class BridgeForBukkitAPI rscp.getServer().getServicesManager().register( net.milkbowl.vault.permission.Permission.class, vaultPermission, rscp, ServicePriority.Highest); - console.sendMessage(GenericChatCodes.processStringStatic("[rscp] " + Phrases.INTEGRATION_V_Y.toString())); + console.sendMessage(GenericChatCodes.processStringStatic(Settings.CHAT_PREFIX + Phrases.INTEGRATION_V_Y.toString())); } else - console.sendMessage(GenericChatCodes.processStringStatic("[rscp] " + Phrases.INTEGRATION_V_N.toString())); + console.sendMessage(GenericChatCodes.processStringStatic(Settings.CHAT_PREFIX + Phrases.INTEGRATION_V_N.toString())); } protected void setupWEPIF() { @@ -78,9 +81,9 @@ public class BridgeForBukkitAPI prm.setPluginPermissionsResolver(wepif); else PermissionsResolverManager.initialize(wepif); - console.sendMessage(GenericChatCodes.processStringStatic("[rscp] " + Phrases.INTEGRATION_WE_Y.toString())); + console.sendMessage(GenericChatCodes.processStringStatic(Settings.CHAT_PREFIX + Phrases.INTEGRATION_WE_Y.toString())); } else - console.sendMessage(GenericChatCodes.processStringStatic("[rscp] " + Phrases.INTEGRATION_WE_N.toString())); + console.sendMessage(GenericChatCodes.processStringStatic(Settings.CHAT_PREFIX + Phrases.INTEGRATION_WE_N.toString())); } public void printDebugString(String info) { diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java index 3225694..38bd5b1 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandGroup.java @@ -4,7 +4,7 @@ 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.DatabaseTransaction; +import ru.simsonic.rscPermissions.Engine.Backends.DatabaseEditor; import ru.simsonic.rscPermissions.Engine.ResolutionResult; public class CommandGroup @@ -112,7 +112,7 @@ public class CommandGroup private void addGroup(ResolutionResult result, String group, String parent, String destination, Integer seconds) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); - final DatabaseTransaction databaseTransaction = new DatabaseTransaction(rscp); + final DatabaseEditor databaseTransaction = new DatabaseEditor(rscp); databaseTransaction.apply(); 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 index 712bb30..89dd852 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandUser.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandUser.java @@ -7,7 +7,7 @@ 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.DatabaseTransaction; +import ru.simsonic.rscPermissions.Engine.Backends.DatabaseEditor; import ru.simsonic.rscPermissions.Engine.Matchers; import ru.simsonic.rscPermissions.Engine.ResolutionResult; @@ -112,7 +112,7 @@ public class CommandUser private void addGroup(ResolutionResult result, String user, String parent, String destination, Integer seconds) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); - final DatabaseTransaction databaseTransaction = new DatabaseTransaction(rscp); + final DatabaseEditor databaseTransaction = new DatabaseEditor(rscp); databaseTransaction.apply(); throw new CommandAnswerException(answer); } diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java index 5ae66d7..f0df55e 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java @@ -31,11 +31,12 @@ public class BackendDatabase extends ConnectionMySQL public synchronized DatabaseContents retrieveContents() { executeUpdateT("Cleanup"); - final DatabaseContents contents = new DatabaseContents(); - contents.entities = fetchEntities(); - contents.permissions = fetchPermissions(); - contents.inheritance = fetchInheritance(); - return contents; + final DatabaseContents result = new DatabaseContents(); + result.entities = fetchEntities(); + result.permissions = fetchPermissions(); + result.inheritance = fetchInheritance(); + result.cached = true; + return result; } private RowEntity[] fetchEntities() { diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendJson.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendJson.java index b02d7dd..f03acf8 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendJson.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendJson.java @@ -49,6 +49,7 @@ public class BackendJson result.inheritance = gson.fromJson(jr, RowInheritance[].class); } catch(IOException ex) { } + result.cached = true; return result; } public synchronized void saveContents(DatabaseContents contents) diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseAction.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseAction.java deleted file mode 100644 index 4c7892a..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseAction.java +++ /dev/null @@ -1,11 +0,0 @@ -package ru.simsonic.rscPermissions.Engine.Backends; - -import ru.simsonic.rscPermissions.API.RowInheritance; -import ru.simsonic.rscPermissions.API.RowPermission; - -public class DatabaseAction -{ - public int id; - public RowPermission permissions; - public RowInheritance inheritance; -} 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 9b59d66..b2ddc78 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java @@ -12,6 +12,7 @@ import ru.simsonic.rscPermissions.Engine.Matchers; public class DatabaseContents { + public boolean cached; public RowEntity entities[]; public RowPermission permissions[]; public RowInheritance inheritance[]; @@ -28,24 +29,25 @@ public class DatabaseContents final ArrayList li = new ArrayList<>(); try { + long subRowEntry; // Entities - long subRowEntry = 0; for(RowEntity row : entities) { + subRowEntry = 0; final String[] splittedByEntity = Matchers.genericParse(row.entity); for(String oneEntity : splittedByEntity) { final RowEntity clone = row.clone(); - clone.splittedId = String.format("%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); + clone.splittedId = String.format("e%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(oneEntity); le.add(clone); subRowEntry += 1; } } // Permissions - subRowEntry = 0; for(RowPermission row : permissions) { + subRowEntry = 0; final String[] splittedByEntity = Matchers.genericParse(row.entity); final String[] splittedByPermission = Matchers.genericParse(row.permission); final String[] splittedByDestination = Matchers.genericParse(row.destinationSource); @@ -57,7 +59,7 @@ public class DatabaseContents for(String entity : splittedByEntity) { final RowPermission clone = row.clone(); - clone.splittedId = String.format("%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); + clone.splittedId = String.format("p%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(entity); clone.permission = permission; clone.destination = destination; @@ -67,9 +69,9 @@ public class DatabaseContents } } // Inheritance - subRowEntry = 0; for(RowInheritance row : inheritance) { + subRowEntry = 0; final String[] splittedByEntity = Matchers.genericParse(row.entity); final String[] splittedByParent = Matchers.genericParse(row.parent); final String[] splittedByDestination = Matchers.genericParse(row.destinationSource); @@ -81,7 +83,7 @@ public class DatabaseContents for(String entity : splittedByEntity) { final RowInheritance clone = row.clone(); - clone.splittedId = String.format("%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); + clone.splittedId = String.format("i%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(entity); clone.parent = parent; clone.deriveInstance(); diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseTransaction.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java similarity index 61% rename from src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseTransaction.java rename to src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java index 8d895a0..77c8dfe 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseTransaction.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java @@ -1,29 +1,63 @@ package ru.simsonic.rscPermissions.Engine.Backends; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; +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 DatabaseTransaction +public class DatabaseEditor { - private final BukkitPluginMain rscp; - private final List actions = new LinkedList<>(); - public DatabaseTransaction(BukkitPluginMain rscp) + private final BukkitPluginMain plugin; + private final Map entities = new HashMap<>(); + private final Map permissions = new HashMap<>(); + private final Map inheritance = new HashMap<>(); + public DatabaseEditor(BukkitPluginMain rscp) { - this.rscp = rscp; + this.plugin = rscp; + } + public void fill(DatabaseContents contents) + { + clear(); + for(RowEntity row : contents.entities) + entities.put(row.splittedId, row); + for(RowPermission row : contents.permissions) + permissions.put(row.splittedId, row); + for(RowInheritance row : contents.inheritance) + inheritance.put(row.splittedId, row); + } + private void clear() + { + entities.clear(); + permissions.clear(); + inheritance.clear(); + } + public void removeEntity(String splittedId) + { + // 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()) + { + // DO RESTORE + } } - /* - What can happen? - add permission [destination] [lifetime] - remove permission [destination] - add group [destination] [lifitime] - remove group [destination] - */ public void apply() throws CommandAnswerException { final DatabaseContents contents = prepareChanges(); @@ -61,22 +95,22 @@ public class DatabaseTransaction private DatabaseContents prepareChanges() { // START TRANSACTION AND LOCK TABLE - rscp.connection.lockTableEntities(); - rscp.connection.lockTablePermissions(); - rscp.connection.lockTableInheritance(); - rscp.connection.transactionStart(); + plugin.connection.lockTableEntities(); + plugin.connection.lockTablePermissions(); + plugin.connection.lockTableInheritance(); + plugin.connection.transactionStart(); // SELECT FROM DATABASE INTO LOCAL CACHE TO MAKE IT ACTUAL - return rscp.commandHelper.threadFetchDatabaseContents.remoteToLocal(); + return plugin.commandHelper.threadFetchDatabaseContents.remoteToLocal(); } private void finishChanges(boolean commit) { // COMMIT OR ROLLBACK ACTIONS if(commit) - rscp.connection.transactionCommit(); + plugin.connection.transactionCommit(); else - rscp.connection.transactionCommit(); + plugin.connection.transactionCommit(); // CALL PLUGIN TO APPLY ALL THIS CHANGES - rscp.commandHelper.threadFetchDatabaseContents.run(); + plugin.commandHelper.threadFetchDatabaseContents.run(); } private RowPermission restorePermissionsAfterDelete(DatabaseContents contents, RowPermission remove) { diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java index c4b3af4..f42bc3c 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java @@ -27,6 +27,7 @@ public class InternalCache private boolean groupsInheritParentPrefixes = true; private RowEntity implicit_g; private RowEntity implicit_u; + private boolean freshRemoteData; public void setDefaultGroup(String defaultGroup, boolean alwaysInheritDefaultGroup, boolean groupsInheritParentPrefixes) { defaultInheritance.parent = defaultGroup; @@ -37,12 +38,17 @@ public class InternalCache public synchronized void fill(DatabaseContents contents) { clear(); - importEntities(contents); + this.freshRemoteData = contents.cached; + importEntities (contents); importPermissions(contents.permissions); importInheritance(contents.inheritance); implicit_g = entities_g.get(""); implicit_u = entities_u.get(""); } + public boolean isFreshData() + { + return freshRemoteData; + } private void importEntities(DatabaseContents contents) { final HashSet names_u = new HashSet<>(); diff --git a/src/main/resources/languages/russian.yml b/src/main/resources/languages/russian.yml index 93c3ea9..a97a674 100644 --- a/src/main/resources/languages/russian.yml +++ b/src/main/resources/languages/russian.yml @@ -2,7 +2,7 @@ generic: enabled: "[rscp] Плагин rscPermissions успешно включён." disabled: "[rscp] Плагин rscPermissions выключен." reloaded: "[rscp] Плагин rscPermissions перезапущен, конфигурация перечитана." - metrics: "[rscp] Включён сбор метрики (mcstats.org)." + metrics: "[rscp] Включён сбор статистической информации (mcstats.org)." player-only: "{_LR}Эта команда не может быть использована из консоли." console-only: "{_LR}Эта команда может быть использована только из консоли." server-is-full: "{_LR}Сервер заполнен, оставшиеся слоты находятся в резерве."