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. 14
      src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java
  5. 26
      src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java
  6. 80
      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 transient String destinationSource;
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;
}
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;

6
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
{

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

26
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<RowPermission> lp = new ArrayList<>();
final ArrayList<RowPermission> lp = new ArrayList<>();
final ArrayList<RowInheritance> 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)

80
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<String, RowEntity> entities = new HashMap<>();
private final Map<String, RowPermission> permissions = new HashMap<>();
private final Map<String, RowInheritance> 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<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> perms = new HashSet<>();
final HashSet<String> 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<RowInheritance> clones)
{
final LinkedList<RowInheritance> 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<String> names = new HashSet<>();
final HashSet<String> prnts = new HashSet<>();
final HashSet<String> 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;
}

Loading…
Cancel
Save