Browse Source

Added test for clones interferation.

master
Stanislav Usenkov 9 years ago
parent
commit
e12552a117
  1. 1
      src/main/java/ru/simsonic/rscPermissions/API/ConditionalRow.java
  2. 4
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitRegionProviders.java
  3. 6
      src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
  4. 24
      src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java
  5. 52
      src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java

1
src/main/java/ru/simsonic/rscPermissions/API/ConditionalRow.java

@ -5,4 +5,5 @@ public abstract class ConditionalRow extends GenericRow
public Destination destination; public Destination destination;
public transient String destinationSource; public transient String destinationSource;
public int expirience; public int expirience;
public transient boolean interfering;
} }

4
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitRegionProviders.java

@ -30,7 +30,7 @@ public final class BukkitRegionProviders
{ {
this.rscp = rscp; this.rscp = rscp;
} }
public synchronized void integrate() public synchronized void onEnable()
{ {
// WorldGuard // WorldGuard
if(rscp.settings.isUseWorldGuard()) if(rscp.settings.isUseWorldGuard())
@ -47,7 +47,7 @@ public final class BukkitRegionProviders
} else } else
this.worldguard = null; this.worldguard = null;
} }
public synchronized void deintegrate() public synchronized void onDisable()
{ {
this.worldguard = null; this.worldguard = null;
this.residence = null; this.residence = null;

6
src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java

@ -85,7 +85,7 @@ public final class BukkitPluginMain extends JavaPlugin
// Integrate Vault and WEPIF // Integrate Vault and WEPIF
rscpAPIs.onEnable(); rscpAPIs.onEnable();
// WorldGuard, Residence and other possible region list providers // WorldGuard, Residence and other possible region list providers
regionProviders.integrate(); regionProviders.onEnable();
// Restore temporary cached data from json files // Restore temporary cached data from json files
final DatabaseContents contents = localStorage.retrieveContents(); final DatabaseContents contents = localStorage.retrieveContents();
contents.filterServerId(getServer().getServerId()).filterLifetime(); contents.filterServerId(getServer().getServerId()).filterLifetime();
@ -96,7 +96,7 @@ public final class BukkitPluginMain extends JavaPlugin
// Start all needed parallel threads as daemons // Start all needed parallel threads as daemons
permissionManager.startDeamon(); permissionManager.startDeamon();
regionObserver.startDeamon(); regionObserver.startDeamon();
// Connect to database and initiate data fetching // Connect to the database and initiate data fetching
connection.setLogger(this.getLogger()); connection.setLogger(this.getLogger());
connection.initialize(settings.getConnectionParams()); connection.initialize(settings.getConnectionParams());
fetchNowAndReschedule(); fetchNowAndReschedule();
@ -115,7 +115,7 @@ public final class BukkitPluginMain extends JavaPlugin
permissionManager.stop(); permissionManager.stop();
internalCache.clear(); internalCache.clear();
connection.disconnect(); connection.disconnect();
regionProviders.deintegrate(); regionProviders.onDisable();
if(metrics != null) if(metrics != null)
try try
{ {

24
src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java

@ -34,11 +34,11 @@ public class DatabaseContents
{ {
subRowEntry = 0; subRowEntry = 0;
final String[] splittedByE = splitDatabaseRows(row.entity); final String[] splittedByE = splitDatabaseRows(row.entity);
final boolean isAlone = splittedByE.length == 1; final boolean hasNoClones = splittedByE.length == 1;
for(String oneEntity : splittedByE) for(String oneEntity : splittedByE)
{ {
final RowEntity clone = row.clone(); 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); row.id, Settings.SPLITTED_ID_SEP, subRowEntry);
clone.entity = PlayerType.normalize(oneEntity); clone.entity = PlayerType.normalize(oneEntity);
le.add(clone); le.add(clone);
@ -52,7 +52,11 @@ public class DatabaseContents
final String[] splittedByE = splitDatabaseRows(row.entity); final String[] splittedByE = splitDatabaseRows(row.entity);
final String[] splittedByP = splitDatabaseRows(row.permission); final String[] splittedByP = splitDatabaseRows(row.permission);
final String[] splittedByD = splitDatabaseRows(row.destinationSource); 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; row.destinationSource = null;
for(String oneDestination : splittedByD) for(String oneDestination : splittedByD)
{ {
@ -61,11 +65,12 @@ public class DatabaseContents
for(String entity : splittedByE) for(String entity : splittedByE)
{ {
final RowPermission clone = row.clone(); 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); row.id, Settings.SPLITTED_ID_SEP, subRowEntry);
clone.entity = PlayerType.normalize(entity); clone.entity = PlayerType.normalize(entity);
clone.permission = permission; clone.permission = permission;
clone.destination = destination; clone.destination = destination;
clone.interfering = interfering;
lp.add(clone); lp.add(clone);
subRowEntry += 1; subRowEntry += 1;
} }
@ -78,7 +83,11 @@ public class DatabaseContents
final String[] splittedByE = splitDatabaseRows(row.entity); final String[] splittedByE = splitDatabaseRows(row.entity);
final String[] splittedByP = splitDatabaseRows(row.parent); final String[] splittedByP = splitDatabaseRows(row.parent);
final String[] splittedByD = splitDatabaseRows(row.destinationSource); 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; row.destinationSource = null;
for(String oneDestination : splittedByD) for(String oneDestination : splittedByD)
{ {
@ -87,12 +96,13 @@ public class DatabaseContents
for(String entity : splittedByE) for(String entity : splittedByE)
{ {
final RowInheritance clone = row.clone(); 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); row.id, Settings.SPLITTED_ID_SEP, subRowEntry);
clone.entity = PlayerType.normalize(entity); clone.entity = PlayerType.normalize(entity);
clone.parent = parent; clone.parent = parent;
clone.deriveInstance(); clone.deriveInstance();
clone.destination = destination; clone.destination = destination;
clone.interfering = interfering;
li.add(clone); li.add(clone);
subRowEntry += 1; subRowEntry += 1;
} }
@ -156,7 +166,7 @@ public class DatabaseContents
&& (permissions != null && permissions.length > 0) && (permissions != null && permissions.length > 0)
&& (inheritance != null && inheritance.length > 0)); && (inheritance != null && inheritance.length > 0));
} }
private static String[] splitDatabaseRows(String multiobject) public static String[] splitDatabaseRows(String multiobject)
{ {
return multiobject != null return multiobject != null
? multiobject.split(Settings.REGEXP_ROW_SPLIT) ? multiobject.split(Settings.REGEXP_ROW_SPLIT)

52
src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseEditor.java

@ -1,8 +1,10 @@
package ru.simsonic.rscPermissions.Engine.Backends; package ru.simsonic.rscPermissions.Engine.Backends;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List;
import java.util.Map; import java.util.Map;
import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
import ru.simsonic.rscPermissions.API.RowEntity; import ru.simsonic.rscPermissions.API.RowEntity;
@ -12,13 +14,13 @@ import ru.simsonic.rscPermissions.BukkitPluginMain;
public class DatabaseEditor extends BackendDatabase public class DatabaseEditor extends BackendDatabase
{ {
private final BukkitPluginMain plugin; // private final BukkitPluginMain plugin;
private final Map<String, RowEntity> entities = new HashMap<>(); private final Map<String, RowEntity> entities = new HashMap<>();
private final Map<String, RowPermission> permissions = new HashMap<>(); private final Map<String, RowPermission> permissions = new HashMap<>();
private final Map<String, RowInheritance> inheritance = new HashMap<>(); private final Map<String, RowInheritance> inheritance = new HashMap<>();
public DatabaseEditor(BukkitPluginMain rscp) public DatabaseEditor(BukkitPluginMain rscp)
{ {
this.plugin = rscp; // this.plugin = rscp;
} }
@Override @Override
public DatabaseContents retrieveContents() public DatabaseContents retrieveContents()
@ -107,13 +109,30 @@ public class DatabaseEditor extends BackendDatabase
for(RowPermission row : contents.permissions) for(RowPermission row : contents.permissions)
if(row.id == remove.id) if(row.id == remove.id)
sameIDs.add(row); sameIDs.add(row);
if(sameIDs.isEmpty() == false) return rowFromPermissionClones(sameIDs);
}
private RowInheritance restoreInheritanceAfterDelete(DatabaseContents contents, RowInheritance remove)
{
final LinkedList<RowInheritance> sameIDs = new LinkedList<>();
for(RowInheritance row : contents.inheritance)
if(row.id == remove.id)
sameIDs.add(row);
return rowFromInheritanceClones(sameIDs);
}
private RowPermission rowFromPermissionClones(List<RowPermission> clones)
{
if(clones == null)
return null;
if(clones.isEmpty())
return null;
try
{ {
final HashSet<String> names = new HashSet<>(); final HashSet<String> names = new HashSet<>();
final HashSet<String> perms = new HashSet<>(); final HashSet<String> perms = new HashSet<>();
final HashSet<String> dests = new HashSet<>(); final HashSet<String> dests = new HashSet<>();
for(RowPermission row : sameIDs) for(RowPermission row : clones)
{ {
// assert remove.id == row.id;
// assert remove.value == row.value; // assert remove.value == row.value;
// assert remove.expirience == row.expirience; // assert remove.expirience == row.expirience;
// assert remove.entityType.equals(row.entityType); // assert remove.entityType.equals(row.entityType);
@ -122,9 +141,7 @@ public class DatabaseEditor extends BackendDatabase
perms.add(row.permission); perms.add(row.permission);
dests.add(row.destination.toString()); dests.add(row.destination.toString());
} }
try final RowPermission merged = clones.get(0).clone();
{
final RowPermission merged = remove.clone();
merged.entity = GenericChatCodes.glue(names.toArray(new String[names.size()]), "; \n"); merged.entity = GenericChatCodes.glue(names.toArray(new String[names.size()]), "; \n");
merged.permission = GenericChatCodes.glue(perms.toArray(new String[perms.size()]), "; \n"); merged.permission = GenericChatCodes.glue(perms.toArray(new String[perms.size()]), "; \n");
merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[dests.size()]), "; \n"); merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[dests.size()]), "; \n");
@ -132,22 +149,22 @@ public class DatabaseEditor extends BackendDatabase
} catch(CloneNotSupportedException ex) { } catch(CloneNotSupportedException ex) {
// IMPOSSIBLE // IMPOSSIBLE
} }
}
return null; return null;
} }
private RowInheritance restoreInheritanceAfterDelete(DatabaseContents contents, RowInheritance remove) private RowInheritance rowFromInheritanceClones(List<RowInheritance> clones)
{ {
final LinkedList<RowInheritance> sameIDs = new LinkedList<>(); if(clones == null)
for(RowInheritance row : contents.inheritance) return null;
if(row.id == remove.id) if(clones.isEmpty())
sameIDs.add(row); return null;
if(sameIDs.isEmpty() == false) try
{ {
final HashSet<String> names = new HashSet<>(); final HashSet<String> names = new HashSet<>();
final HashSet<String> prnts = new HashSet<>(); final HashSet<String> prnts = new HashSet<>();
final HashSet<String> dests = new HashSet<>(); final HashSet<String> dests = new HashSet<>();
for(RowInheritance row : sameIDs) for(RowInheritance row : clones)
{ {
// assert remove.id == row.id;
// assert remove.value == row.value; // assert remove.value == row.value;
// assert remove.expirience == row.expirience; // assert remove.expirience == row.expirience;
// assert remove.entityType.equals(row.entityType); // assert remove.entityType.equals(row.entityType);
@ -156,9 +173,7 @@ public class DatabaseEditor extends BackendDatabase
prnts.add(row.parent); prnts.add(row.parent);
dests.add(row.destination.toString()); dests.add(row.destination.toString());
} }
try final RowInheritance merged = clones.get(0).clone();
{
final RowInheritance merged = remove.clone();
merged.entity = GenericChatCodes.glue(names.toArray(new String[names.size()]), "; \n"); merged.entity = GenericChatCodes.glue(names.toArray(new String[names.size()]), "; \n");
merged.parent = GenericChatCodes.glue(prnts.toArray(new String[prnts.size()]), "; \n"); merged.parent = GenericChatCodes.glue(prnts.toArray(new String[prnts.size()]), "; \n");
merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[dests.size()]), "; \n"); merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[dests.size()]), "; \n");
@ -166,7 +181,6 @@ public class DatabaseEditor extends BackendDatabase
} catch(CloneNotSupportedException ex) { } catch(CloneNotSupportedException ex) {
// IMPOSSIBLE // IMPOSSIBLE
} }
}
return null; return null;
} }
} }

Loading…
Cancel
Save