diff --git a/common/src/main/java/me/lucko/luckperms/common/model/User.java b/common/src/main/java/me/lucko/luckperms/common/model/User.java index 9f6d9e2ec..dd6ea66dc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/User.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/User.java @@ -29,7 +29,7 @@ import me.lucko.luckperms.api.Contexts; import me.lucko.luckperms.common.caching.UserCachedData; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.primarygroup.CachedPrimaryGroupHolder; +import me.lucko.luckperms.common.primarygroup.ContextualHolder; import me.lucko.luckperms.common.primarygroup.PrimaryGroupHolder; import java.util.Optional; @@ -81,8 +81,8 @@ public class User extends PermissionHolder implements Identifiable calculateValue(Contexts contexts) { InheritanceGraph graph = this.user.getPlugin().getInheritanceHandler().getGraph(contexts); // fully traverse the graph, obtain a list of permission holders the user inherits from - List traversal = ImmutableList.copyOf(graph.traverse(this.user.getPlugin().getConfiguration().get(ConfigKeys.INHERITANCE_TRAVERSAL_ALGORITHM), this.user)); + Iterable traversal = graph.traverse(this.user.getPlugin().getConfiguration().get(ConfigKeys.INHERITANCE_TRAVERSAL_ALGORITHM), this.user); Group bestGroup = null; - if (!traversal.isEmpty()) { - int best = 0; - for (PermissionHolder holder : traversal) { - if (!(holder instanceof Group)) { - continue; - } - Group g = ((Group) holder); + int best = 0; + for (PermissionHolder holder : traversal) { + if (!(holder instanceof Group)) { + continue; + } + Group g = ((Group) holder); - int weight = g.getWeight().orElse(0); - if (bestGroup == null || g.getWeight().orElse(0) > best) { - bestGroup = g; - best = weight; - } + int weight = g.getWeight().orElse(0); + if (bestGroup == null || g.getWeight().orElse(0) > best) { + bestGroup = g; + best = weight; } } - return bestGroup == null ? null : bestGroup.getName(); + return bestGroup == null ? Optional.empty() : Optional.of(bestGroup.getName()); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/primarygroup/CachedPrimaryGroupHolder.java b/common/src/main/java/me/lucko/luckperms/common/primarygroup/ContextualHolder.java similarity index 61% rename from common/src/main/java/me/lucko/luckperms/common/primarygroup/CachedPrimaryGroupHolder.java rename to common/src/main/java/me/lucko/luckperms/common/primarygroup/ContextualHolder.java index 84498b644..e2a4b6fbf 100644 --- a/common/src/main/java/me/lucko/luckperms/common/primarygroup/CachedPrimaryGroupHolder.java +++ b/common/src/main/java/me/lucko/luckperms/common/primarygroup/ContextualHolder.java @@ -25,40 +25,49 @@ package me.lucko.luckperms.common.primarygroup; -import me.lucko.luckperms.common.buffers.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; + +import me.lucko.luckperms.api.Contexts; import me.lucko.luckperms.common.model.User; import me.lucko.luckperms.common.node.factory.NodeFactory; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + import javax.annotation.Nonnull; /** * Abstract implementation of {@link PrimaryGroupHolder} which caches all lookups. */ -public abstract class CachedPrimaryGroupHolder extends StoredHolder { +public abstract class ContextualHolder extends StoredHolder { // cache lookups - private final Cache cache = new Cache() { - @Nonnull - @Override - protected String supply() { - return calculateValue(); - } - }; + private final LoadingCache> cache = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.MINUTES) + .build(this::calculateValue); - public CachedPrimaryGroupHolder(User user) { + public ContextualHolder(User user) { super(user); } - protected abstract String calculateValue(); + @Nonnull + protected abstract Optional calculateValue(Contexts contexts); - public void invalidate() { - this.cache.invalidate();; + public void invalidateCache() { + this.cache.invalidateAll(); } @Override public final String getValue() { - String s = this.cache.get(); - return s != null ? s : getStoredValue().orElse(NodeFactory.DEFAULT_GROUP_NAME); + Contexts contexts = this.user.getPlugin().getContextForUser(this.user).orElse(null); + if (contexts == null) { + contexts = this.user.getPlugin().getContextManager().getStaticContexts(); + } + + return Objects.requireNonNull(this.cache.get(contexts)) + .orElseGet(() -> getStoredValue().orElse(NodeFactory.DEFAULT_GROUP_NAME)); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/primarygroup/ParentsByWeightHolder.java b/common/src/main/java/me/lucko/luckperms/common/primarygroup/ParentsByWeightHolder.java index 7e3bcbf15..b5be11f18 100644 --- a/common/src/main/java/me/lucko/luckperms/common/primarygroup/ParentsByWeightHolder.java +++ b/common/src/main/java/me/lucko/luckperms/common/primarygroup/ParentsByWeightHolder.java @@ -31,26 +31,21 @@ import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.User; import java.util.LinkedHashSet; +import java.util.Optional; import java.util.Set; -public class ParentsByWeightHolder extends CachedPrimaryGroupHolder { +import javax.annotation.Nonnull; + +public class ParentsByWeightHolder extends ContextualHolder { public ParentsByWeightHolder(User user) { super(user); } + @Nonnull @Override - protected String calculateValue() { - Contexts contexts = this.user.getPlugin().getContextForUser(this.user).orElse(null); - if (contexts == null) { - contexts = this.user.getPlugin().getContextManager().getStaticContexts(); - } - + protected Optional calculateValue(Contexts contexts) { Set groups = new LinkedHashSet<>(); - for (Node node : this.user.getOwnNodes(contexts.getContexts())) { - if (!node.getValue() || !node.isGroupNode()) { - continue; - } - + for (Node node : this.user.getOwnGroupNodes(contexts.getContexts())) { Group group = this.user.getPlugin().getGroupManager().getIfLoaded(node.getGroupName()); if (group != null) { groups.add(group); @@ -70,6 +65,6 @@ public class ParentsByWeightHolder extends CachedPrimaryGroupHolder { } } - return bestGroup == null ? null : bestGroup.getName(); + return bestGroup == null ? Optional.empty() : Optional.of(bestGroup.getName()); } }