diff --git a/src/main/java/ru/simsonic/rscPermissions/API/ConditionalRow.java b/src/main/java/ru/simsonic/rscPermissions/API/ConditionalRow.java index b27466d..e328a53 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/ConditionalRow.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/ConditionalRow.java @@ -5,4 +5,5 @@ public abstract class ConditionalRow extends GenericRow public Destination destination; public transient String destinationSource; public int expirience; + public transient boolean interfering; } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitRegionProviders.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitRegionProviders.java index d98122c..dcaf892 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitRegionProviders.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitRegionProviders.java @@ -30,7 +30,7 @@ public final class BukkitRegionProviders { this.rscp = rscp; } - public synchronized void integrate() + public synchronized void onEnable() { // WorldGuard if(rscp.settings.isUseWorldGuard()) @@ -47,7 +47,7 @@ public final class BukkitRegionProviders } else this.worldguard = null; } - public synchronized void deintegrate() + public synchronized void onDisable() { this.worldguard = null; this.residence = null; diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index c8d5e34..2170c13 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -85,7 +85,7 @@ public final class BukkitPluginMain extends JavaPlugin // Integrate Vault and WEPIF rscpAPIs.onEnable(); // WorldGuard, Residence and other possible region list providers - regionProviders.integrate(); + regionProviders.onEnable(); // Restore temporary cached data from json files final DatabaseContents contents = localStorage.retrieveContents(); contents.filterServerId(getServer().getServerId()).filterLifetime(); @@ -96,7 +96,7 @@ public final class BukkitPluginMain extends JavaPlugin // Start all needed parallel threads as daemons permissionManager.startDeamon(); regionObserver.startDeamon(); - // Connect to database and initiate data fetching + // Connect to the database and initiate data fetching connection.setLogger(this.getLogger()); connection.initialize(settings.getConnectionParams()); fetchNowAndReschedule(); @@ -115,7 +115,7 @@ public final class BukkitPluginMain extends JavaPlugin permissionManager.stop(); internalCache.clear(); connection.disconnect(); - regionProviders.deintegrate(); + regionProviders.onDisable(); if(metrics != null) try { 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 b11da90..d6ce655 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java @@ -65,13 +65,13 @@ public class BackendDatabase extends ConnectionMySQL { while(rs.next()) { - RowEntity row = new RowEntity(); - row.id = rs.getLong("id"); - row.entity = rs.getString("entity"); - row.entityType = EntityType.byValue(rs.getInt("entity_type")); - row.prefix = rs.getString("prefix"); - row.suffix = rs.getString("suffix"); - row.lifetime = rs.getTimestamp("lifetime"); + RowEntity row = new RowEntity(); + row.id = rs.getLong("id"); + row.entity = rs.getString("entity"); + row.entityType = EntityType.byValue(rs.getInt("entity_type")); + row.prefix = rs.getString("prefix"); + row.suffix = rs.getString("suffix"); + row.lifetime = rs.getTimestamp("lifetime"); result.add(row); } rs.close(); 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 22a605e..7954ea7 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java @@ -34,11 +34,11 @@ public class DatabaseContents { subRowEntry = 0; final String[] splittedByE = splitDatabaseRows(row.entity); - final boolean isAlone = splittedByE.length == 1; + final boolean hasNoClones = splittedByE.length == 1; for(String oneEntity : splittedByE) { final RowEntity clone = row.clone(); - clone.splittedId = String.format(isAlone ? "e%d" : "e%d%s%d", + clone.splittedId = String.format(hasNoClones ? "e%d" : "e%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(oneEntity); le.add(clone); @@ -52,7 +52,11 @@ public class DatabaseContents final String[] splittedByE = splitDatabaseRows(row.entity); final String[] splittedByP = splitDatabaseRows(row.permission); final String[] splittedByD = splitDatabaseRows(row.destinationSource); - final boolean isAlone = splittedByE.length * splittedByP.length * splittedByD.length == 1; + final boolean multipleE = splittedByE.length > 1; + final boolean multipleP = splittedByP.length > 1; + final boolean multipleD = splittedByD.length > 1; + final boolean hasNoClones = !multipleE && !multipleP && !multipleD; + final boolean interfering = (multipleE ? 1 : 0) + (multipleP ? 1 : 0) + (multipleD ? 1 : 0) > 1; row.destinationSource = null; for(String oneDestination : splittedByD) { @@ -61,11 +65,12 @@ public class DatabaseContents for(String entity : splittedByE) { final RowPermission clone = row.clone(); - clone.splittedId = String.format(isAlone ? "p%d" : "p%d%s%d", + clone.splittedId = String.format(hasNoClones ? "p%d" : "p%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(entity); clone.permission = permission; clone.destination = destination; + clone.interfering = interfering; lp.add(clone); subRowEntry += 1; } @@ -78,7 +83,11 @@ public class DatabaseContents final String[] splittedByE = splitDatabaseRows(row.entity); final String[] splittedByP = splitDatabaseRows(row.parent); final String[] splittedByD = splitDatabaseRows(row.destinationSource); - final boolean isAlone = splittedByE.length * splittedByP.length * splittedByD.length == 1; + final boolean multipleE = splittedByE.length > 1; + final boolean multipleP = splittedByP.length > 1; + final boolean multipleD = splittedByD.length > 1; + final boolean hasNoClones = !multipleE && !multipleP && !multipleD; + final boolean interfering = (multipleE ? 1 : 0) + (multipleP ? 1 : 0) + (multipleD ? 1 : 0) > 1; row.destinationSource = null; for(String oneDestination : splittedByD) { @@ -87,12 +96,13 @@ public class DatabaseContents for(String entity : splittedByE) { final RowInheritance clone = row.clone(); - clone.splittedId = String.format(isAlone ? "i%d" : "i%d%s%d", + clone.splittedId = String.format(hasNoClones ? "i%d" : "i%d%s%d", row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(entity); clone.parent = parent; clone.deriveInstance(); clone.destination = destination; + clone.interfering = interfering; li.add(clone); subRowEntry += 1; } @@ -137,7 +147,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) @@ -156,7 +166,7 @@ public class DatabaseContents && (permissions != null && permissions.length > 0) && (inheritance != null && inheritance.length > 0)); } - private static String[] splitDatabaseRows(String multiobject) + public static String[] splitDatabaseRows(String multiobject) { return multiobject != null ? multiobject.split(Settings.REGEXP_ROW_SPLIT) 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 fd0071b..94314bc 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java @@ -1,8 +1,10 @@ package ru.simsonic.rscPermissions.Engine.Backends; +import java.util.Collection; 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.GenericChatCodes; import ru.simsonic.rscPermissions.API.RowEntity; @@ -12,13 +14,13 @@ import ru.simsonic.rscPermissions.BukkitPluginMain; public class DatabaseEditor extends BackendDatabase { - private final BukkitPluginMain plugin; + // 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.plugin = rscp; + // this.plugin = rscp; } @Override public DatabaseContents retrieveContents() @@ -107,14 +109,31 @@ public class DatabaseEditor extends BackendDatabase for(RowPermission row : contents.permissions) if(row.id == remove.id) sameIDs.add(row); - if(sameIDs.isEmpty() == false) + return rowFromPermissionClones(sameIDs); + } + 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); + return rowFromInheritanceClones(sameIDs); + } + private RowPermission rowFromPermissionClones(List clones) + { + if(clones == null) + return null; + if(clones.isEmpty()) + return null; + try { final HashSet names = new HashSet<>(); final HashSet perms = new HashSet<>(); final HashSet dests = new HashSet<>(); - for(RowPermission row : sameIDs) + for(RowPermission row : clones) { - // assert remove.value == row.value; + // assert remove.id == row.id; + // assert remove.value == row.value; // assert remove.expirience == row.expirience; // assert remove.entityType.equals(row.entityType); // assert remove.lifetime.equals(row.lifetime); @@ -122,33 +141,31 @@ public class DatabaseEditor extends BackendDatabase perms.add(row.permission); dests.add(row.destination.toString()); } - try - { - final RowPermission merged = remove.clone(); - merged.entity = GenericChatCodes.glue(names.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 - } + final RowPermission merged = clones.get(0).clone(); + merged.entity = GenericChatCodes.glue(names.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 } return null; } - private RowInheritance restoreInheritanceAfterDelete(DatabaseContents contents, RowInheritance remove) + private RowInheritance rowFromInheritanceClones(List clones) { - final LinkedList sameIDs = new LinkedList<>(); - for(RowInheritance row : contents.inheritance) - if(row.id == remove.id) - sameIDs.add(row); - if(sameIDs.isEmpty() == false) + if(clones == null) + return null; + if(clones.isEmpty()) + return null; + try { final HashSet names = new HashSet<>(); final HashSet prnts = new HashSet<>(); final HashSet dests = new HashSet<>(); - for(RowInheritance row : sameIDs) + for(RowInheritance row : clones) { - // assert remove.value == row.value; + // assert remove.id == row.id; + // assert remove.value == row.value; // assert remove.expirience == row.expirience; // assert remove.entityType.equals(row.entityType); // assert remove.lifetime.equals(row.lifetime); @@ -156,16 +173,13 @@ public class DatabaseEditor extends BackendDatabase 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 - } + final RowInheritance merged = clones.get(0).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; }