Reuse the same InheritanceOrigin object where possible

This commit is contained in:
Luck 2022-01-01 20:49:12 +00:00
parent 4de7448394
commit a53c9fad00
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
15 changed files with 70 additions and 68 deletions

View File

@ -83,7 +83,7 @@ public class ParentAddTemp extends GenericChildCommand {
return; return;
} }
if (group.getName().equalsIgnoreCase(target.getObjectName())) { if (group.getName().equalsIgnoreCase(target.getIdentifier().getName())) {
Message.ALREADY_TEMP_INHERITS.send(sender, target, group, context); Message.ALREADY_TEMP_INHERITS.send(sender, target, group, context);
return; return;
} }

View File

@ -1671,7 +1671,7 @@ public interface Message {
.append(space()) .append(space())
.append(formatContextSetBracketed(node.getContexts(), empty())) .append(formatContextSetBracketed(node.getContexts(), empty()))
.apply(builder -> { .apply(builder -> {
String holderName = holder.getType() == HolderType.GROUP ? holder.getObjectName() : holder.getPlainDisplayName(); String holderName = holder.getType() == HolderType.GROUP ? holder.getIdentifier().getName() : holder.getPlainDisplayName();
boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty(); boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty();
Component hover = join(newline(), Component hover = join(newline(),
@ -1701,7 +1701,7 @@ public interface Message {
.append(space()) .append(space())
.append(formatContextSetBracketed(node.getContexts(), empty())) .append(formatContextSetBracketed(node.getContexts(), empty()))
.apply(builder -> { .apply(builder -> {
String holderName = holder.getType() == HolderType.GROUP ? holder.getObjectName() : holder.getPlainDisplayName(); String holderName = holder.getType() == HolderType.GROUP ? holder.getIdentifier().getName() : holder.getPlainDisplayName();
boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty(); boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty();
Component hover = join(newline(), Component hover = join(newline(),
@ -1771,7 +1771,7 @@ public interface Message {
.content(node.getGroupName()) .content(node.getGroupName())
.color(GREEN) .color(GREEN)
.apply(builder -> { .apply(builder -> {
String holderName = holder.getType() == HolderType.GROUP ? holder.getObjectName() : holder.getPlainDisplayName(); String holderName = holder.getType() == HolderType.GROUP ? holder.getIdentifier().getName() : holder.getPlainDisplayName();
boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty(); boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty();
Component hover = join(newline(), Component hover = join(newline(),
@ -1804,7 +1804,7 @@ public interface Message {
.content(node.getGroupName()) .content(node.getGroupName())
.color(GREEN) .color(GREEN)
.apply(builder -> { .apply(builder -> {
String holderName = holder.getType() == HolderType.GROUP ? holder.getObjectName() : holder.getPlainDisplayName(); String holderName = holder.getType() == HolderType.GROUP ? holder.getIdentifier().getName() : holder.getPlainDisplayName();
boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty(); boolean explicitGlobalContext = !holder.getPlugin().getConfiguration().getContextsFile().getDefaultContexts().isEmpty();
Component hover = join(newline(), Component hover = join(newline(),

View File

@ -68,8 +68,8 @@ public class Group extends PermissionHolder {
private final GroupCachedDataManager cachedData; private final GroupCachedDataManager cachedData;
public Group(String name, LuckPermsPlugin plugin) { public Group(String name, LuckPermsPlugin plugin) {
super(plugin); super(plugin, name.toLowerCase(Locale.ROOT));
this.name = name.toLowerCase(Locale.ROOT); this.name = getIdentifier().getName();
this.cachedData = new GroupCachedDataManager(this); this.cachedData = new GroupCachedDataManager(this);
getPlugin().getEventDispatcher().dispatchGroupCacheLoad(this, this.cachedData); getPlugin().getEventDispatcher().dispatchGroupCacheLoad(this, this.cachedData);
@ -89,11 +89,6 @@ public class Group extends PermissionHolder {
return this.name; return this.name;
} }
@Override
public String getObjectName() {
return this.name;
}
public ApiGroup getApiProxy() { public ApiGroup getApiProxy() {
return this.apiProxy; return this.apiProxy;
} }

View File

@ -25,28 +25,47 @@
package me.lucko.luckperms.common.model; package me.lucko.luckperms.common.model;
import net.luckperms.api.model.PermissionHolder;
import net.luckperms.api.model.data.DataType; import net.luckperms.api.model.data.DataType;
import net.luckperms.api.node.metadata.types.InheritanceOriginMetadata; import net.luckperms.api.node.metadata.types.InheritanceOriginMetadata;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Objects;
public class InheritanceOrigin implements InheritanceOriginMetadata { public class InheritanceOrigin implements InheritanceOriginMetadata {
private final PermissionHolder.Identifier location; private final PermissionHolderIdentifier origin;
private final DataType dataType; private final DataType dataType;
public InheritanceOrigin(PermissionHolder.Identifier location, DataType dataType) { public InheritanceOrigin(PermissionHolderIdentifier origin, DataType dataType) {
this.location = location; this.origin = origin;
this.dataType = dataType; this.dataType = dataType;
} }
@Override @Override
public PermissionHolder.@NonNull Identifier getOrigin() { public @NonNull PermissionHolderIdentifier getOrigin() {
return this.location; return this.origin;
} }
@Override @Override
public @NonNull DataType getDataType() { public @NonNull DataType getDataType() {
return this.dataType; return this.dataType;
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof InheritanceOriginMetadata)) return false;
InheritanceOriginMetadata that = (InheritanceOriginMetadata) o;
return this.origin.equals(that.getOrigin()) && this.dataType == that.getDataType();
}
@Override
public int hashCode() {
return Objects.hash(this.origin, getDataType());
}
@Override
public String toString() {
return this.origin + " (" + this.dataType + ")";
}
} }

View File

@ -53,7 +53,6 @@ import net.luckperms.api.query.Flag;
import net.luckperms.api.query.QueryOptions; import net.luckperms.api.query.QueryOptions;
import net.luckperms.api.util.Tristate; import net.luckperms.api.util.Tristate;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -102,7 +101,7 @@ public abstract class PermissionHolder {
/** /**
* The holders identifier * The holders identifier
*/ */
private @MonotonicNonNull PermissionHolderIdentifier identifier; private final PermissionHolderIdentifier identifier;
/** /**
* The holders persistent nodes. * The holders persistent nodes.
@ -135,8 +134,9 @@ public abstract class PermissionHolder {
* *
* @param plugin the plugin instance * @param plugin the plugin instance
*/ */
protected PermissionHolder(LuckPermsPlugin plugin) { protected PermissionHolder(LuckPermsPlugin plugin, String objectName) {
this.plugin = plugin; this.plugin = plugin;
this.identifier = new PermissionHolderIdentifier(getType(), objectName);
} }
// getters // getters
@ -169,22 +169,9 @@ public abstract class PermissionHolder {
} }
public PermissionHolderIdentifier getIdentifier() { public PermissionHolderIdentifier getIdentifier() {
if (this.identifier == null) {
this.identifier = new PermissionHolderIdentifier(getType(), getObjectName());
}
return this.identifier; return this.identifier;
} }
/**
* Gets the unique name of this holder object.
*
* <p>Used as a base for identifying permission holding objects. Also acts
* as a method for preventing circular inheritance issues.</p>
*
* @return the object name
*/
public abstract String getObjectName();
/** /**
* Gets the formatted display name of this permission holder * Gets the formatted display name of this permission holder
* (for use in commands, etc) * (for use in commands, etc)
@ -439,7 +426,7 @@ public abstract class PermissionHolder {
} }
public Tristate hasNode(DataType type, Node node, NodeEqualityPredicate equalityPredicate) { public Tristate hasNode(DataType type, Node node, NodeEqualityPredicate equalityPredicate) {
if (this.getType() == HolderType.GROUP && node instanceof InheritanceNode && ((InheritanceNode) node).getGroupName().equalsIgnoreCase(getObjectName())) { if (this.getType() == HolderType.GROUP && node instanceof InheritanceNode && ((InheritanceNode) node).getGroupName().equalsIgnoreCase(getIdentifier().getName())) {
return Tristate.TRUE; return Tristate.TRUE;
} }

View File

@ -36,7 +36,9 @@ public final class PermissionHolderIdentifier implements Identifier {
private final String name; private final String name;
public PermissionHolderIdentifier(HolderType type, String name) { public PermissionHolderIdentifier(HolderType type, String name) {
this.type = type == HolderType.USER ? Identifier.USER_TYPE : Identifier.GROUP_TYPE; this.type = type == HolderType.USER
? Identifier.USER_TYPE
: Identifier.GROUP_TYPE;
this.name = name; this.name = name;
} }
@ -46,13 +48,13 @@ public final class PermissionHolderIdentifier implements Identifier {
} }
@Override @Override
public @NonNull String getName() { public @NonNull String getType() {
return this.name; return this.type;
} }
@Override @Override
public @NonNull String getType() { public @NonNull String getName() {
return this.type; return this.name;
} }
@Override @Override
@ -60,12 +62,16 @@ public final class PermissionHolderIdentifier implements Identifier {
if (this == o) return true; if (this == o) return true;
if (!(o instanceof Identifier)) return false; if (!(o instanceof Identifier)) return false;
Identifier that = (Identifier) o; Identifier that = (Identifier) o;
return getType().equals(that.getType()) && return this.type.equals(that.getType()) && this.name.equals(that.getName());
getName().equals(that.getName());
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(getType(), getName()); return Objects.hash(this.type, this.name);
}
@Override
public String toString() {
return this.type + '/' + this.name;
} }
} }

View File

@ -62,7 +62,7 @@ public class User extends PermissionHolder {
private final UserCachedDataManager cachedData; private final UserCachedDataManager cachedData;
public User(UUID uniqueId, LuckPermsPlugin plugin) { public User(UUID uniqueId, LuckPermsPlugin plugin) {
super(plugin); super(plugin, uniqueId.toString());
this.uniqueId = uniqueId; this.uniqueId = uniqueId;
this.primaryGroup = plugin.getConfiguration().get(ConfigKeys.PRIMARY_GROUP_CALCULATION).apply(this); this.primaryGroup = plugin.getConfiguration().get(ConfigKeys.PRIMARY_GROUP_CALCULATION).apply(this);
this.cachedData = new UserCachedDataManager(this); this.cachedData = new UserCachedDataManager(this);
@ -77,11 +77,6 @@ public class User extends PermissionHolder {
return Optional.ofNullable(this.username); return Optional.ofNullable(this.username);
} }
@Override
public String getObjectName() {
return this.uniqueId.toString();
}
@Override @Override
public Component getFormattedDisplayName() { public Component getFormattedDisplayName() {
return Component.text(getPlainDisplayName()); return Component.text(getPlainDisplayName());

View File

@ -63,7 +63,7 @@ public class WeightCache extends Cache<OptionalInt> {
if (!seen) { if (!seen) {
Map<String, Integer> configWeights = this.group.getPlugin().getConfiguration().get(ConfigKeys.GROUP_WEIGHTS); Map<String, Integer> configWeights = this.group.getPlugin().getConfiguration().get(ConfigKeys.GROUP_WEIGHTS);
Integer value = configWeights.get(this.group.getObjectName().toLowerCase(Locale.ROOT)); Integer value = configWeights.get(this.group.getIdentifier().getName().toLowerCase(Locale.ROOT));
if (value != null) { if (value != null) {
seen = true; seen = true;
weight = value; weight = value;

View File

@ -90,11 +90,11 @@ public class NodeMapMutable extends NodeMapBase {
private final Lock lock = new ReentrantLock(); private final Lock lock = new ReentrantLock();
protected final PermissionHolder holder; protected final PermissionHolder holder;
private final DataType type; private final InheritanceOrigin inheritanceOrigin;
public NodeMapMutable(PermissionHolder holder, DataType type) { public NodeMapMutable(PermissionHolder holder, DataType type) {
this.holder = holder; this.holder = holder;
this.type = type; this.inheritanceOrigin = new InheritanceOrigin(holder.getIdentifier(), type);
} }
@Override @Override
@ -113,12 +113,12 @@ public class NodeMapMutable extends NodeMapBase {
} }
private Node addInheritanceOrigin(Node node) { private Node addInheritanceOrigin(Node node) {
Optional<InheritanceOriginMetadata> metadata = node.getMetadata(InheritanceOriginMetadata.KEY); Optional<InheritanceOriginMetadata> existing = node.getMetadata(InheritanceOriginMetadata.KEY);
if (metadata.isPresent() && metadata.get().getOrigin().equals(this.holder.getIdentifier())) { if (existing.isPresent() && existing.get().equals(this.inheritanceOrigin)) {
return node; return node;
} }
return node.toBuilder().withMetadata(InheritanceOriginMetadata.KEY, new InheritanceOrigin(this.holder.getIdentifier(), this.type)).build(); return node.toBuilder().withMetadata(InheritanceOriginMetadata.KEY, this.inheritanceOrigin).build();
} }
@Override @Override

View File

@ -139,7 +139,7 @@ public class WebEditorRequest {
private static JObject formPermissionHolder(PermissionHolder holder) { private static JObject formPermissionHolder(PermissionHolder holder) {
return new JObject() return new JObject()
.add("type", holder.getType().toString()) .add("type", holder.getType().toString())
.add("id", holder.getObjectName()) .add("id", holder.getIdentifier().getName())
.add("displayName", holder.getPlainDisplayName()) .add("displayName", holder.getPlainDisplayName())
.add("nodes", NodeJsonSerializer.serializeNodes(holder.normalData().asList())); .add("nodes", NodeJsonSerializer.serializeNodes(holder.normalData().asList()));
} }

View File

@ -27,8 +27,9 @@ package me.lucko.luckperms.sponge.service.model;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import me.lucko.luckperms.common.model.PermissionHolderIdentifier;
import net.luckperms.api.context.ImmutableContextSet; import net.luckperms.api.context.ImmutableContextSet;
import net.luckperms.api.model.PermissionHolder;
import net.luckperms.api.query.QueryOptions; import net.luckperms.api.query.QueryOptions;
import net.luckperms.api.util.Tristate; import net.luckperms.api.util.Tristate;
@ -46,7 +47,7 @@ public interface LPSubject {
LPPermissionService getService(); LPPermissionService getService();
PermissionHolder.Identifier getIdentifier(); PermissionHolderIdentifier getIdentifier();
default LPSubjectReference toReference() { default LPSubjectReference toReference() {
return getService().getReferenceFactory().obtain(this); return getService().getReferenceFactory().obtain(this);

View File

@ -70,6 +70,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class CalculatedSubjectData implements LPSubjectData { public class CalculatedSubjectData implements LPSubjectData {
private final LPSubject parentSubject; private final LPSubject parentSubject;
private final DataType type; private final DataType type;
private final InheritanceOrigin inheritanceOrigin;
private final LPPermissionService service; private final LPPermissionService service;
private final Map<ImmutableContextSet, Map<String, Boolean>> permissions = new ConcurrentHashMap<>(); private final Map<ImmutableContextSet, Map<String, Boolean>> permissions = new ConcurrentHashMap<>();
@ -79,6 +80,7 @@ public class CalculatedSubjectData implements LPSubjectData {
public CalculatedSubjectData(LPSubject parentSubject, DataType type, LPPermissionService service) { public CalculatedSubjectData(LPSubject parentSubject, DataType type, LPPermissionService service) {
this.parentSubject = parentSubject; this.parentSubject = parentSubject;
this.type = type; this.type = type;
this.inheritanceOrigin = new InheritanceOrigin(this.parentSubject.getIdentifier(), this.type);
this.service = service; this.service = service;
} }
@ -155,7 +157,7 @@ public class CalculatedSubjectData implements LPSubjectData {
.permission(key) .permission(key)
.value(value) .value(value)
.context(entry.getKey()) .context(entry.getKey())
.withMetadata(InheritanceOriginMetadata.KEY, new InheritanceOrigin(this.parentSubject.getIdentifier(), this.type)) .withMetadata(InheritanceOriginMetadata.KEY, this.inheritanceOrigin)
.build(); .build();
nodeMap.put(key, node); nodeMap.put(key, node);
}); });
@ -320,7 +322,7 @@ public class CalculatedSubjectData implements LPSubjectData {
.key(key) .key(key)
.value(value) .value(value)
.context(entry.getKey()) .context(entry.getKey())
.withMetadata(InheritanceOriginMetadata.KEY, new InheritanceOrigin(this.parentSubject.getIdentifier(), this.type)) .withMetadata(InheritanceOriginMetadata.KEY, this.inheritanceOrigin)
.build(); .build();
nodeMap.put(key, node); nodeMap.put(key, node);
}); });

View File

@ -25,13 +25,12 @@
package me.lucko.luckperms.sponge.service.model.permissionholder; package me.lucko.luckperms.sponge.service.model.permissionholder;
import me.lucko.luckperms.common.model.PermissionHolderIdentifier;
import me.lucko.luckperms.sponge.LPSpongePlugin; import me.lucko.luckperms.sponge.LPSpongePlugin;
import me.lucko.luckperms.sponge.model.SpongeGroup; import me.lucko.luckperms.sponge.model.SpongeGroup;
import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import net.luckperms.api.model.PermissionHolder;
import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.CommandSource;
import java.util.Optional; import java.util.Optional;
@ -45,7 +44,7 @@ public class GroupSubject extends PermissionHolderSubject<SpongeGroup> implement
} }
@Override @Override
public PermissionHolder.Identifier getIdentifier() { public PermissionHolderIdentifier getIdentifier() {
return this.parent.getIdentifier(); return this.parent.getIdentifier();
} }

View File

@ -25,13 +25,12 @@
package me.lucko.luckperms.sponge.service.model.permissionholder; package me.lucko.luckperms.sponge.service.model.permissionholder;
import me.lucko.luckperms.common.model.PermissionHolderIdentifier;
import me.lucko.luckperms.sponge.LPSpongePlugin; import me.lucko.luckperms.sponge.LPSpongePlugin;
import me.lucko.luckperms.sponge.model.SpongeUser; import me.lucko.luckperms.sponge.model.SpongeUser;
import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import net.luckperms.api.model.PermissionHolder;
import org.spongepowered.api.Sponge; import org.spongepowered.api.Sponge;
import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.CommandSource;
@ -48,7 +47,7 @@ public final class UserSubject extends PermissionHolderSubject<SpongeUser> imple
} }
@Override @Override
public PermissionHolder.Identifier getIdentifier() { public PermissionHolderIdentifier getIdentifier() {
return this.parent.getIdentifier(); return this.parent.getIdentifier();
} }

View File

@ -38,7 +38,6 @@ import me.lucko.luckperms.sponge.service.model.calculated.CalculatedSubject;
import me.lucko.luckperms.sponge.service.model.calculated.CalculatedSubjectData; import me.lucko.luckperms.sponge.service.model.calculated.CalculatedSubjectData;
import me.lucko.luckperms.sponge.service.model.calculated.MonitoredSubjectData; import me.lucko.luckperms.sponge.service.model.calculated.MonitoredSubjectData;
import net.luckperms.api.model.PermissionHolder;
import net.luckperms.api.model.data.DataType; import net.luckperms.api.model.data.DataType;
import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.CommandSource;
@ -158,7 +157,7 @@ public class PersistedSubject extends CalculatedSubject implements LPSubject {
} }
@Override @Override
public PermissionHolder.Identifier getIdentifier() { public PermissionHolderIdentifier getIdentifier() {
return this.identifier; return this.identifier;
} }