From 4547b52748d9bfc352eaa88f510d9d38f4072d63 Mon Sep 17 00:00:00 2001 From: Luck Date: Wed, 2 May 2018 20:18:48 +0100 Subject: [PATCH] Refactor extended node types, general cleanup --- .../java/me/lucko/luckperms/api/Node.java | 191 +++++++---- .../luckperms/api/nodetype/NodeType.java | 44 +++ .../luckperms/api/nodetype/NodeTypeKey.java | 56 +++ .../api/nodetype/types/InheritanceType.java | 57 ++++ .../api/nodetype/types/MetaType.java | 69 ++++ .../api/nodetype/types/PrefixType.java | 71 ++++ .../api/nodetype/types/SuffixType.java | 71 ++++ .../api/nodetype/types/WeightType.java | 29 +- .../calculators/BukkitCalculatorFactory.java | 2 +- .../migration/MigrationBPermissions.java | 5 +- .../migration/MigrationGroupManager.java | 9 +- .../migration/MigrationPermissionsBukkit.java | 2 +- .../migration/MigrationPermissionsEx.java | 9 +- .../migration/MigrationPowerfulPerms.java | 2 +- .../migration/MigrationZPermissions.java | 5 +- .../permissible/LPPermissionAttachment.java | 4 +- .../luckperms/bukkit/vault/VaultChatHook.java | 5 +- .../bukkit/vault/VaultPermissionHook.java | 4 +- .../migration/MigrationBungeePerms.java | 2 +- .../delegates/manager/ApiGroupManager.java | 2 +- .../api/delegates/manager/ApiUserManager.java | 2 +- .../api/delegates/misc/ApiNodeFactory.java | 2 +- .../delegates/model/ApiPermissionHolder.java | 49 ++- .../api/delegates/model/ApiStorage.java | 2 +- .../common/api/delegates/model/ApiUser.java | 6 +- .../assignments/AssignmentExpression.java | 5 +- .../common/assignments/AssignmentRule.java | 2 +- .../luckperms/common/backup/Exporter.java | 10 +- .../luckperms/common/backup/Importer.java | 2 +- .../common/bulkupdate/BulkUpdate.java | 6 +- .../common/bulkupdate/action/Action.java | 4 +- .../bulkupdate/action/DeleteAction.java | 4 +- .../bulkupdate/action/UpdateAction.java | 4 +- .../bulkupdate/constraint/Constraint.java | 4 +- .../common/caching/GroupCachedData.java | 2 +- .../common/caching/UserCachedData.java | 2 +- .../caching/handlers/CachedStateManager.java | 115 ------- .../common/caching/type/MetaAccumulator.java | 30 +- .../PermissionCalculatorMetadata.java | 2 +- .../generic/meta/MetaAddChatMeta.java | 2 +- .../generic/meta/MetaAddTempChatMeta.java | 2 +- .../commands/generic/meta/MetaClear.java | 14 +- .../commands/generic/meta/MetaInfo.java | 4 +- .../generic/meta/MetaRemoveChatMeta.java | 2 +- .../generic/meta/MetaRemoveTempChatMeta.java | 2 +- .../common/commands/generic/meta/MetaSet.java | 6 +- .../commands/generic/meta/MetaSetTemp.java | 6 +- .../commands/generic/other/HolderClear.java | 4 +- .../generic/other/HolderShowTracks.java | 4 +- .../commands/generic/parent/ParentAdd.java | 2 +- .../generic/parent/ParentAddTemp.java | 2 +- .../commands/generic/parent/ParentClear.java | 4 +- .../generic/parent/ParentClearTrack.java | 4 +- .../commands/generic/parent/ParentInfo.java | 8 +- .../commands/generic/parent/ParentRemove.java | 2 +- .../generic/parent/ParentRemoveTemp.java | 2 +- .../commands/generic/parent/ParentSet.java | 2 +- .../generic/parent/ParentSetTrack.java | 2 +- .../parent/UserSwitchPrimaryGroup.java | 2 +- .../generic/permission/PermissionCheck.java | 5 +- .../permission/PermissionCheckInherits.java | 4 +- .../generic/permission/PermissionClear.java | 4 +- .../generic/permission/PermissionInfo.java | 18 +- .../generic/permission/PermissionSet.java | 2 +- .../generic/permission/PermissionSetTemp.java | 2 +- .../generic/permission/PermissionUnset.java | 2 +- .../permission/PermissionUnsetTemp.java | 2 +- .../common/commands/group/DeleteGroup.java | 2 +- .../common/commands/group/GroupClone.java | 3 +- .../common/commands/group/GroupInfo.java | 4 +- .../commands/group/GroupListMembers.java | 6 +- .../common/commands/group/GroupRename.java | 3 +- .../commands/group/GroupSetDisplayName.java | 2 +- .../common/commands/group/GroupSetWeight.java | 5 +- .../common/commands/log/LogNotify.java | 4 +- .../commands/migration/MigrationUtils.java | 5 +- .../commands/misc/ApplyEditsCommand.java | 17 +- .../common/commands/misc/SearchCommand.java | 9 +- .../common/commands/user/UserClone.java | 3 +- .../common/commands/user/UserInfo.java | 4 +- .../common/commands/user/UserMainCommand.java | 2 +- .../luckperms/common/event/EventFactory.java | 2 +- .../inheritance/InheritanceComparator.java | 2 +- .../common/managers/AbstractManager.java | 2 +- .../luckperms/common/managers/Manager.java | 2 +- .../managers/user/AbstractUserManager.java | 14 +- .../managers/user/StandardUserManager.java | 2 +- .../common/managers/user/UserHousekeeper.java | 2 +- .../common/managers/user/UserManager.java | 2 +- .../lucko/luckperms/common/model/Group.java | 27 +- .../{references => model}/HolderType.java | 4 +- .../{references => model}/Identifiable.java | 2 +- .../lucko/luckperms/common/model/NodeMap.java | 14 +- .../common/model/PermissionHolder.java | 229 +++---------- .../lucko/luckperms/common/model/Track.java | 11 +- .../me/lucko/luckperms/common/model/User.java | 9 - .../{references => model}/UserIdentifier.java | 4 +- .../luckperms/common/model/WeightCache.java | 30 +- .../HeldPermissionComparator.java | 2 +- .../node/{ => comparator}/NodeComparator.java | 2 +- .../NodeWithContextComparator.java | 2 +- .../node/{ => factory}/LegacyNodeFactory.java | 12 +- .../node/{ => factory}/NodeBuilder.java | 11 +- .../node/{ => factory}/NodeFactory.java | 107 +----- .../node/{ => model}/ForwardingNode.java | 32 +- .../{ => model}/ImmutableLocalizedNode.java | 2 +- .../node/{ => model}/ImmutableNode.java | 129 +++---- .../{ => model}/ImmutableTransientNode.java | 2 +- .../NodeDataContainer.java} | 35 +- .../node/{ => model}/NodeHeldPermission.java | 9 +- .../common/node/model/NodeTypes.java | 319 ++++++++++++++++++ .../node/{ => utils}/InheritanceInfo.java | 2 +- .../common/node/{ => utils}/MetaType.java | 2 +- .../common/node/{ => utils}/NodeTools.java | 2 +- .../node/{ => utils}/ShorthandParser.java | 2 +- .../plugin/AbstractLuckPermsPlugin.java | 8 - .../common/plugin/LuckPermsPlugin.java | 8 - .../CachedPrimaryGroupHolder.java | 2 +- .../primarygroup/ParentsByWeightHolder.java | 2 +- .../common/processors/WildcardProcessor.java | 2 +- .../common/references/GroupReference.java | 79 ----- .../common/references/UserReference.java | 79 ----- .../dao/file/AbstractConfigurateDao.java | 67 ++-- .../dao/file/CombinedConfigurateDao.java | 12 +- .../dao/file/SeparatedConfigurateDao.java | 12 +- .../common/storage/dao/mongodb/MongoDao.java | 59 ++-- .../common/storage/dao/sql/SqlDao.java | 65 ++-- .../luckperms/common/tasks/UpdateTask.java | 2 +- .../lucko/luckperms/common/web/WebEditor.java | 12 +- .../calculators/NukkitCalculatorFactory.java | 2 +- .../permissible/LPPermissionAttachment.java | 4 +- .../sponge/managers/SpongeUserManager.java | 2 +- .../processors/SpongeWildcardProcessor.java | 2 +- .../service/calculated/CalculatedSubject.java | 24 +- .../calculated/CalculatedSubjectData.java | 6 +- .../service/internal/HolderSubject.java | 7 +- .../service/internal/HolderSubjectData.java | 25 +- 137 files changed, 1401 insertions(+), 1186 deletions(-) create mode 100644 api/src/main/java/me/lucko/luckperms/api/nodetype/NodeType.java create mode 100644 api/src/main/java/me/lucko/luckperms/api/nodetype/NodeTypeKey.java create mode 100644 api/src/main/java/me/lucko/luckperms/api/nodetype/types/InheritanceType.java create mode 100644 api/src/main/java/me/lucko/luckperms/api/nodetype/types/MetaType.java create mode 100644 api/src/main/java/me/lucko/luckperms/api/nodetype/types/PrefixType.java create mode 100644 api/src/main/java/me/lucko/luckperms/api/nodetype/types/SuffixType.java rename common/src/main/java/me/lucko/luckperms/common/references/HolderReference.java => api/src/main/java/me/lucko/luckperms/api/nodetype/types/WeightType.java (65%) delete mode 100644 common/src/main/java/me/lucko/luckperms/common/caching/handlers/CachedStateManager.java rename common/src/main/java/me/lucko/luckperms/common/{references => model}/HolderType.java (94%) rename common/src/main/java/me/lucko/luckperms/common/{references => model}/Identifiable.java (97%) rename common/src/main/java/me/lucko/luckperms/common/{references => model}/UserIdentifier.java (96%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => comparator}/HeldPermissionComparator.java (97%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => comparator}/NodeComparator.java (97%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => comparator}/NodeWithContextComparator.java (98%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => factory}/LegacyNodeFactory.java (94%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => factory}/NodeBuilder.java (95%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => factory}/NodeFactory.java (74%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => model}/ForwardingNode.java (91%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => model}/ImmutableLocalizedNode.java (98%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => model}/ImmutableNode.java (83%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => model}/ImmutableTransientNode.java (98%) rename common/src/main/java/me/lucko/luckperms/common/node/{NodeModel.java => model/NodeDataContainer.java} (81%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => model}/NodeHeldPermission.java (94%) create mode 100644 common/src/main/java/me/lucko/luckperms/common/node/model/NodeTypes.java rename common/src/main/java/me/lucko/luckperms/common/node/{ => utils}/InheritanceInfo.java (98%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => utils}/MetaType.java (98%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => utils}/NodeTools.java (98%) rename common/src/main/java/me/lucko/luckperms/common/node/{ => utils}/ShorthandParser.java (99%) delete mode 100644 common/src/main/java/me/lucko/luckperms/common/references/GroupReference.java delete mode 100644 common/src/main/java/me/lucko/luckperms/common/references/UserReference.java diff --git a/api/src/main/java/me/lucko/luckperms/api/Node.java b/api/src/main/java/me/lucko/luckperms/api/Node.java index 5da591ec7..67d27210c 100644 --- a/api/src/main/java/me/lucko/luckperms/api/Node.java +++ b/api/src/main/java/me/lucko/luckperms/api/Node.java @@ -28,6 +28,13 @@ package me.lucko.luckperms.api; import com.google.common.base.Preconditions; import me.lucko.luckperms.api.context.ContextSet; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; +import me.lucko.luckperms.api.nodetype.types.InheritanceType; +import me.lucko.luckperms.api.nodetype.types.MetaType; +import me.lucko.luckperms.api.nodetype.types.PrefixType; +import me.lucko.luckperms.api.nodetype.types.SuffixType; +import me.lucko.luckperms.api.nodetype.types.WeightType; import java.util.Date; import java.util.List; @@ -64,7 +71,7 @@ import javax.annotation.concurrent.Immutable; *

* * - *

Nodes can also fall into the following sub categories.

+ *

The 'permission' property of a {@link Node} is also used in some cases to represent state + * beyond a granted permission. This state is encapsulated by extra {@link NodeType} data which + * can be obtained from this instance using {@link #getTypeData(NodeTypeKey)}.

+ * + *

Type data is mapped by {@link NodeTypeKey}s, which are usually stored as static members of the + * corresponding {@link NodeType} class under the KEY field.

+ * + *

The current types are:

*

* * *

The core node state must be immutable in all implementations.

@@ -108,19 +123,7 @@ public interface Node { * * @return the nodes value */ - @Nonnull - default Boolean getValue() { - return getValuePrimitive(); - } - - /** - * Gets the value of the node. - * - *

A negated setting would result in a value of false.

- * - * @return the nodes value - */ - boolean getValuePrimitive(); + boolean getValue(); /** * Gets the value of this node as a {@link Tristate}. @@ -129,18 +132,18 @@ public interface Node { */ @Nonnull default Tristate getTristate() { - return Tristate.fromBoolean(getValuePrimitive()); + return Tristate.fromBoolean(getValue()); } /** * Gets if the node is negated. * - *

This is the inverse of the {@link #getValuePrimitive() value}.

+ *

This is the inverse of the {@link #getValue() value}.

* * @return true if the node is negated */ default boolean isNegated() { - return !getValuePrimitive(); + return !getValue(); } /** @@ -209,7 +212,8 @@ public interface Node { boolean shouldApplyWithContext(@Nonnull ContextSet contextSet); /** - * Resolves any shorthand parts of this node and returns the full list. + * Resolves any shorthand parts of this node and returns the full list of + * resolved nodes. * *

The list will not contain the exact permission itself.

* @@ -219,7 +223,7 @@ public interface Node { List resolveShorthand(); /** - * Gets if this node is temporary (will automatically expire). + * Gets if this node is assigned temporarily. * * @return true if this node will expire in the future */ @@ -291,30 +295,6 @@ public interface Node { @Nonnull ContextSet getFullContexts(); - /** - * Returns if the node is a "standard" permission node. - * - * @return true if this is a regular permission node - * @since 4.2 - */ - boolean isRegularPermissionNode(); - - /** - * Returns if this is a group node. - * - * @return true if this is a group node - */ - boolean isGroupNode(); - - /** - * Gets the name of the group, if this is a group node. - * - * @return the name of the group - * @throws IllegalStateException if this is not a group node. See {@link #isGroupNode()} - */ - @Nonnull - String getGroupName() throws IllegalStateException; - /** * Gets if this node is a wildcard permission. * @@ -325,58 +305,135 @@ public interface Node { /** * Gets the level of this wildcard. * + *

The node luckperms.* has a wildcard level of 1.

+ *

The node luckperms.user.permission.* has a wildcard level of 3.

+ * + *

Nodes with a higher wildcard level are more specific and have priority over + * less specific nodes (nodes with a lower wildcard level).

+ * * @return the wildcard level * @throws IllegalStateException if this is not a wildcard */ int getWildcardLevel() throws IllegalStateException; /** - * Gets if this node is a meta node. + * Gets if this node has any extra {@link NodeType} data attached to it. * - * @return true if this node is a meta node + * @return if this node has any type data + * @since 4.2 */ - boolean isMeta(); + boolean hasTypeData(); /** - * Gets the meta value from this node. + * Gets the type data corresponding to the given key, if present. * - * @return the meta value - * @throws IllegalStateException if this node is not a meta node + * @param key the key + * @param the {@link NodeType} type + * @return the data, if present + * @since 4.2 + */ + Optional getTypeData(NodeTypeKey key); + + /** + * Gets the type data corresponding to the given key, throwing an exception + * if no data is present. + * + * @param key the key + * @param the {@link NodeType} type + * @return the data + * @throws IllegalStateException if data isn't present + * @since 4.2 + */ + default T typeData(NodeTypeKey key) throws IllegalStateException { + return getTypeData(key) + .orElseThrow(() -> + new IllegalStateException("Node '" + getPermission() + "' does not have the '" + key.getTypeName() + "' type.") + ); + } + + /** + * Gets if this node has {@link InheritanceType} type data. + * + * @return true if this is a inheritance (group) node. + */ + default boolean isGroupNode() { + return getTypeData(InheritanceType.KEY).isPresent(); + } + + /** + * Gets the name of the inherited group if this node has {@link InheritanceType} type data, + * throwing an exception if the data is not present. + * + * @return the name of the group + * @throws IllegalStateException if this node doesn't have {@link InheritanceType} data */ @Nonnull - Map.Entry getMeta() throws IllegalStateException; + default String getGroupName() throws IllegalStateException { + return typeData(InheritanceType.KEY).getGroupName(); + } /** - * Gets if this node is a prefix node. + * Gets if this node has {@link MetaType} type data. + * + * @return true if this is a meta node. + */ + default boolean isMeta() { + return getTypeData(MetaType.KEY).isPresent(); + } + + /** + * Gets the meta entry if this node has {@link MetaType} type data, + * throwing an exception if the data is not present. + * + * @return the meta entry + * @throws IllegalStateException if this node doesn't have {@link MetaType} data + */ + @Nonnull + default Map.Entry getMeta() throws IllegalStateException { + return typeData(MetaType.KEY); + } + + /** + * Gets if this node has {@link PrefixType} type data. * * @return true if this node is a prefix node */ - boolean isPrefix(); + default boolean isPrefix() { + return getTypeData(PrefixType.KEY).isPresent(); + } /** - * Gets the prefix value from this node. + * Gets the prefix entry if this node has {@link PrefixType} type data, + * throwing an exception if the data is not present. * - * @return the prefix value - * @throws IllegalStateException if this node is a not a prefix node + * @return the meta entry + * @throws IllegalStateException if this node doesn't have {@link PrefixType} data */ @Nonnull - Map.Entry getPrefix() throws IllegalStateException; + default Map.Entry getPrefix() throws IllegalStateException { + return typeData(PrefixType.KEY).getAsEntry(); + } /** - * Gets if this node is a suffix node. + * Gets if this node has {@link SuffixType} type data. * * @return true if this node is a suffix node */ - boolean isSuffix(); + default boolean isSuffix() { + return getTypeData(SuffixType.KEY).isPresent(); + } /** - * Gets the suffix value from this node. + * Gets the suffix entry if this node has {@link SuffixType} type data, + * throwing an exception if the data is not present. * - * @return the suffix value - * @throws IllegalStateException if this node is a not a suffix node + * @return the meta entry + * @throws IllegalStateException if this node doesn't have {@link SuffixType} data */ @Nonnull - Map.Entry getSuffix() throws IllegalStateException; + default Map.Entry getSuffix() throws IllegalStateException { + return typeData(SuffixType.KEY).getAsEntry(); + } /** * Gets if this Node is equal to another node. diff --git a/api/src/main/java/me/lucko/luckperms/api/nodetype/NodeType.java b/api/src/main/java/me/lucko/luckperms/api/nodetype/NodeType.java new file mode 100644 index 000000000..abfb3d136 --- /dev/null +++ b/api/src/main/java/me/lucko/luckperms/api/nodetype/NodeType.java @@ -0,0 +1,44 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.api.nodetype; + +import me.lucko.luckperms.api.Node; + +/** + * Superinterface for extended {@link Node} types. + * + *

The 'permission' property of a {@link Node} is also used in some cases to represent state + * beyond a granted permission. This state is encapsulated by extra {@link NodeType} data which + * can be obtained from this instance using {@link Node#getTypeData(NodeTypeKey)}.

+ * + *

Type data is mapped by {@link NodeTypeKey}s, which are usually stored as static members of the + * corresponding {@link NodeType} class under the KEY field.

+ * + * @since 4.2 + */ +public interface NodeType { + +} diff --git a/api/src/main/java/me/lucko/luckperms/api/nodetype/NodeTypeKey.java b/api/src/main/java/me/lucko/luckperms/api/nodetype/NodeTypeKey.java new file mode 100644 index 000000000..32f2dedc6 --- /dev/null +++ b/api/src/main/java/me/lucko/luckperms/api/nodetype/NodeTypeKey.java @@ -0,0 +1,56 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.api.nodetype; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import javax.annotation.Nonnull; + +/** + * Marks an instance used as a key for a {@link NodeType}. + * + *

A single instance of this interface is created and stored statically for + * each sub-interface of {@link NodeType}.

+ * + * @param the type of the {@link NodeType} being indexed by this key + * @since 4.2 + */ +public interface NodeTypeKey { + + /** + * Gets the {@link Class#getSimpleName() class name} of the represented type. + * + * @return the name of the represented type + */ + @Nonnull + default String getTypeName() { + ParameterizedType thisType = (ParameterizedType) getClass().getGenericSuperclass(); + Type nodeType = thisType.getActualTypeArguments()[0]; + return ((Class) nodeType).getSimpleName(); + } + +} diff --git a/api/src/main/java/me/lucko/luckperms/api/nodetype/types/InheritanceType.java b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/InheritanceType.java new file mode 100644 index 000000000..8f5ba38d4 --- /dev/null +++ b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/InheritanceType.java @@ -0,0 +1,57 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.api.nodetype.types; + +import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; + +import javax.annotation.Nonnull; + +/** + * A sub-type of {@link Node} used to mark that the holder of the node should inherit + * from another group. + * + * @since 4.2 + */ +public interface InheritanceType extends NodeType { + + /** + * The key for this type. + */ + NodeTypeKey KEY = new NodeTypeKey(){}; + + /** + * Gets the name of the group to be inherited. + * + *

This is no guarantee that this group exists.

+ * + * @return the name of the group + */ + @Nonnull + String getGroupName(); + +} diff --git a/api/src/main/java/me/lucko/luckperms/api/nodetype/types/MetaType.java b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/MetaType.java new file mode 100644 index 000000000..0f9c094c4 --- /dev/null +++ b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/MetaType.java @@ -0,0 +1,69 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.api.nodetype.types; + +import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; + +import java.util.Map; + +import javax.annotation.Nonnull; + +/** + * A sub-type of {@link Node} used to store meta assignments. + * + * @since 4.2 + */ +public interface MetaType extends NodeType, Map.Entry { + + /** + * The key for this type. + */ + NodeTypeKey KEY = new NodeTypeKey(){}; + + /** + * Gets the meta key. + * + * @return the meta key + */ + @Nonnull + String getKey(); + + /** + * Gets the meta value. + * + * @return the meta value + */ + @Nonnull + String getValue(); + + @Override + @Deprecated + default String setValue(String value) { + throw new UnsupportedOperationException(); + } +} diff --git a/api/src/main/java/me/lucko/luckperms/api/nodetype/types/PrefixType.java b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/PrefixType.java new file mode 100644 index 000000000..c3a052dc5 --- /dev/null +++ b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/PrefixType.java @@ -0,0 +1,71 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.api.nodetype.types; + +import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; + +import java.util.Map; + +import javax.annotation.Nonnull; + +/** + * A sub-type of {@link Node} used to store prefix assignments. + * + * @since 4.2 + */ +public interface PrefixType extends NodeType { + + /** + * The key for this type. + */ + NodeTypeKey KEY = new NodeTypeKey(){}; + + /** + * Gets the priority of the prefix assignment. + * + * @return the priority + */ + int getPriority(); + + /** + * Gets the actual prefix string. + * + * @return the prefix + */ + @Nonnull + String getPrefix(); + + /** + * Gets a representation of this instance as a {@link Map.Entry}. + * + * @return a map entry representation of the priority and prefix string + */ + @Nonnull + Map.Entry getAsEntry(); + +} diff --git a/api/src/main/java/me/lucko/luckperms/api/nodetype/types/SuffixType.java b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/SuffixType.java new file mode 100644 index 000000000..3a5b71879 --- /dev/null +++ b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/SuffixType.java @@ -0,0 +1,71 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.api.nodetype.types; + +import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; + +import java.util.Map; + +import javax.annotation.Nonnull; + +/** + * A sub-type of {@link Node} used to store suffix assignments. + * + * @since 4.2 + */ +public interface SuffixType extends NodeType { + + /** + * The key for this type. + */ + NodeTypeKey KEY = new NodeTypeKey(){}; + + /** + * Gets the priority of the suffix assignment. + * + * @return the priority + */ + int getPriority(); + + /** + * Gets the actual suffix string. + * + * @return the suffix + */ + @Nonnull + String getSuffix(); + + /** + * Gets a representation of this instance as a {@link Map.Entry}. + * + * @return a map entry representation of the priority and suffix string + */ + @Nonnull + Map.Entry getAsEntry(); + +} diff --git a/common/src/main/java/me/lucko/luckperms/common/references/HolderReference.java b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/WeightType.java similarity index 65% rename from common/src/main/java/me/lucko/luckperms/common/references/HolderReference.java rename to api/src/main/java/me/lucko/luckperms/api/nodetype/types/WeightType.java index 834d01e4a..b4f781922 100644 --- a/common/src/main/java/me/lucko/luckperms/common/references/HolderReference.java +++ b/api/src/main/java/me/lucko/luckperms/api/nodetype/types/WeightType.java @@ -23,34 +23,29 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.references; +package me.lucko.luckperms.api.nodetype.types; -import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.plugin.LuckPermsPlugin; - -import java.util.function.Consumer; +import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; /** - * A reference to a specific {@link PermissionHolder}. + * A sub-type of {@link Node} used to mark the weight of the node's holder. * - * @param the holder type - * @param the holder identifier type + * @since 4.2 */ -public interface HolderReference extends Identifiable { +public interface WeightType extends NodeType { /** - * Gets the holder type - * - * @return the holder type + * The key for this type. */ - HolderType getType(); + NodeTypeKey KEY = new NodeTypeKey(){}; /** - * Applies an action to this reference, if it is present and exists. + * Gets the weight value. * - * @param plugin the plugin - * @param consumer the action + * @return the weight */ - void apply(LuckPermsPlugin plugin, Consumer consumer); + int getWeight(); } diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java index 07755aee2..55e3ef2a0 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java @@ -36,11 +36,11 @@ import me.lucko.luckperms.common.calculators.AbstractCalculatorFactory; import me.lucko.luckperms.common.calculators.PermissionCalculator; import me.lucko.luckperms.common.calculators.PermissionCalculatorMetadata; import me.lucko.luckperms.common.config.ConfigKeys; +import me.lucko.luckperms.common.model.HolderType; import me.lucko.luckperms.common.processors.MapProcessor; import me.lucko.luckperms.common.processors.PermissionProcessor; import me.lucko.luckperms.common.processors.RegexProcessor; import me.lucko.luckperms.common.processors.WildcardProcessor; -import me.lucko.luckperms.common.references.HolderType; public class BukkitCalculatorFactory extends AbstractCalculatorFactory { private final LPBukkitPlugin plugin; diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationBPermissions.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationBPermissions.java index 7669851a3..a0e09b493 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationBPermissions.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationBPermissions.java @@ -42,7 +42,8 @@ import me.lucko.luckperms.common.logging.ProgressLogger; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Iterators; @@ -212,7 +213,7 @@ public class MigrationBPermissions extends SubCommand { continue; } - if (meta.getKey().equalsIgnoreCase(NodeFactory.PREFIX_KEY) || meta.getKey().equalsIgnoreCase(NodeFactory.SUFFIX_KEY)) { + if (meta.getKey().equalsIgnoreCase(NodeTypes.PREFIX_KEY) || meta.getKey().equalsIgnoreCase(NodeTypes.SUFFIX_KEY)) { ChatMetaType type = ChatMetaType.valueOf(meta.getKey().toUpperCase()); holder.setPermission(NodeFactory.buildChatMetaNode(type, c.getPriority(), meta.getValue()).setWorld(world.getName()).build()); continue; diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationGroupManager.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationGroupManager.java index cb584a3cd..67ef7276c 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationGroupManager.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationGroupManager.java @@ -37,9 +37,10 @@ import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.logging.ProgressLogger; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.model.UserIdentifier; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Iterators; import me.lucko.luckperms.common.utils.Predicates; @@ -149,7 +150,7 @@ public class MigrationGroupManager extends SubCommand { if (key.isEmpty() || value.isEmpty()) continue; if (key.equals("build")) continue; - if (key.equals(NodeFactory.PREFIX_KEY) || key.equals(NodeFactory.SUFFIX_KEY)) { + if (key.equals(NodeTypes.PREFIX_KEY) || key.equals(NodeTypes.SUFFIX_KEY)) { ChatMetaType type = ChatMetaType.valueOf(key.toUpperCase()); groups.get(groupName).add(NodeFactory.buildChatMetaNode(type, 50, value).setWorld(worldMappingFunc.apply(world)).build()); } else { @@ -201,7 +202,7 @@ public class MigrationGroupManager extends SubCommand { if (key.isEmpty() || value.isEmpty()) continue; if (key.equals("build")) continue; - if (key.equals(NodeFactory.PREFIX_KEY) || key.equals(NodeFactory.SUFFIX_KEY)) { + if (key.equals(NodeTypes.PREFIX_KEY) || key.equals(NodeTypes.SUFFIX_KEY)) { ChatMetaType type = ChatMetaType.valueOf(key.toUpperCase()); users.get(id).add(NodeFactory.buildChatMetaNode(type, 100, value).setWorld(worldMappingFunc.apply(world)).build()); } else { diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsBukkit.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsBukkit.java index ef888f6bd..306639cc3 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsBukkit.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsBukkit.java @@ -38,7 +38,7 @@ import me.lucko.luckperms.common.logging.ProgressLogger; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Iterators; diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsEx.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsEx.java index 63d0e4f26..af9d26f80 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsEx.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPermissionsEx.java @@ -39,7 +39,8 @@ import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Iterators; @@ -288,9 +289,9 @@ public class MigrationPermissionsEx extends SubCommand { } String key = opt.getKey().toLowerCase(); - boolean ignore = key.equals(NodeFactory.PREFIX_KEY) || - key.equals(NodeFactory.SUFFIX_KEY) || - key.equals(NodeFactory.WEIGHT_KEY) || + boolean ignore = key.equals(NodeTypes.PREFIX_KEY) || + key.equals(NodeTypes.SUFFIX_KEY) || + key.equals(NodeTypes.WEIGHT_KEY) || key.equals("rank") || key.equals("rank-ladder") || key.equals("name") || diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPowerfulPerms.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPowerfulPerms.java index 4b9c66ff8..c4103d5f4 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPowerfulPerms.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationPowerfulPerms.java @@ -44,7 +44,7 @@ import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.logging.ProgressLogger; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.storage.StorageType; diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationZPermissions.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationZPermissions.java index e4e4723bc..13e886c73 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationZPermissions.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/migration/MigrationZPermissions.java @@ -39,7 +39,8 @@ import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Iterators; @@ -218,7 +219,7 @@ public class MigrationZPermissions extends SubCommand { String valueString = value.toString(); if (valueString.isEmpty()) continue; - if (key.equals(NodeFactory.PREFIX_KEY) || key.equals(NodeFactory.SUFFIX_KEY)) { + if (key.equals(NodeTypes.PREFIX_KEY) || key.equals(NodeTypes.SUFFIX_KEY)) { ChatMetaType type = ChatMetaType.valueOf(key.toUpperCase()); holder.setPermission(NodeFactory.buildChatMetaNode(type, weight, valueString).build()); } else { diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/permissible/LPPermissionAttachment.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/permissible/LPPermissionAttachment.java index 11dcd3d89..e31cf8887 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/permissible/LPPermissionAttachment.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/permissible/LPPermissionAttachment.java @@ -31,8 +31,8 @@ import me.lucko.luckperms.api.Node; import me.lucko.luckperms.bukkit.model.dummy.DummyPlugin; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.ImmutableTransientNode; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.ImmutableTransientNode; import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionRemovedExecutor; diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java index 7e5e4eda4..eef205c78 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java @@ -39,7 +39,8 @@ import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import net.milkbowl.vault.chat.Chat; @@ -318,7 +319,7 @@ public class VaultChatHook extends AbstractVaultChat { } Node.Builder metaNode; - if (key.equalsIgnoreCase(NodeFactory.PREFIX_KEY) || key.equalsIgnoreCase(NodeFactory.SUFFIX_KEY)) { + if (key.equalsIgnoreCase(NodeTypes.PREFIX_KEY) || key.equalsIgnoreCase(NodeTypes.SUFFIX_KEY)) { metaNode = NodeFactory.buildChatMetaNode(ChatMetaType.valueOf(key.toUpperCase()), 100, value.toString()); } else { metaNode = NodeFactory.buildMetaNode(key, value.toString()); diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java index b560701e2..23ab529aa 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java @@ -39,7 +39,7 @@ import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.verbose.CheckOrigin; import net.milkbowl.vault.permission.Permission; @@ -210,7 +210,7 @@ public class VaultPermissionHook extends AbstractVaultPermission { ContextSet contexts = contextForLookup(user, world).getContexts(); - String[] ret = user.getEnduringNodes().values().stream() + String[] ret = user.enduringData().immutable().values().stream() .filter(Node::isGroupNode) .filter(n -> n.shouldApplyWithContext(contexts)) .map(n -> { diff --git a/bungee/src/main/java/me/lucko/luckperms/bungee/migration/MigrationBungeePerms.java b/bungee/src/main/java/me/lucko/luckperms/bungee/migration/MigrationBungeePerms.java index 26774be2f..91a4e404a 100644 --- a/bungee/src/main/java/me/lucko/luckperms/bungee/migration/MigrationBungeePerms.java +++ b/bungee/src/main/java/me/lucko/luckperms/bungee/migration/MigrationBungeePerms.java @@ -34,7 +34,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.logging.ProgressLogger; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Iterators; diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java index 168d77467..8282bf707 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java @@ -31,7 +31,7 @@ import me.lucko.luckperms.common.api.ApiUtils; import me.lucko.luckperms.common.api.delegates.model.ApiGroup; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.utils.ImmutableCollectors; diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java index c1526a600..0224baa59 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java @@ -29,8 +29,8 @@ import me.lucko.luckperms.common.api.ApiUtils; import me.lucko.luckperms.common.api.delegates.model.ApiUser; import me.lucko.luckperms.common.managers.user.UserManager; import me.lucko.luckperms.common.model.User; +import me.lucko.luckperms.common.model.UserIdentifier; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import me.lucko.luckperms.common.utils.ImmutableCollectors; import java.util.Objects; diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java index bc457ea9f..266804df2 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java @@ -29,7 +29,7 @@ import me.lucko.luckperms.api.ChatMetaType; import me.lucko.luckperms.api.Group; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.common.api.delegates.model.ApiGroup; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import java.util.Objects; diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java index 589f7723d..137f6c4f1 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java @@ -36,6 +36,7 @@ import me.lucko.luckperms.api.DataMutateResult; import me.lucko.luckperms.api.LocalizedNode; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.NodeEqualityPredicate; +import me.lucko.luckperms.api.StandardNodeEquality; import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.api.caching.CachedData; import me.lucko.luckperms.api.context.ContextSet; @@ -44,14 +45,18 @@ import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.MetaType; +import me.lucko.luckperms.common.node.comparator.NodeWithContextComparator; +import me.lucko.luckperms.common.node.utils.MetaType; +import me.lucko.luckperms.common.node.utils.NodeTools; import me.lucko.luckperms.common.utils.ImmutableCollectors; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.SortedSet; +import java.util.TreeSet; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; @@ -99,13 +104,13 @@ public class ApiPermissionHolder implements me.lucko.luckperms.api.PermissionHol @Nonnull @Override public ImmutableSetMultimap getNodes() { - return this.handle.getEnduringNodes(); + return this.handle.enduringData().immutable(); } @Nonnull @Override public ImmutableSetMultimap getTransientNodes() { - return this.handle.getTransientNodes(); + return this.handle.transientData().immutable(); } @Nonnull @@ -123,33 +128,55 @@ public class ApiPermissionHolder implements me.lucko.luckperms.api.PermissionHol @Nonnull @Override public Set getEnduringPermissions() { - return ImmutableSet.copyOf(this.handle.getEnduringNodes().values()); + return ImmutableSet.copyOf(this.handle.enduringData().immutable().values()); } @Nonnull @Override public Set getTransientPermissions() { - return ImmutableSet.copyOf(this.handle.getTransientNodes().values()); + return ImmutableSet.copyOf(this.handle.transientData().immutable().values()); } @Nonnull @Override public SortedSet getAllNodes(@Nonnull Contexts contexts) { Objects.requireNonNull(contexts, "contexts"); - return ImmutableSortedSet.copyOfSorted(this.handle.resolveInheritancesAlmostEqual(contexts)); + + List nodes = new LinkedList<>(); + this.handle.accumulateInheritancesTo(nodes, contexts); + NodeTools.removeEqual(nodes.iterator(), StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); + + SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); + ret.addAll(nodes); + + return ImmutableSortedSet.copyOfSorted(ret); } @Nonnull @Override public SortedSet getAllNodes() { - return ImmutableSortedSet.copyOfSorted(this.handle.resolveInheritancesAlmostEqual()); + List nodes = new LinkedList<>(); + this.handle.accumulateInheritancesTo(nodes); + NodeTools.removeEqual(nodes.iterator(), StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); + + SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); + ret.addAll(nodes); + + return ImmutableSortedSet.copyOfSorted(ret); } @Nonnull @Override public Set getAllNodesFiltered(@Nonnull Contexts contexts) { Objects.requireNonNull(contexts, "contexts"); - return ImmutableSet.copyOf(this.handle.getAllNodes(contexts)); + + List entries = this.handle.getAllEntries(contexts); + + NodeTools.removeSamePermission(entries.iterator()); + SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); + ret.addAll(entries); + + return ImmutableSet.copyOf(ret); } @Nonnull @@ -187,21 +214,21 @@ public class ApiPermissionHolder implements me.lucko.luckperms.api.PermissionHol @Override public Tristate hasPermission(@Nonnull Node node) { Objects.requireNonNull(node, "node"); - return this.handle.hasPermission(NodeMapType.ENDURING, node); + return this.handle.hasPermission(NodeMapType.ENDURING, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); } @Nonnull @Override public Tristate hasTransientPermission(@Nonnull Node node) { Objects.requireNonNull(node, "node"); - return this.handle.hasPermission(NodeMapType.TRANSIENT, node); + return this.handle.hasPermission(NodeMapType.TRANSIENT, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); } @Nonnull @Override public Tristate inheritsPermission(@Nonnull Node node) { Objects.requireNonNull(node, "node"); - return this.handle.inheritsPermission(node); + return this.handle.inheritsPermission(node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java index 1a41f9924..08da96c8e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java @@ -33,7 +33,7 @@ import me.lucko.luckperms.api.Track; import me.lucko.luckperms.api.User; import me.lucko.luckperms.api.event.cause.CreationCause; import me.lucko.luckperms.api.event.cause.DeletionCause; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.storage.Storage; diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiUser.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiUser.java index 504d84a08..9300dbdd5 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiUser.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiUser.java @@ -28,9 +28,11 @@ package me.lucko.luckperms.common.api.delegates.model; import com.google.common.base.Preconditions; import me.lucko.luckperms.api.DataMutateResult; +import me.lucko.luckperms.api.StandardNodeEquality; import me.lucko.luckperms.api.caching.UserData; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import java.util.Objects; import java.util.UUID; @@ -80,7 +82,7 @@ public final class ApiUser extends ApiPermissionHolder implements me.lucko.luckp return DataMutateResult.ALREADY_HAS; } - if (!this.handle.hasPermission(NodeFactory.buildGroupNode(group.toLowerCase()).build()).asBoolean()) { + if (!this.handle.hasPermission(NodeMapType.ENDURING, NodeFactory.buildGroupNode(group.toLowerCase()).build(), StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE).asBoolean()) { return DataMutateResult.FAIL; } diff --git a/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentExpression.java b/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentExpression.java index 9719efffd..f81844a83 100644 --- a/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentExpression.java +++ b/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentExpression.java @@ -30,8 +30,9 @@ import com.google.common.collect.ImmutableList; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.StandardNodeEquality; import me.lucko.luckperms.api.Tristate; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.LegacyNodeFactory; +import me.lucko.luckperms.common.node.factory.LegacyNodeFactory; import me.lucko.luckperms.common.utils.Scripting; import java.util.List; @@ -61,7 +62,7 @@ public class AssignmentExpression { throw new NullPointerException("script engine"); } - Predicate checker = node -> holder.hasPermission(node, StandardNodeEquality.IGNORE_VALUE_OR_IF_TEMPORARY) == tristate; + Predicate checker = node -> holder.hasPermission(NodeMapType.ENDURING, node, StandardNodeEquality.IGNORE_VALUE_OR_IF_TEMPORARY) == tristate; String exp = this.expression.stream().map(t -> t.forExpression(checker)).collect(Collectors.joining()) .replace("&", "&&").replace("|", "||"); diff --git a/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentRule.java b/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentRule.java index 36d9a1e6f..c19a23310 100644 --- a/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentRule.java +++ b/common/src/main/java/me/lucko/luckperms/common/assignments/AssignmentRule.java @@ -28,7 +28,7 @@ package me.lucko.luckperms.common.assignments; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.LegacyNodeFactory; +import me.lucko.luckperms.common.node.factory.LegacyNodeFactory; import me.lucko.luckperms.common.utils.ImmutableCollectors; import java.util.List; diff --git a/common/src/main/java/me/lucko/luckperms/common/backup/Exporter.java b/common/src/main/java/me/lucko/luckperms/common/backup/Exporter.java index 9036ad68e..c8380b556 100644 --- a/common/src/main/java/me/lucko/luckperms/common/backup/Exporter.java +++ b/common/src/main/java/me/lucko/luckperms/common/backup/Exporter.java @@ -29,11 +29,11 @@ import me.lucko.luckperms.api.Node; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.logging.ProgressLogger; import me.lucko.luckperms.common.model.Group; +import me.lucko.luckperms.common.model.HolderType; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.HolderType; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.storage.Storage; @@ -127,7 +127,7 @@ public class Exporter implements Runnable { } write(writer, "# Export group: " + group.getName()); - for (Node node : group.getEnduringNodes().values()) { + for (Node node : group.enduringData().immutable().values()) { write(writer, "/lp " + NodeFactory.nodeAsCommand(node, group.getName(), HolderType.GROUP, true)); } write(writer, ""); @@ -217,7 +217,7 @@ public class Exporter implements Runnable { output.add("# Export user: " + user.getUuid().toString() + " - " + user.getName().orElse("unknown username")); boolean inDefault = false; - for (Node node : user.getEnduringNodes().values()) { + for (Node node : user.enduringData().immutable().values()) { if (node.isGroupNode() && node.getGroupName().equalsIgnoreCase(NodeFactory.DEFAULT_GROUP_NAME)) { inDefault = true; continue; @@ -242,7 +242,7 @@ public class Exporter implements Runnable { } // all of the threads have been scheduled now and are running. we just need to wait for them all to complete - CompletableFuture overallFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])); + CompletableFuture overallFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); while (true) { try { diff --git a/common/src/main/java/me/lucko/luckperms/common/backup/Importer.java b/common/src/main/java/me/lucko/luckperms/common/backup/Importer.java index 4b1817195..3d07cc120 100644 --- a/common/src/main/java/me/lucko/luckperms/common/backup/Importer.java +++ b/common/src/main/java/me/lucko/luckperms/common/backup/Importer.java @@ -142,7 +142,7 @@ public class Importer implements Runnable { } // all of the threads have been scheduled now and are running. we just need to wait for them all to complete - CompletableFuture overallFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])); + CompletableFuture overallFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); this.notify.forEach(s -> Message.IMPORT_INFO.send(s, "All commands have been processed and scheduled - now waiting for the execution to complete.")); diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java index 394132eaa..d545a2f37 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java @@ -27,7 +27,7 @@ package me.lucko.luckperms.common.bulkupdate; import me.lucko.luckperms.common.bulkupdate.action.Action; import me.lucko.luckperms.common.bulkupdate.constraint.Constraint; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; import java.util.List; import java.util.Objects; @@ -59,7 +59,7 @@ public final class BulkUpdate { * @param node the node to check * @return true if satisfied */ - public boolean satisfiesConstraints(NodeModel node) { + public boolean satisfiesConstraints(NodeDataContainer node) { for (Constraint constraint : this.constraints) { if (!constraint.isSatisfiedBy(node)) { return false; @@ -74,7 +74,7 @@ public final class BulkUpdate { * @param from the node to base changes from * @return the new nodemodel instance, or null if the node should be deleted. */ - public NodeModel apply(NodeModel from) { + public NodeDataContainer apply(NodeDataContainer from) { if (!satisfiesConstraints(from)) { return from; // make no change } diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/Action.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/Action.java index eca6182d1..038f5bb2f 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/Action.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/Action.java @@ -25,7 +25,7 @@ package me.lucko.luckperms.common.bulkupdate.action; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; /** * Represents an action to be applied to a given node. @@ -45,7 +45,7 @@ public interface Action { * @param from the node to base changes from * @return the new nodemodel instance, or null if the node should be deleted. */ - NodeModel apply(NodeModel from); + NodeDataContainer apply(NodeDataContainer from); /** * Gets this action in SQL form. diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/DeleteAction.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/DeleteAction.java index 350854d04..97c1a4155 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/DeleteAction.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/DeleteAction.java @@ -25,7 +25,7 @@ package me.lucko.luckperms.common.bulkupdate.action; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; public class DeleteAction implements Action { @@ -42,7 +42,7 @@ public class DeleteAction implements Action { } @Override - public NodeModel apply(NodeModel from) { + public NodeDataContainer apply(NodeDataContainer from) { return null; // this action just deletes nodes, so return null } diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java index b4f73484a..0db5718e8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java @@ -27,7 +27,7 @@ package me.lucko.luckperms.common.bulkupdate.action; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; import me.lucko.luckperms.common.bulkupdate.constraint.QueryField; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; public class UpdateAction implements Action { @@ -52,7 +52,7 @@ public class UpdateAction implements Action { } @Override - public NodeModel apply(NodeModel from) { + public NodeDataContainer apply(NodeDataContainer from) { switch (this.field) { case PERMISSION: return from.setPermission(this.value); diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/Constraint.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/Constraint.java index 8427f6b6d..bcf960508 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/Constraint.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/Constraint.java @@ -27,7 +27,7 @@ package me.lucko.luckperms.common.bulkupdate.constraint; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; import me.lucko.luckperms.common.bulkupdate.comparisons.Comparison; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; /** * Represents a query constraint @@ -59,7 +59,7 @@ public class Constraint { * @param node the node * @return true if satisfied */ - public boolean isSatisfiedBy(NodeModel node) { + public boolean isSatisfiedBy(NodeDataContainer node) { switch (this.field) { case PERMISSION: return this.comparison.matches(node.getPermission(), this.value); diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/GroupCachedData.java b/common/src/main/java/me/lucko/luckperms/common/caching/GroupCachedData.java index 27b91aa4a..0e0099d6d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/GroupCachedData.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/GroupCachedData.java @@ -29,7 +29,7 @@ import me.lucko.luckperms.api.Contexts; import me.lucko.luckperms.api.caching.GroupData; import me.lucko.luckperms.common.calculators.PermissionCalculatorMetadata; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.references.HolderType; +import me.lucko.luckperms.common.model.HolderType; /** * Holds an easily accessible cache of a groups's data in a number of contexts diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/UserCachedData.java b/common/src/main/java/me/lucko/luckperms/common/caching/UserCachedData.java index a0849b505..52437af35 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/UserCachedData.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/UserCachedData.java @@ -28,8 +28,8 @@ package me.lucko.luckperms.common.caching; import me.lucko.luckperms.api.Contexts; import me.lucko.luckperms.api.caching.UserData; import me.lucko.luckperms.common.calculators.PermissionCalculatorMetadata; +import me.lucko.luckperms.common.model.HolderType; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.references.HolderType; /** * Holds an easily accessible cache of a user's data in a number of contexts 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 deleted file mode 100644 index f0399399e..000000000 --- a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/CachedStateManager.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is part of LuckPerms, licensed under the MIT License. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package me.lucko.luckperms.common.caching.handlers; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - -import me.lucko.luckperms.common.references.HolderReference; - -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.locks.ReentrantLock; - -/** - * Manages the cached state of all permission holders - */ -public class CachedStateManager { - - // Group --> Groups/Users that inherit from that group. (reverse relationship) - private final Multimap map = HashMultimap.create(); - private final ReentrantLock lock = new ReentrantLock(); - - /** - * Gets a set of holder names that inherit permissions (either directly or via other groups) - * from the given holder name - * - * @param holder the holder name to query for - * @return a set of inherited groups - */ - public Set getInheritances(HolderReference holder) { - Set set = new HashSet<>(); - set.add(holder); - - this.lock.lock(); - try { - while (true) { - Set clone = new HashSet<>(set); - - boolean work = false; - - for (HolderReference s : clone) { - if (set.addAll(this.map.get(s))) { - work = true; - } - } - - if (!work) { - break; - } - } - } finally { - this.lock.unlock(); - } - - set.remove(holder); - return set; - } - - /** - * Registers a holder and the groups they inherit from within this map. - * - * @param holder the holder to add - * @param inheritedGroups a list of groups the holder inherits from - */ - public void putAll(HolderReference holder, Set inheritedGroups) { - this.lock.lock(); - try { - this.map.entries().removeIf(entry -> entry.getValue().equals(holder)); - - for (HolderReference child : inheritedGroups) { - this.map.put(child, holder); - } - } finally { - this.lock.unlock(); - } - } - - /** - * Clears defined inheritances for the given holder name. - * - * @param holder the holder name to clear - */ - public void clear(HolderReference holder) { - this.lock.lock(); - try { - this.map.entries().removeIf(entry -> entry.getValue().equals(holder)); - } finally { - this.lock.unlock(); - } - } - -} diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/type/MetaAccumulator.java b/common/src/main/java/me/lucko/luckperms/common/caching/type/MetaAccumulator.java index 49372d2e4..2b3c36a4f 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/type/MetaAccumulator.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/type/MetaAccumulator.java @@ -30,10 +30,13 @@ import com.google.common.collect.ListMultimap; import me.lucko.luckperms.api.ChatMetaType; import me.lucko.luckperms.api.LocalizedNode; +import me.lucko.luckperms.api.nodetype.types.MetaType; +import me.lucko.luckperms.api.nodetype.types.PrefixType; +import me.lucko.luckperms.api.nodetype.types.SuffixType; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.metastacking.MetaStack; import me.lucko.luckperms.common.metastacking.SimpleMetaStack; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import java.util.Comparator; @@ -73,22 +76,19 @@ public class MetaAccumulator { } public void accumulateNode(LocalizedNode n) { - if (n.isMeta()) { - Map.Entry entry = n.getMeta(); - this.meta.put(entry.getKey(), entry.getValue()); - } + n.getTypeData(MetaType.KEY).ifPresent(metaType -> + this.meta.put(metaType.getKey(), metaType.getValue()) + ); - if (n.isPrefix()) { - Map.Entry value = n.getPrefix(); - this.prefixes.putIfAbsent(value.getKey(), value.getValue()); + n.getTypeData(PrefixType.KEY).ifPresent(prefix -> { + this.prefixes.putIfAbsent(prefix.getPriority(), prefix.getPrefix()); this.prefixStack.accumulateToAll(n); - } + }); - if (n.isSuffix()) { - Map.Entry value = n.getSuffix(); - this.suffixes.putIfAbsent(value.getKey(), value.getValue()); + n.getTypeData(SuffixType.KEY).ifPresent(suffix -> { + this.suffixes.putIfAbsent(suffix.getPriority(), suffix.getSuffix()); this.suffixStack.accumulateToAll(n); - } + }); } public void accumulateMeta(String key, String value) { @@ -103,8 +103,8 @@ public class MetaAccumulator { // (it's not going to accumulate more nodes) // Therefore, it should be ok to set the weight meta key, if not already present. public ListMultimap getMeta() { - if (!this.meta.containsKey(NodeFactory.WEIGHT_KEY) && this.weight != 0) { - this.meta.put(NodeFactory.WEIGHT_KEY, String.valueOf(this.weight)); + if (!this.meta.containsKey(NodeTypes.WEIGHT_KEY) && this.weight != 0) { + this.meta.put(NodeTypes.WEIGHT_KEY, String.valueOf(this.weight)); } return this.meta; diff --git a/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java b/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java index 51b0a2f13..6d7fdb4cf 100644 --- a/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java +++ b/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java @@ -26,7 +26,7 @@ package me.lucko.luckperms.common.calculators; import me.lucko.luckperms.api.context.ContextSet; -import me.lucko.luckperms.common.references.HolderType; +import me.lucko.luckperms.common.model.HolderType; /** * Metadata about a given {@link PermissionCalculator}. diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddChatMeta.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddChatMeta.java index 345985423..6b33152d0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddChatMeta.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddChatMeta.java @@ -42,7 +42,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddTempChatMeta.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddTempChatMeta.java index 681c09430..3391da003 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddTempChatMeta.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaAddTempChatMeta.java @@ -45,7 +45,7 @@ import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.TemporaryModifier; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.DurationFormatter; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaClear.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaClear.java index 41546c2ab..80834ef0f 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaClear.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaClear.java @@ -39,8 +39,8 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.MetaType; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; +import me.lucko.luckperms.common.node.utils.MetaType; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; @@ -68,13 +68,13 @@ public class MetaClear extends SharedSubCommand { if (typeId.equals("chat") || typeId.equals("chatmeta")) { type = MetaType.CHAT; } - if (typeId.equals(NodeFactory.META_KEY)) { + if (typeId.equals(NodeTypes.META_KEY)) { type = MetaType.META; } - if (typeId.equals(NodeFactory.PREFIX_KEY) || typeId.equals("prefixes")) { + if (typeId.equals(NodeTypes.PREFIX_KEY) || typeId.equals("prefixes")) { type = MetaType.PREFIX; } - if (typeId.equals(NodeFactory.SUFFIX_KEY) || typeId.equals("suffixes")) { + if (typeId.equals(NodeTypes.SUFFIX_KEY) || typeId.equals("suffixes")) { type = MetaType.SUFFIX; } @@ -87,7 +87,7 @@ public class MetaClear extends SharedSubCommand { type = MetaType.ANY; } - int before = holder.getEnduringNodes().size(); + int before = holder.enduringData().immutable().size(); MutableContextSet context = ArgumentParser.parseContext(0, args, plugin); @@ -102,7 +102,7 @@ public class MetaClear extends SharedSubCommand { holder.clearMeta(type, context); } - int changed = before - holder.getEnduringNodes().size(); + int changed = before - holder.enduringData().immutable().size(); if (changed == 1) { Message.META_CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), type.name().toLowerCase(), MessageUtils.contextSetToString(context), changed); } else { diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaInfo.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaInfo.java index c6a31ebd3..4b299acbb 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaInfo.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaInfo.java @@ -40,8 +40,8 @@ import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeWithContextComparator; +import me.lucko.luckperms.common.node.comparator.NodeWithContextComparator; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveChatMeta.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveChatMeta.java index 2542867a5..a7f759264 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveChatMeta.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveChatMeta.java @@ -42,7 +42,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveTempChatMeta.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveTempChatMeta.java index 2a30b2019..79cf8a734 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveTempChatMeta.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaRemoveTempChatMeta.java @@ -42,7 +42,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSet.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSet.java index 73abc0db3..dcad6c3e8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSet.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSet.java @@ -26,6 +26,7 @@ package me.lucko.luckperms.common.commands.generic.meta; import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.StandardNodeEquality; import me.lucko.luckperms.api.context.MutableContextSet; import me.lucko.luckperms.common.actionlog.ExtendedLogEntry; import me.lucko.luckperms.common.command.CommandResult; @@ -39,8 +40,9 @@ import me.lucko.luckperms.common.command.utils.StorageAssistant; import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; @@ -79,7 +81,7 @@ public class MetaSet extends SharedSubCommand { Node n = NodeFactory.buildMetaNode(key, value).withExtraContext(context).build(); - if (holder.hasPermission(n).asBoolean()) { + if (holder.hasPermission(NodeMapType.ENDURING, n, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE).asBoolean()) { Message.ALREADY_HAS_META.send(sender, holder.getFriendlyName(), key, value, MessageUtils.contextSetToString(context)); return CommandResult.STATE_ERROR; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTemp.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTemp.java index 47a6e2fb0..30726b7a6 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTemp.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/meta/MetaSetTemp.java @@ -26,6 +26,7 @@ package me.lucko.luckperms.common.commands.generic.meta; import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.StandardNodeEquality; import me.lucko.luckperms.api.context.MutableContextSet; import me.lucko.luckperms.common.actionlog.ExtendedLogEntry; import me.lucko.luckperms.common.command.CommandManager; @@ -41,9 +42,10 @@ import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.TemporaryModifier; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.DurationFormatter; @@ -85,7 +87,7 @@ public class MetaSetTemp extends SharedSubCommand { Node n = NodeFactory.buildMetaNode(key, value).withExtraContext(context).setExpiry(duration).build(); - if (holder.hasPermission(n).asBoolean()) { + if (holder.hasPermission(NodeMapType.ENDURING, n, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE).asBoolean()) { Message.ALREADY_HAS_TEMP_META.send(sender, holder.getFriendlyName(), key, value, MessageUtils.contextSetToString(context)); return CommandResult.STATE_ERROR; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderClear.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderClear.java index 10c790e14..88a221a27 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderClear.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderClear.java @@ -57,7 +57,7 @@ public class HolderClear extends SubCommand { return CommandResult.NO_PERMISSION; } - int before = holder.getEnduringNodes().size(); + int before = holder.enduringData().immutable().size(); MutableContextSet context = ArgumentParser.parseContext(0, args, plugin); @@ -72,7 +72,7 @@ public class HolderClear extends SubCommand { holder.clearNodes(context); } - int changed = before - holder.getEnduringNodes().size(); + int changed = before - holder.enduringData().immutable().size(); if (changed == 1) { Message.CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), MessageUtils.contextSetToString(context), changed); } else { diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderShowTracks.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderShowTracks.java index 218bcbd38..0e8f29942 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderShowTracks.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/other/HolderShowTracks.java @@ -73,9 +73,9 @@ public class HolderShowTracks extends SubCommand if (holder.getType().isUser()) { // if the holder is a user, we want to query parent groups for tracks - Set nodes = holder.getEnduringNodes().values().stream() + Set nodes = holder.enduringData().immutable().values().stream() .filter(Node::isGroupNode) - .filter(Node::getValuePrimitive) + .filter(Node::getValue) .filter(Node::isPermanent) .collect(Collectors.toSet()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAdd.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAdd.java index 2ad96feaf..ea04ff4bc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAdd.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAdd.java @@ -41,7 +41,7 @@ import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAddTemp.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAddTemp.java index fce904313..b40ba3338 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAddTemp.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentAddTemp.java @@ -44,7 +44,7 @@ import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.TemporaryModifier; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.DurationFormatter; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClear.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClear.java index 6763c6a5a..f5ff4c8a9 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClear.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClear.java @@ -57,7 +57,7 @@ public class ParentClear extends SharedSubCommand { return CommandResult.NO_PERMISSION; } - int before = holder.getEnduringNodes().size(); + int before = holder.enduringData().immutable().size(); MutableContextSet context = ArgumentParser.parseContext(0, args, plugin); @@ -72,7 +72,7 @@ public class ParentClear extends SharedSubCommand { holder.clearParents(context, true); } - int changed = before - holder.getEnduringNodes().size(); + int changed = before - holder.enduringData().immutable().size(); if (changed == 1) { Message.PARENT_CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), MessageUtils.contextSetToString(context), changed); } else { diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClearTrack.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClearTrack.java index 571c2d861..bead6a413 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClearTrack.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentClearTrack.java @@ -78,7 +78,7 @@ public class ParentClearTrack extends SharedSubCommand { return CommandResult.STATE_ERROR; } - int before = holder.getEnduringNodes().size(); + int before = holder.enduringData().immutable().size(); MutableContextSet context = ArgumentParser.parseContext(1, args, plugin); @@ -102,7 +102,7 @@ public class ParentClearTrack extends SharedSubCommand { plugin.getUserManager().giveDefaultIfNeeded(((User) holder), false); } - int changed = before - holder.getEnduringNodes().size(); + int changed = before - holder.enduringData().immutable().size(); if (changed == 1) { Message.PARENT_CLEAR_TRACK_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), track.getName(), MessageUtils.contextSetToString(context), changed); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentInfo.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentInfo.java index 32c464812..11cf6bef4 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentInfo.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentInfo.java @@ -40,8 +40,8 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeWithContextComparator; +import me.lucko.luckperms.common.node.comparator.NodeWithContextComparator; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.CollationKeyCache; @@ -77,10 +77,10 @@ public class ParentInfo extends SharedSubCommand { SortMode sortMode = SortMode.determine(args); // get the holders nodes - List nodes = new ArrayList<>(holder.getEnduringData().asSortedSet()); + List nodes = new ArrayList<>(holder.enduringData().asSortedSet()); // remove irrelevant types (these are displayed in the other info commands) - nodes.removeIf(node -> !node.isGroupNode() || !node.getValuePrimitive()); + nodes.removeIf(node -> !node.isGroupNode() || !node.getValue()); // handle empty if (nodes.isEmpty()) { diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemove.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemove.java index 8d024b022..6ffa40a37 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemove.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemove.java @@ -42,7 +42,7 @@ import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemoveTemp.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemoveTemp.java index 27fbe8e10..978ff1b47 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemoveTemp.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentRemoveTemp.java @@ -40,7 +40,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSet.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSet.java index 677f0392f..8b24c7a45 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSet.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSet.java @@ -41,7 +41,7 @@ import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSetTrack.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSetTrack.java index 5fc605e4b..e5422f24c 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSetTrack.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/ParentSetTrack.java @@ -41,7 +41,7 @@ import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.Track; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.storage.DataConstraints; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/UserSwitchPrimaryGroup.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/UserSwitchPrimaryGroup.java index 5ee8b6ba4..0b4854a11 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/UserSwitchPrimaryGroup.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/parent/UserSwitchPrimaryGroup.java @@ -38,7 +38,7 @@ import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheck.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheck.java index e6c1d994b..22e5ad071 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheck.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheck.java @@ -38,8 +38,9 @@ import me.lucko.luckperms.common.command.utils.MessageUtils; import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; @@ -63,7 +64,7 @@ public class PermissionCheck extends SharedSubCommand { String node = ArgumentParser.parseString(0, args); MutableContextSet context = ArgumentParser.parseContext(1, args, plugin); - Tristate result = holder.hasPermission(NodeFactory.builder(node).withExtraContext(context).build(), StandardNodeEquality.IGNORE_VALUE_OR_IF_TEMPORARY); + Tristate result = holder.hasPermission(NodeMapType.ENDURING, NodeFactory.builder(node).withExtraContext(context).build(), StandardNodeEquality.IGNORE_VALUE_OR_IF_TEMPORARY); String s = MessageUtils.formatTristate(result); Message.CHECK_PERMISSION.send(sender, holder.getFriendlyName(), node, s, MessageUtils.contextSetToString(context)); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheckInherits.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheckInherits.java index f557b93c3..0119d3ada 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheckInherits.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionCheckInherits.java @@ -38,8 +38,8 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.InheritanceInfo; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.utils.InheritanceInfo; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionClear.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionClear.java index 6d9c46c36..32d814cfa 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionClear.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionClear.java @@ -57,7 +57,7 @@ public class PermissionClear extends SharedSubCommand { return CommandResult.NO_PERMISSION; } - int before = holder.getEnduringNodes().size(); + int before = holder.enduringData().immutable().size(); MutableContextSet context = ArgumentParser.parseContext(0, args, plugin); @@ -72,7 +72,7 @@ public class PermissionClear extends SharedSubCommand { holder.clearPermissions(context); } - int changed = before - holder.getEnduringNodes().size(); + int changed = before - holder.enduringData().immutable().size(); if (changed == 1) { Message.PERMISSION_CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), MessageUtils.contextSetToString(context), changed); } else { diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java index 1b56f9656..e9410f6fc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java @@ -40,8 +40,8 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeWithContextComparator; +import me.lucko.luckperms.common.node.comparator.NodeWithContextComparator; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.CollationKeyCache; @@ -77,14 +77,12 @@ public class PermissionInfo extends SharedSubCommand { SortMode sortMode = SortMode.determine(args); // get the holders nodes - List nodes = new ArrayList<>(holder.getEnduringData().asSortedSet()); + List nodes = new ArrayList<>(holder.enduringData().asSortedSet()); // remove irrelevant types (these are displayed in the other info commands) - nodes.removeIf(node -> - // remove if the node is a group node, and if the value isn't false and if the group actually exists - (node.isGroupNode() && node.getValuePrimitive() && plugin.getGroupManager().isLoaded(node.getGroupName())) || - // remove if the node is a meta node - node.isPrefix() || node.isSuffix() || node.isMeta() + nodes.removeIf(node -> (node.isGroupNode() && node.getValue() && plugin.getGroupManager().isLoaded(node.getGroupName())) || + // remove if the node is a meta node + node.isPrefix() || node.isSuffix() || node.isMeta() ); // handle empty @@ -118,7 +116,7 @@ public class PermissionInfo extends SharedSubCommand { // send content for (LocalizedNode node : content) { - String s = "&3> " + (node.getValuePrimitive() ? "&a" : "&c") + node.getPermission() + (sender.isConsole() ? " &7(" + node.getValuePrimitive() + "&7)" : "") + MessageUtils.getAppendableNodeContextString(node); + String s = "&3> " + (node.getValue() ? "&a" : "&c") + node.getPermission() + (sender.isConsole() ? " &7(" + node.getValue() + "&7)" : "") + MessageUtils.getAppendableNodeContextString(node); if (node.isTemporary()) { s += "\n&2- expires in " + DurationFormatter.LONG.formatDateDiff(node.getExpiryUnixTime()); } @@ -142,7 +140,7 @@ public class PermissionInfo extends SharedSubCommand { private static Consumer> makeFancy(PermissionHolder holder, String label, Node node) { HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextUtils.fromLegacy(TextUtils.joinNewline( - "Â¥3> " + (node.getValuePrimitive() ? "Â¥a" : "Â¥c") + node.getPermission(), + "Â¥3> " + (node.getValue() ? "Â¥a" : "Â¥c") + node.getPermission(), " ", "Â¥7Click to remove this node from " + holder.getFriendlyName() ), 'Â¥')); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSet.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSet.java index 389935b9c..9b1bd1932 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSet.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSet.java @@ -40,7 +40,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSetTemp.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSetTemp.java index ae90e31e4..a9f56202d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSetTemp.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionSetTemp.java @@ -43,7 +43,7 @@ import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.TemporaryModifier; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.DurationFormatter; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnset.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnset.java index c8eb0e4f4..1c0a52d8c 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnset.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnset.java @@ -40,7 +40,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnsetTemp.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnsetTemp.java index c6cbae1e6..958b07629 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnsetTemp.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionUnsetTemp.java @@ -40,7 +40,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java index 204e65834..f57de2f12 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java @@ -36,7 +36,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupClone.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupClone.java index 68253ee68..d2922bc9d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupClone.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupClone.java @@ -36,6 +36,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.storage.DataConstraints; @@ -72,7 +73,7 @@ public class GroupClone extends SubCommand { return CommandResult.NO_PERMISSION; } - newGroup.replaceEnduringNodes(group.getEnduringNodes()); + newGroup.replaceNodes(NodeMapType.ENDURING, group.enduringData().immutable()); Message.CLONE_SUCCESS.send(sender, group.getName(), newGroup.getName()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupInfo.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupInfo.java index f5b1d7ebe..37e7b2fbb 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupInfo.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupInfo.java @@ -62,12 +62,12 @@ public class GroupInfo extends SubCommand { group.getWeight().isPresent() ? group.getWeight().getAsInt() : "None" ); - Set parents = group.getEnduringData().asSet().stream() + Set parents = group.enduringData().asSet().stream() .filter(Node::isGroupNode) .filter(Node::isPermanent) .collect(Collectors.toSet()); - Set tempParents = group.getEnduringData().asSet().stream() + Set tempParents = group.enduringData().asSet().stream() .filter(Node::isGroupNode) .filter(Node::isTemporary) .collect(Collectors.toSet()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java index 742058e23..1ed466237 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java @@ -42,10 +42,10 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.node.HeldPermissionComparator; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.model.HolderType; +import me.lucko.luckperms.common.node.comparator.HeldPermissionComparator; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.HolderType; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.DurationFormatter; import me.lucko.luckperms.common.utils.Iterators; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java index c897671af..675123710 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java @@ -36,6 +36,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.storage.DataConstraints; @@ -78,7 +79,7 @@ public class GroupRename extends SubCommand { return CommandResult.FAILURE; } - newGroup.replaceEnduringNodes(group.getEnduringNodes()); + newGroup.replaceNodes(NodeMapType.ENDURING, group.enduringData().immutable()); Message.RENAME_SUCCESS.send(sender, group.getName(), newGroup.getName()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetDisplayName.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetDisplayName.java index 2671b2e86..04f42fd12 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetDisplayName.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetDisplayName.java @@ -36,7 +36,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetWeight.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetWeight.java index 3bad02c4c..5203bac33 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetWeight.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupSetWeight.java @@ -25,6 +25,7 @@ package me.lucko.luckperms.common.commands.group; +import me.lucko.luckperms.api.nodetype.types.WeightType; import me.lucko.luckperms.common.actionlog.ExtendedLogEntry; import me.lucko.luckperms.common.command.CommandResult; import me.lucko.luckperms.common.command.abstraction.CommandException; @@ -37,7 +38,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; @@ -58,7 +59,7 @@ public class GroupSetWeight extends SubCommand { int weight = ArgumentParser.parsePriority(0, args); - group.removeIf(n -> NodeFactory.parseWeightNode(n.getPermission()) != null); + group.removeIf(n -> n.getTypeData(WeightType.KEY).isPresent()); group.setPermission(NodeFactory.buildWeightNode(weight).build()); Message.GROUP_SET_WEIGHT.send(sender, weight, group.getFriendlyName()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/log/LogNotify.java b/common/src/main/java/me/lucko/luckperms/common/commands/log/LogNotify.java index c81a0a6cf..15e2f7949 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/log/LogNotify.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/log/LogNotify.java @@ -34,7 +34,7 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Predicates; @@ -60,7 +60,7 @@ public class LogNotify extends SubCommand { // if they don't have the perm, they're not ignoring // if set to false, ignore it, return false - return ret.map(Node::getValuePrimitive).orElse(false); + return ret.map(Node::getValue).orElse(false); } private static void setIgnoring(LuckPermsPlugin plugin, UUID uuid, boolean state) { diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/migration/MigrationUtils.java b/common/src/main/java/me/lucko/luckperms/common/commands/migration/MigrationUtils.java index 7b1f90a50..75f3368fa 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/migration/MigrationUtils.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/migration/MigrationUtils.java @@ -26,8 +26,9 @@ package me.lucko.luckperms.common.commands.migration; import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.api.nodetype.types.WeightType; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; public final class MigrationUtils { @@ -52,7 +53,7 @@ public final class MigrationUtils { } public static void setGroupWeight(Group group, int weight) { - group.removeIf(n -> NodeFactory.parseWeightNode(n.getPermission()) != null); + group.removeIf(n -> n.getTypeData(WeightType.KEY).isPresent()); group.setPermission(NodeFactory.buildWeightNode(weight).build()); } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/misc/ApplyEditsCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/misc/ApplyEditsCommand.java index b048e4b13..575f8c8ef 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/misc/ApplyEditsCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/misc/ApplyEditsCommand.java @@ -41,8 +41,9 @@ import me.lucko.luckperms.common.command.utils.StorageAssistant; import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.DurationFormatter; @@ -105,10 +106,10 @@ public class ApplyEditsCommand extends SingleCommand { return false; } - Set nodes = WebEditor.deserializePermissions(data.getAsJsonArray("nodes")); + Set nodes = WebEditor.deserializePermissions(data.getAsJsonArray("nodes")); - Set before = new HashSet<>(holder.getEnduringNodes().values()); - Set after = nodes.stream().map(NodeModel::toNode).collect(Collectors.toSet()); + Set before = new HashSet<>(holder.enduringData().immutable().values()); + Set after = nodes.stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); Map.Entry, Set> diff = diff(before, after); Set diffAdded = diff.getKey(); @@ -121,16 +122,16 @@ public class ApplyEditsCommand extends SingleCommand { return false; } - holder.setEnduringNodes(after); + holder.setNodes(NodeMapType.ENDURING, after); for (Node n : diffAdded) { ExtendedLogEntry.build().actor(sender).acted(holder) - .action("webeditor", "add", n.getPermission(), n.getValuePrimitive(), n.getFullContexts()) + .action("webeditor", "add", n.getPermission(), n.getValue(), n.getFullContexts()) .build().submit(plugin, sender); } for (Node n : diffRemoved) { ExtendedLogEntry.build().actor(sender).acted(holder) - .action("webeditor", "remove", n.getPermission(), n.getValuePrimitive(), n.getFullContexts()) + .action("webeditor", "remove", n.getPermission(), n.getValue(), n.getFullContexts()) .build().submit(plugin, sender); } @@ -150,7 +151,7 @@ public class ApplyEditsCommand extends SingleCommand { } private static String formatNode(Node n) { - return n.getPermission() + " &7(" + (n.getValuePrimitive() ? "&a" : "&c") + n.getValuePrimitive() + "&7)" + MessageUtils.getAppendableNodeContextString(n) + + return n.getPermission() + " &7(" + (n.getValue() ? "&a" : "&c") + n.getValue() + "&7)" + MessageUtils.getAppendableNodeContextString(n) + (n.isTemporary() ? " &7(" + DurationFormatter.CONCISE.formatDateDiff(n.getExpiryUnixTime()) + ")" : ""); } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java index 0869519c5..4002946f1 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java @@ -41,11 +41,10 @@ import me.lucko.luckperms.common.command.utils.TabCompletions; import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; -import me.lucko.luckperms.common.node.HeldPermissionComparator; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeHeldPermission; +import me.lucko.luckperms.common.model.HolderType; +import me.lucko.luckperms.common.node.comparator.HeldPermissionComparator; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.HolderType; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.DurationFormatter; import me.lucko.luckperms.common.utils.Iterators; @@ -147,7 +146,7 @@ public class SearchCommand extends SingleCommand { private static Consumer> makeFancy(String holderName, HolderType holderType, String label, HeldPermission perm) { HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextUtils.fromLegacy(TextUtils.joinNewline( - "&3> " + (perm.asNode().getValuePrimitive() ? "&a" : "&c") + perm.asNode().getPermission(), + "&3> " + (perm.asNode().getValue() ? "&a" : "&c") + perm.asNode().getPermission(), " ", "&7Click to remove this node from " + holderName ), CommandManager.AMPERSAND_CHAR)); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserClone.java b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserClone.java index 53b947b8c..e9f421c45 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserClone.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserClone.java @@ -35,6 +35,7 @@ import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.User; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; @@ -99,7 +100,7 @@ public class UserClone extends SubCommand { return CommandResult.NO_PERMISSION; } - otherUser.replaceEnduringNodes(user.getEnduringNodes()); + otherUser.replaceNodes(NodeMapType.ENDURING, user.enduringData().immutable()); Message.CLONE_SUCCESS.send(sender, user.getFriendlyName(), otherUser.getFriendlyName()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserInfo.java b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserInfo.java index a1db78358..ff18522de 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserInfo.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserInfo.java @@ -72,12 +72,12 @@ public class UserInfo extends SubCommand { user.getPrimaryGroup().getValue() ); - Set parents = user.getEnduringData().asSet().stream() + Set parents = user.enduringData().asSet().stream() .filter(Node::isGroupNode) .filter(Node::isPermanent) .collect(Collectors.toSet()); - Set tempParents = user.getEnduringData().asSet().stream() + Set tempParents = user.enduringData().asSet().stream() .filter(Node::isGroupNode) .filter(Node::isTemporary) .collect(Collectors.toSet()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserMainCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserMainCommand.java index 6921d385a..e517a2053 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserMainCommand.java @@ -42,8 +42,8 @@ import me.lucko.luckperms.common.locale.LocaleManager; import me.lucko.luckperms.common.locale.command.CommandSpec; import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.User; +import me.lucko.luckperms.common.model.UserIdentifier; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.storage.DataConstraints; import me.lucko.luckperms.common.utils.Uuids; diff --git a/common/src/main/java/me/lucko/luckperms/common/event/EventFactory.java b/common/src/main/java/me/lucko/luckperms/common/event/EventFactory.java index 539dd95b2..7239f5487 100644 --- a/common/src/main/java/me/lucko/luckperms/common/event/EventFactory.java +++ b/common/src/main/java/me/lucko/luckperms/common/event/EventFactory.java @@ -123,7 +123,7 @@ public final class EventFactory { } public void handleGroupDelete(Group group, DeletionCause cause) { - EventGroupDelete event = new EventGroupDelete(group.getName(), ImmutableSet.copyOf(group.getEnduringNodes().values()), cause); + EventGroupDelete event = new EventGroupDelete(group.getName(), ImmutableSet.copyOf(group.enduringData().immutable().values()), cause); fireEventAsync(event); } diff --git a/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceComparator.java b/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceComparator.java index 6df485e35..7956bee1b 100644 --- a/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceComparator.java +++ b/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceComparator.java @@ -28,7 +28,7 @@ package me.lucko.luckperms.common.inheritance; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import java.util.Comparator; diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/AbstractManager.java b/common/src/main/java/me/lucko/luckperms/common/managers/AbstractManager.java index be71a71b2..24acef9db 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/AbstractManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/AbstractManager.java @@ -30,7 +30,7 @@ import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.collect.ImmutableMap; -import me.lucko.luckperms.common.references.Identifiable; +import me.lucko.luckperms.common.model.Identifiable; import java.util.Map; diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/Manager.java b/common/src/main/java/me/lucko/luckperms/common/managers/Manager.java index 0a222286b..eb6d227bb 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/Manager.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/Manager.java @@ -25,7 +25,7 @@ package me.lucko.luckperms.common.managers; -import me.lucko.luckperms.common.references.Identifiable; +import me.lucko.luckperms.common.model.Identifiable; import java.util.Map; import java.util.function.Function; diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/user/AbstractUserManager.java b/common/src/main/java/me/lucko/luckperms/common/managers/user/AbstractUserManager.java index 71c08aef0..fe16c3c10 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/user/AbstractUserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/user/AbstractUserManager.java @@ -30,9 +30,9 @@ import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.managers.AbstractManager; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.model.UserIdentifier; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import java.util.Optional; import java.util.UUID; @@ -83,7 +83,7 @@ public abstract class AbstractUserManager extends AbstractManage String pg = user.getPrimaryGroup().getValue(); boolean has = false; - for (Node node : user.getEnduringNodes().get(ImmutableContextSet.empty())) { + for (Node node : user.enduringData().immutable().get(ImmutableContextSet.empty())) { if (node.isGroupNode() && node.getGroupName().equalsIgnoreCase(pg)) { has = true; break; @@ -92,7 +92,7 @@ public abstract class AbstractUserManager extends AbstractManage // need to find a new primary group for the user. if (!has) { - String group = user.getEnduringNodes().get(ImmutableContextSet.empty()).stream() + String group = user.enduringData().immutable().get(ImmutableContextSet.empty()).stream() .filter(Node::isGroupNode) .findFirst() .map(Node::getGroupName) @@ -109,7 +109,7 @@ public abstract class AbstractUserManager extends AbstractManage // check that all users are member of at least one group boolean hasGroup = false; if (user.getPrimaryGroup().getStoredValue().isPresent()) { - for (Node node : user.getEnduringNodes().values()) { + for (Node node : user.enduringData().immutable().values()) { if (node.hasSpecificContext()) { continue; } @@ -160,11 +160,11 @@ public abstract class AbstractUserManager extends AbstractManage */ @Override public boolean shouldSave(User user) { - if (user.getEnduringNodes().size() != 1) { + if (user.enduringData().immutable().size() != 1) { return true; } - for (Node node : user.getEnduringNodes().values()) { + for (Node node : user.enduringData().immutable().values()) { // There's only one. if (!node.isGroupNode()) { return true; diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/user/StandardUserManager.java b/common/src/main/java/me/lucko/luckperms/common/managers/user/StandardUserManager.java index 26b4d3b6c..fb744fdce 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/user/StandardUserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/user/StandardUserManager.java @@ -26,8 +26,8 @@ package me.lucko.luckperms.common.managers.user; import me.lucko.luckperms.common.model.User; +import me.lucko.luckperms.common.model.UserIdentifier; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import java.util.concurrent.TimeUnit; diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/user/UserHousekeeper.java b/common/src/main/java/me/lucko/luckperms/common/managers/user/UserHousekeeper.java index 79165bec9..222a89f52 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/user/UserHousekeeper.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/user/UserHousekeeper.java @@ -25,8 +25,8 @@ package me.lucko.luckperms.common.managers.user; +import me.lucko.luckperms.common.model.UserIdentifier; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import me.lucko.luckperms.common.utils.ExpiringSet; import java.util.UUID; diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/user/UserManager.java b/common/src/main/java/me/lucko/luckperms/common/managers/user/UserManager.java index e00610472..b95e0d5dc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/user/UserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/user/UserManager.java @@ -27,7 +27,7 @@ package me.lucko.luckperms.common.managers.user; import me.lucko.luckperms.common.managers.Manager; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.references.UserIdentifier; +import me.lucko.luckperms.common.model.UserIdentifier; import java.util.UUID; import java.util.concurrent.CompletableFuture; diff --git a/common/src/main/java/me/lucko/luckperms/common/model/Group.java b/common/src/main/java/me/lucko/luckperms/common/model/Group.java index ad648eaee..2718d18c4 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/Group.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/Group.java @@ -29,30 +29,37 @@ import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.common.api.delegates.model.ApiGroup; import me.lucko.luckperms.common.buffers.BufferedRequest; +import me.lucko.luckperms.common.buffers.Cache; import me.lucko.luckperms.common.caching.GroupCachedData; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.GroupReference; -import me.lucko.luckperms.common.references.HolderType; -import me.lucko.luckperms.common.references.Identifiable; import java.util.Optional; +import java.util.OptionalInt; import java.util.concurrent.CompletableFuture; public class Group extends PermissionHolder implements Identifiable { + private final ApiGroup apiDelegate = new ApiGroup(this); /** * The name of the group */ private final String name; - private final ApiGroup apiDelegate = new ApiGroup(this); + /** + * Caches the holders weight + * @see #getWeight() + */ + private final Cache weightCache = new WeightCache(this); /** * The groups data cache instance */ private final GroupCachedData cachedData; + /** + * The group's cached data refresh buffer + */ private final GroupRefreshBuffer refreshBuffer; public Group(String name, LuckPermsPlugin plugin) { @@ -67,6 +74,12 @@ public class Group extends PermissionHolder implements Identifiable { getStateListeners().add(this.refreshBuffer::request); } + @Override + protected void invalidateCache() { + this.weightCache.invalidate(); + super.invalidateCache(); + } + public String getName() { return this.name; } @@ -92,7 +105,7 @@ public class Group extends PermissionHolder implements Identifiable { public Optional getDisplayName() { String name = null; - for (Node n : getEnduringNodes().get(ImmutableContextSet.empty())) { + for (Node n : enduringData().immutable().get(ImmutableContextSet.empty())) { if (!n.getPermission().startsWith("displayname.")) { continue; } @@ -116,8 +129,8 @@ public class Group extends PermissionHolder implements Identifiable { } @Override - public GroupReference toReference() { - return GroupReference.of(getId()); + public OptionalInt getWeight() { + return this.weightCache.get(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/references/HolderType.java b/common/src/main/java/me/lucko/luckperms/common/model/HolderType.java similarity index 94% rename from common/src/main/java/me/lucko/luckperms/common/references/HolderType.java rename to common/src/main/java/me/lucko/luckperms/common/model/HolderType.java index bccd04b0b..4678986a5 100644 --- a/common/src/main/java/me/lucko/luckperms/common/references/HolderType.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/HolderType.java @@ -23,9 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.references; - -import me.lucko.luckperms.common.model.PermissionHolder; +package me.lucko.luckperms.common.model; public enum HolderType { diff --git a/common/src/main/java/me/lucko/luckperms/common/references/Identifiable.java b/common/src/main/java/me/lucko/luckperms/common/model/Identifiable.java similarity index 97% rename from common/src/main/java/me/lucko/luckperms/common/references/Identifiable.java rename to common/src/main/java/me/lucko/luckperms/common/model/Identifiable.java index af4f4d6bf..b72dd54ca 100644 --- a/common/src/main/java/me/lucko/luckperms/common/references/Identifiable.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/Identifiable.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.references; +package me.lucko.luckperms.common.model; /** * Interface to represent an identifiable object diff --git a/common/src/main/java/me/lucko/luckperms/common/model/NodeMap.java b/common/src/main/java/me/lucko/luckperms/common/model/NodeMap.java index f61be7dd6..7a23d0d6d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/NodeMap.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/NodeMap.java @@ -37,9 +37,9 @@ import me.lucko.luckperms.api.context.ContextSet; import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.common.buffers.Cache; import me.lucko.luckperms.common.contexts.ContextSetComparator; -import me.lucko.luckperms.common.node.ImmutableLocalizedNode; -import me.lucko.luckperms.common.node.NodeComparator; -import me.lucko.luckperms.common.node.NodeWithContextComparator; +import me.lucko.luckperms.common.node.comparator.NodeComparator; +import me.lucko.luckperms.common.node.comparator.NodeWithContextComparator; +import me.lucko.luckperms.common.node.model.ImmutableLocalizedNode; import java.util.ArrayList; import java.util.Collection; @@ -207,7 +207,7 @@ public final class NodeMap { try { ImmutableContextSet context = node.getFullContexts().makeImmutable(); this.map.put(context, node); - if (node.isGroupNode() && node.getValuePrimitive()) { + if (node.isGroupNode() && node.getValue()) { this.inheritanceMap.put(context, node); } } finally { @@ -233,7 +233,7 @@ public final class NodeMap { try { ImmutableContextSet context = node.getFullContexts().makeImmutable(); this.map.remove(context, node); - if (node.isGroupNode() && node.getValuePrimitive()) { + if (node.isGroupNode() && node.getValue()) { this.inheritanceMap.remove(context, node); } } finally { @@ -293,7 +293,7 @@ public final class NodeMap { this.map.putAll(multimap); for (Map.Entry entry : this.map.entries()) { - if (entry.getValue().isGroupNode() && entry.getValue().getValuePrimitive()) { + if (entry.getValue().isGroupNode() && entry.getValue().getValue()) { this.inheritanceMap.put(entry.getKey(), entry.getValue()); } } @@ -342,7 +342,7 @@ public final class NodeMap { if (removed != null) { removed.add(entry); } - if (entry.isGroupNode() && entry.getValuePrimitive()) { + if (entry.isGroupNode() && entry.getValue()) { this.inheritanceMap.remove(entry.getFullContexts().makeImmutable(), entry); } work = true; diff --git a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java index f5e79f1c1..9f83e8fec 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java @@ -27,7 +27,6 @@ package me.lucko.luckperms.common.model; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -42,23 +41,19 @@ import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.api.context.ContextSet; import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.common.buffers.BufferedRequest; -import me.lucko.luckperms.common.buffers.Cache; import me.lucko.luckperms.common.caching.HolderCachedData; import me.lucko.luckperms.common.caching.handlers.StateListener; import me.lucko.luckperms.common.caching.type.MetaAccumulator; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.inheritance.InheritanceComparator; import me.lucko.luckperms.common.inheritance.InheritanceGraph; -import me.lucko.luckperms.common.node.ImmutableLocalizedNode; -import me.lucko.luckperms.common.node.InheritanceInfo; -import me.lucko.luckperms.common.node.MetaType; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeTools; -import me.lucko.luckperms.common.node.NodeWithContextComparator; +import me.lucko.luckperms.common.node.comparator.NodeWithContextComparator; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.ImmutableLocalizedNode; +import me.lucko.luckperms.common.node.utils.InheritanceInfo; +import me.lucko.luckperms.common.node.utils.MetaType; +import me.lucko.luckperms.common.node.utils.NodeTools; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.GroupReference; -import me.lucko.luckperms.common.references.HolderReference; -import me.lucko.luckperms.common.references.HolderType; import java.util.ArrayList; import java.util.Comparator; @@ -76,7 +71,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * Represents an object that can hold permissions, (a user or group) @@ -124,7 +118,7 @@ public abstract class PermissionHolder { * *

These (unlike transient nodes) are saved to the storage backing.

* - * @see #getEnduringData() + * @see #enduringData() */ private final NodeMap enduringNodes = new NodeMap(this); @@ -136,16 +130,10 @@ public abstract class PermissionHolder { * when the server stops, and for a user, it's when they log out, or get * unloaded.)

* - * @see #getTransientData() + * @see #transientData() */ private final NodeMap transientNodes = new NodeMap(this); - /** - * Caches the holders weight - * @see #getWeight() - */ - private final Cache weightCache = WeightCache.getFor(this); - /** * Lock used by Storage implementations to prevent concurrent read/writes * @see #getIoLock() @@ -183,10 +171,9 @@ public abstract class PermissionHolder { return this.stateListeners; } - private void invalidateCache() { + protected void invalidateCache() { this.enduringNodes.invalidate(); this.transientNodes.invalidate(); - this.weightCache.invalidate(); // Invalidate listeners for (StateListener listener : this.stateListeners) { @@ -196,17 +183,6 @@ public abstract class PermissionHolder { e.printStackTrace(); } } - - // Declare new state to the state manager - declareState(); - } - - private void declareState() { - /* only declare state of groups. the state manager isn't really being used now the caches in this class - are gone, but it's useful for command output. */ - if (this.getType().isGroup()) { - this.plugin.getCachedStateManager().putAll(toReference(), getGroupReferences()); - } } /** @@ -223,14 +199,12 @@ public abstract class PermissionHolder { */ public abstract HolderCachedData getCachedData(); - public abstract BufferedRequest getRefreshBuffer(); - /** - * Forms a HolderReference for this PermissionHolder. + * Gets the holders refresh buffer * - * @return this holders reference + * @return the holders refresh buffer */ - public abstract HolderReference toReference(); + public abstract BufferedRequest getRefreshBuffer(); /** * Returns the type of this PermissionHolder. @@ -254,43 +228,21 @@ public abstract class PermissionHolder { } } - public NodeMap getEnduringData() { + public NodeMap enduringData() { return this.enduringNodes; } - public NodeMap getTransientData() { + public NodeMap transientData() { return this.transientNodes; } - public ImmutableSetMultimap getNodes(NodeMapType type) { - return getData(type).immutable(); - } - - public ImmutableSetMultimap getEnduringNodes() { - return this.enduringNodes.immutable(); - } - - public ImmutableSetMultimap getTransientNodes() { - return this.transientNodes.immutable(); - } - - /** - * Sets this objects nodes to the values in the set - * - * @param set the set of nodes to apply to the object - */ - public void setEnduringNodes(Set set) { - this.enduringNodes.setContent(set); + public void setNodes(NodeMapType type, Set set) { + getData(type).setContent(set); invalidateCache(); } - /** - * Replaces the multimap backing this object with another - * - * @param multimap the replacement multimap - */ - public void replaceEnduringNodes(Multimap multimap) { - this.enduringNodes.setContent(multimap); + public void replaceNodes(NodeMapType type, Multimap multimap) { + getData(type).setContent(multimap); invalidateCache(); } @@ -334,7 +286,7 @@ public abstract class PermissionHolder { } public boolean removeIf(Predicate predicate, Runnable taskIfSuccess) { - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); if (!this.enduringNodes.removeIf(predicate)) { return false; } @@ -342,7 +294,7 @@ public abstract class PermissionHolder { taskIfSuccess.run(); } invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); this.plugin.getEventFactory().handleNodeClear(this, before, after); return true; @@ -353,7 +305,7 @@ public abstract class PermissionHolder { } public boolean removeIf(ContextSet contextSet, Predicate predicate, Runnable taskIfSuccess) { - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); if (!this.enduringNodes.removeIf(contextSet, predicate)) { return false; } @@ -361,7 +313,7 @@ public abstract class PermissionHolder { taskIfSuccess.run(); } invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); this.plugin.getEventFactory().handleNodeClear(this, before, after); return true; @@ -375,7 +327,7 @@ public abstract class PermissionHolder { return result; } - private void accumulateInheritancesTo(List accumulator, Contexts context) { + public void accumulateInheritancesTo(List accumulator, Contexts context) { InheritanceGraph graph = this.plugin.getInheritanceHandler().getGraph(context); Iterable traversal = graph.traverse(this.plugin.getConfiguration().get(ConfigKeys.INHERITANCE_TRAVERSAL_ALGORITHM), this); for (PermissionHolder holder : traversal) { @@ -393,27 +345,7 @@ public abstract class PermissionHolder { return accumulator; } - public SortedSet resolveInheritancesAlmostEqual(Contexts contexts) { - List nodes = new LinkedList<>(); - accumulateInheritancesTo(nodes, contexts); - - NodeTools.removeEqual(nodes.iterator(), StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); - SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); - ret.addAll(nodes); - return ret; - } - - public SortedSet resolveInheritancesMergeTemp(Contexts contexts) { - List nodes = new LinkedList<>(); - accumulateInheritancesTo(nodes, contexts); - - NodeTools.removeEqual(nodes.iterator(), StandardNodeEquality.IGNORE_VALUE_OR_IF_TEMPORARY); - SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); - ret.addAll(nodes); - return ret; - } - - private void accumulateInheritancesTo(List accumulator) { + public void accumulateInheritancesTo(List accumulator) { InheritanceGraph graph = this.plugin.getInheritanceHandler().getGraph(); Iterable traversal = graph.traverse(this.plugin.getConfiguration().get(ConfigKeys.INHERITANCE_TRAVERSAL_ALGORITHM), this); for (PermissionHolder holder : traversal) { @@ -431,27 +363,7 @@ public abstract class PermissionHolder { return accumulator; } - public SortedSet resolveInheritancesAlmostEqual() { - List nodes = new LinkedList<>(); - accumulateInheritancesTo(nodes); - - NodeTools.removeEqual(nodes.iterator(), StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); - SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); - ret.addAll(nodes); - return ret; - } - - public SortedSet resolveInheritancesMergeTemp() { - List nodes = new LinkedList<>(); - accumulateInheritancesTo(nodes); - - NodeTools.removeEqual(nodes.iterator(), StandardNodeEquality.IGNORE_VALUE_OR_IF_TEMPORARY); - SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); - ret.addAll(nodes); - return ret; - } - - private List getAllEntries(Contexts context) { + public List getAllEntries(Contexts context) { List entries = new LinkedList<>(); if (context.hasSetting(LookupSetting.RESOLVE_INHERITANCE)) { accumulateInheritancesTo(entries, context); @@ -472,15 +384,6 @@ public abstract class PermissionHolder { return entries; } - public SortedSet getAllNodes(Contexts context) { - List entries = getAllEntries(context); - - NodeTools.removeSamePermission(entries.iterator()); - SortedSet ret = new TreeSet<>(NodeWithContextComparator.reverse()); - ret.addAll(entries); - return ret; - } - public Map exportNodesAndShorthand(Contexts context, boolean lowerCase) { List entries = getAllEntries(context); @@ -489,12 +392,12 @@ public abstract class PermissionHolder { for (Node node : entries) { String perm = lowerCase ? node.getPermission().toLowerCase() : node.getPermission(); - if (perms.putIfAbsent(perm, node.getValuePrimitive()) == null) { + if (perms.putIfAbsent(perm, node.getValue()) == null) { if (applyShorthand) { List shorthand = node.resolveShorthand(); if (!shorthand.isEmpty()) { for (String s : shorthand) { - perms.putIfAbsent(lowerCase ? s.toLowerCase() : s, node.getValuePrimitive()); + perms.putIfAbsent(lowerCase ? s.toLowerCase() : s, node.getValue()); } } } @@ -512,11 +415,11 @@ public abstract class PermissionHolder { for (Node node : entries) { String perm = lowerCase ? node.getPermission().toLowerCase().intern() : node.getPermission(); - if (perms.putIfAbsent(perm, node.getValuePrimitive()) == null && applyShorthand) { + if (perms.putIfAbsent(perm, node.getValue()) == null && applyShorthand) { List shorthand = node.resolveShorthand(); if (!shorthand.isEmpty()) { for (String s : shorthand) { - perms.putIfAbsent((lowerCase ? s.toLowerCase() : s).intern(), node.getValuePrimitive()); + perms.putIfAbsent((lowerCase ? s.toLowerCase() : s).intern(), node.getValue()); } } } @@ -535,7 +438,7 @@ public abstract class PermissionHolder { for (PermissionHolder holder : traversal) { List nodes = holder.getOwnNodes(context.getContexts()); for (Node node : nodes) { - if (!node.getValuePrimitive()) continue; + if (!node.getValue()) continue; if (!node.isMeta() && !node.isPrefix() && !node.isSuffix()) continue; if (!((context.hasSetting(LookupSetting.INCLUDE_NODES_SET_WITHOUT_SERVER) || node.isServerSpecific()) && (context.hasSetting(LookupSetting.INCLUDE_NODES_SET_WITHOUT_WORLD) || node.isWorldSpecific()))) { @@ -564,7 +467,7 @@ public abstract class PermissionHolder { for (PermissionHolder holder : traversal) { List nodes = holder.getOwnNodes(); for (Node node : nodes) { - if (!node.getValuePrimitive()) continue; + if (!node.getValue()) continue; if (!node.isMeta() && !node.isPrefix() && !node.isSuffix()) continue; accumulator.accumulateNode(ImmutableLocalizedNode.of(node, holder.getObjectName())); @@ -589,7 +492,7 @@ public abstract class PermissionHolder { // we don't call events for transient nodes boolean transientWork = this.transientNodes.auditTemporaryNodes(null); - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); Set removed = new HashSet<>(); boolean enduringWork = this.enduringNodes.auditTemporaryNodes(removed); @@ -598,7 +501,7 @@ public abstract class PermissionHolder { invalidateCache(); // call event - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); for (Node r : removed) { this.plugin.getEventFactory().handleNodeRemove(r, this, before, after); } @@ -636,18 +539,6 @@ public abstract class PermissionHolder { return searchForMatch(type, node, equalityPredicate).map(Node::getTristate).orElse(Tristate.UNDEFINED); } - public Tristate hasPermission(NodeMapType type, Node node) { - return hasPermission(type, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); - } - - public Tristate hasPermission(Node node, NodeEqualityPredicate equalityPredicate) { - return hasPermission(NodeMapType.ENDURING, node, equalityPredicate); - } - - public Tristate hasPermission(Node node) { - return hasPermission(NodeMapType.ENDURING, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); - } - /** * Check if the holder inherits a node * @@ -676,24 +567,20 @@ public abstract class PermissionHolder { return searchForInheritedMatch(node, equalityPredicate).getResult(); } - public Tristate inheritsPermission(Node node) { - return inheritsPermission(node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE); - } - /** * Sets a permission node * * @param node the node to set */ public DataMutateResult setPermission(Node node) { - if (hasPermission(NodeMapType.ENDURING, node) != Tristate.UNDEFINED) { + if (hasPermission(NodeMapType.ENDURING, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE) != Tristate.UNDEFINED) { return DataMutateResult.ALREADY_HAS; } - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); this.enduringNodes.add(node); invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); this.plugin.getEventFactory().handleNodeAdd(node, this, before, after); return DataMutateResult.SUCCESS; @@ -720,10 +607,10 @@ public abstract class PermissionHolder { Node newNode = node.toBuilder().setExpiry(previous.getExpiryUnixTime() + node.getSecondsTilExpiry()).build(); // Remove the old node & add the new one. - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); this.enduringNodes.replace(newNode, previous); invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); this.plugin.getEventFactory().handleNodeAdd(newNode, this, before, after); return Maps.immutableEntry(DataMutateResult.SUCCESS, newNode); @@ -740,10 +627,10 @@ public abstract class PermissionHolder { // Only replace if the new expiry time is greater than the old one. if (node.getExpiryUnixTime() > previous.getExpiryUnixTime()) { - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); this.enduringNodes.replace(node, previous); invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); this.plugin.getEventFactory().handleNodeAdd(node, this, before, after); return Maps.immutableEntry(DataMutateResult.SUCCESS, node); @@ -764,7 +651,7 @@ public abstract class PermissionHolder { * @param node the node to set */ public DataMutateResult setTransientPermission(Node node) { - if (hasPermission(NodeMapType.TRANSIENT, node) != Tristate.UNDEFINED) { + if (hasPermission(NodeMapType.TRANSIENT, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE) != Tristate.UNDEFINED) { return DataMutateResult.ALREADY_HAS; } @@ -779,14 +666,14 @@ public abstract class PermissionHolder { * @param node the node to unset */ public DataMutateResult unsetPermission(Node node) { - if (hasPermission(NodeMapType.ENDURING, node) == Tristate.UNDEFINED) { + if (hasPermission(NodeMapType.ENDURING, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE) == Tristate.UNDEFINED) { return DataMutateResult.LACKS; } - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); this.enduringNodes.remove(node); invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); this.plugin.getEventFactory().handleNodeRemove(node, this, before, after); return DataMutateResult.SUCCESS; @@ -798,7 +685,7 @@ public abstract class PermissionHolder { * @param node the node to unset */ public DataMutateResult unsetTransientPermission(Node node) { - if (hasPermission(NodeMapType.TRANSIENT, node) == Tristate.UNDEFINED) { + if (hasPermission(NodeMapType.TRANSIENT, node, StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE) == Tristate.UNDEFINED) { return DataMutateResult.LACKS; } @@ -808,21 +695,21 @@ public abstract class PermissionHolder { } public boolean inheritsGroup(Group group) { - return group.getName().equalsIgnoreCase(this.getObjectName()) || hasPermission(NodeFactory.buildGroupNode(group.getName()).build()).asBoolean(); + return group.getName().equalsIgnoreCase(this.getObjectName()) || hasPermission(NodeMapType.ENDURING, NodeFactory.buildGroupNode(group.getName()).build(), StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE).asBoolean(); } public boolean inheritsGroup(Group group, ContextSet contextSet) { - return group.getName().equalsIgnoreCase(this.getObjectName()) || hasPermission(NodeFactory.buildGroupNode(group.getName()).withExtraContext(contextSet).build()).asBoolean(); + return group.getName().equalsIgnoreCase(this.getObjectName()) || hasPermission(NodeMapType.ENDURING, NodeFactory.buildGroupNode(group.getName()).withExtraContext(contextSet).build(), StandardNodeEquality.IGNORE_EXPIRY_TIME_AND_VALUE).asBoolean(); } /** * Clear all of the holders permission nodes */ public boolean clearNodes() { - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); this.enduringNodes.clear(); invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); if (before.size() == after.size()) { return false; @@ -833,10 +720,10 @@ public abstract class PermissionHolder { } public boolean clearNodes(ContextSet contextSet) { - ImmutableCollection before = getEnduringNodes().values(); + ImmutableCollection before = enduringData().immutable().values(); this.enduringNodes.clear(contextSet); invalidateCache(); - ImmutableCollection after = getEnduringNodes().values(); + ImmutableCollection after = enduringData().immutable().values(); if (before.size() == after.size()) { return false; @@ -847,11 +734,11 @@ public abstract class PermissionHolder { } public boolean clearPermissions() { - return removeIf(Node::isRegularPermissionNode); + return removeIf(node -> !node.hasTypeData()); } public boolean clearPermissions(ContextSet contextSet) { - return removeIf(contextSet, Node::isRegularPermissionNode); + return removeIf(contextSet, node -> !node.hasTypeData()); } public boolean clearParents(boolean giveDefault) { @@ -893,14 +780,6 @@ public abstract class PermissionHolder { } public OptionalInt getWeight() { - return this.weightCache.get(); - } - - public Set getGroupReferences() { - return getOwnGroupNodes().stream() - .map(Node::getGroupName) - .map(String::toLowerCase) - .map(GroupReference::of) - .collect(Collectors.toSet()); + return OptionalInt.empty(); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/model/Track.java b/common/src/main/java/me/lucko/luckperms/common/model/Track.java index 3c93ab71d..aeb0e1e3f 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/Track.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/Track.java @@ -35,9 +35,8 @@ import me.lucko.luckperms.api.context.ContextSet; import me.lucko.luckperms.common.api.DemotionResults; import me.lucko.luckperms.common.api.PromotionResults; import me.lucko.luckperms.common.api.delegates.model.ApiTrack; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.Identifiable; import me.lucko.luckperms.common.sender.Sender; import java.util.ArrayList; @@ -277,9 +276,9 @@ public final class Track implements Identifiable { } // find all groups that are inherited by the user in the exact contexts given and applicable to this track - List nodes = user.getEnduringNodes().get(context.makeImmutable()).stream() + List nodes = user.enduringData().immutable().get(context.makeImmutable()).stream() .filter(Node::isGroupNode) - .filter(Node::getValuePrimitive) + .filter(Node::getValue) .filter(node -> containsGroup(node.getGroupName())) .distinct() .collect(Collectors.toList()); @@ -339,9 +338,9 @@ public final class Track implements Identifiable { } // find all groups that are inherited by the user in the exact contexts given and applicable to this track - List nodes = user.getEnduringNodes().get(context.makeImmutable()).stream() + List nodes = user.enduringData().immutable().get(context.makeImmutable()).stream() .filter(Node::isGroupNode) - .filter(Node::getValuePrimitive) + .filter(node -> node.getValue()) .filter(node -> containsGroup(node.getGroupName())) .distinct() .collect(Collectors.toList()); 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 114949dde..d99bc1a8f 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 @@ -31,10 +31,6 @@ 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.PrimaryGroupHolder; -import me.lucko.luckperms.common.references.HolderType; -import me.lucko.luckperms.common.references.Identifiable; -import me.lucko.luckperms.common.references.UserIdentifier; -import me.lucko.luckperms.common.references.UserReference; import java.util.Optional; import java.util.UUID; @@ -161,11 +157,6 @@ public class User extends PermissionHolder implements Identifiable { - private static final Cache NULL = new Cache() { - @Override - protected OptionalInt supply() { - return OptionalInt.empty(); - } - }; - - public static Cache getFor(PermissionHolder holder) { - if (holder.getType().isUser()) { - return NULL; - } - - return new WeightCache(((Group) holder)); - } - private final Group group; - private WeightCache(Group group) { + public WeightCache(Group group) { this.group = group; } @@ -64,14 +50,16 @@ public class WeightCache extends Cache { boolean seen = false; int best = 0; for (Node n : this.group.getOwnNodes(ImmutableContextSet.empty())) { - Integer weight = NodeFactory.parseWeightNode(n.getPermission()); - if (weight == null) { + Optional weight = n.getTypeData(WeightType.KEY); + if (!weight.isPresent()) { continue; } - if (!seen || weight > best) { + int value = weight.get().getWeight(); + + if (!seen || value > best) { seen = true; - best = weight; + best = value; } } OptionalInt weight = seen ? OptionalInt.of(best) : OptionalInt.empty(); diff --git a/common/src/main/java/me/lucko/luckperms/common/node/HeldPermissionComparator.java b/common/src/main/java/me/lucko/luckperms/common/node/comparator/HeldPermissionComparator.java similarity index 97% rename from common/src/main/java/me/lucko/luckperms/common/node/HeldPermissionComparator.java rename to common/src/main/java/me/lucko/luckperms/common/node/comparator/HeldPermissionComparator.java index e14960611..409fa249d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/HeldPermissionComparator.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/comparator/HeldPermissionComparator.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.comparator; import me.lucko.luckperms.api.HeldPermission; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeComparator.java b/common/src/main/java/me/lucko/luckperms/common/node/comparator/NodeComparator.java similarity index 97% rename from common/src/main/java/me/lucko/luckperms/common/node/NodeComparator.java rename to common/src/main/java/me/lucko/luckperms/common/node/comparator/NodeComparator.java index 6e30faa5b..0cc08d0c6 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/NodeComparator.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/comparator/NodeComparator.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.comparator; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.common.utils.CollationKeyCache; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeWithContextComparator.java b/common/src/main/java/me/lucko/luckperms/common/node/comparator/NodeWithContextComparator.java similarity index 98% rename from common/src/main/java/me/lucko/luckperms/common/node/NodeWithContextComparator.java rename to common/src/main/java/me/lucko/luckperms/common/node/comparator/NodeWithContextComparator.java index c0c45c55d..f9120ccac 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/NodeWithContextComparator.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/comparator/NodeWithContextComparator.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.comparator; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.common.utils.CollationKeyCache; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/LegacyNodeFactory.java b/common/src/main/java/me/lucko/luckperms/common/node/factory/LegacyNodeFactory.java similarity index 94% rename from common/src/main/java/me/lucko/luckperms/common/node/LegacyNodeFactory.java rename to common/src/main/java/me/lucko/luckperms/common/node/factory/LegacyNodeFactory.java index 4bf22b3c5..fee267ae2 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/LegacyNodeFactory.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/factory/LegacyNodeFactory.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.factory; import com.google.common.base.Splitter; @@ -40,17 +40,17 @@ public final class LegacyNodeFactory { /** * The characters which are delimited when serializing a permission string */ - static final String[] PERMISSION_DELIMITERS = new String[]{"/", "-", "$", "(", ")", "=", ","}; + public static final String[] PERMISSION_DELIMITERS = new String[]{"/", "-", "$", "(", ")", "=", ","}; /** * The characters which are delimited when serializing a server or world string */ - static final String[] SERVER_WORLD_DELIMITERS = new String[]{"/", "-"}; + public static final String[] SERVER_WORLD_DELIMITERS = new String[]{"/", "-"}; /** * The characters which are delimited when serializing a context set */ - static final String[] CONTEXT_DELIMITERS = new String[]{"=", "(", ")", ","}; + private static final String[] CONTEXT_DELIMITERS = new String[]{"=", "(", ")", ","}; /** * The characters which are delimited when serializing meta/prefix/suffix strings @@ -146,7 +146,7 @@ public final class LegacyNodeFactory { return escapeDelimiters(s, GENERIC_DELIMITERS); } - static String unescapeCharacters(String s) { + public static String unescapeCharacters(String s) { if (s == null) { throw new NullPointerException(); } @@ -172,7 +172,7 @@ public final class LegacyNodeFactory { return s; } - static String unescapeDelimiters(String s, String... delimiters) { + public static String unescapeDelimiters(String s, String... delimiters) { if (s == null) { return null; } diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeBuilder.java b/common/src/main/java/me/lucko/luckperms/common/node/factory/NodeBuilder.java similarity index 95% rename from common/src/main/java/me/lucko/luckperms/common/node/NodeBuilder.java rename to common/src/main/java/me/lucko/luckperms/common/node/factory/NodeBuilder.java index 16027117e..095fc20bb 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/NodeBuilder.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/factory/NodeBuilder.java @@ -23,12 +23,13 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.factory; import me.lucko.luckperms.api.Contexts; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.context.ContextSet; import me.lucko.luckperms.api.context.ImmutableContextSet; +import me.lucko.luckperms.common.node.model.ImmutableNode; import java.util.Map; import java.util.Objects; @@ -39,7 +40,7 @@ import javax.annotation.Nonnull; /** * Builds node instances */ -class NodeBuilder implements Node.Builder { +public class NodeBuilder implements Node.Builder { protected String permission; private ImmutableContextSet.Builder extraContexts = ImmutableContextSet.builder(); private Boolean value = true; @@ -48,7 +49,7 @@ class NodeBuilder implements Node.Builder { private String world = null; private long expireAt = 0L; - protected NodeBuilder() { + NodeBuilder() { } @@ -56,7 +57,7 @@ class NodeBuilder implements Node.Builder { this.permission = permission; } - NodeBuilder(Node other) { + public NodeBuilder(Node other) { this.permission = other.getPermission(); copyFrom(other); } @@ -64,7 +65,7 @@ class NodeBuilder implements Node.Builder { @Override public Node.Builder copyFrom(@Nonnull Node node) { Objects.requireNonNull(node, "node"); - this.value = node.getValuePrimitive(); + this.value = node.getValue(); this.override = node.isOverride(); this.server = node.getServer().orElse(null); this.world = node.getWorld().orElse(null); diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeFactory.java b/common/src/main/java/me/lucko/luckperms/common/node/factory/NodeFactory.java similarity index 74% rename from common/src/main/java/me/lucko/luckperms/common/node/NodeFactory.java rename to common/src/main/java/me/lucko/luckperms/common/node/factory/NodeFactory.java index ba148643e..005dea323 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/NodeFactory.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/factory/NodeFactory.java @@ -23,19 +23,15 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; - -import com.google.common.base.Splitter; -import com.google.common.collect.Maps; +package me.lucko.luckperms.common.node.factory; import me.lucko.luckperms.api.ChatMetaType; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.context.ContextSet; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.references.HolderType; -import me.lucko.luckperms.common.utils.PatternCache; +import me.lucko.luckperms.common.model.HolderType; +import me.lucko.luckperms.common.node.model.NodeTypes; -import java.util.Iterator; import java.util.Map; /** @@ -44,20 +40,6 @@ import java.util.Map; public final class NodeFactory { public static final String DEFAULT_GROUP_NAME = "default"; - public static final String PREFIX_KEY = "prefix"; - public static final String SUFFIX_KEY = "suffix"; - public static final String META_KEY = "meta"; - public static final String WEIGHT_KEY = "weight"; - - private static final String GROUP_NODE_MARKER = "group."; - private static final String PREFIX_NODE_MARKER = PREFIX_KEY + "."; - private static final String SUFFIX_NODE_MARKER = SUFFIX_KEY + "."; - private static final String META_NODE_MARKER = META_KEY + "."; - private static final String WEIGHT_NODE_MARKER = WEIGHT_KEY + "."; - - // used to split prefix/suffix/meta nodes - private static final Splitter META_SPLITTER = Splitter.on(PatternCache.compileDelimiterPattern(".", "\\")).limit(2); - public static Node.Builder builder(String s) { return new NodeBuilder(s); } @@ -91,7 +73,7 @@ public final class NodeFactory { } public static String groupNode(String groupName) { - return GROUP_NODE_MARKER + groupName; + return NodeTypes.GROUP_NODE_MARKER + groupName; } public static String chatMetaNode(ChatMetaType type, int priority, String value) { @@ -99,19 +81,19 @@ public final class NodeFactory { } public static String prefixNode(int priority, String prefix) { - return PREFIX_NODE_MARKER + priority + "." + LegacyNodeFactory.escapeCharacters(prefix); + return NodeTypes.PREFIX_NODE_MARKER + priority + "." + LegacyNodeFactory.escapeCharacters(prefix); } public static String suffixNode(int priority, String suffix) { - return SUFFIX_NODE_MARKER + priority + "." + LegacyNodeFactory.escapeCharacters(suffix); + return NodeTypes.SUFFIX_NODE_MARKER + priority + "." + LegacyNodeFactory.escapeCharacters(suffix); } public static String metaNode(String key, String value) { - return META_NODE_MARKER + LegacyNodeFactory.escapeCharacters(key) + "." + LegacyNodeFactory.escapeCharacters(value); + return NodeTypes.META_NODE_MARKER + LegacyNodeFactory.escapeCharacters(key) + "." + LegacyNodeFactory.escapeCharacters(value); } public static String weightNode(int weight) { - return WEIGHT_NODE_MARKER + weight; + return NodeTypes.WEIGHT_NODE_MARKER + weight; } public static Node make(String node) { @@ -232,7 +214,7 @@ public final class NodeFactory { return appendContextToCommand(sb, node).toString(); } - if (node.getValuePrimitive() && (node.isPrefix() || node.isSuffix())) { + if (node.getValue() && (node.isPrefix() || node.isSuffix())) { ChatMetaType chatMetaType = node.isPrefix() ? ChatMetaType.PREFIX : ChatMetaType.SUFFIX; sb.append("meta "); @@ -267,7 +249,7 @@ public final class NodeFactory { return appendContextToCommand(sb, node).toString(); } - if (node.getValuePrimitive() && node.isMeta()) { + if (node.getValue() && node.isMeta()) { sb.append("meta "); if (set) { @@ -329,7 +311,7 @@ public final class NodeFactory { sb.append(perm); } if (set) { - sb.append(" ").append(node.getValuePrimitive()); + sb.append(" ").append(node.getValue()); if (node.isTemporary()) { sb.append(" ").append(node.getExpiryUnixTime()); @@ -355,73 +337,6 @@ public final class NodeFactory { return sb; } - public static String parseGroupNode(String s) { - String lower = s.toLowerCase(); - if (!lower.startsWith(GROUP_NODE_MARKER)) { - return null; - } - return lower.substring(GROUP_NODE_MARKER.length()).intern(); - } - - public static Map.Entry parseMetaNode(String s) { - if (!s.toLowerCase().startsWith(META_NODE_MARKER)) { - return null; - } - - Iterator metaParts = META_SPLITTER.split(s.substring(META_NODE_MARKER.length())).iterator(); - - if (!metaParts.hasNext()) return null; - String key = metaParts.next(); - - if (!metaParts.hasNext()) return null; - String value = metaParts.next(); - - return Maps.immutableEntry(LegacyNodeFactory.unescapeCharacters(key).intern(), LegacyNodeFactory.unescapeCharacters(value).intern()); - } - - private static Map.Entry parseChatMetaNode(String marker, String s) { - if (!s.toLowerCase().startsWith(marker)) { - return null; - } - - Iterator metaParts = META_SPLITTER.split(s.substring(marker.length())).iterator(); - - if (!metaParts.hasNext()) return null; - String priority = metaParts.next(); - - if (!metaParts.hasNext()) return null; - String value = metaParts.next(); - - try { - int p = Integer.parseInt(priority); - String v = LegacyNodeFactory.unescapeCharacters(value).intern(); - return Maps.immutableEntry(p, v); - } catch (NumberFormatException e) { - return null; - } - } - - public static Map.Entry parsePrefixNode(String s) { - return parseChatMetaNode(PREFIX_NODE_MARKER, s); - } - - public static Map.Entry parseSuffixNode(String s) { - return parseChatMetaNode(SUFFIX_NODE_MARKER, s); - } - - public static Integer parseWeightNode(String s) { - String lower = s.toLowerCase(); - if (!lower.startsWith(WEIGHT_NODE_MARKER)) { - return null; - } - String i = lower.substring(WEIGHT_NODE_MARKER.length()); - try { - return Integer.parseInt(i); - } catch (NumberFormatException e) { - return null; - } - } - private NodeFactory() {} } diff --git a/common/src/main/java/me/lucko/luckperms/common/node/ForwardingNode.java b/common/src/main/java/me/lucko/luckperms/common/node/model/ForwardingNode.java similarity index 91% rename from common/src/main/java/me/lucko/luckperms/common/node/ForwardingNode.java rename to common/src/main/java/me/lucko/luckperms/common/node/model/ForwardingNode.java index a0dcc59d0..a861dce6d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/ForwardingNode.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/model/ForwardingNode.java @@ -23,13 +23,15 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.model; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.NodeEqualityPredicate; import me.lucko.luckperms.api.StandardNodeEquality; import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.api.context.ContextSet; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; import java.util.Date; import java.util.List; @@ -58,17 +60,11 @@ public abstract class ForwardingNode implements Node { return delegate().getPermission(); } - @Nonnull @Override - public Boolean getValue() { + public boolean getValue() { return delegate().getValue(); } - @Override - public boolean getValuePrimitive() { - return delegate().getValuePrimitive(); - } - @Nonnull @Override public Tristate getTristate() { @@ -171,11 +167,6 @@ public abstract class ForwardingNode implements Node { return delegate().getFullContexts(); } - @Override - public boolean isRegularPermissionNode() { - return delegate().isRegularPermissionNode(); - } - @Override public boolean isGroupNode() { return delegate().isGroupNode(); @@ -197,6 +188,21 @@ public abstract class ForwardingNode implements Node { return delegate().getWildcardLevel(); } + @Override + public boolean hasTypeData() { + return delegate().hasTypeData(); + } + + @Override + public Optional getTypeData(NodeTypeKey key) { + return delegate().getTypeData(key); + } + + @Override + public T typeData(NodeTypeKey key) throws IllegalStateException { + return delegate().typeData(key); + } + @Override public boolean isMeta() { return delegate().isMeta(); diff --git a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableLocalizedNode.java b/common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableLocalizedNode.java similarity index 98% rename from common/src/main/java/me/lucko/luckperms/common/node/ImmutableLocalizedNode.java rename to common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableLocalizedNode.java index 0e474b8cf..1de4bc80e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableLocalizedNode.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableLocalizedNode.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.model; import me.lucko.luckperms.api.LocalizedNode; import me.lucko.luckperms.api.Node; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableNode.java b/common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableNode.java similarity index 83% rename from common/src/main/java/me/lucko/luckperms/common/node/ImmutableNode.java rename to common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableNode.java index cc8a16609..e49c2e2fc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableNode.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableNode.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.model; import com.google.common.collect.ImmutableList; @@ -33,75 +33,67 @@ import me.lucko.luckperms.api.StandardNodeEquality; import me.lucko.luckperms.api.context.ContextSet; import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.api.context.MutableContextSet; +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; +import me.lucko.luckperms.common.node.factory.LegacyNodeFactory; +import me.lucko.luckperms.common.node.factory.NodeBuilder; +import me.lucko.luckperms.common.node.utils.ShorthandParser; import me.lucko.luckperms.common.processors.WildcardProcessor; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkState; /** * An immutable implementation of {@link Node}. */ +@SuppressWarnings("OptionalUsedAsFieldOrParameterType") public final class ImmutableNode implements Node { /** * The character which separates each part of a permission node */ public static final char NODE_SEPARATOR = '.'; - public static final int NODE_SEPARATOR_CODE = Character.getNumericValue('.'); + + /** + * The numeric value of {@link #NODE_SEPARATOR} + */ + public static final int NODE_SEPARATOR_CODE = Character.getNumericValue(NODE_SEPARATOR); + + // node attributes private final String permission; - private final boolean value; - private boolean override; - // nullable + @Nullable private final String server; - // nullable + @Nullable private final String world; - // 0L for no expiry - private final long expireAt; - + private final long expireAt; // 0L for no expiry private final ImmutableContextSet contexts; - private final ImmutableContextSet fullContexts; - /* - * CACHED STATE - * - * These values are based upon the node state above, and are stored here - * to make node comparison and manipulation faster. - * - * This increases the memory footprint of this class by a bit, but it is - * worth it for the gain in speed. - * - * The methods on this class are called v. frequently. - */ - // storing optionals as a field type is usually a bad idea, however, the - // #getServer and #getWorld methods are called frequently when comparing nodes. - // without caching these values, it creates quite a bit of object churn - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + + // cached state + private final Optional optServer; - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private final Optional optWorld; + // this class is immutable, so we can cache the hashcode calculation private final int hashCode; - // all nullable - private String groupName; private final int wildcardLevel; - private Map.Entry meta; - private Map.Entry prefix; - private Map.Entry suffix; - + private final Map, NodeType> resolvedTypes; private final List resolvedShorthand; /** @@ -114,8 +106,7 @@ public final class ImmutableNode implements Node { * @param world the world this node applies on * @param contexts any additional contexts applying to this node */ - @SuppressWarnings("deprecation") - ImmutableNode(String permission, boolean value, boolean override, long expireAt, String server, String world, ContextSet contexts) { + public ImmutableNode(String permission, boolean value, boolean override, long expireAt, String server, String world, ContextSet contexts) { if (permission == null || permission.isEmpty()) { throw new IllegalArgumentException("Empty permission"); } @@ -134,11 +125,8 @@ public final class ImmutableNode implements Node { this.contexts = contexts == null ? ContextSet.empty() : contexts.makeImmutable(); // define cached state - this.groupName = NodeFactory.parseGroupNode(this.permission); this.wildcardLevel = this.permission.endsWith(WildcardProcessor.WILDCARD_SUFFIX) ? this.permission.chars().filter(num -> num == NODE_SEPARATOR_CODE).sum() : -1; - this.meta = NodeFactory.parseMetaNode(this.permission); - this.prefix = NodeFactory.parsePrefixNode(this.permission); - this.suffix = NodeFactory.parseSuffixNode(this.permission); + this.resolvedTypes = NodeTypes.parseTypes(this.permission); this.resolvedShorthand = ImmutableList.copyOf(ShorthandParser.parseShorthand(getPermission())); this.optServer = Optional.ofNullable(this.server); this.optWorld = Optional.ofNullable(this.world); @@ -173,7 +161,7 @@ public final class ImmutableNode implements Node { } @Override - public boolean getValuePrimitive() { + public boolean getValue() { return this.value; } @@ -226,6 +214,11 @@ public final class ImmutableNode implements Node { return this.server != null || this.world != null || !this.contexts.isEmpty(); } + @Override + public boolean shouldApplyWithContext(@Nonnull ContextSet contextSet) { + return getFullContexts().isSatisfiedBy(contextSet); + } + @Override public boolean isTemporary() { return this.expireAt != 0L; @@ -255,23 +248,6 @@ public final class ImmutableNode implements Node { return isTemporary() && this.expireAt < System.currentTimeMillis() / 1000L; } - @Override - public boolean isRegularPermissionNode() { - return !isGroupNode() && !isPrefix() && !isSuffix() && !isMeta(); - } - - @Override - public boolean isGroupNode() { - return this.groupName != null; - } - - @Nonnull - @Override - public String getGroupName() { - checkState(isGroupNode(), "Node is not a group node"); - return this.groupName; - } - @Override public boolean isWildcard() { return this.wildcardLevel != -1; @@ -284,44 +260,17 @@ public final class ImmutableNode implements Node { } @Override - public boolean isMeta() { - return this.meta != null; - } - - @Nonnull - @Override - public Map.Entry getMeta() { - checkState(isMeta(), "Node is not a meta node"); - return this.meta; + public boolean hasTypeData() { + return !this.resolvedTypes.isEmpty(); } @Override - public boolean isPrefix() { - return this.prefix != null; - } + public Optional getTypeData(NodeTypeKey key) { + Objects.requireNonNull(key, "key"); - @Nonnull - @Override - public Map.Entry getPrefix() { - checkState(isPrefix(), "Node is not a prefix node"); - return this.prefix; - } - - @Override - public boolean isSuffix() { - return this.suffix != null; - } - - @Nonnull - @Override - public Map.Entry getSuffix() { - checkState(isSuffix(), "Node is not a suffix node"); - return this.suffix; - } - - @Override - public boolean shouldApplyWithContext(@Nonnull ContextSet contextSet) { - return getFullContexts().isSatisfiedBy(contextSet); + //noinspection unchecked + T result = (T) this.resolvedTypes.get(key); + return Optional.ofNullable(result); } @Nonnull diff --git a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableTransientNode.java b/common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableTransientNode.java similarity index 98% rename from common/src/main/java/me/lucko/luckperms/common/node/ImmutableTransientNode.java rename to common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableTransientNode.java index 7ecf493b0..fc330cd10 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableTransientNode.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/model/ImmutableTransientNode.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.model; import me.lucko.luckperms.api.Node; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeModel.java b/common/src/main/java/me/lucko/luckperms/common/node/model/NodeDataContainer.java similarity index 81% rename from common/src/main/java/me/lucko/luckperms/common/node/NodeModel.java rename to common/src/main/java/me/lucko/luckperms/common/node/model/NodeDataContainer.java index 11d09ca4a..b84cf03b9 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/NodeModel.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/model/NodeDataContainer.java @@ -23,10 +23,11 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.model; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.context.ImmutableContextSet; +import me.lucko.luckperms.common.node.factory.NodeFactory; import java.util.Objects; @@ -36,12 +37,12 @@ import java.util.Objects; * * All values are non-null. */ -public final class NodeModel { +public final class NodeDataContainer { - public static NodeModel fromNode(Node node) { - NodeModel model = of( + public static NodeDataContainer fromNode(Node node) { + NodeDataContainer model = of( node.getPermission(), - node.getValuePrimitive(), + node.getValue(), node.getServer().orElse("global"), node.getWorld().orElse("global"), node.isTemporary() ? node.getExpiryUnixTime() : 0L, @@ -51,11 +52,11 @@ public final class NodeModel { return model; } - public static NodeModel of(String permission, boolean value, String server, String world, long expiry, ImmutableContextSet contexts) { - return new NodeModel(permission, value, server, world, expiry, contexts); + public static NodeDataContainer of(String permission, boolean value, String server, String world, long expiry, ImmutableContextSet contexts) { + return new NodeDataContainer(permission, value, server, world, expiry, contexts); } - public static NodeModel of(String permission) { + public static NodeDataContainer of(String permission) { return of(permission, true, "global", "global", 0L, ImmutableContextSet.empty()); } @@ -67,7 +68,7 @@ public final class NodeModel { private final ImmutableContextSet contexts; private Node node = null; - private NodeModel(String permission, boolean value, String server, String world, long expiry, ImmutableContextSet contexts) { + private NodeDataContainer(String permission, boolean value, String server, String world, long expiry, ImmutableContextSet contexts) { this.permission = Objects.requireNonNull(permission, "permission"); this.value = value; this.server = Objects.requireNonNull(server, "server"); @@ -114,35 +115,35 @@ public final class NodeModel { return this.contexts; } - public NodeModel setPermission(String permission) { + public NodeDataContainer setPermission(String permission) { return of(permission, this.value, this.server, this.world, this.expiry, this.contexts); } - public NodeModel setValue(boolean value) { + public NodeDataContainer setValue(boolean value) { return of(this.permission, value, this.server, this.world, this.expiry, this.contexts); } - public NodeModel setServer(String server) { + public NodeDataContainer setServer(String server) { return of(this.permission, this.value, server, this.world, this.expiry, this.contexts); } - public NodeModel setWorld(String world) { + public NodeDataContainer setWorld(String world) { return of(this.permission, this.value, this.server, world, this.expiry, this.contexts); } - public NodeModel setExpiry(long expiry) { + public NodeDataContainer setExpiry(long expiry) { return of(this.permission, this.value, this.server, this.world, expiry, this.contexts); } - public NodeModel setContexts(ImmutableContextSet contexts) { + public NodeDataContainer setContexts(ImmutableContextSet contexts) { return of(this.permission, this.value, this.server, this.world, this.expiry, contexts); } @Override public boolean equals(Object o) { if (o == this) return true; - if (!(o instanceof NodeModel)) return false; - final NodeModel other = (NodeModel) o; + if (!(o instanceof NodeDataContainer)) return false; + final NodeDataContainer other = (NodeDataContainer) o; return this.getPermission().equals(other.getPermission()) && this.getValue() == other.getValue() && diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeHeldPermission.java b/common/src/main/java/me/lucko/luckperms/common/node/model/NodeHeldPermission.java similarity index 94% rename from common/src/main/java/me/lucko/luckperms/common/node/NodeHeldPermission.java rename to common/src/main/java/me/lucko/luckperms/common/node/model/NodeHeldPermission.java index ff57a888c..c9f20aed7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/NodeHeldPermission.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/model/NodeHeldPermission.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.model; import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.api.Node; @@ -31,13 +31,12 @@ import me.lucko.luckperms.api.context.ContextSet; import java.util.Optional; import java.util.OptionalLong; -import java.util.UUID; import javax.annotation.Nonnull; public final class NodeHeldPermission> implements HeldPermission { - public static > NodeHeldPermission of(T holder, NodeModel nodeModel) { - return of(holder, nodeModel.toNode()); + public static > NodeHeldPermission of(T holder, NodeDataContainer node) { + return of(holder, node.toNode()); } public static > NodeHeldPermission of(T holder, Node node) { @@ -60,7 +59,7 @@ public final class NodeHeldPermission> implements HeldPe @Override public boolean getValue() { - return this.node.getValuePrimitive(); + return this.node.getValue(); } @Nonnull diff --git a/common/src/main/java/me/lucko/luckperms/common/node/model/NodeTypes.java b/common/src/main/java/me/lucko/luckperms/common/node/model/NodeTypes.java new file mode 100644 index 000000000..e1a9be50b --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/node/model/NodeTypes.java @@ -0,0 +1,319 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.node.model; + +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableMap; + +import me.lucko.luckperms.api.nodetype.NodeType; +import me.lucko.luckperms.api.nodetype.NodeTypeKey; +import me.lucko.luckperms.api.nodetype.types.InheritanceType; +import me.lucko.luckperms.api.nodetype.types.MetaType; +import me.lucko.luckperms.api.nodetype.types.PrefixType; +import me.lucko.luckperms.api.nodetype.types.SuffixType; +import me.lucko.luckperms.api.nodetype.types.WeightType; +import me.lucko.luckperms.common.node.factory.LegacyNodeFactory; +import me.lucko.luckperms.common.utils.PatternCache; + +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.Map; + +import javax.annotation.Nonnull; + +public final class NodeTypes { + + public static final String PREFIX_KEY = "prefix"; + public static final String SUFFIX_KEY = "suffix"; + public static final String META_KEY = "meta"; + public static final String WEIGHT_KEY = "weight"; + + public static final String GROUP_NODE_MARKER = "group."; + public static final String PREFIX_NODE_MARKER = PREFIX_KEY + "."; + public static final String SUFFIX_NODE_MARKER = SUFFIX_KEY + "."; + public static final String META_NODE_MARKER = META_KEY + "."; + public static final String WEIGHT_NODE_MARKER = WEIGHT_KEY + "."; + + // used to split prefix/suffix/meta nodes + private static final Splitter META_SPLITTER = Splitter.on(PatternCache.compileDelimiterPattern(".", "\\")).limit(2); + + public static Map, NodeType> parseTypes(String s) { + Map, NodeType> results = new IdentityHashMap<>(); + + NodeType type = parseInheritanceType(s); + if (type != null) { + results.put(InheritanceType.KEY, type); + } + + type = parseMetaType(s); + if (type != null) { + results.put(MetaType.KEY, type); + } + + type = parsePrefixType(s); + if (type != null) { + results.put(PrefixType.KEY, type); + } + + type = parseSuffixType(s); + if (type != null) { + results.put(SuffixType.KEY, type); + } + + type = parseWeightType(s); + if (type != null) { + results.put(WeightType.KEY, type); + } + + if (results.isEmpty()) { + return ImmutableMap.of(); + } + + return results; + } + + private static InheritanceType parseInheritanceType(String s) { + s = s.toLowerCase(); + if (!s.startsWith(GROUP_NODE_MARKER)) { + return null; + } + + String groupName = s.substring(GROUP_NODE_MARKER.length()).intern(); + return new Inheritance(groupName); + } + + private static MetaType parseMetaType(String s) { + if (!s.toLowerCase().startsWith(META_NODE_MARKER)) { + return null; + } + + Iterator metaParts = META_SPLITTER.split(s.substring(META_NODE_MARKER.length())).iterator(); + + if (!metaParts.hasNext()) return null; + String key = metaParts.next(); + + if (!metaParts.hasNext()) return null; + String value = metaParts.next(); + + return new Meta( + LegacyNodeFactory.unescapeCharacters(key).intern(), + LegacyNodeFactory.unescapeCharacters(value).intern() + ); + } + + private static PrefixType parsePrefixType(String s) { + if (!s.toLowerCase().startsWith(PREFIX_NODE_MARKER)) { + return null; + } + + Iterator metaParts = META_SPLITTER.split(s.substring(PREFIX_NODE_MARKER.length())).iterator(); + + if (!metaParts.hasNext()) return null; + String priority = metaParts.next(); + + if (!metaParts.hasNext()) return null; + String value = metaParts.next(); + + try { + int p = Integer.parseInt(priority); + String v = LegacyNodeFactory.unescapeCharacters(value).intern(); + return new Prefix(p, v); + } catch (NumberFormatException e) { + return null; + } + } + + private static SuffixType parseSuffixType(String s) { + if (!s.toLowerCase().startsWith(SUFFIX_NODE_MARKER)) { + return null; + } + + Iterator metaParts = META_SPLITTER.split(s.substring(SUFFIX_NODE_MARKER.length())).iterator(); + + if (!metaParts.hasNext()) return null; + String priority = metaParts.next(); + + if (!metaParts.hasNext()) return null; + String value = metaParts.next(); + + try { + int p = Integer.parseInt(priority); + String v = LegacyNodeFactory.unescapeCharacters(value).intern(); + return new Suffix(p, v); + } catch (NumberFormatException e) { + return null; + } + } + + private static WeightType parseWeightType(String s) { + String lower = s.toLowerCase(); + if (!lower.startsWith(WEIGHT_NODE_MARKER)) { + return null; + } + String i = lower.substring(WEIGHT_NODE_MARKER.length()); + try { + return new Weight(Integer.parseInt(i)); + } catch (NumberFormatException e) { + return null; + } + } + + private static final class Inheritance implements InheritanceType { + private final String groupName; + + private Inheritance(String groupName) { + this.groupName = groupName; + } + + @Nonnull + @Override + public String getGroupName() { + return this.groupName; + } + } + + private static final class Meta implements MetaType { + private final String key; + private final String value; + + private Meta(String key, String value) { + this.key = key; + this.value = value; + } + + @Nonnull + @Override + public String getKey() { + return this.key; + } + + @Nonnull + @Override + public String getValue() { + return this.value; + } + } + + private static final class Prefix implements PrefixType, Map.Entry { + private final int priority; + private final String prefix; + + private Prefix(int priority, String prefix) { + this.priority = priority; + this.prefix = prefix; + } + + @Override + public int getPriority() { + return this.priority; + } + + @Nonnull + @Override + public String getPrefix() { + return this.prefix; + } + + @Nonnull + @Override + public Map.Entry getAsEntry() { + return this; + } + + @Override + public Integer getKey() { + return getPriority(); + } + + @Override + public String getValue() { + return getPrefix(); + } + + @Override + public String setValue(String value) { + throw new UnsupportedOperationException(); + } + } + + private static final class Suffix implements SuffixType, Map.Entry { + private final int priority; + private final String suffix; + + private Suffix(int priority, String suffix) { + this.priority = priority; + this.suffix = suffix; + } + + @Override + public int getPriority() { + return this.priority; + } + + @Nonnull + @Override + public String getSuffix() { + return this.suffix; + } + + @Nonnull + @Override + public Map.Entry getAsEntry() { + return this; + } + + @Override + public Integer getKey() { + return getPriority(); + } + + @Override + public String getValue() { + return getSuffix(); + } + + @Override + public String setValue(String value) { + throw new UnsupportedOperationException(); + } + } + + private static final class Weight implements WeightType { + private final int weight; + + private Weight(int weight) { + this.weight = weight; + } + + @Override + public int getWeight() { + return this.weight; + } + } + + private NodeTypes() {} + +} diff --git a/common/src/main/java/me/lucko/luckperms/common/node/InheritanceInfo.java b/common/src/main/java/me/lucko/luckperms/common/node/utils/InheritanceInfo.java similarity index 98% rename from common/src/main/java/me/lucko/luckperms/common/node/InheritanceInfo.java rename to common/src/main/java/me/lucko/luckperms/common/node/utils/InheritanceInfo.java index 2463fa223..f5768df13 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/InheritanceInfo.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/utils/InheritanceInfo.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.utils; import me.lucko.luckperms.api.LocalizedNode; import me.lucko.luckperms.api.Tristate; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/MetaType.java b/common/src/main/java/me/lucko/luckperms/common/node/utils/MetaType.java similarity index 98% rename from common/src/main/java/me/lucko/luckperms/common/node/MetaType.java rename to common/src/main/java/me/lucko/luckperms/common/node/utils/MetaType.java index 0a8f02ced..08126d0f8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/MetaType.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/utils/MetaType.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.utils; import me.lucko.luckperms.api.Node; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeTools.java b/common/src/main/java/me/lucko/luckperms/common/node/utils/NodeTools.java similarity index 98% rename from common/src/main/java/me/lucko/luckperms/common/node/NodeTools.java rename to common/src/main/java/me/lucko/luckperms/common/node/utils/NodeTools.java index 0ec9ff7ff..466dea20a 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/NodeTools.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/utils/NodeTools.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.utils; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.NodeEqualityPredicate; diff --git a/common/src/main/java/me/lucko/luckperms/common/node/ShorthandParser.java b/common/src/main/java/me/lucko/luckperms/common/node/utils/ShorthandParser.java similarity index 99% rename from common/src/main/java/me/lucko/luckperms/common/node/ShorthandParser.java rename to common/src/main/java/me/lucko/luckperms/common/node/utils/ShorthandParser.java index 11e49e638..b327515eb 100644 --- a/common/src/main/java/me/lucko/luckperms/common/node/ShorthandParser.java +++ b/common/src/main/java/me/lucko/luckperms/common/node/utils/ShorthandParser.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.node; +package me.lucko.luckperms.common.node.utils; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java b/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java index 7e2d1d99e..69498f80a 100644 --- a/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java +++ b/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java @@ -31,7 +31,6 @@ import me.lucko.luckperms.common.api.ApiRegistrationUtil; import me.lucko.luckperms.common.api.LuckPermsApiProvider; import me.lucko.luckperms.common.buffers.BufferedRequest; import me.lucko.luckperms.common.buffers.UpdateTaskBuffer; -import me.lucko.luckperms.common.caching.handlers.CachedStateManager; import me.lucko.luckperms.common.calculators.PlatformCalculatorFactory; import me.lucko.luckperms.common.command.utils.MessageUtils; import me.lucko.luckperms.common.config.AbstractConfiguration; @@ -80,7 +79,6 @@ public abstract class AbstractLuckPermsPlugin implements LuckPermsPlugin { private InternalMessagingService messagingService = null; private BufferedRequest updateTaskBuffer; private InheritanceHandler inheritanceHandler; - private CachedStateManager cachedStateManager; private PlatformCalculatorFactory calculatorFactory; private LuckPermsApiProvider apiProvider; private EventFactory eventFactory; @@ -147,7 +145,6 @@ public abstract class AbstractLuckPermsPlugin implements LuckPermsPlugin { // load internal managers getLogger().info("Loading internal permission managers..."); this.inheritanceHandler = new InheritanceHandler(this); - this.cachedStateManager = new CachedStateManager(); // setup user/group/track manager setupManagers(); @@ -314,11 +311,6 @@ public abstract class AbstractLuckPermsPlugin implements LuckPermsPlugin { return this.inheritanceHandler; } - @Override - public CachedStateManager getCachedStateManager() { - return this.cachedStateManager; - } - @Override public PlatformCalculatorFactory getCalculatorFactory() { return this.calculatorFactory; diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/LuckPermsPlugin.java b/common/src/main/java/me/lucko/luckperms/common/plugin/LuckPermsPlugin.java index 388628931..13fdc87db 100644 --- a/common/src/main/java/me/lucko/luckperms/common/plugin/LuckPermsPlugin.java +++ b/common/src/main/java/me/lucko/luckperms/common/plugin/LuckPermsPlugin.java @@ -29,7 +29,6 @@ import me.lucko.luckperms.api.Contexts; import me.lucko.luckperms.common.actionlog.LogDispatcher; import me.lucko.luckperms.common.api.LuckPermsApiProvider; import me.lucko.luckperms.common.buffers.BufferedRequest; -import me.lucko.luckperms.common.caching.handlers.CachedStateManager; import me.lucko.luckperms.common.calculators.CalculatorFactory; import me.lucko.luckperms.common.command.CommandManager; import me.lucko.luckperms.common.command.abstraction.Command; @@ -186,13 +185,6 @@ public interface LuckPermsPlugin { */ InheritanceHandler getInheritanceHandler(); - /** - * Gets the cached state manager for the platform. - * - * @return the cached state manager - */ - CachedStateManager getCachedStateManager(); - /** * Gets the class responsible for constructing PermissionCalculators on this platform. * diff --git a/common/src/main/java/me/lucko/luckperms/common/primarygroup/CachedPrimaryGroupHolder.java b/common/src/main/java/me/lucko/luckperms/common/primarygroup/CachedPrimaryGroupHolder.java index 71a4b8814..b55f81de7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/primarygroup/CachedPrimaryGroupHolder.java +++ b/common/src/main/java/me/lucko/luckperms/common/primarygroup/CachedPrimaryGroupHolder.java @@ -28,7 +28,7 @@ package me.lucko.luckperms.common.primarygroup; import me.lucko.luckperms.common.buffers.Cache; import me.lucko.luckperms.common.caching.handlers.StateListener; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; /** * Abstract implementation of {@link StateListener} which caches all lookups. 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 87b009dbf..7e3bcbf15 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 @@ -47,7 +47,7 @@ public class ParentsByWeightHolder extends CachedPrimaryGroupHolder { Set groups = new LinkedHashSet<>(); for (Node node : this.user.getOwnNodes(contexts.getContexts())) { - if (!node.getValuePrimitive() || !node.isGroupNode()) { + if (!node.getValue() || !node.isGroupNode()) { continue; } diff --git a/common/src/main/java/me/lucko/luckperms/common/processors/WildcardProcessor.java b/common/src/main/java/me/lucko/luckperms/common/processors/WildcardProcessor.java index 9b93620e1..60dceaf89 100644 --- a/common/src/main/java/me/lucko/luckperms/common/processors/WildcardProcessor.java +++ b/common/src/main/java/me/lucko/luckperms/common/processors/WildcardProcessor.java @@ -28,7 +28,7 @@ package me.lucko.luckperms.common.processors; import com.google.common.collect.ImmutableMap; import me.lucko.luckperms.api.Tristate; -import me.lucko.luckperms.common.node.ImmutableNode; +import me.lucko.luckperms.common.node.model.ImmutableNode; import java.util.Collections; import java.util.Map; diff --git a/common/src/main/java/me/lucko/luckperms/common/references/GroupReference.java b/common/src/main/java/me/lucko/luckperms/common/references/GroupReference.java deleted file mode 100644 index 66835fc58..000000000 --- a/common/src/main/java/me/lucko/luckperms/common/references/GroupReference.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of LuckPerms, licensed under the MIT License. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package me.lucko.luckperms.common.references; - -import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.plugin.LuckPermsPlugin; - -import java.util.function.Consumer; - -public final class GroupReference implements HolderReference { - public static GroupReference of(String id) { - return new GroupReference(id); - } - - private final String id; - - private GroupReference(String id) { - this.id = id; - } - - @Override - public HolderType getType() { - return HolderType.GROUP; - } - - @Override - public void apply(LuckPermsPlugin plugin, Consumer consumer) { - Group group = plugin.getGroupManager().getIfLoaded(this.id); - if (group == null) return; - - consumer.accept(group); - } - - @Override - public String getId() { - return this.id; - } - - @Override - public boolean equals(Object o) { - if (o == this) return true; - if (!(o instanceof GroupReference)) return false; - final GroupReference other = (GroupReference) o; - return this.getId().equals(other.getId()); - } - - @Override - public int hashCode() { - return this.id.hashCode(); - } - - @Override - public String toString() { - return "GroupReference(id=" + this.getId() + ")"; - } -} diff --git a/common/src/main/java/me/lucko/luckperms/common/references/UserReference.java b/common/src/main/java/me/lucko/luckperms/common/references/UserReference.java deleted file mode 100644 index cf60ad1d9..000000000 --- a/common/src/main/java/me/lucko/luckperms/common/references/UserReference.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of LuckPerms, licensed under the MIT License. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package me.lucko.luckperms.common.references; - -import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.plugin.LuckPermsPlugin; - -import java.util.function.Consumer; - -public final class UserReference implements HolderReference { - public static UserReference of(UserIdentifier id) { - return new UserReference(id); - } - - private final UserIdentifier id; - - private UserReference(UserIdentifier id) { - this.id = id; - } - - @Override - public HolderType getType() { - return HolderType.USER; - } - - @Override - public void apply(LuckPermsPlugin plugin, Consumer consumer) { - User user = plugin.getUserManager().getIfLoaded(this.id); - if (user == null) return; - - consumer.accept(user); - } - - @Override - public UserIdentifier getId() { - return this.id; - } - - @Override - public boolean equals(Object o) { - if (o == this) return true; - if (!(o instanceof UserReference)) return false; - final UserReference other = (UserReference) o; - return this.id.equals(other.id); - } - - @Override - public int hashCode() { - return this.id.hashCode(); - } - - @Override - public String toString() { - return "UserReference(id=" + this.getId() + ")"; - } -} diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java index 5f3e2fe2a..efe9a30d1 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java @@ -37,13 +37,14 @@ import me.lucko.luckperms.common.actionlog.Log; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; import me.lucko.luckperms.common.contexts.ContextSetConfigurateSerializer; import me.lucko.luckperms.common.model.Group; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.MetaType; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.model.UserIdentifier; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeDataContainer; +import me.lucko.luckperms.common.node.utils.MetaType; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import me.lucko.luckperms.common.storage.PlayerSaveResult; import me.lucko.luckperms.common.storage.dao.AbstractDao; import me.lucko.luckperms.common.storage.dao.file.loader.ConfigurateLoader; @@ -156,8 +157,8 @@ public abstract class AbstractConfigurateDao extends AbstractDao { } protected ConfigurationNode processBulkUpdate(BulkUpdate bulkUpdate, ConfigurationNode node) { - Set nodes = readNodes(node); - Set results = nodes.stream() + Set nodes = readNodes(node); + Set results = nodes.stream() .map(bulkUpdate::apply) .filter(Objects::nonNull) .collect(Collectors.toSet()); @@ -180,8 +181,8 @@ public abstract class AbstractConfigurateDao extends AbstractDao { String name = object.getNode("name").getString(); user.getPrimaryGroup().setStoredValue(object.getNode(this.loader instanceof JsonLoader ? "primaryGroup" : "primary-group").getString()); - Set nodes = readNodes(object).stream().map(NodeModel::toNode).collect(Collectors.toSet()); - user.setEnduringNodes(nodes); + Set nodes = readNodes(object).stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + user.setNodes(NodeMapType.ENDURING, nodes); user.setName(name, true); boolean save = this.plugin.getUserManager().giveDefaultIfNeeded(user, false); @@ -222,7 +223,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { data.getNode("name").setValue(user.getName().orElse("null")); data.getNode(this.loader instanceof JsonLoader ? "primaryGroup" : "primary-group").setValue(user.getPrimaryGroup().getStoredValue().orElse(NodeFactory.DEFAULT_GROUP_NAME)); - Set nodes = user.getEnduringNodes().values().stream().map(NodeModel::fromNode).collect(Collectors.toCollection(LinkedHashSet::new)); + Set nodes = user.enduringData().immutable().values().stream().map(NodeDataContainer::fromNode).collect(Collectors.toCollection(LinkedHashSet::new)); writeNodes(data, nodes); saveFile(StorageLocation.USER, user.getUuid().toString(), data); @@ -242,15 +243,15 @@ public abstract class AbstractConfigurateDao extends AbstractDao { ConfigurationNode object = readFile(StorageLocation.GROUP, name); if (object != null) { - Set nodes = readNodes(object).stream().map(NodeModel::toNode).collect(Collectors.toSet()); - group.setEnduringNodes(nodes); + Set nodes = readNodes(object).stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + group.setNodes(NodeMapType.ENDURING, nodes); } else { ConfigurationNode data = SimpleConfigurationNode.root(); if (this instanceof SeparatedConfigurateDao) { data.getNode("name").setValue(group.getName()); } - Set nodes = group.getEnduringNodes().values().stream().map(NodeModel::fromNode).collect(Collectors.toCollection(LinkedHashSet::new)); + Set nodes = group.enduringData().immutable().values().stream().map(NodeDataContainer::fromNode).collect(Collectors.toCollection(LinkedHashSet::new)); writeNodes(data, nodes); saveFile(StorageLocation.GROUP, name, data); @@ -283,9 +284,9 @@ public abstract class AbstractConfigurateDao extends AbstractDao { group.getIoLock().lock(); } - Set data = readNodes(object); - Set nodes = data.stream().map(NodeModel::toNode).collect(Collectors.toSet()); - group.setEnduringNodes(nodes); + Set data = readNodes(object); + Set nodes = data.stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + group.setNodes(NodeMapType.ENDURING, nodes); } catch (Exception e) { throw reportException(name, e); @@ -307,7 +308,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { data.getNode("name").setValue(group.getName()); } - Set nodes = group.getEnduringNodes().values().stream().map(NodeModel::fromNode).collect(Collectors.toCollection(LinkedHashSet::new)); + Set nodes = group.enduringData().immutable().values().stream().map(NodeDataContainer::fromNode).collect(Collectors.toCollection(LinkedHashSet::new)); writeNodes(data, nodes); saveFile(StorageLocation.GROUP, group.getName(), data); @@ -441,7 +442,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { return this.uuidCache.lookupUsername(uuid); } - private static NodeModel readAttributes(ConfigurationNode attributes, Function permissionFunction) { + private static NodeDataContainer readAttributes(ConfigurationNode attributes, Function permissionFunction) { boolean value = attributes.getNode("value").getBoolean(true); String server = attributes.getNode("server").getString("global"); String world = attributes.getNode("world").getString("global"); @@ -453,10 +454,10 @@ public abstract class AbstractConfigurateDao extends AbstractDao { context = ContextSetConfigurateSerializer.deserializeContextSet(contextMap).makeImmutable(); } - return NodeModel.of(permissionFunction.apply(attributes), value, server, world, expiry, context); + return NodeDataContainer.of(permissionFunction.apply(attributes), value, server, world, expiry, context); } - private static Collection readAttributes(ConfigurationNode attributes, String permission) { + private static Collection readAttributes(ConfigurationNode attributes, String permission) { boolean value = attributes.getNode("value").getBoolean(true); String server = attributes.getNode("server").getString("global"); String world = attributes.getNode("world").getString("global"); @@ -470,13 +471,13 @@ public abstract class AbstractConfigurateDao extends AbstractDao { ConfigurationNode batchAttribute = attributes.getNode("permissions"); if (permission.startsWith("luckperms.batch") && !batchAttribute.isVirtual() && batchAttribute.hasListChildren()) { - List nodes = new ArrayList<>(); + List nodes = new ArrayList<>(); for (ConfigurationNode element : batchAttribute.getChildrenList()) { - nodes.add(NodeModel.of(element.getString(), value, server, world, expiry, context)); + nodes.add(NodeDataContainer.of(element.getString(), value, server, world, expiry, context)); } return nodes; } else { - return Collections.singleton(NodeModel.of(permission, value, server, world, expiry, context)); + return Collections.singleton(NodeDataContainer.of(permission, value, server, world, expiry, context)); } } @@ -513,15 +514,15 @@ public abstract class AbstractConfigurateDao extends AbstractDao { return Maps.immutableEntry(permission, appended); } - protected static Set readNodes(ConfigurationNode data) { - Set nodes = new HashSet<>(); + protected static Set readNodes(ConfigurationNode data) { + Set nodes = new HashSet<>(); if (data.getNode("permissions").hasListChildren()) { List children = data.getNode("permissions").getChildrenList(); for (ConfigurationNode appended : children) { String plainValue = appended.getValue(Types::strictAsString); if (plainValue != null) { - nodes.add(NodeModel.of(plainValue)); + nodes.add(NodeDataContainer.of(plainValue)); continue; } @@ -538,7 +539,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { for (ConfigurationNode appended : children) { String stringValue = appended.getValue(Types::strictAsString); if (stringValue != null) { - nodes.add(NodeModel.of(NodeFactory.groupNode(stringValue))); + nodes.add(NodeDataContainer.of(NodeFactory.groupNode(stringValue))); continue; } @@ -578,7 +579,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { return nodes; } - private static void writeAttributesTo(ConfigurationNode attributes, NodeModel node, boolean writeValue) { + private static void writeAttributesTo(ConfigurationNode attributes, NodeDataContainer node, boolean writeValue) { if (writeValue) { attributes.getNode("value").setValue(node.getValue()); } @@ -600,7 +601,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { } } - private static boolean isPlain(NodeModel node) { + private static boolean isPlain(NodeDataContainer node) { return node.getValue() && node.getServer().equalsIgnoreCase("global") && node.getWorld().equalsIgnoreCase("global") && @@ -625,14 +626,14 @@ public abstract class AbstractConfigurateDao extends AbstractDao { } } - private void writeNodes(ConfigurationNode to, Set nodes) { + private void writeNodes(ConfigurationNode to, Set nodes) { ConfigurationNode permissionsSection = SimpleConfigurationNode.root(); ConfigurationNode parentsSection = SimpleConfigurationNode.root(); ConfigurationNode prefixesSection = SimpleConfigurationNode.root(); ConfigurationNode suffixesSection = SimpleConfigurationNode.root(); ConfigurationNode metaSection = SimpleConfigurationNode.root(); - for (NodeModel node : nodes) { + for (NodeDataContainer node : nodes) { Node n = node.toNode(); // just add a string to the list. @@ -648,7 +649,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { } ChatMetaType chatMetaType = ChatMetaType.ofNode(n).orElse(null); - if (chatMetaType != null && n.getValuePrimitive()) { + if (chatMetaType != null && n.getValue()) { // handle prefixes / suffixes Map.Entry entry = chatMetaType.getEntry(n); @@ -666,7 +667,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { default: throw new AssertionError(); } - } else if (n.isMeta() && n.getValuePrimitive()) { + } else if (n.isMeta() && n.getValue()) { // handle meta nodes Map.Entry meta = n.getMeta(); @@ -675,7 +676,7 @@ public abstract class AbstractConfigurateDao extends AbstractDao { writeAttributesTo(attributes, node, false); appendNode(metaSection, meta.getKey(), attributes, "key"); - } else if (n.isGroupNode() && n.getValuePrimitive()) { + } else if (n.isGroupNode() && n.getValue()) { // handle group nodes ConfigurationNode attributes = SimpleConfigurationNode.root(); writeAttributesTo(attributes, node, false); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java index 359943d85..7b4f01a57 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java @@ -29,8 +29,8 @@ import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; -import me.lucko.luckperms.common.node.NodeHeldPermission; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; +import me.lucko.luckperms.common.node.model.NodeHeldPermission; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.storage.dao.file.loader.ConfigurateLoader; @@ -270,8 +270,8 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao { UUID holder = UUID.fromString(entry.getKey().toString()); ConfigurationNode object = entry.getValue(); - Set nodes = readNodes(object); - for (NodeModel e : nodes) { + Set nodes = readNodes(object); + for (NodeDataContainer e : nodes) { if (!e.getPermission().equalsIgnoreCase(permission)) { continue; } @@ -324,8 +324,8 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao { String holder = entry.getKey().toString(); ConfigurationNode object = entry.getValue(); - Set nodes = readNodes(object); - for (NodeModel e : nodes) { + Set nodes = readNodes(object); + for (NodeDataContainer e : nodes) { if (!e.getPermission().equalsIgnoreCase(permission)) { continue; } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java index 4b6a3f2c4..af5c593d9 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java @@ -30,8 +30,8 @@ import me.lucko.luckperms.common.bulkupdate.BulkUpdate; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeHeldPermission; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; +import me.lucko.luckperms.common.node.model.NodeHeldPermission; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.storage.dao.file.loader.ConfigurateLoader; import me.lucko.luckperms.common.utils.MoreFiles; @@ -263,8 +263,8 @@ public class SeparatedConfigurateDao extends AbstractConfigurateDao { registerFileAction(StorageLocation.USER, file); ConfigurationNode object = readFile(file); UUID holder = UUID.fromString(fileName.substring(0, fileName.length() - this.fileExtension.length())); - Set nodes = readNodes(object); - for (NodeModel e : nodes) { + Set nodes = readNodes(object); + for (NodeDataContainer e : nodes) { if (!e.getPermission().equalsIgnoreCase(permission)) { continue; } @@ -319,8 +319,8 @@ public class SeparatedConfigurateDao extends AbstractConfigurateDao { registerFileAction(StorageLocation.GROUP, file); ConfigurationNode object = readFile(file); String holder = fileName.substring(0, fileName.length() - this.fileExtension.length()); - Set nodes = readNodes(object); - for (NodeModel e : nodes) { + Set nodes = readNodes(object); + for (NodeDataContainer e : nodes) { if (!e.getPermission().equalsIgnoreCase(permission)) { continue; } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java index 49de4fa5c..bc1812dab 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java @@ -49,14 +49,15 @@ import me.lucko.luckperms.common.bulkupdate.BulkUpdate; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; import me.lucko.luckperms.common.model.Group; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.LegacyNodeFactory; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeHeldPermission; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.model.UserIdentifier; +import me.lucko.luckperms.common.node.factory.LegacyNodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeDataContainer; +import me.lucko.luckperms.common.node.model.NodeHeldPermission; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import me.lucko.luckperms.common.storage.PlayerSaveResult; import me.lucko.luckperms.common.storage.StorageCredentials; import me.lucko.luckperms.common.storage.dao.AbstractDao; @@ -204,8 +205,8 @@ public class MongoDao extends AbstractDao { Document d = cursor.next(); UUID uuid = d.get("_id", UUID.class); - Set nodes = new HashSet<>(nodesFromDoc(d)); - Set results = nodes.stream() + Set nodes = new HashSet<>(nodesFromDoc(d)); + Set results = nodes.stream() .map(bulkUpdate::apply) .filter(Objects::nonNull) .collect(Collectors.toSet()); @@ -229,8 +230,8 @@ public class MongoDao extends AbstractDao { Document d = cursor.next(); String holder = d.getString("_id"); - Set nodes = new HashSet<>(nodesFromDoc(d)); - Set results = nodes.stream() + Set nodes = new HashSet<>(nodesFromDoc(d)); + Set results = nodes.stream() .map(bulkUpdate::apply) .filter(Objects::nonNull) .collect(Collectors.toSet()); @@ -262,8 +263,8 @@ public class MongoDao extends AbstractDao { String name = d.getString("name"); user.getPrimaryGroup().setStoredValue(d.getString("primaryGroup")); - Set nodes = nodesFromDoc(d).stream().map(NodeModel::toNode).collect(Collectors.toSet()); - user.setEnduringNodes(nodes); + Set nodes = nodesFromDoc(d).stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + user.setNodes(NodeMapType.ENDURING, nodes); user.setName(name, true); boolean save = this.plugin.getUserManager().giveDefaultIfNeeded(user, false); @@ -326,8 +327,8 @@ public class MongoDao extends AbstractDao { Document d = cursor.next(); UUID holder = d.get("_id", UUID.class); - Set nodes = new HashSet<>(nodesFromDoc(d)); - for (NodeModel e : nodes) { + Set nodes = new HashSet<>(nodesFromDoc(d)); + for (NodeDataContainer e : nodes) { if (!e.getPermission().equalsIgnoreCase(permission)) { continue; } @@ -347,8 +348,8 @@ public class MongoDao extends AbstractDao { try (MongoCursor cursor = c.find(new Document("_id", group.getName())).iterator()) { if (cursor.hasNext()) { Document d = cursor.next(); - Set nodes = nodesFromDoc(d).stream().map(NodeModel::toNode).collect(Collectors.toSet()); - group.setEnduringNodes(nodes); + Set nodes = nodesFromDoc(d).stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + group.setNodes(NodeMapType.ENDURING, nodes); } else { c.insertOne(groupToDoc(group)); } @@ -379,8 +380,8 @@ public class MongoDao extends AbstractDao { } Document d = cursor.next(); - Set nodes = nodesFromDoc(d).stream().map(NodeModel::toNode).collect(Collectors.toSet()); - group.setEnduringNodes(nodes); + Set nodes = nodesFromDoc(d).stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + group.setNodes(NodeMapType.ENDURING, nodes); } } finally { if (group != null) { @@ -453,8 +454,8 @@ public class MongoDao extends AbstractDao { Document d = cursor.next(); String holder = d.getString("_id"); - Set nodes = new HashSet<>(nodesFromDoc(d)); - for (NodeModel e : nodes) { + Set nodes = new HashSet<>(nodesFromDoc(d)); + for (NodeDataContainer e : nodes) { if (!e.getPermission().equalsIgnoreCase(permission)) { continue; } @@ -623,8 +624,8 @@ public class MongoDao extends AbstractDao { } private static Document userToDoc(User user) { - List nodes = user.getEnduringNodes().values().stream() - .map(NodeModel::fromNode) + List nodes = user.enduringData().immutable().values().stream() + .map(NodeDataContainer::fromNode) .map(MongoDao::nodeToDoc) .collect(Collectors.toList()); @@ -634,8 +635,8 @@ public class MongoDao extends AbstractDao { .append("permissions", nodes); } - private static List nodesFromDoc(Document document) { - List nodes = new ArrayList<>(); + private static List nodesFromDoc(Document document) { + List nodes = new ArrayList<>(); // legacy if (document.containsKey("perms") && document.get("perms") instanceof Map) { @@ -644,7 +645,7 @@ public class MongoDao extends AbstractDao { for (Map.Entry e : permsMap.entrySet()) { // legacy permission key deserialisation String permission = e.getKey().replace("[**DOT**]", ".").replace("[**DOLLAR**]", "$"); - nodes.add(NodeModel.fromNode(LegacyNodeFactory.fromLegacyString(permission, e.getValue()))); + nodes.add(NodeDataContainer.fromNode(LegacyNodeFactory.fromLegacyString(permission, e.getValue()))); } } @@ -661,8 +662,8 @@ public class MongoDao extends AbstractDao { } private static Document groupToDoc(Group group) { - List nodes = group.getEnduringNodes().values().stream() - .map(NodeModel::fromNode) + List nodes = group.enduringData().immutable().values().stream() + .map(NodeDataContainer::fromNode) .map(MongoDao::nodeToDoc) .collect(Collectors.toList()); @@ -673,7 +674,7 @@ public class MongoDao extends AbstractDao { return new Document("_id", track.getName()).append("groups", track.getGroups()); } - private static Document nodeToDoc(NodeModel node) { + private static Document nodeToDoc(NodeDataContainer node) { Document document = new Document(); document.append("permission", node.getPermission()); @@ -698,7 +699,7 @@ public class MongoDao extends AbstractDao { return document; } - private static NodeModel nodeFromDoc(Document document) { + private static NodeDataContainer nodeFromDoc(Document document) { String permission = document.getString("permission"); boolean value = true; String server = "global"; @@ -725,7 +726,7 @@ public class MongoDao extends AbstractDao { context = docsToContextSet(contexts).makeImmutable(); } - return NodeModel.of(permission, value, server, world, expiry, context); + return NodeDataContainer.of(permission, value, server, world, expiry, context); } private static List contextSetToDocs(ContextSet contextSet) { diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java index b0023369b..83f21e7d3 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java @@ -39,13 +39,14 @@ import me.lucko.luckperms.common.contexts.ContextSetJsonSerializer; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; import me.lucko.luckperms.common.model.Group; +import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; -import me.lucko.luckperms.common.node.NodeHeldPermission; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.model.UserIdentifier; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeDataContainer; +import me.lucko.luckperms.common.node.model.NodeHeldPermission; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.references.UserIdentifier; import me.lucko.luckperms.common.storage.PlayerSaveResult; import me.lucko.luckperms.common.storage.dao.AbstractDao; import me.lucko.luckperms.common.storage.dao.sql.connection.AbstractConnectionFactory; @@ -287,7 +288,7 @@ public class SqlDao extends AbstractDao { User user = this.plugin.getUserManager().getOrMake(UserIdentifier.of(uuid, username)); user.getIoLock().lock(); try { - List data = new ArrayList<>(); + List data = new ArrayList<>(); String primaryGroup = null; String userName = null; @@ -335,8 +336,8 @@ public class SqlDao extends AbstractDao { // If the user has any data in storage if (!data.isEmpty()) { - Set nodes = data.stream().map(NodeModel::toNode).collect(Collectors.toSet()); - user.setEnduringNodes(nodes); + Set nodes = data.stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + user.setNodes(NodeMapType.ENDURING, nodes); // Save back to the store if data they were given any defaults or had permissions expire if (this.plugin.getUserManager().giveDefaultIfNeeded(user, false) | user.auditTemporaryPermissions()) { @@ -380,7 +381,7 @@ public class SqlDao extends AbstractDao { } // Get a snapshot of current data. - Set remote = new HashSet<>(); + Set remote = new HashSet<>(); try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(USER_PERMISSIONS_SELECT))) { ps.setString(1, user.getUuid().toString()); @@ -399,17 +400,17 @@ public class SqlDao extends AbstractDao { } } - Set local = user.getEnduringNodes().values().stream().map(NodeModel::fromNode).collect(Collectors.toSet()); + Set local = user.enduringData().immutable().values().stream().map(NodeDataContainer::fromNode).collect(Collectors.toSet()); - Map.Entry, Set> diff = compareSets(local, remote); + Map.Entry, Set> diff = compareSets(local, remote); - Set toAdd = diff.getKey(); - Set toRemove = diff.getValue(); + Set toAdd = diff.getKey(); + Set toRemove = diff.getValue(); if (!toRemove.isEmpty()) { try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(USER_PERMISSIONS_DELETE_SPECIFIC))) { - for (NodeModel nd : toRemove) { + for (NodeDataContainer nd : toRemove) { ps.setString(1, user.getUuid().toString()); ps.setString(2, nd.getPermission()); ps.setBoolean(3, nd.getValue()); @@ -427,7 +428,7 @@ public class SqlDao extends AbstractDao { if (!toAdd.isEmpty()) { try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(USER_PERMISSIONS_INSERT))) { - for (NodeModel nd : toAdd) { + for (NodeDataContainer nd : toAdd) { ps.setString(1, user.getUuid().toString()); ps.setString(2, nd.getPermission()); ps.setBoolean(3, nd.getValue()); @@ -506,7 +507,7 @@ public class SqlDao extends AbstractDao { long expiry = rs.getLong("expiry"); String contexts = rs.getString("contexts"); - NodeModel data = deserializeNode(permission, value, server, world, expiry, contexts); + NodeDataContainer data = deserializeNode(permission, value, server, world, expiry, contexts); held.add(NodeHeldPermission.of(holder, data)); } } @@ -565,7 +566,7 @@ public class SqlDao extends AbstractDao { Group group = this.plugin.getGroupManager().getOrMake(name); group.getIoLock().lock(); try { - List data = new ArrayList<>(); + List data = new ArrayList<>(); try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(GROUP_PERMISSIONS_SELECT))) { @@ -586,8 +587,8 @@ public class SqlDao extends AbstractDao { } if (!data.isEmpty()) { - Set nodes = data.stream().map(NodeModel::toNode).collect(Collectors.toSet()); - group.setEnduringNodes(nodes); + Set nodes = data.stream().map(NodeDataContainer::toNode).collect(Collectors.toSet()); + group.setNodes(NodeMapType.ENDURING, nodes); } else { group.clearNodes(); } @@ -636,7 +637,7 @@ public class SqlDao extends AbstractDao { group.getIoLock().lock(); try { // Empty data, just delete. - if (group.getEnduringNodes().isEmpty()) { + if (group.enduringData().immutable().isEmpty()) { try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(GROUP_PERMISSIONS_DELETE))) { ps.setString(1, group.getName()); @@ -647,7 +648,7 @@ public class SqlDao extends AbstractDao { } // Get a snapshot of current data - Set remote = new HashSet<>(); + Set remote = new HashSet<>(); try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(GROUP_PERMISSIONS_SELECT))) { ps.setString(1, group.getName()); @@ -666,17 +667,17 @@ public class SqlDao extends AbstractDao { } } - Set local = group.getEnduringNodes().values().stream().map(NodeModel::fromNode).collect(Collectors.toSet()); + Set local = group.enduringData().immutable().values().stream().map(NodeDataContainer::fromNode).collect(Collectors.toSet()); - Map.Entry, Set> diff = compareSets(local, remote); + Map.Entry, Set> diff = compareSets(local, remote); - Set toAdd = diff.getKey(); - Set toRemove = diff.getValue(); + Set toAdd = diff.getKey(); + Set toRemove = diff.getValue(); if (!toRemove.isEmpty()) { try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(GROUP_PERMISSIONS_DELETE_SPECIFIC))) { - for (NodeModel nd : toRemove) { + for (NodeDataContainer nd : toRemove) { ps.setString(1, group.getName()); ps.setString(2, nd.getPermission()); ps.setBoolean(3, nd.getValue()); @@ -694,7 +695,7 @@ public class SqlDao extends AbstractDao { if (!toAdd.isEmpty()) { try (Connection c = this.provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(GROUP_PERMISSIONS_INSERT))) { - for (NodeModel nd : toAdd) { + for (NodeDataContainer nd : toAdd) { ps.setString(1, group.getName()); ps.setString(2, nd.getPermission()); ps.setBoolean(3, nd.getValue()); @@ -750,7 +751,7 @@ public class SqlDao extends AbstractDao { long expiry = rs.getLong("expiry"); String contexts = rs.getString("contexts"); - NodeModel data = deserializeNode(permission, value, server, world, expiry, contexts); + NodeDataContainer data = deserializeNode(permission, value, server, world, expiry, contexts); held.add(NodeHeldPermission.of(holder, data)); } } @@ -994,20 +995,20 @@ public class SqlDao extends AbstractDao { * @param remote the remote set * @return the entries to add to remote, and the entries to remove from remote */ - private static Map.Entry, Set> compareSets(Set local, Set remote) { + private static Map.Entry, Set> compareSets(Set local, Set remote) { // entries in local but not remote need to be added // entries in remote but not local need to be removed - Set toAdd = new HashSet<>(local); + Set toAdd = new HashSet<>(local); toAdd.removeAll(remote); - Set toRemove = new HashSet<>(remote); + Set toRemove = new HashSet<>(remote); toRemove.removeAll(local); return Maps.immutableEntry(toAdd, toRemove); } - private NodeModel deserializeNode(String permission, boolean value, String server, String world, long expiry, String contexts) { - return NodeModel.of(permission, value, server, world, expiry, ContextSetJsonSerializer.deserializeContextSet(this.gson, contexts).makeImmutable()); + private NodeDataContainer deserializeNode(String permission, boolean value, String server, String world, long expiry, String contexts) { + return NodeDataContainer.of(permission, value, server, world, expiry, ContextSetJsonSerializer.deserializeContextSet(this.gson, contexts).makeImmutable()); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java b/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java index a8a725968..db8f35c60 100644 --- a/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java +++ b/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java @@ -26,7 +26,7 @@ package me.lucko.luckperms.common.tasks; import me.lucko.luckperms.api.event.cause.CreationCause; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import java.util.concurrent.CompletableFuture; diff --git a/common/src/main/java/me/lucko/luckperms/common/web/WebEditor.java b/common/src/main/java/me/lucko/luckperms/common/web/WebEditor.java index 3046a834b..0e6f79388 100644 --- a/common/src/main/java/me/lucko/luckperms/common/web/WebEditor.java +++ b/common/src/main/java/me/lucko/luckperms/common/web/WebEditor.java @@ -37,7 +37,7 @@ import me.lucko.luckperms.common.locale.message.Message; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeModel; +import me.lucko.luckperms.common.node.model.NodeDataContainer; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.utils.Uuids; @@ -78,7 +78,7 @@ public final class WebEditor { obj.add("uuid", ((User) holder).getUuid().toString()); } })) - .add("nodes", serializePermissions(holder.getEnduringNodes().values().stream().map(NodeModel::fromNode))); + .add("nodes", serializePermissions(holder.enduringData().immutable().values().stream().map(NodeDataContainer::fromNode))); } public static JsonObject formPayload(List holders, Sender sender, String cmdLabel, LuckPermsPlugin plugin) { @@ -168,7 +168,7 @@ public final class WebEditor { } } - private static JsonArray serializePermissions(Stream nodes) { + private static JsonArray serializePermissions(Stream nodes) { JsonArray arr = new JsonArray(); nodes.forEach(node -> { JsonObject attributes = new JsonObject(); @@ -196,8 +196,8 @@ public final class WebEditor { return arr; } - public static Set deserializePermissions(JsonArray permissionsSection) { - Set nodes = new HashSet<>(); + public static Set deserializePermissions(JsonArray permissionsSection) { + Set nodes = new HashSet<>(); for (JsonElement ent : permissionsSection) { if (!ent.isJsonObject()) { @@ -231,7 +231,7 @@ public final class WebEditor { context = ContextSetJsonSerializer.deserializeContextSet(contexts).makeImmutable(); } - nodes.add(NodeModel.of(permission, value, server, world, expiry, context)); + nodes.add(NodeDataContainer.of(permission, value, server, world, expiry, context)); } return nodes; diff --git a/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java b/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java index 04ffb59af..d78933aef 100644 --- a/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java +++ b/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java @@ -33,11 +33,11 @@ import me.lucko.luckperms.common.calculators.AbstractCalculatorFactory; import me.lucko.luckperms.common.calculators.PermissionCalculator; import me.lucko.luckperms.common.calculators.PermissionCalculatorMetadata; import me.lucko.luckperms.common.config.ConfigKeys; +import me.lucko.luckperms.common.model.HolderType; import me.lucko.luckperms.common.processors.MapProcessor; import me.lucko.luckperms.common.processors.PermissionProcessor; import me.lucko.luckperms.common.processors.RegexProcessor; import me.lucko.luckperms.common.processors.WildcardProcessor; -import me.lucko.luckperms.common.references.HolderType; import me.lucko.luckperms.nukkit.LPNukkitPlugin; import me.lucko.luckperms.nukkit.processors.ChildProcessor; import me.lucko.luckperms.nukkit.processors.DefaultsProcessor; diff --git a/nukkit/src/main/java/me/lucko/luckperms/nukkit/model/permissible/LPPermissionAttachment.java b/nukkit/src/main/java/me/lucko/luckperms/nukkit/model/permissible/LPPermissionAttachment.java index ba55dfb3e..46149f263 100644 --- a/nukkit/src/main/java/me/lucko/luckperms/nukkit/model/permissible/LPPermissionAttachment.java +++ b/nukkit/src/main/java/me/lucko/luckperms/nukkit/model/permissible/LPPermissionAttachment.java @@ -30,8 +30,8 @@ import com.google.common.base.Preconditions; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.ImmutableTransientNode; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.ImmutableTransientNode; import me.lucko.luckperms.nukkit.model.dummy.DummyPlugin; import cn.nukkit.permission.Permission; diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java index 60be479d3..85d70be9c 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java @@ -37,7 +37,7 @@ import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.common.managers.user.AbstractUserManager; import me.lucko.luckperms.common.managers.user.UserHousekeeper; -import me.lucko.luckperms.common.references.UserIdentifier; +import me.lucko.luckperms.common.model.UserIdentifier; import me.lucko.luckperms.common.utils.ImmutableCollectors; import me.lucko.luckperms.common.utils.Uuids; import me.lucko.luckperms.sponge.LPSpongePlugin; diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/processors/SpongeWildcardProcessor.java b/sponge/src/main/java/me/lucko/luckperms/sponge/processors/SpongeWildcardProcessor.java index daee7809c..58be38c5f 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/processors/SpongeWildcardProcessor.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/processors/SpongeWildcardProcessor.java @@ -26,7 +26,7 @@ package me.lucko.luckperms.sponge.processors; import me.lucko.luckperms.api.Tristate; -import me.lucko.luckperms.common.node.ImmutableNode; +import me.lucko.luckperms.common.node.model.ImmutableNode; import me.lucko.luckperms.common.processors.AbstractPermissionProcessor; import me.lucko.luckperms.common.processors.PermissionProcessor; diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java index dfad3a2d9..d56f905ed 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java @@ -151,11 +151,7 @@ public abstract class CalculatedSubject implements LPSubject { throw new AssertionError(); } - for (LPSubjectReference entry : merging) { - if (!parents.contains(entry)) { - parents.add(entry); - } - } + parents.addAll(merging); return parents; } @@ -175,11 +171,7 @@ public abstract class CalculatedSubject implements LPSubject { throw new AssertionError(); } - for (LPSubjectReference entry : merging) { - if (!parents.contains(entry)) { - parents.add(entry); - } - } + parents.addAll(merging); return parents; } @@ -189,11 +181,7 @@ public abstract class CalculatedSubject implements LPSubject { Iterable traversal = graph.traverse(TraversalAlgorithm.DEPTH_FIRST_PRE_ORDER, this); for (CalculatedSubject subject : traversal) { - for (LPSubjectReference entry : subject.getCombinedParents(filter)) { - if (!result.contains(entry)) { - result.add(entry); - } - } + result.addAll(subject.getCombinedParents(filter)); } return result; @@ -205,11 +193,7 @@ public abstract class CalculatedSubject implements LPSubject { Iterable traversal = graph.traverse(TraversalAlgorithm.DEPTH_FIRST_PRE_ORDER, this); for (CalculatedSubject subject : traversal) { - for (LPSubjectReference entry : subject.getCombinedParents()) { - if (!result.contains(entry)) { - result.add(entry); - } - } + result.addAll(subject.getCombinedParents()); } return result; diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java index e6c1ac548..c5c31ef7d 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java @@ -225,11 +225,7 @@ public class CalculatedSubjectData implements LPSubjectData { // flatten Set result = new LinkedHashSet<>(); for (Set set : sorted.values()) { - for (LPSubjectReference e : set) { - if (!result.contains(e)) { - result.add(e); - } - } + result.addAll(set); } return result; } diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java index cb825accd..42f4be6bc 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java @@ -36,7 +36,8 @@ import me.lucko.luckperms.common.inheritance.InheritanceGraph; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import me.lucko.luckperms.common.verbose.CheckOrigin; import me.lucko.luckperms.sponge.LPSpongePlugin; import me.lucko.luckperms.sponge.model.SpongeGroup; @@ -133,13 +134,13 @@ public abstract class HolderSubject implements LPSub @Override public Optional getOption(ImmutableContextSet contexts, String s) { MetaData data = this.parent.getCachedData().getMetaData(this.plugin.getContextManager().formContexts(contexts)); - if (s.equalsIgnoreCase(NodeFactory.PREFIX_KEY)) { + if (s.equalsIgnoreCase(NodeTypes.PREFIX_KEY)) { if (data.getPrefix() != null) { return Optional.of(data.getPrefix()); } } - if (s.equalsIgnoreCase(NodeFactory.SUFFIX_KEY)) { + if (s.equalsIgnoreCase(NodeTypes.SUFFIX_KEY)) { if (data.getSuffix() != null) { return Optional.of(data.getSuffix()); } diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubjectData.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubjectData.java index ee3bff50a..22b65d951 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubjectData.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubjectData.java @@ -38,7 +38,8 @@ import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.NodeMapType; import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; -import me.lucko.luckperms.common.node.NodeFactory; +import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.node.model.NodeTypes; import me.lucko.luckperms.sponge.service.LuckPermsService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectData; @@ -72,7 +73,7 @@ public class HolderSubjectData implements LPSubjectData { } private Stream streamNodes() { - return this.holder.getNodes(this.type).values().stream(); + return this.holder.getData(this.type).immutable().values().stream(); } @Override @@ -93,10 +94,10 @@ public class HolderSubjectData implements LPSubjectData { @Override public ImmutableMap> getAllPermissions() { ImmutableMap.Builder> ret = ImmutableMap.builder(); - for (Map.Entry> entry : this.holder.getNodes(this.type).asMap().entrySet()) { + for (Map.Entry> entry : this.holder.getData(this.type).immutable().asMap().entrySet()) { ImmutableMap.Builder builder = ImmutableMap.builder(); for (Node n : entry.getValue()) { - builder.put(n.getPermission(), n.getValuePrimitive()); + builder.put(n.getPermission(), n.getValue()); } ret.put(entry.getKey(), builder.build()); } @@ -182,7 +183,7 @@ public class HolderSubjectData implements LPSubjectData { @Override public ImmutableMap> getAllParents() { ImmutableMap.Builder> ret = ImmutableMap.builder(); - for (Map.Entry> entry : this.holder.getNodes(this.type).asMap().entrySet()) { + for (Map.Entry> entry : this.holder.getData(this.type).immutable().asMap().entrySet()) { ImmutableList.Builder builder = ImmutableList.builder(); for (Node n : entry.getValue()) { if (n.isGroupNode()) { @@ -294,8 +295,8 @@ public class HolderSubjectData implements LPSubjectData { Map minPrefixPriority = new HashMap<>(); Map minSuffixPriority = new HashMap<>(); - for (Node n : this.holder.getNodes(this.type).values()) { - if (!n.getValuePrimitive()) continue; + for (Node n : this.holder.getData(this.type).immutable().values()) { + if (!n.getValue()) continue; if (!n.isMeta() && !n.isPrefix() && !n.isSuffix()) continue; ImmutableContextSet immutableContexts = n.getFullContexts().makeImmutable(); @@ -309,7 +310,7 @@ public class HolderSubjectData implements LPSubjectData { if (n.isPrefix()) { Map.Entry value = n.getPrefix(); if (value.getKey() > minPrefixPriority.get(immutableContexts)) { - options.get(immutableContexts).put(NodeFactory.PREFIX_KEY, value.getValue()); + options.get(immutableContexts).put(NodeTypes.PREFIX_KEY, value.getValue()); minPrefixPriority.put(immutableContexts, value.getKey()); } continue; @@ -318,7 +319,7 @@ public class HolderSubjectData implements LPSubjectData { if (n.isSuffix()) { Map.Entry value = n.getSuffix(); if (value.getKey() > minSuffixPriority.get(immutableContexts)) { - options.get(immutableContexts).put(NodeFactory.SUFFIX_KEY, value.getValue()); + options.get(immutableContexts).put(NodeTypes.SUFFIX_KEY, value.getValue()); minSuffixPriority.put(immutableContexts, value.getKey()); } continue; @@ -344,7 +345,7 @@ public class HolderSubjectData implements LPSubjectData { Objects.requireNonNull(value, "value"); Node node; - if (key.equalsIgnoreCase(NodeFactory.PREFIX_KEY) || key.equalsIgnoreCase(NodeFactory.SUFFIX_KEY)) { + if (key.equalsIgnoreCase(NodeTypes.PREFIX_KEY) || key.equalsIgnoreCase(NodeTypes.SUFFIX_KEY)) { // special handling. ChatMetaType type = ChatMetaType.valueOf(key.toUpperCase()); @@ -393,9 +394,9 @@ public class HolderSubjectData implements LPSubjectData { List toRemove = streamNodes() .filter(n -> { - if (key.equalsIgnoreCase(NodeFactory.PREFIX_KEY)) { + if (key.equalsIgnoreCase(NodeTypes.PREFIX_KEY)) { return n.isPrefix(); - } else if (key.equalsIgnoreCase(NodeFactory.SUFFIX_KEY)) { + } else if (key.equalsIgnoreCase(NodeTypes.SUFFIX_KEY)) { return n.isSuffix(); } else { return n.isMeta() && n.getMeta().getKey().equals(key);