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}Сервер заполнен, оставшиеся слоты находятся в резерве."