From dae64fc8c4468462372594d9feb26e004c7d7076 Mon Sep 17 00:00:00 2001 From: Luck Date: Thu, 7 Feb 2019 15:35:09 +0000 Subject: [PATCH] Cleanup some of the Sponge permission holder implementation code --- .../command/access/ArgumentPermissions.java | 2 +- .../generic/meta/MetaSetChatMeta.java | 2 +- .../generic/meta/MetaSetTempChatMeta.java | 2 +- .../luckperms/common/model/NodeMapType.java | 40 +++--- .../service/proxy/api6/SubjectProxy.java | 4 +- .../service/proxy/api7/SubjectProxy.java | 4 +- .../sponge/service/model/LPSubjectData.java | 8 +- .../model/calculated/CalculatedSubject.java | 6 +- .../calculated/CalculatedSubjectData.java | 16 +++ .../PermissionHolderSubjectData.java | 119 +++++++++++------- 10 files changed, 120 insertions(+), 83 deletions(-) diff --git a/common/src/main/java/me/lucko/luckperms/common/command/access/ArgumentPermissions.java b/common/src/main/java/me/lucko/luckperms/common/command/access/ArgumentPermissions.java index 56acd7cac..68d949da1 100644 --- a/common/src/main/java/me/lucko/luckperms/common/command/access/ArgumentPermissions.java +++ b/common/src/main/java/me/lucko/luckperms/common/command/access/ArgumentPermissions.java @@ -298,7 +298,7 @@ public final class ArgumentPermissions { throw new IllegalStateException("Unable to get a User for " + sender.getUuid() + " - " + sender.getName()); } - PermissionCache permissionData = user.getCachedData().getPermissionData(Contexts.of(contextSet, Contexts.global().getSettings())); + PermissionCache permissionData = user.getCachedData().getPermissionData(Contexts.global().setContexts(contextSet)); return !permissionData.getPermissionValue(NodeFactory.groupNode(targetGroupName), PermissionCheckEvent.Origin.INTERNAL).result().asBoolean(); } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetChatMeta.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetChatMeta.java index 102276c66..e7d458721 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetChatMeta.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetChatMeta.java @@ -107,7 +107,7 @@ public class MetaSetChatMeta extends SharedSubCommand { // determine the priority to set at if (priority == Integer.MIN_VALUE) { - MetaAccumulator metaAccumulator = holder.accumulateMeta(null, Contexts.of(context, Contexts.global().getSettings())); + MetaAccumulator metaAccumulator = holder.accumulateMeta(null, Contexts.global().setContexts(context)); metaAccumulator.complete(); priority = metaAccumulator.getChatMeta(this.type).keySet().stream().mapToInt(e -> e).max().orElse(0) + 1; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTempChatMeta.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTempChatMeta.java index 0dc809c89..202373d91 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTempChatMeta.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTempChatMeta.java @@ -116,7 +116,7 @@ public class MetaSetTempChatMeta extends SharedSubCommand { // determine the priority to set at if (priority == Integer.MIN_VALUE) { - MetaAccumulator metaAccumulator = holder.accumulateMeta(null, Contexts.of(context, Contexts.global().getSettings())); + MetaAccumulator metaAccumulator = holder.accumulateMeta(null, Contexts.global().setContexts(context)); metaAccumulator.complete(); priority = metaAccumulator.getChatMeta(this.type).keySet().stream().mapToInt(e -> e).max().orElse(0) + 1; diff --git a/common/src/main/java/me/lucko/luckperms/common/model/NodeMapType.java b/common/src/main/java/me/lucko/luckperms/common/model/NodeMapType.java index cfe9ea38a..60f55cfa6 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/NodeMapType.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/NodeMapType.java @@ -29,26 +29,34 @@ import java.util.function.Supplier; public enum NodeMapType { - ENDURING, - TRANSIENT; + ENDURING { + @Override + public void run(Runnable enduringTask, Runnable transientTask) { + enduringTask.run(); + } + + @Override + public T supply(Supplier enduringSupplier, Supplier transientSupplier) { + return enduringSupplier.get(); + } + }, + TRANSIENT { + @Override + public void run(Runnable enduringTask, Runnable transientTask) { + transientTask.run(); + } + + @Override + public T supply(Supplier enduringSupplier, Supplier transientSupplier) { + return transientSupplier.get(); + } + }; // useful methods for fluent/conditional execution - public void run(Runnable ifEnduring, Runnable ifTransient) { - if (this == ENDURING) { - ifEnduring.run(); - } else { - ifTransient.run(); - } - } + public abstract void run(Runnable enduringTask, Runnable transientTask); - public T supply(Supplier ifEnduring, Supplier ifTransient) { - if (this == ENDURING) { - return ifEnduring.get(); - } else { - return ifTransient.get(); - } - } + public abstract T supply(Supplier enduringSupplier, Supplier transientSupplier); } diff --git a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java index e06905d1c..345a37612 100644 --- a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java +++ b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java @@ -26,7 +26,6 @@ package me.lucko.luckperms.sponge.service.proxy.api6; import me.lucko.luckperms.api.context.ImmutableContextSet; -import me.lucko.luckperms.common.context.ContextManager; import me.lucko.luckperms.common.context.ContextsSupplier; import me.lucko.luckperms.common.util.ImmutableCollectors; import me.lucko.luckperms.sponge.service.CompatibilityUtil; @@ -68,8 +67,7 @@ public final class SubjectProxy implements Subject, ProxiedSubject, ProxiedServi // lazy init private ContextsSupplier getContextsCache() { if (this.contextsSupplier == null) { - ContextManager contextManager = (ContextManager) this.service.getPlugin().getContextManager(); - this.contextsSupplier = contextManager.getCacheFor(this); + this.contextsSupplier = this.service.getContextManager().getCacheFor(this); } return this.contextsSupplier; } diff --git a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java index 61be67cc0..af9edd420 100644 --- a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java +++ b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java @@ -26,7 +26,6 @@ package me.lucko.luckperms.sponge.service.proxy.api7; import me.lucko.luckperms.api.context.ImmutableContextSet; -import me.lucko.luckperms.common.context.ContextManager; import me.lucko.luckperms.common.context.ContextsSupplier; import me.lucko.luckperms.sponge.service.CompatibilityUtil; import me.lucko.luckperms.sponge.service.model.LPPermissionService; @@ -68,8 +67,7 @@ public final class SubjectProxy implements Subject, ProxiedSubject, ProxiedServi // lazy init private ContextsSupplier getContextsCache() { if (this.contextsSupplier == null) { - ContextManager contextManager = (ContextManager) this.service.getPlugin().getContextManager(); - this.contextsSupplier = contextManager.getCacheFor(this); + this.contextsSupplier = this.service.getContextManager().getCacheFor(this); } return this.contextsSupplier; } diff --git a/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubjectData.java b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubjectData.java index e0e70e699..d0628496e 100644 --- a/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubjectData.java +++ b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubjectData.java @@ -51,9 +51,7 @@ public interface LPSubjectData { ImmutableMap> getAllPermissions(); - default ImmutableMap getPermissions(ImmutableContextSet contexts) { - return ImmutableMap.copyOf(getAllPermissions().getOrDefault(contexts, ImmutableMap.of())); - } + ImmutableMap getPermissions(ImmutableContextSet contexts); CompletableFuture setPermission(ImmutableContextSet contexts, String permission, Tristate value); @@ -65,9 +63,7 @@ public interface LPSubjectData { ImmutableMap> getAllParents(); - default ImmutableList getParents(ImmutableContextSet contexts) { - return ImmutableList.copyOf(getAllParents().getOrDefault(contexts, ImmutableList.of())); - } + ImmutableList getParents(ImmutableContextSet contexts); CompletableFuture addParent(ImmutableContextSet contexts, LPSubjectReference parent); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java index 5ed5a7de2..eae715a09 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java @@ -294,8 +294,7 @@ public abstract class CalculatedSubject implements LPSubject { @Override public Tristate getPermissionValue(ImmutableContextSet contexts, String permission) { - Contexts lookupContexts = Contexts.of(contexts, Contexts.global().getSettings()); - return this.cachedData.getPermissionData(lookupContexts).getPermissionValue(permission, PermissionCheckEvent.Origin.INTERNAL).result(); + return this.cachedData.getPermissionData(Contexts.global().setContexts(contexts)).getPermissionValue(permission, PermissionCheckEvent.Origin.INTERNAL).result(); } @Override @@ -310,8 +309,7 @@ public abstract class CalculatedSubject implements LPSubject { @Override public Optional getOption(ImmutableContextSet contexts, String key) { - Contexts lookupContexts = Contexts.of(contexts, Contexts.global().getSettings()); - return Optional.ofNullable(this.cachedData.getMetaData(lookupContexts).getMeta(MetaCheckEvent.Origin.PLATFORM_API).get(key)); + return Optional.ofNullable(this.cachedData.getMetaData(Contexts.global().setContexts(contexts)).getMeta(MetaCheckEvent.Origin.PLATFORM_API).get(key)); } @Override diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubjectData.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubjectData.java index f2623d02d..bbe512d2a 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubjectData.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubjectData.java @@ -27,6 +27,7 @@ package me.lucko.luckperms.sponge.service.model.calculated; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.api.context.ContextSet; @@ -120,6 +121,11 @@ public class CalculatedSubjectData implements LPSubjectData { return map.build(); } + @Override + public ImmutableMap getPermissions(ImmutableContextSet contexts) { + return ImmutableMap.copyOf(this.permissions.getOrDefault(contexts, ImmutableMap.of())); + } + public Map resolvePermissions(ContextSet filter) { // get relevant entries SortedMap> sorted = new TreeMap<>(ContextSetComparator.reverse()); @@ -211,6 +217,11 @@ public class CalculatedSubjectData implements LPSubjectData { return map.build(); } + @Override + public ImmutableList getParents(ImmutableContextSet contexts) { + return ImmutableList.copyOf(this.parents.getOrDefault(contexts, ImmutableSet.of())); + } + public Set resolveParents(ContextSet filter) { // get relevant entries SortedMap> sorted = new TreeMap<>(ContextSetComparator.reverse()); @@ -297,6 +308,11 @@ public class CalculatedSubjectData implements LPSubjectData { return map.build(); } + @Override + public ImmutableMap getOptions(ImmutableContextSet contexts) { + return ImmutableMap.copyOf(this.options.getOrDefault(contexts, ImmutableMap.of())); + } + public Map resolveOptions(ContextSet filter) { // get relevant entries SortedMap> sorted = new TreeMap<>(ContextSetComparator.reverse()); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubjectData.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubjectData.java index f2385e5d1..f257f8ca1 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubjectData.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubjectData.java @@ -105,6 +105,15 @@ public class PermissionHolderSubjectData implements LPSubjectData { return ret.build(); } + @Override + public ImmutableMap getPermissions(ImmutableContextSet contexts) { + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (Node n : this.holder.getData(this.type).immutable().get(contexts)) { + builder.put(n.getPermission(), n.getValue()); + } + return builder.build(); + } + @Override public CompletableFuture setPermission(ImmutableContextSet contexts, String permission, Tristate tristate) { Objects.requireNonNull(contexts, "contexts"); @@ -196,6 +205,17 @@ public class PermissionHolderSubjectData implements LPSubjectData { return ret.build(); } + @Override + public ImmutableList getParents(ImmutableContextSet contexts) { + ImmutableList.Builder builder = ImmutableList.builder(); + for (Node n : this.holder.getData(this.type).immutable().get(contexts)) { + if (n.isGroupNode()) { + builder.add(this.service.getGroupSubjects().loadSubject(n.getGroupName()).join().toReference()); + } + } + return builder.build(); + } + @Override public CompletableFuture addParent(ImmutableContextSet contexts, LPSubjectReference subject) { Objects.requireNonNull(contexts, "contexts"); @@ -292,51 +312,52 @@ public class PermissionHolderSubjectData implements LPSubjectData { @Override public ImmutableMap> getAllOptions() { - Map> options = new HashMap<>(); - Map minPrefixPriority = new HashMap<>(); - Map minSuffixPriority = new HashMap<>(); + ImmutableMap.Builder> ret = ImmutableMap.builder(); + for (Map.Entry> entry : this.holder.getData(this.type).immutable().asMap().entrySet()) { + ret.put(entry.getKey(), nodesToOptions(entry.getValue())); + } + return ret.build(); + } - for (Node n : this.holder.getData(this.type).immutable().values()) { + @Override + public ImmutableMap getOptions(ImmutableContextSet contexts) { + return nodesToOptions(this.holder.getData(this.type).immutable().get(contexts)); + } + + private static ImmutableMap nodesToOptions(Iterable nodes) { + Map builder = new HashMap<>(); + int maxPrefixPriority = Integer.MIN_VALUE; + int maxSuffixPriority = Integer.MIN_VALUE; + + for (Node n : nodes) { if (!n.getValue()) continue; if (!n.isMeta() && !n.isPrefix() && !n.isSuffix()) continue; - ImmutableContextSet immutableContexts = n.getFullContexts().makeImmutable(); - - if (!options.containsKey(immutableContexts)) { - options.put(immutableContexts, new HashMap<>()); - minPrefixPriority.put(immutableContexts, Integer.MIN_VALUE); - minSuffixPriority.put(immutableContexts, Integer.MIN_VALUE); - } - if (n.isPrefix()) { Map.Entry value = n.getPrefix(); - if (value.getKey() > minPrefixPriority.get(immutableContexts)) { - options.get(immutableContexts).put(NodeTypes.PREFIX_KEY, value.getValue()); - minPrefixPriority.put(immutableContexts, value.getKey()); + if (value.getKey() > maxPrefixPriority) { + builder.put(NodeTypes.PREFIX_KEY, value.getValue()); + maxPrefixPriority = value.getKey(); } continue; } if (n.isSuffix()) { Map.Entry value = n.getSuffix(); - if (value.getKey() > minSuffixPriority.get(immutableContexts)) { - options.get(immutableContexts).put(NodeTypes.SUFFIX_KEY, value.getValue()); - minSuffixPriority.put(immutableContexts, value.getKey()); + if (value.getKey() > maxSuffixPriority) { + builder.put(NodeTypes.SUFFIX_KEY, value.getValue()); + maxSuffixPriority = value.getKey(); } continue; } if (n.isMeta()) { Map.Entry meta = n.getMeta(); - options.get(immutableContexts).put(meta.getKey(), meta.getValue()); + builder.put(meta.getKey(), meta.getValue()); } } - ImmutableMap.Builder> map = ImmutableMap.builder(); - for (Map.Entry> e : options.entrySet()) { - map.put(e.getKey(), ImmutableMap.copyOf(e.getValue())); - } - return map.build(); + return ImmutableMap.copyOf(builder); } @Override @@ -351,17 +372,15 @@ public class PermissionHolderSubjectData implements LPSubjectData { ChatMetaType type = ChatMetaType.valueOf(key.toUpperCase()); // remove all prefixes/suffixes from the user - List toRemove = streamNodes() + streamNodes() .filter(type::matches) .filter(n -> n.getFullContexts().equals(contexts)) - .collect(Collectors.toList()); + .forEach(n -> this.type.run( + () -> this.holder.unsetPermission(n), + () -> this.holder.unsetTransientPermission(n) + )); - toRemove.forEach(n -> this.type.run( - () -> this.holder.unsetPermission(n), - () -> this.holder.unsetTransientPermission(n) - )); - - MetaAccumulator metaAccumulator = this.holder.accumulateMeta(null, Contexts.of(contexts, Contexts.global().getSettings())); + MetaAccumulator metaAccumulator = this.holder.accumulateMeta(null, Contexts.global().setContexts(contexts)); metaAccumulator.complete(); int priority = metaAccumulator.getChatMeta(type).keySet().stream().mapToInt(e -> e).max().orElse(0); priority += 10; @@ -369,15 +388,13 @@ public class PermissionHolderSubjectData implements LPSubjectData { node = NodeFactory.buildChatMetaNode(type, priority, value).withExtraContext(contexts).build(); } else { // standard remove - List toRemove = streamNodes() + streamNodes() .filter(n -> n.isMeta() && n.getMeta().getKey().equals(key)) .filter(n -> n.getFullContexts().equals(contexts)) - .collect(Collectors.toList()); - - toRemove.forEach(n -> this.type.run( - () -> this.holder.unsetPermission(n), - () -> this.holder.unsetTransientPermission(n) - )); + .forEach(n -> this.type.run( + () -> this.holder.unsetPermission(n), + () -> this.holder.unsetTransientPermission(n) + )); node = NodeFactory.buildMetaNode(key, value).withExtraContext(contexts).build(); } @@ -394,7 +411,7 @@ public class PermissionHolderSubjectData implements LPSubjectData { Objects.requireNonNull(contexts, "contexts"); Objects.requireNonNull(key, "key"); - List toRemove = streamNodes() + streamNodes() .filter(n -> { if (key.equalsIgnoreCase(NodeTypes.PREFIX_KEY)) { return n.isPrefix(); @@ -405,12 +422,10 @@ public class PermissionHolderSubjectData implements LPSubjectData { } }) .filter(n -> n.getFullContexts().equals(contexts)) - .collect(Collectors.toList()); - - toRemove.forEach(node -> this.type.run( - () -> this.holder.unsetPermission(node), - () -> this.holder.unsetTransientPermission(node) - )); + .forEach(node -> this.type.run( + () -> this.holder.unsetPermission(node), + () -> this.holder.unsetTransientPermission(node) + )); return objectSave(this.holder).thenApply(v -> true); } @@ -429,7 +444,11 @@ public class PermissionHolderSubjectData implements LPSubjectData { () -> this.holder.unsetTransientPermission(node) )); - return objectSave(this.holder).thenApply(v -> !toRemove.isEmpty()); + if (toRemove.isEmpty()) { + return CompletableFuture.completedFuture(false); + } + + return objectSave(this.holder).thenApply(v -> true); } @Override @@ -443,7 +462,11 @@ public class PermissionHolderSubjectData implements LPSubjectData { () -> this.holder.unsetTransientPermission(node) )); - return objectSave(this.holder).thenApply(v -> !toRemove.isEmpty()); + if (toRemove.isEmpty()) { + return CompletableFuture.completedFuture(false); + } + + return objectSave(this.holder).thenApply(v -> true); } private CompletableFuture objectSave(PermissionHolder t) {