Cache permission lookups

This commit is contained in:
Luck
2016-09-16 21:11:12 +01:00
Unverified
parent f6aa20c300
commit f2e06b56e7
8 changed files with 229 additions and 47 deletions
@@ -46,11 +46,12 @@ public class LPPermissible extends PermissibleBase {
private final CommandSender parent;
private final LuckPermsPlugin plugin;
@Getter
private final Map<String, Boolean> luckPermsPermissions = new ConcurrentHashMap<>();
private final List<PermissionAttachment> attachments = new LinkedList<>();
private final Map<String, PermissionAttachmentInfo> attachmentPermissions = new HashMap<>();
@Getter
private final Map<String, Boolean> luckPermsPermissions = new ConcurrentHashMap<>();
private final Map<String, Tristate> lookupCache = new HashMap<>();
public LPPermissible(@NonNull CommandSender sender, LuckPermsPlugin plugin) {
super(sender);
@@ -58,24 +59,10 @@ public class LPPermissible extends PermissibleBase {
this.plugin = plugin;
}
@Override
public boolean isOp() {
return parent.isOp();
}
@Override
public void setOp(boolean value) {
parent.setOp(value);
}
@Override
public boolean isPermissionSet(@NonNull String name) {
return luckPermsPermissions.containsKey(name.toLowerCase()) || attachmentPermissions.containsKey(name.toLowerCase());
}
@Override
public boolean isPermissionSet(@NonNull Permission perm) {
return isPermissionSet(perm.getName());
public void invalidateCache() {
synchronized (lookupCache) {
lookupCache.clear();
}
}
private Tristate getPermissionValue(String permission) {
@@ -84,7 +71,18 @@ public class LPPermissible extends PermissibleBase {
}
permission = permission.toLowerCase();
synchronized (lookupCache) {
if (lookupCache.containsKey(permission)) {
return lookupCache.get(permission);
} else {
Tristate t = lookupPermissionValue(permission);
lookupCache.put(permission, t);
return t;
}
}
}
private Tristate lookupPermissionValue(String permission) {
if (luckPermsPermissions.containsKey(permission)) {
return Tristate.fromBoolean(luckPermsPermissions.get(permission));
}
@@ -124,6 +122,26 @@ public class LPPermissible extends PermissibleBase {
return Tristate.UNDEFINED;
}
@Override
public boolean isOp() {
return parent.isOp();
}
@Override
public void setOp(boolean value) {
parent.setOp(value);
}
@Override
public boolean isPermissionSet(@NonNull String name) {
return luckPermsPermissions.containsKey(name.toLowerCase()) || attachmentPermissions.containsKey(name.toLowerCase());
}
@Override
public boolean isPermissionSet(@NonNull Permission perm) {
return isPermissionSet(perm.getName());
}
@Override
public boolean hasPermission(@NonNull String name) {
Tristate ts = getPermissionValue(name);
@@ -239,6 +257,8 @@ public class LPPermissible extends PermissibleBase {
for (PermissionAttachment attachment : attachments) {
calculateChildPermissions(attachment.getPermissions(), false, attachment);
}
invalidateCache();
}
@Override
@@ -87,6 +87,7 @@ public class BukkitUser extends User {
if (!different) return;
existing.clear();
lpPermissible.invalidateCache();
existing.putAll(toApply);
if (plugin.getConfiguration().getAutoOp()) {