Improve permission lookup speed (slightly)

This commit is contained in:
Luck
2016-10-26 21:35:44 +01:00
Unverified
parent 1c15f8462f
commit 0198068a13
14 changed files with 94 additions and 64 deletions
@@ -53,7 +53,8 @@ public class PermissionCache implements PermissionData {
public PermissionCache(Contexts contexts, User user, CalculatorFactory calculatorFactory) {
permissions = new ConcurrentHashMap<>();
calculator = calculatorFactory.build(contexts, user, permissions);
calculator = calculatorFactory.build(contexts, user);
calculator.updateBacking(permissions); // Initial setup.
}
@Override
@@ -64,6 +65,7 @@ public class PermissionCache implements PermissionData {
public void setPermissions(Map<String, Boolean> permissions) {
this.permissions.clear();
this.permissions.putAll(permissions);
calculator.updateBacking(this.permissions);
invalidateCache();
}
@@ -25,13 +25,11 @@ package me.lucko.luckperms.common.calculators;
import me.lucko.luckperms.api.Contexts;
import me.lucko.luckperms.common.users.User;
import java.util.Map;
/**
* Creates a calculator instance given a set of contexts
*/
public interface CalculatorFactory {
PermissionCalculator build(Contexts contexts, User user, Map<String, Boolean> map);
PermissionCalculator build(Contexts contexts, User user);
}
@@ -22,21 +22,23 @@
package me.lucko.luckperms.common.calculators;
import lombok.AllArgsConstructor;
import lombok.Getter;
import me.lucko.luckperms.api.Tristate;
import java.util.Map;
@AllArgsConstructor
public class MapProcessor implements PermissionProcessor {
@Getter
private final Map<String, Boolean> map;
private Map<String, Boolean> map = null;
@Override
public Tristate hasPermission(String permission) {
Boolean b = map.get(permission);
return b == null ? Tristate.UNDEFINED : Tristate.fromBoolean(b);
}
@Override
public void updateBacking(Map<String, Boolean> map) {
if (this.map == null) {
this.map = map;
}
}
}
@@ -30,6 +30,7 @@ import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.common.LuckPermsPlugin;
import java.util.List;
import java.util.Map;
/**
* Calculates and caches permissions
@@ -76,4 +77,10 @@ public class PermissionCalculator {
return Tristate.UNDEFINED;
}
public synchronized void updateBacking(Map<String, Boolean> map) {
for (PermissionProcessor processor : processors) {
processor.updateBacking(map);
}
}
}
@@ -24,8 +24,11 @@ package me.lucko.luckperms.common.calculators;
import me.lucko.luckperms.api.Tristate;
import java.util.Map;
public interface PermissionProcessor {
Tristate hasPermission(String permission);
void updateBacking(Map<String, Boolean> map);
}
@@ -22,28 +22,20 @@
package me.lucko.luckperms.common.calculators;
import lombok.AllArgsConstructor;
import lombok.Getter;
import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.common.constants.Patterns;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
@AllArgsConstructor
public class RegexProcessor implements PermissionProcessor {
@Getter
private final Map<String, Boolean> map;
private Map<String, Boolean> regexPermissions = new ConcurrentHashMap<>();
@Override
public Tristate hasPermission(String permission) {
for (Map.Entry<String, Boolean> e : map.entrySet()) {
if (!e.getKey().startsWith("r=") && !e.getKey().startsWith("R=")) {
continue;
}
Pattern p = Patterns.compile(e.getKey().substring(2));
for (Map.Entry<String, Boolean> e : regexPermissions.entrySet()) {
Pattern p = Patterns.compile(e.getKey());
if (p == null) {
continue;
}
@@ -55,4 +47,16 @@ public class RegexProcessor implements PermissionProcessor {
return Tristate.UNDEFINED;
}
@Override
public void updateBacking(Map<String, Boolean> map) {
regexPermissions.clear();
for (Map.Entry<String, Boolean> e : map.entrySet()) {
if (!e.getKey().startsWith("r=") && !e.getKey().startsWith("R=")) {
continue;
}
regexPermissions.put(e.getKey().substring(2), e.getValue());
}
}
}
@@ -22,17 +22,12 @@
package me.lucko.luckperms.common.calculators;
import lombok.AllArgsConstructor;
import lombok.Getter;
import me.lucko.luckperms.api.Tristate;
import java.util.Map;
@AllArgsConstructor
public class WildcardProcessor implements PermissionProcessor {
@Getter
private final Map<String, Boolean> map;
private Map<String, Boolean> map = null;
@Override
public Tristate hasPermission(String permission) {
@@ -65,4 +60,11 @@ public class WildcardProcessor implements PermissionProcessor {
return Tristate.UNDEFINED;
}
@Override
public void updateBacking(Map<String, Boolean> map) {
if (this.map == null) {
this.map = map;
}
}
}