Browse Source

OK, it seems to be working now!

+ Permissions are perfectly calculated.
+ Parent groups are listed after calculation.
+ Prefixes/suffixes are in place.
+ Local json cache is working.
+ Database fetching is working.
What else?
master
Stanislav Usenkov 10 years ago
parent
commit
e9e466ba97
  1. 4
      src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
  2. 6
      src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java
  3. 1
      src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java
  4. 3
      src/main/java/ru/simsonic/rscPermissions/API/Settings.java
  5. 6
      src/main/java/ru/simsonic/rscPermissions/Backends/DatabaseContents.java
  6. 8
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java
  7. 25
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
  8. 2
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java
  9. 20
      src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
  10. 14
      src/main/java/ru/simsonic/rscPermissions/IndependentMain.java
  11. 267
      src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java
  12. 4
      src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionParams.java
  13. 12
      src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java

4
src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java

@ -38,7 +38,7 @@ public enum PlayerType
+ "(?:/([0-9]|[1-2][0-9]|3[0-2]))$"); + "(?:/([0-9]|[1-2][0-9]|3[0-2]))$");
public static PlayerType scanPlayerEntity(String entity) public static PlayerType scanPlayerEntity(String entity)
{ {
if("".equals(entity)) if(entity == null || "".equals(entity))
return name; return name;
if(nicknameRegExp.matcher(entity).matches()) if(nicknameRegExp.matcher(entity).matches())
return name; return name;
@ -102,7 +102,7 @@ public enum PlayerType
switch(this) switch(this)
{ {
case name: case name:
return entity.equals(identifier); return identifier.equals(entity);
case hyphenatedUUID: case hyphenatedUUID:
identifier = identifier.replace("-", "").toLowerCase(); identifier = identifier.replace("-", "").toLowerCase();
case dehyphenatedUUID: case dehyphenatedUUID:

6
src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java

@ -16,6 +16,8 @@ public class RowInheritance implements Cloneable, Comparable<RowInheritance>
public Timestamp lifetime; public Timestamp lifetime;
public transient PlayerType playerType; public transient PlayerType playerType;
public transient String destinationSource; public transient String destinationSource;
public transient RowEntity entityChild;
public transient RowEntity entityParent;
public void deriveInstance() public void deriveInstance()
{ {
if(parent != null) if(parent != null)
@ -38,7 +40,9 @@ public class RowInheritance implements Cloneable, Comparable<RowInheritance>
@Override @Override
public int compareTo(RowInheritance t) public int compareTo(RowInheritance t)
{ {
return (priority != t.priority) ? priority - t.priority : parent.compareTo(t.parent); return (priority != t.priority)
? priority - t.priority
: parent.compareTo(t.parent);
} }
public boolean isEntityApplicable(String identifier) public boolean isEntityApplicable(String identifier)
{ {

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

@ -13,6 +13,7 @@ public class RowPermission implements Cloneable
public Timestamp lifetime; public Timestamp lifetime;
public transient PlayerType playerType; public transient PlayerType playerType;
public transient String destinationSource; public transient String destinationSource;
public transient RowEntity entityObject;
@Override @Override
public RowPermission clone() throws CloneNotSupportedException public RowPermission clone() throws CloneNotSupportedException
{ {

3
src/main/java/ru/simsonic/rscPermissions/API/Settings.java

@ -3,9 +3,10 @@ import ru.simsonic.rscUtilityLibrary.ConnectionMySQL.ConnectionParams;
public interface Settings public interface Settings
{ {
public static final String instantiator = "?";
public static final String separator = "."; public static final String separator = ".";
public static final String separatorRegExp = "\\."; public static final String separatorRegExp = "\\.";
public static final String instantiator = "?";
public static final String textInheriter = "%";
public void onLoad(); public void onLoad();
public void readSettings(); public void readSettings();
public String getDefaultGroup(); public String getDefaultGroup();

6
src/main/java/ru/simsonic/rscPermissions/Backends/DatabaseContents.java

@ -131,4 +131,10 @@ public class DatabaseContents
inheritance = li.toArray(new RowInheritance[li.size()]); inheritance = li.toArray(new RowInheritance[li.size()]);
return this; return this;
} }
public boolean isEmpty()
{
return !((entities != null && entities.length > 0)
&& (permissions != null && permissions.length > 0)
&& (inheritance != null && inheritance.length > 0));
}
} }

8
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java

@ -7,8 +7,8 @@ import java.util.logging.Level;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.Backends.DatabaseContents;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.RestartableThread; import ru.simsonic.rscUtilityLibrary.RestartableThread;
@ -108,7 +108,7 @@ public class BukkitCommands
}); });
} }
}; };
threadInsertExampleRows.start(); threadInsertExampleRows.startDeamon();
return threadInsertExampleRows; return threadInsertExampleRows;
} }
public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandAnswerException public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandAnswerException
@ -193,7 +193,7 @@ public class BukkitCommands
// TO DO HERE // TO DO HERE
PermissionsEx_YAML importer_pex = new PermissionsEx_YAML( PermissionsEx_YAML importer_pex = new PermissionsEx_YAML(
new File(rscp.getDataFolder(), args[2])); new File(rscp.getDataFolder(), args[2]));
threadFetchDatabaseContents.start(); threadFetchDatabaseContents.startDeamon();
throw new CommandAnswerException(new String[] throw new CommandAnswerException(new String[]
{ {
"Data has been imported successfully!", "Data has been imported successfully!",
@ -221,7 +221,7 @@ public class BukkitCommands
/* rscp fetch */ /* rscp fetch */
if(sender.hasPermission("rscp.admin.reload")) if(sender.hasPermission("rscp.admin.reload"))
{ {
threadFetchDatabaseContents.start(); threadFetchDatabaseContents.startDeamon();
throw new CommandAnswerException("Tables have been fetched."); throw new CommandAnswerException("Tables have been fetched.");
} }
return; return;

25
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java

@ -8,7 +8,6 @@ import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachment;
import ru.simsonic.rscPermissions.API.RowPermission;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.InternalCache.ResolutionParams; import ru.simsonic.rscPermissions.InternalCache.ResolutionParams;
import ru.simsonic.rscPermissions.InternalCache.ResolutionResult; import ru.simsonic.rscPermissions.InternalCache.ResolutionResult;
@ -23,8 +22,8 @@ public class BukkitPermissionManager extends RestartableThread
} }
private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>(); private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>();
private final HashMap<Player, PermissionAttachment> attachments = new HashMap<>(); private final HashMap<Player, PermissionAttachment> attachments = new HashMap<>();
private final HashMap<Player, RowPermission[]> persistentPermissions = new HashMap<>(); private final HashMap<Player, Map<String, Boolean>> persistentPermissions = new HashMap<>();
private final HashMap<Player, RowPermission[]> transientPermissions = new HashMap<>(); private final HashMap<Player, Map<String, Boolean>> transientPermissions = new HashMap<>();
private final HashMap<Player, String> prefixes = new HashMap<>(); private final HashMap<Player, String> prefixes = new HashMap<>();
private final HashMap<Player, String> suffixes = new HashMap<>(); private final HashMap<Player, String> suffixes = new HashMap<>();
public void recalculateOnlinePlayers() public void recalculateOnlinePlayers()
@ -76,25 +75,21 @@ public class BukkitPermissionManager extends RestartableThread
public void run() public void run()
{ {
// Remove old // Remove old
final PermissionAttachment previous = attachments.get(player); if(attachments.containsKey(player))
if(previous != null) attachments.remove(player).remove();
{
player.removeAttachment(previous);
attachments.remove(player);
}
// Create new // Create new
final RowPermission[] pp = persistentPermissions.get(player); final Map<String, Boolean> pp = persistentPermissions.get(player);
final RowPermission[] tp = transientPermissions.get(player); final Map<String, Boolean> tp = transientPermissions.get(player);
if(pp == null && tp == null) if(pp == null && tp == null)
return; return;
final PermissionAttachment attachment = player.addAttachment(rscp); final PermissionAttachment attachment = player.addAttachment(rscp);
attachments.put(player, attachment); attachments.put(player, attachment);
if(pp != null) if(pp != null)
for(RowPermission row : pp) for(Map.Entry<String, Boolean> row : pp.entrySet())
attachment.setPermission(row.permission, row.value); attachment.setPermission(row.getKey(), row.getValue());
if(tp != null) if(tp != null)
for(RowPermission row : tp) for(Map.Entry<String, Boolean> row : tp.entrySet())
attachment.setPermission(row.permission, row.value); attachment.setPermission(row.getKey(), row.getValue());
// Server operator // Server operator
final Boolean asterisk = attachment.getPermissions().get("*"); final Boolean asterisk = attachment.getPermissions().get("*");
if(rscp.settings.isAsteriskOP()) if(rscp.settings.isAsteriskOP())

2
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java

@ -1,7 +1,7 @@
package ru.simsonic.rscPermissions.Bukkit; package ru.simsonic.rscPermissions.Bukkit;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.ConnectionMySQL.ConnectionParams; import ru.simsonic.rscUtilityLibrary.ConnectionMySQL.ConnectionParams;
public class BukkitPluginConfiguration implements Settings public class BukkitPluginConfiguration implements Settings

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

@ -1,9 +1,4 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions;
import ru.simsonic.rscPermissions.API.BridgeForBukkitAPI;
import ru.simsonic.rscPermissions.Bukkit.BukkitCommands;
import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders;
import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver;
import ru.simsonic.rscPermissions.API.Settings;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -13,12 +8,17 @@ import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.mcstats.MetricsLite; import org.mcstats.MetricsLite;
import ru.simsonic.rscPermissions.API.BridgeForBukkitAPI;
import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.Backends.BackendDatabase; import ru.simsonic.rscPermissions.Backends.BackendDatabase;
import ru.simsonic.rscPermissions.Backends.BackendJson; import ru.simsonic.rscPermissions.Backends.BackendJson;
import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.Backends.DatabaseContents;
import ru.simsonic.rscPermissions.Bukkit.BukkitCommands;
import ru.simsonic.rscPermissions.Bukkit.BukkitEventListener;
import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager; import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager;
import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration;
import ru.simsonic.rscPermissions.Bukkit.BukkitEventListener; import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders;
import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver;
import ru.simsonic.rscPermissions.InternalCache.InternalCache; import ru.simsonic.rscPermissions.InternalCache.InternalCache;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
@ -67,11 +67,11 @@ public final class BukkitPluginMain extends JavaPlugin
contents.inheritance.length, contents.inheritance.length,
}); });
// Start all needed threads // Start all needed threads
permissionManager.start(); permissionManager.startDeamon();
regionUpdateObserver.start(); regionUpdateObserver.startDeamon();
// Connect to database and fetch data // Connect to database and fetch data
connection.initialize(settings.getConnectionParams()); connection.initialize(settings.getConnectionParams());
commandHelper.threadFetchDatabaseContents.start(); commandHelper.threadFetchDatabaseContents.startDeamon();
// Metrics // Metrics
if(settings.isUseMetrics()) if(settings.isUseMetrics())
{ {
@ -110,7 +110,7 @@ public final class BukkitPluginMain extends JavaPlugin
@Override @Override
public void run() public void run()
{ {
commandHelper.threadFetchDatabaseContents.start(); commandHelper.threadFetchDatabaseContents.startDeamon();
} }
}, delay); }, delay);
} }

14
src/main/java/ru/simsonic/rscPermissions/IndependentMain.java

@ -1,10 +1,12 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions;
import java.io.File; import java.io.File;
import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import ru.simsonic.rscPermissions.Backends.BackendDatabase; import ru.simsonic.rscPermissions.Backends.BackendDatabase;
import ru.simsonic.rscPermissions.Backends.BackendJson; import ru.simsonic.rscPermissions.Backends.BackendJson;
import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.Backends.DatabaseContents;
import ru.simsonic.rscPermissions.InternalCache.InternalCache; import ru.simsonic.rscPermissions.InternalCache.InternalCache;
import ru.simsonic.rscPermissions.InternalCache.ResolutionResult;
public class IndependentMain public class IndependentMain
{ {
@ -34,7 +36,19 @@ public class IndependentMain
final DatabaseContents contents = localJsn.retrieveContents(); final DatabaseContents contents = localJsn.retrieveContents();
System.out.println("Filter and calculating permission tree."); System.out.println("Filter and calculating permission tree.");
contents.filterServerId("localtest").filterLifetime(); contents.filterServerId("localtest").filterLifetime();
if(contents.isEmpty())
{
System.out.println("Permission database is empty, stopping.");
return;
}
intCache.fill(contents); intCache.fill(contents);
final ResolutionResult result = intCache.resolvePlayer("rscpTester");
for(Map.Entry<String, Boolean> perm : result.permissions.entrySet())
System.out.println(perm.getKey() + " = " + perm.getValue());
if(result.prefix != null)
System.out.println("Prefix = " + result.prefix);
if(result.suffix != null)
System.out.println("Suffix = " + result.suffix);
System.out.println("Done."); System.out.println("Done.");
} }
} }

267
src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java

@ -4,6 +4,7 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import ru.simsonic.rscPermissions.API.EntityType; import ru.simsonic.rscPermissions.API.EntityType;
import ru.simsonic.rscPermissions.API.PlayerType; import ru.simsonic.rscPermissions.API.PlayerType;
@ -15,28 +16,20 @@ import ru.simsonic.rscPermissions.Backends.DatabaseContents;
public class InternalCache public class InternalCache
{ {
private final HashMap<String, RowEntity> entities_g = new HashMap<>();
private final HashMap<String, RowEntity> entities_u = new HashMap<>();
private final RowInheritance defaultInheritance = new RowInheritance(); private final RowInheritance defaultInheritance = new RowInheritance();
public void setDefaultGroup(String defaultGroup) public void setDefaultGroup(String defaultGroup)
{ {
defaultInheritance.parent = defaultGroup; defaultInheritance.parent = defaultGroup;
defaultInheritance.deriveInstance(); defaultInheritance.deriveInstance();
} }
private final HashMap<String, RowEntity> entities_g = new HashMap<>();
private final HashMap<String, RowEntity> entities_u = new HashMap<>();/*
private final ArrayList<RowPermission> permissions_p2g = new ArrayList<>();
private final ArrayList<RowPermission> permissions_p2u = new ArrayList<>();
private final ArrayList<RowInheritance> inheritance_g2g = new ArrayList<>();
private final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>();*/
public synchronized void fill(DatabaseContents contents) public synchronized void fill(DatabaseContents contents)
{ {
clear(); clear();
// Import data
importEntities(contents); importEntities(contents);
importPermissions(contents.permissions); importPermissions(contents.permissions);
importInheritance(contents.inheritance); importInheritance(contents.inheritance);
// Parse PlayerType's
for(RowEntity row : entities_u.values())
row.playerType = PlayerType.scanPlayerEntity(row.entity);
} }
private void importEntities(DatabaseContents contents) private void importEntities(DatabaseContents contents)
{ {
@ -45,31 +38,46 @@ public class InternalCache
for(RowEntity row : contents.entities) for(RowEntity row : contents.entities)
if(row.entityType == EntityType.group) if(row.entityType == EntityType.group)
{ {
names_g.add(row.entity);
entities_g.put(row.entity.toLowerCase(), row); entities_g.put(row.entity.toLowerCase(), row);
names_g.add(row.entity.toLowerCase());
} else { } else {
entities_u.put(row.entity, row);
names_u.add(row.entity); names_u.add(row.entity);
entities_u.put(row.entity, row);
} }
for(RowPermission row : contents.permissions) for(RowPermission row : contents.permissions)
if(row.entityType == EntityType.group) if(row.entityType == EntityType.group)
names_g.add(row.entity.toLowerCase()); names_g.add(row.entity);
else else
names_u.add(row.entity); names_u.add(row.entity);
for(RowInheritance row : contents.inheritance) for(RowInheritance row : contents.inheritance)
{ {
names_g.add(row.parent.toLowerCase()); names_g.add(row.parent);
if(row.childType == EntityType.group) if(row.childType == EntityType.group)
names_g.add(row.entity.toLowerCase()); names_g.add(row.entity);
else else
names_u.add(row.entity); names_u.add(row.entity);
} }
for(String name : names_g) for(String name : names_g)
if(!entities_g.containsKey(name)) {
entities_g.put(name, new RowEntity()); final String groupInternalName = name.toLowerCase();
if(!entities_g.containsKey(groupInternalName))
{
final RowEntity dummy = new RowEntity();
dummy.entity = name;
dummy.entityType = EntityType.group;
entities_g.put(groupInternalName, dummy);
}
}
for(String name : names_u) for(String name : names_u)
if(!entities_u.containsKey(name)) if(!entities_u.containsKey(name))
entities_u.put(name, new RowEntity()); {
final RowEntity dummy = new RowEntity();
dummy.entity = name;
dummy.entityType = EntityType.player;
entities_u.put(name, dummy);
}
for(RowEntity row : entities_u.values())
row.playerType = PlayerType.scanPlayerEntity(row.entity);
} }
private void importPermissions(RowPermission[] rows) private void importPermissions(RowPermission[] rows)
{ {
@ -77,9 +85,13 @@ public class InternalCache
final ArrayList<RowPermission> permissions_p2u = new ArrayList<>(); final ArrayList<RowPermission> permissions_p2u = new ArrayList<>();
for(RowPermission row : rows) for(RowPermission row : rows)
if(row.entityType == EntityType.group) if(row.entityType == EntityType.group)
{
row.entityObject = entities_g.get(row.entity.toLowerCase());
permissions_p2g.add(row); permissions_p2g.add(row);
else } else {
row.entityObject = entities_u.get(row.entity);
permissions_p2u.add(row); permissions_p2u.add(row);
}
for(String entry : entities_g.keySet()) for(String entry : entities_g.keySet())
{ {
final ArrayList<RowPermission> permissions = new ArrayList<>(); final ArrayList<RowPermission> permissions = new ArrayList<>();
@ -103,9 +115,15 @@ public class InternalCache
final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>(); final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>();
for(RowInheritance row : rows) for(RowInheritance row : rows)
if(row.childType == EntityType.group) if(row.childType == EntityType.group)
{
row.entityChild = entities_g.get(row.entity.toLowerCase());
row.entityParent = entities_g.get(row.parent.toLowerCase());
inheritance_g2g.add(row); inheritance_g2g.add(row);
else } else {
row.entityChild = entities_u.get(row.entity);
row.entityParent = entities_g.get(row.parent.toLowerCase());
inheritance_g2u.add(row); inheritance_g2u.add(row);
}
for(Entry<String, RowEntity> entry : entities_g.entrySet()) for(Entry<String, RowEntity> entry : entities_g.entrySet())
{ {
final ArrayList<RowInheritance> inheritances = new ArrayList<>(); final ArrayList<RowInheritance> inheritances = new ArrayList<>();
@ -113,16 +131,18 @@ public class InternalCache
for(RowInheritance row : inheritance_g2g) for(RowInheritance row : inheritance_g2g)
if(row.entity.toLowerCase().equals(name)) if(row.entity.toLowerCase().equals(name))
inheritances.add(row); inheritances.add(row);
Collections.sort(inheritances);
entry.getValue().inheritance = inheritances.toArray(new RowInheritance[inheritances.size()]); entry.getValue().inheritance = inheritances.toArray(new RowInheritance[inheritances.size()]);
} }
for(Entry<String, RowEntity> entry : entities_u.entrySet()) for(Entry<String, RowEntity> entry : entities_u.entrySet())
{ {
final ArrayList<RowInheritance> inheritance = new ArrayList<>(); final ArrayList<RowInheritance> inheritances = new ArrayList<>();
final String name = entry.getKey(); final String name = entry.getKey();
for(RowInheritance row : inheritance_g2u) for(RowInheritance row : inheritance_g2u)
if(row.entity.equals(name)) if(row.entity.equals(name))
inheritance.add(row); inheritances.add(row);
entry.getValue().inheritance = inheritance.toArray(new RowInheritance[inheritance.size()]); Collections.sort(inheritances);
entry.getValue().inheritance = inheritances.toArray(new RowInheritance[inheritances.size()]);
} }
} }
public synchronized ResolutionResult resolvePlayer(String player) public synchronized ResolutionResult resolvePlayer(String player)
@ -134,175 +154,118 @@ public class InternalCache
final ResolutionParams params = new ResolutionParams(); final ResolutionParams params = new ResolutionParams();
params.applicableIdentifiers = player; params.applicableIdentifiers = player;
params.destRegions = new String[] {}; params.destRegions = new String[] {};
// params.destWorld = "";
// params.expirience = 0;
return resolvePlayer(params); return resolvePlayer(params);
} }
public synchronized ResolutionResult resolvePlayer(ResolutionParams params) public synchronized ResolutionResult resolvePlayer(ResolutionParams params)
{ {
final ArrayList<ResolutionResult> intermediate = new ArrayList<>(); final ArrayList<RowPermission> applicablePermissions = new ArrayList<>();
if(entities_g.containsKey("")) final ArrayList<RowInheritance> applicableInheritance = new ArrayList<>();
{ params.groupList = new HashSet<>();
params.parentEntity = entities_g.get(""); params.finalPerms = new HashMap<>();
params.instantiator = ""; params.instantiator = "";
intermediate.add(resolveParent(params));
}
for(RowEntity row : entities_u.values()) for(RowEntity row : entities_u.values())
for(String identifier : params.applicableIdentifiers) for(String identifier : params.applicableIdentifiers)
if(row.playerType.isEntityApplicable(row.entity, identifier)) if(row.playerType.isEntityApplicable(row.entity, identifier))
{ {
params.parentEntity = row; if(row.inheritance != null && row.inheritance.length > 0)
params.instantiator = ""; for(RowInheritance inheritance : row.inheritance)
intermediate.add(resolveParent(params)); if(isInheritanceApplicable(params, inheritance))
break; applicableInheritance.add(inheritance);
} applicablePermissions.addAll(Arrays.asList(row.permissions));
final ResolutionResult result = processResultColumn(params, intermediate);
parents.addAll(Arrays.asList(implicitInheritance_u));
parents.add(defaultInheritance);
for(Entry<String, RowInheritance[]> entity : inheritanceTrees_u.entrySet())
{
for(RowInheritance row : entity.getValue())
if(PlayerType.isEntityApplicable(entity, , entity))
};
final ResolutionResult result = new ResolutionResult();
intermediate.addAll(Arrays.asList(implicitPermissions_u));
final ArrayList<RowPermission> inheritance = new ArrayList<>();
return result;
}
public synchronized ResolutionResult resolveParent(ResolutionParams params)
{
return null;
} }
/*
public synchronized ResolutionResult resolvePlayerOld(ResolutionParams params)
{
final ArrayList<InheritanceLeaf> applicableBranches = new ArrayList<>();
// Grab all inheritance rows applicable to this player
for(String identifier : params.applicableIdentifiers)
for(String tree : entityTrees.keySet())
if(tree.equals(identifier))
applicableBranches.add(entityTrees.get(tree));
Collections.sort(applicableBranches);
// Begin resolution
final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>(); final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>();
for(InheritanceLeaf branch : applicableBranches) Collections.sort(applicableInheritance);
if(isInheritanceApplicable(params, branch.node, "")) for(RowInheritance row : applicableInheritance)
intermediateResults.add(resolveBranch(params, branch, ""));
final ResolutionResult result = processResultColumn(params, intermediateResults, "");
intermediateResults.clear();
return result;
}
// FROM HERE I SHOULD MAKE IT WORKING
private void buildInheritanceForest()
{
final HashSet<String> entitiesWhichInherits = new HashSet<>();
for(RowInheritance row : inheritance_g2u)
entitiesWhichInherits.add(row.entity);
for(String inheritingEntity : entitiesWhichInherits)
{ {
final ArrayList<RowInheritance> entityDirectParents = new ArrayList<>(); params.instantiator = "";
for(RowInheritance row : inheritance_g2u) params.parentEntity = row.entityParent;
if(row.entity.equalsIgnoreCase(inheritingEntity)) intermediateResults.add(resolveParent(params));
entityDirectParents.add(row);
Collections.sort(entityDirectParents);
for(RowInheritance row : entityDirectParents)
this.entityTrees.put(inheritingEntity, buildBranch(row));
}
}
private InheritanceLeaf buildBranch(RowInheritance source)
{
final InheritanceLeaf result = new InheritanceLeaf();
result.node = source;
result.instantiator = source.instance;
final String entityName = source.entity.toLowerCase();
if(entities_g.containsKey(entityName))
{
result.prefix = entities_g.get(entityName).prefix;
result.suffix = entities_g.get(entityName).suffix;
} }
final ArrayList<RowInheritance> parents = new ArrayList<>(); final ResolutionResult result = processPrefixesAndSuffixes(params, intermediateResults);
for(RowInheritance row : inheritance_g2g) processPermissions(params, applicablePermissions);
if(row.parentEntity.equalsIgnoreCase(source.entity)) result.permissions = params.finalPerms;
parents.add(row); result.groups = params.groupList;
Collections.sort(parents);
final ArrayList<InheritanceLeaf> subleafs = new ArrayList<>();
for(RowInheritance row : parents)
subleafs.add(buildBranch(row));
result.subleafs = subleafs.toArray(new InheritanceLeaf[subleafs.size()]);
return result; return result;
} }
private ResolutionResult resolveBranch(ResolutionParams params, RowInheritance[] rows, String instantiator) private ResolutionResult resolveParent(ResolutionParams params)
{ {
final RowEntity currentParent = params.parentEntity;
final String instantiator = params.instantiator;
params.groupList.add(currentParent.entity + ("".equals(instantiator) ? "" : Settings.separator + instantiator));
final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>(); final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>();
for(InheritanceLeaf subleaf : branch.subleafs) for(RowInheritance row : params.parentEntity.inheritance)
{ if(isInheritanceApplicable(params, row))
final String overloadedInstantiator = (subleaf.instantiator != null && !"".equals(subleaf.instantiator)) {
? subleaf.instantiator : instantiator; params.parentEntity = row.entityParent;
if(isInheritanceApplicable(params, subleaf.node, overloadedInstantiator)) params.instantiator = (row.instance != null && !"".equals(row.instance))
intermediateResults.add(resolveBranch(params, subleaf, overloadedInstantiator)); ? row.instance
: instantiator;
intermediateResults.add(resolveParent(params));
} }
final ResolutionResult result = processResultColumn(params, intermediateResults, branch.instantiator); // Prefixes and suffixes
intermediateResults.clear(); params.parentEntity = currentParent;
params.instantiator = instantiator;
final ResolutionResult result = processPrefixesAndSuffixes(params, intermediateResults);
// Permissions
if(currentParent.permissions != null)
processPermissions(params, Arrays.asList(currentParent.permissions));
return result; return result;
} }
*/ private ResolutionResult processPrefixesAndSuffixes(ResolutionParams params, ArrayList<ResolutionResult> intermediate)
private ResolutionResult processResultColumn(ResolutionParams params, ArrayList<ResolutionResult> intermediate)
{
switch(intermediate.size())
{ {
case 0:
return new ResolutionResult();
case 1:
return intermediate.get(0);
default:
final ResolutionResult result = new ResolutionResult(); final ResolutionResult result = new ResolutionResult();
final ArrayList<RowPermission> permissions = new ArrayList<>(); result.prefix = params.parentEntity.prefix;
result.prefix = ""; result.suffix = params.parentEntity.suffix;
result.suffix = ""; if(result.prefix == null || "".equals(result.prefix))
for(ResolutionResult oneOf : intermediate) result.prefix = "%";
{ if(result.suffix == null || "".equals(result.suffix))
// Prefixes & suffixes result.suffix = "%";
if(oneOf.prefix != null && !"".equals(oneOf.prefix)) if(intermediate.size() > 0)
result.prefix = result.prefix.replace("%", oneOf.prefix); {
if(oneOf.suffix != null && !"".equals(oneOf.suffix)) final StringBuilder sbp = new StringBuilder();
result.suffix = result.suffix.replace("%", oneOf.suffix); final StringBuilder sbs = new StringBuilder();
for(ResolutionResult inherited : intermediate)
{
if(inherited.prefix != null)
sbp.append(inherited.prefix);
if(inherited.suffix != null)
sbs.append(inherited.suffix);
}
intermediate.clear();
result.prefix = result.prefix.replace(Settings.textInheriter, sbp.toString());
result.suffix = result.suffix.replace(Settings.textInheriter, sbs.toString());
}
result.prefix = result.prefix.replace(Settings.instantiator, params.instantiator); result.prefix = result.prefix.replace(Settings.instantiator, params.instantiator);
result.suffix = result.suffix.replace(Settings.instantiator, params.instantiator); result.suffix = result.suffix.replace(Settings.instantiator, params.instantiator);
// Permissions
for(RowPermission permission : oneOf.permissions)
if(isPermissionApplicable(params, permission, params.instantiator))
permissions.add(permission);
}
result.permissions = permissions.toArray(new RowPermission[permissions.size()]);
return result; return result;
} }
private void processPermissions(ResolutionParams params, List<RowPermission> permissions)
{
for(RowPermission row : permissions)
if(isPermissionApplicable(params, row))
params.finalPerms.put(
row.permission.replace(Settings.instantiator, params.instantiator),
row.value);
} }
private boolean isPermissionApplicable(ResolutionParams params, RowPermission row, String instantiator) private boolean isPermissionApplicable(ResolutionParams params, RowPermission row)
{ {
if(params.expirience < row.expirience) if(params.expirience < row.expirience)
return false; return false;
return row.destination.isWorldApplicable(params.destWorld, instantiator) return row.destination.isWorldApplicable(params.destWorld, params.instantiator)
? row.destination.isRegionApplicable(params.destRegions, instantiator) ? row.destination.isRegionApplicable(params.destRegions, params.instantiator)
: false; : false;
} }
private boolean isInheritanceApplicable(ResolutionParams params, RowInheritance row, String instantiator) private boolean isInheritanceApplicable(ResolutionParams params, RowInheritance row)
{ {
if(params.expirience < row.expirience) if(params.expirience < row.expirience)
return false; return false;
return row.destination.isWorldApplicable(params.destWorld, instantiator) return row.destination.isWorldApplicable(params.destWorld, params.instantiator)
? row.destination.isRegionApplicable(params.destRegions, instantiator) ? row.destination.isRegionApplicable(params.destRegions, params.instantiator)
: false; : false;
} }
public synchronized void clear() public synchronized void clear()
{ {
entities_g.clear(); entities_g.clear();
entities_u.clear(); entities_u.clear();
/*
permissions_p2g.clear();
permissions_p2u.clear();
inheritance_g2g.clear();
inheritance_g2u.clear();
*/
} }
} }

4
src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionParams.java

@ -1,4 +1,6 @@
package ru.simsonic.rscPermissions.InternalCache; package ru.simsonic.rscPermissions.InternalCache;
import java.util.Map;
import java.util.Set;
import ru.simsonic.rscPermissions.API.RowEntity; import ru.simsonic.rscPermissions.API.RowEntity;
public class ResolutionParams public class ResolutionParams
@ -9,4 +11,6 @@ public class ResolutionParams
public int expirience; public int expirience;
protected transient RowEntity parentEntity; protected transient RowEntity parentEntity;
protected transient String instantiator; protected transient String instantiator;
protected transient Map<String, Boolean> finalPerms;
protected transient Set<String> groupList;
} }

12
src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java

@ -1,16 +1,18 @@
package ru.simsonic.rscPermissions.InternalCache; package ru.simsonic.rscPermissions.InternalCache;
import ru.simsonic.rscPermissions.API.RowPermission; import java.util.Map;
import java.util.Set;
public class ResolutionResult public class ResolutionResult
{ {
public String prefix; public String prefix;
public String suffix; public String suffix;
public RowPermission[] permissions; public Map<String, Boolean> permissions;
public Set<String> groups;
public boolean hasPermission(String permission) public boolean hasPermission(String permission)
{ {
for(RowPermission row : permissions) for(Map.Entry<String, Boolean> entry : permissions.entrySet())
if(permission.equals(row.permission)) if(entry.getKey().equals(permission))
return row.value; return entry.getValue();
return false; return false;
} }
} }

Loading…
Cancel
Save