Improve permission lookup speed (slightly)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user