From 6760a965279d019a091a854b7edb2927ace6ba35 Mon Sep 17 00:00:00 2001 From: Luck Date: Tue, 6 Dec 2016 21:48:37 +0000 Subject: [PATCH] Ensure holder state is always declared --- .../caching/handlers/CachedStateManager.java | 6 ++- .../caching/handlers/GroupReference.java | 4 ++ .../caching/handlers/UserReference.java | 4 ++ .../common/core/model/PermissionHolder.java | 39 +++++++++++++++---- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/CachedStateManager.java b/common/src/main/java/me/lucko/luckperms/common/caching/handlers/CachedStateManager.java index 94c0c8c3e..3a83e872e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/CachedStateManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/handlers/CachedStateManager.java @@ -119,7 +119,11 @@ public class CachedStateManager { public void invalidateInheritances(HolderReference holder) { Set toInvalidate = getInheritances(holder); - toInvalidate.forEach(hr -> hr.apply(plugin, INVALIDATE_CONSUMER)); + invalidateInheritances(plugin, toInvalidate); + } + + public static void invalidateInheritances(LuckPermsPlugin plugin, Set references) { + references.forEach(hr -> hr.apply(plugin, INVALIDATE_CONSUMER)); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/GroupReference.java b/common/src/main/java/me/lucko/luckperms/common/caching/handlers/GroupReference.java index 695b771b5..717fc7f1d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/GroupReference.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/handlers/GroupReference.java @@ -23,7 +23,9 @@ package me.lucko.luckperms.common.caching.handlers; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.ToString; import me.lucko.luckperms.common.LuckPermsPlugin; import me.lucko.luckperms.common.core.model.Group; @@ -32,6 +34,8 @@ import me.lucko.luckperms.common.core.model.PermissionHolder; import java.util.function.Consumer; @Getter +@ToString +@EqualsAndHashCode @AllArgsConstructor(staticName = "of") public class GroupReference implements HolderReference { diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/UserReference.java b/common/src/main/java/me/lucko/luckperms/common/caching/handlers/UserReference.java index 5476626b8..441dfd8e0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/UserReference.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/handlers/UserReference.java @@ -23,7 +23,9 @@ package me.lucko.luckperms.common.caching.handlers; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.ToString; import me.lucko.luckperms.common.LuckPermsPlugin; import me.lucko.luckperms.common.core.UserIdentifier; @@ -33,6 +35,8 @@ import me.lucko.luckperms.common.core.model.User; import java.util.function.Consumer; @Getter +@ToString +@EqualsAndHashCode @AllArgsConstructor(staticName = "of") public class UserReference implements HolderReference { private final UserIdentifier id; diff --git a/common/src/main/java/me/lucko/luckperms/common/core/model/PermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/core/model/PermissionHolder.java index 8b1bd0313..eb4611573 100644 --- a/common/src/main/java/me/lucko/luckperms/common/core/model/PermissionHolder.java +++ b/common/src/main/java/me/lucko/luckperms/common/core/model/PermissionHolder.java @@ -48,6 +48,8 @@ import me.lucko.luckperms.common.LuckPermsPlugin; import me.lucko.luckperms.common.api.internal.GroupLink; import me.lucko.luckperms.common.api.internal.PermissionHolderLink; import me.lucko.luckperms.common.caching.MetaHolder; +import me.lucko.luckperms.common.caching.handlers.CachedStateManager; +import me.lucko.luckperms.common.caching.handlers.GroupReference; import me.lucko.luckperms.common.caching.handlers.HolderReference; import me.lucko.luckperms.common.caching.holder.ExportNodesHolder; import me.lucko.luckperms.common.caching.holder.GetAllNodesHolder; @@ -169,8 +171,23 @@ public abstract class PermissionHolder { } cache.invalidate(); mergedCache.invalidate(); - invalidateInheritanceCaches(); - plugin.getCachedStateManager().invalidateInheritances(toReference()); + + // Invalidate inheritance caches + getAllNodesCache.invalidateAll(); + getAllNodesFilteredCache.invalidateAll(); + exportNodesCache.invalidateAll(); + + // Get previous references + Set refs = plugin.getCachedStateManager().getInheritances(toReference()); + + // Declare new state to the state manager + declareState(); + + // Add all new references affected by the state change. + refs.addAll(plugin.getCachedStateManager().getInheritances(toReference())); + + // Invalidate all affected children. + CachedStateManager.invalidateInheritances(plugin, refs); } private ImmutableSortedSet cacheApply() { @@ -241,12 +258,6 @@ public abstract class PermissionHolder { return ImmutableSortedSet.copyOfSorted(combined); } - public void invalidateInheritanceCaches() { - getAllNodesCache.invalidateAll(); - getAllNodesFilteredCache.invalidateAll(); - exportNodesCache.invalidateAll(); - } - private SortedSet getAllNodesCacheApply(GetAllNodesHolder getAllNodesHolder) { List excludedGroups = new ArrayList<>(getAllNodesHolder.getExcludedGroups()); ExtractedContexts contexts = getAllNodesHolder.getContexts(); @@ -367,6 +378,9 @@ public abstract class PermissionHolder { return ImmutableMap.copyOf(perms); } + protected void declareState() { + plugin.getCachedStateManager().putAll(toReference(), getGroupReferences()); + } public abstract String getFriendlyName(); public abstract HolderReference toReference(); @@ -1048,6 +1062,15 @@ public abstract class PermissionHolder { .collect(Collectors.toList()); } + public Set getGroupReferences() { + return getNodes().stream() + .filter(Node::isGroupNode) + .map(Node::getGroupName) + .map(String::toLowerCase) + .map(GroupReference::of) + .collect(Collectors.toSet()); + } + /** * Get a {@link List} of the groups the holder inherits on a specific server and world *