Ensure holder state is always declared

This commit is contained in:
Luck 2016-12-06 21:48:37 +00:00
parent 257f426ab9
commit 6760a96527
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
4 changed files with 44 additions and 9 deletions

View File

@ -119,7 +119,11 @@ public class CachedStateManager {
public void invalidateInheritances(HolderReference holder) {
Set<HolderReference> toInvalidate = getInheritances(holder);
toInvalidate.forEach(hr -> hr.apply(plugin, INVALIDATE_CONSUMER));
invalidateInheritances(plugin, toInvalidate);
}
public static void invalidateInheritances(LuckPermsPlugin plugin, Set<HolderReference> references) {
references.forEach(hr -> hr.apply(plugin, INVALIDATE_CONSUMER));
}
}

View File

@ -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<String> {

View File

@ -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<UserIdentifier> {
private final UserIdentifier id;

View File

@ -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<HolderReference> 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<LocalizedNode> cacheApply() {
@ -241,12 +258,6 @@ public abstract class PermissionHolder {
return ImmutableSortedSet.copyOfSorted(combined);
}
public void invalidateInheritanceCaches() {
getAllNodesCache.invalidateAll();
getAllNodesFilteredCache.invalidateAll();
exportNodesCache.invalidateAll();
}
private SortedSet<LocalizedNode> getAllNodesCacheApply(GetAllNodesHolder getAllNodesHolder) {
List<String> 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<HolderReference> 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
*