Refactor some Sponge service details

This commit is contained in:
Luck
2018-01-15 18:07:27 +00:00
Unverified
parent 39daed23c4
commit 9ceacdb739
53 changed files with 542 additions and 356 deletions
@@ -57,7 +57,6 @@ import me.lucko.luckperms.common.logging.SenderLogger;
import me.lucko.luckperms.common.managers.track.StandardTrackManager;
import me.lucko.luckperms.common.messaging.ExtendedMessagingService;
import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.plugin.SchedulerAdapter;
import me.lucko.luckperms.common.storage.Storage;
import me.lucko.luckperms.common.storage.StorageFactory;
@@ -82,6 +81,7 @@ import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.model.LPPermissionService;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.LuckPermsSpongePlugin;
import me.lucko.luckperms.sponge.service.persisted.PersistedCollection;
import me.lucko.luckperms.sponge.tasks.ServiceCacheHousekeepingTask;
import me.lucko.luckperms.sponge.utils.VersionData;
@@ -136,7 +136,7 @@ import java.util.stream.Stream;
description = "A permissions plugin",
url = "https://github.com/lucko/LuckPerms"
)
public class LPSpongePlugin implements LuckPermsPlugin {
public class LPSpongePlugin implements LuckPermsSpongePlugin {
@Inject
private Logger logger;
@@ -39,7 +39,7 @@ import me.lucko.luckperms.common.locale.LocaleManager;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.utils.Predicates;
import me.lucko.luckperms.sponge.service.model.LPSubjectData;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import java.util.List;
import java.util.Map;
@@ -54,18 +54,18 @@ public class ParentInfo extends SubCommand<LPSubjectData> {
ImmutableContextSet contextSet = ArgumentUtils.handleContextSponge(0, args);
if (contextSet.isEmpty()) {
CommandUtils.sendPluginMessage(sender, "&aShowing parents matching contexts &bANY&a.");
Map<ImmutableContextSet, ImmutableList<SubjectReference>> parents = subjectData.getAllParents();
Map<ImmutableContextSet, ImmutableList<LPSubjectReference>> parents = subjectData.getAllParents();
if (parents.isEmpty()) {
CommandUtils.sendPluginMessage(sender, "That subject does not have any parents defined.");
return CommandResult.SUCCESS;
}
for (Map.Entry<ImmutableContextSet, ImmutableList<SubjectReference>> e : parents.entrySet()) {
for (Map.Entry<ImmutableContextSet, ImmutableList<LPSubjectReference>> e : parents.entrySet()) {
CommandUtils.sendPluginMessage(sender, "&3>> &bContext: " + SpongeCommandUtils.contextToString(e.getKey()) + "\n" + SpongeCommandUtils.parentsToString(e.getValue()));
}
} else {
List<SubjectReference> parents = subjectData.getParents(contextSet);
List<LPSubjectReference> parents = subjectData.getParents(contextSet);
if (parents.isEmpty()) {
CommandUtils.sendPluginMessage(sender, "That subject does not have any parents defined in those contexts.");
return CommandResult.SUCCESS;
@@ -29,7 +29,7 @@ import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.api.context.ContextSet;
import me.lucko.luckperms.common.commands.utils.ArgumentUtils;
import me.lucko.luckperms.common.commands.utils.CommandUtils;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import java.util.List;
import java.util.Map;
@@ -73,9 +73,9 @@ public final class SpongeCommandUtils {
return sb.toString();
}
public static String parentsToString(Iterable<SubjectReference> parents) {
public static String parentsToString(Iterable<LPSubjectReference> parents) {
StringBuilder sb = new StringBuilder();
for (SubjectReference s : parents) {
for (LPSubjectReference s : parents) {
sb.append("&3> &a")
.append(s.getSubjectIdentifier())
.append(" &bfrom collection &a")
@@ -45,8 +45,8 @@ import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.ProxyFactory;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.model.SubjectReferenceFactory;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import me.lucko.luckperms.sponge.service.reference.SubjectReferenceFactory;
import org.spongepowered.api.service.permission.PermissionService;
import org.spongepowered.api.service.permission.SubjectCollection;
@@ -129,9 +129,7 @@ public class SpongeGroupManager extends AbstractGroupManager<SpongeGroup> implem
@Override
public CompletableFuture<LPSubject> loadSubject(String identifier) {
if (!DataConstraints.GROUP_NAME_TEST.test(identifier)) {
CompletableFuture<LPSubject> fut = new CompletableFuture<>();
fut.completeExceptionally(new IllegalArgumentException("Illegal subject identifier"));
return fut;
throw new IllegalArgumentException("Illegal subject identifier");
}
LPSubject present = this.subjectLoadingCache.getIfPresent(identifier.toLowerCase());
@@ -144,16 +142,20 @@ public class SpongeGroupManager extends AbstractGroupManager<SpongeGroup> implem
@Override
public Optional<LPSubject> getSubject(String identifier) {
if (!DataConstraints.GROUP_NAME_TEST.test(identifier)) {
return Optional.empty();
}
return Optional.ofNullable(getIfLoaded(identifier.toLowerCase())).map(SpongeGroup::sponge);
}
@Override
public CompletableFuture<Boolean> hasRegistered(String identifier) {
if (isLoaded(identifier.toLowerCase())) {
return CompletableFuture.completedFuture(true);
} else {
if (!DataConstraints.GROUP_NAME_TEST.test(identifier)) {
return CompletableFuture.completedFuture(false);
}
return CompletableFuture.completedFuture(isLoaded(identifier.toLowerCase()));
}
@Override
@@ -161,6 +163,9 @@ public class SpongeGroupManager extends AbstractGroupManager<SpongeGroup> implem
return CompletableFuture.supplyAsync(() -> {
ImmutableSet.Builder<LPSubject> ret = ImmutableSet.builder();
for (String id : identifiers) {
if (!DataConstraints.GROUP_NAME_TEST.test(id)) {
continue;
}
ret.add(loadSubject(id.toLowerCase()).join());
}
@@ -179,9 +184,9 @@ public class SpongeGroupManager extends AbstractGroupManager<SpongeGroup> implem
}
@Override
public CompletableFuture<ImmutableMap<SubjectReference, Boolean>> getAllWithPermission(String permission) {
public CompletableFuture<ImmutableMap<LPSubjectReference, Boolean>> getAllWithPermission(String permission) {
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<SubjectReference, Boolean> ret = ImmutableMap.builder();
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<String>> lookup = this.plugin.getStorage().getGroupsWithPermission(permission).join();
for (HeldPermission<String> holder : lookup) {
@@ -195,9 +200,9 @@ public class SpongeGroupManager extends AbstractGroupManager<SpongeGroup> implem
}
@Override
public CompletableFuture<ImmutableMap<SubjectReference, Boolean>> getAllWithPermission(ImmutableContextSet contexts, String permission) {
public CompletableFuture<ImmutableMap<LPSubjectReference, Boolean>> getAllWithPermission(ImmutableContextSet contexts, String permission) {
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<SubjectReference, Boolean> ret = ImmutableMap.builder();
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<String>> lookup = this.plugin.getStorage().getGroupsWithPermission(permission).join();
for (HeldPermission<String> holder : lookup) {
@@ -39,14 +39,15 @@ 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.utils.ImmutableCollectors;
import me.lucko.luckperms.common.utils.Uuids;
import me.lucko.luckperms.sponge.LPSpongePlugin;
import me.lucko.luckperms.sponge.model.SpongeUser;
import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.ProxyFactory;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.model.SubjectReferenceFactory;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import me.lucko.luckperms.sponge.service.reference.SubjectReferenceFactory;
import org.spongepowered.api.service.permission.PermissionService;
import org.spongepowered.api.service.permission.SubjectCollection;
@@ -133,26 +134,14 @@ public class SpongeUserManager extends AbstractUserManager<SpongeUser> implement
@Override
public Predicate<String> getIdentifierValidityPredicate() {
return s -> {
try {
//noinspection ResultOfMethodCallIgnored
UUID.fromString(s);
return true;
} catch (IllegalArgumentException e) {
return false;
}
};
return Uuids.PREDICATE;
}
@Override
public CompletableFuture<LPSubject> loadSubject(String identifier) {
UUID uuid;
try {
uuid = UUID.fromString(identifier);
} catch (IllegalArgumentException e) {
CompletableFuture<LPSubject> fut = new CompletableFuture<>();
fut.completeExceptionally(e);
return fut;
UUID uuid = Uuids.parseNullable(identifier);
if (uuid == null) {
throw new IllegalArgumentException("Identifier is not a UUID: " + identifier);
}
LPSubject present = this.subjectLoadingCache.getIfPresent(uuid);
@@ -165,32 +154,25 @@ public class SpongeUserManager extends AbstractUserManager<SpongeUser> implement
@Override
public Optional<LPSubject> getSubject(String identifier) {
UUID uuid = UUID.fromString(identifier);
UUID uuid = Uuids.parseNullable(identifier);
if (uuid == null) {
return Optional.empty();
}
return Optional.ofNullable(getIfLoaded(uuid)).map(SpongeUser::sponge);
}
@Override
public CompletableFuture<Boolean> hasRegistered(String identifier) {
UUID uuid = null;
IllegalArgumentException ex = null;
try {
uuid = UUID.fromString(identifier);
} catch (IllegalArgumentException e) {
ex = e;
UUID uuid = Uuids.parseNullable(identifier);
if (uuid == null) {
return CompletableFuture.completedFuture(false);
}
if (uuid != null && isLoaded(UserIdentifier.of(uuid, null))) {
if (isLoaded(UserIdentifier.of(uuid, null))) {
return CompletableFuture.completedFuture(true);
}
if (uuid == null) {
CompletableFuture<Boolean> fut = new CompletableFuture<>();
fut.completeExceptionally(ex);
return fut;
}
UUID finalUuid = uuid;
return this.plugin.getStorage().getUniqueUsers().thenApply(set -> set.contains(finalUuid));
return this.plugin.getStorage().getUniqueUsers().thenApply(set -> set.contains(uuid));
}
@Override
@@ -198,13 +180,10 @@ public class SpongeUserManager extends AbstractUserManager<SpongeUser> implement
return CompletableFuture.supplyAsync(() -> {
ImmutableSet.Builder<LPSubject> ret = ImmutableSet.builder();
for (String id : identifiers) {
UUID uuid;
try {
uuid = UUID.fromString(id);
} catch (IllegalArgumentException e) {
UUID uuid = Uuids.parseNullable(id);
if (uuid == null) {
continue;
}
ret.add(loadSubject(uuid.toString()).join());
}
@@ -230,9 +209,9 @@ public class SpongeUserManager extends AbstractUserManager<SpongeUser> implement
}
@Override
public CompletableFuture<ImmutableMap<SubjectReference, Boolean>> getAllWithPermission(String permission) {
public CompletableFuture<ImmutableMap<LPSubjectReference, Boolean>> getAllWithPermission(String permission) {
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<SubjectReference, Boolean> ret = ImmutableMap.builder();
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<UUID>> lookup = this.plugin.getStorage().getUsersWithPermission(permission).join();
for (HeldPermission<UUID> holder : lookup) {
@@ -246,9 +225,9 @@ public class SpongeUserManager extends AbstractUserManager<SpongeUser> implement
}
@Override
public CompletableFuture<ImmutableMap<SubjectReference, Boolean>> getAllWithPermission(ImmutableContextSet contexts, String permission) {
public CompletableFuture<ImmutableMap<LPSubjectReference, Boolean>> getAllWithPermission(ImmutableContextSet contexts, String permission) {
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<SubjectReference, Boolean> ret = ImmutableMap.builder();
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<UUID>> lookup = this.plugin.getStorage().getUsersWithPermission(permission).join();
for (HeldPermission<UUID> holder : lookup) {
@@ -31,7 +31,6 @@ import me.lucko.luckperms.common.commands.CommandResult;
import me.lucko.luckperms.common.commands.abstraction.SubCommand;
import me.lucko.luckperms.common.commands.impl.migration.MigrationUtils;
import me.lucko.luckperms.common.commands.sender.Sender;
import me.lucko.luckperms.common.commands.utils.CommandUtils;
import me.lucko.luckperms.common.locale.CommandSpec;
import me.lucko.luckperms.common.locale.LocaleManager;
import me.lucko.luckperms.common.logging.ProgressLogger;
@@ -40,6 +39,7 @@ import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.utils.Predicates;
import me.lucko.luckperms.common.utils.SafeIterator;
import me.lucko.luckperms.common.utils.Uuids;
import me.lucko.luckperms.sponge.LPSpongePlugin;
import me.lucko.luckperms.sponge.service.LuckPermsService;
@@ -119,7 +119,7 @@ public class MigrationPermissionManager extends SubCommand<Object> {
log.log("Starting user migration.");
AtomicInteger userCount = new AtomicInteger(0);
SafeIterator.iterate(pmService.getUserSubjects().getAllSubjects(), pmUser -> {
UUID uuid = CommandUtils.parseUuid(pmUser.getIdentifier());
UUID uuid = Uuids.parseNullable(pmUser.getIdentifier());
if (uuid == null) {
log.logErr("Could not parse UUID for user: " + pmUser.getIdentifier());
return;
@@ -31,7 +31,6 @@ import me.lucko.luckperms.common.commands.CommandResult;
import me.lucko.luckperms.common.commands.abstraction.SubCommand;
import me.lucko.luckperms.common.commands.impl.migration.MigrationUtils;
import me.lucko.luckperms.common.commands.sender.Sender;
import me.lucko.luckperms.common.commands.utils.CommandUtils;
import me.lucko.luckperms.common.locale.CommandSpec;
import me.lucko.luckperms.common.locale.LocaleManager;
import me.lucko.luckperms.common.logging.ProgressLogger;
@@ -41,6 +40,7 @@ import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.utils.Predicates;
import me.lucko.luckperms.common.utils.SafeIterator;
import me.lucko.luckperms.common.utils.Uuids;
import me.lucko.luckperms.sponge.LPSpongePlugin;
import me.lucko.luckperms.sponge.service.LuckPermsService;
@@ -172,7 +172,7 @@ public class MigrationPermissionsEx extends SubCommand<Object> {
int userWeight = maxWeight + 5;
SafeIterator.iterate(pexService.getUserSubjects().getAllSubjects(), pexUser -> {
UUID uuid = CommandUtils.parseUuid(pexUser.getIdentifier());
UUID uuid = Uuids.parseNullable(pexUser.getIdentifier());
if (uuid == null) {
log.logErr("Could not parse UUID for user: " + pexUser.getIdentifier());
return;
@@ -40,7 +40,7 @@ import me.lucko.luckperms.sponge.service.LuckPermsSubjectData;
import me.lucko.luckperms.sponge.service.ProxyFactory;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.service.permission.PermissionService;
@@ -123,13 +123,13 @@ public class SpongeGroup extends Group {
}
@Override
public boolean isChildOf(ImmutableContextSet contexts, SubjectReference parent) {
public boolean isChildOf(ImmutableContextSet contexts, LPSubjectReference parent) {
return parent.getCollectionIdentifier().equals(PermissionService.SUBJECTS_GROUP) && getPermissionValue(contexts, NodeFactory.groupNode(parent.getSubjectIdentifier())).asBoolean();
}
@Override
public ImmutableList<SubjectReference> getParents(ImmutableContextSet contexts) {
ImmutableSet.Builder<SubjectReference> subjects = ImmutableSet.builder();
public ImmutableList<LPSubjectReference> getParents(ImmutableContextSet contexts) {
ImmutableSet.Builder<LPSubjectReference> subjects = ImmutableSet.builder();
for (Map.Entry<String, Boolean> entry : this.parent.getCachedData().getPermissionData(this.plugin.getContextManager().formContexts(contexts)).getImmutableBacking().entrySet()) {
if (!entry.getValue()) {
@@ -180,11 +180,6 @@ public class SpongeGroup extends Group {
return this.plugin.getService().getDefaults().getOption(contexts, s);
}
@Override
public ImmutableContextSet getActiveContextSet() {
return this.plugin.getContextManager().getApplicableContext(this.sponge());
}
@Override
public void invalidateCaches(CacheLevel cacheLevel) {
// invalidate for all changes
@@ -40,7 +40,7 @@ import me.lucko.luckperms.sponge.service.LuckPermsSubjectData;
import me.lucko.luckperms.sponge.service.ProxyFactory;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.command.CommandSource;
@@ -132,13 +132,13 @@ public class SpongeUser extends User {
}
@Override
public boolean isChildOf(ImmutableContextSet contexts, SubjectReference parent) {
public boolean isChildOf(ImmutableContextSet contexts, LPSubjectReference parent) {
return parent.getCollectionIdentifier().equals(PermissionService.SUBJECTS_GROUP) && getPermissionValue(contexts, NodeFactory.groupNode(parent.getSubjectIdentifier())).asBoolean();
}
@Override
public ImmutableList<SubjectReference> getParents(ImmutableContextSet contexts) {
ImmutableSet.Builder<SubjectReference> subjects = ImmutableSet.builder();
public ImmutableList<LPSubjectReference> getParents(ImmutableContextSet contexts) {
ImmutableSet.Builder<LPSubjectReference> subjects = ImmutableSet.builder();
for (Map.Entry<String, Boolean> entry : this.parent.getCachedData().getPermissionData(this.plugin.getContextManager().formContexts(contexts)).getImmutableBacking().entrySet()) {
if (!entry.getValue()) {
@@ -189,11 +189,6 @@ public class SpongeUser extends User {
return this.plugin.getService().getDefaults().getOption(contexts, s);
}
@Override
public ImmutableContextSet getActiveContextSet() {
return this.plugin.getContextManager().getApplicableContext(this.sponge());
}
@Override
public void invalidateCaches(CacheLevel cacheLevel) {
// invalidate for all changes
@@ -0,0 +1,66 @@
/*
* This file is part of LuckPerms, licensed under the MIT License.
*
* Copyright (c) lucko (Luck) <luck@lucko.me>
* 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.sponge.processors;
import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.api.context.ImmutableContextSet;
import me.lucko.luckperms.common.processors.PermissionProcessor;
import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import java.util.Map;
public abstract class DefaultsProcessor implements PermissionProcessor {
private final LuckPermsService service;
private final ImmutableContextSet contexts;
public DefaultsProcessor(LuckPermsService service, ImmutableContextSet contexts) {
this.service = service;
this.contexts = contexts;
}
protected abstract LPSubject getTypeDefaults(LuckPermsService service);
@Override
public Tristate hasPermission(String permission) {
Tristate t = getTypeDefaults(this.service).getPermissionValue(this.contexts, permission);
if (t != Tristate.UNDEFINED) {
return t;
}
t = this.service.getDefaults().getPermissionValue(this.contexts, permission);
if (t != Tristate.UNDEFINED) {
return t;
}
return Tristate.UNDEFINED;
}
@Override
public void updateBacking(Map<String, Boolean> map) {
// Do nothing, this doesn't use the backing
}
}
@@ -25,39 +25,18 @@
package me.lucko.luckperms.sponge.processors;
import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.api.context.ImmutableContextSet;
import me.lucko.luckperms.common.processors.PermissionProcessor;
import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import java.util.Map;
public class GroupDefaultsProcessor implements PermissionProcessor {
private final LuckPermsService service;
private final ImmutableContextSet contexts;
public class GroupDefaultsProcessor extends DefaultsProcessor implements PermissionProcessor {
public GroupDefaultsProcessor(LuckPermsService service, ImmutableContextSet contexts) {
this.service = service;
this.contexts = contexts;
super(service, contexts);
}
@Override
public Tristate hasPermission(String permission) {
Tristate t = this.service.getGroupSubjects().getDefaults().getPermissionValue(this.contexts, permission);
if (t != Tristate.UNDEFINED) {
return t;
}
t = this.service.getDefaults().getPermissionValue(this.contexts, permission);
if (t != Tristate.UNDEFINED) {
return t;
}
return Tristate.UNDEFINED;
}
@Override
public void updateBacking(Map<String, Boolean> map) {
// Do nothing, this doesn't use the backing
protected LPSubject getTypeDefaults(LuckPermsService service) {
return service.getGroupSubjects().getDefaults();
}
}
@@ -25,39 +25,18 @@
package me.lucko.luckperms.sponge.processors;
import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.api.context.ImmutableContextSet;
import me.lucko.luckperms.common.processors.PermissionProcessor;
import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import java.util.Map;
public class UserDefaultsProcessor implements PermissionProcessor {
private final LuckPermsService service;
private final ImmutableContextSet contexts;
public class UserDefaultsProcessor extends DefaultsProcessor implements PermissionProcessor {
public UserDefaultsProcessor(LuckPermsService service, ImmutableContextSet contexts) {
this.service = service;
this.contexts = contexts;
super(service, contexts);
}
@Override
public Tristate hasPermission(String permission) {
Tristate t = this.service.getUserSubjects().getDefaults().getPermissionValue(this.contexts, permission);
if (t != Tristate.UNDEFINED) {
return t;
}
t = this.service.getDefaults().getPermissionValue(this.contexts, permission);
if (t != Tristate.UNDEFINED) {
return t;
}
return Tristate.UNDEFINED;
}
@Override
public void updateBacking(Map<String, Boolean> map) {
// Do nothing, this doesn't use the backing
protected LPSubject getTypeDefaults(LuckPermsService service) {
return service.getUserSubjects().getDefaults();
}
}
@@ -29,7 +29,7 @@ import me.lucko.luckperms.sponge.service.model.LPPermissionDescription;
import me.lucko.luckperms.sponge.service.model.LPPermissionService;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import org.spongepowered.api.plugin.PluginContainer;
import org.spongepowered.api.service.permission.PermissionDescription;
@@ -89,7 +89,7 @@ public final class LuckPermsPermissionDescription implements LPPermissionDescrip
@SuppressWarnings("unchecked")
@Override
public CompletableFuture<Map<SubjectReference, Boolean>> findAssignedSubjects(String id) {
public CompletableFuture<Map<LPSubjectReference, Boolean>> findAssignedSubjects(String id) {
LPSubjectCollection collection = this.service.getCollection(id);
return (CompletableFuture) collection.getAllWithPermission(this.id);
}
@@ -42,9 +42,9 @@ import me.lucko.luckperms.sponge.service.model.LPPermissionDescription;
import me.lucko.luckperms.sponge.service.model.LPPermissionService;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.model.SubjectReferenceFactory;
import me.lucko.luckperms.sponge.service.persisted.PersistedCollection;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import me.lucko.luckperms.sponge.service.reference.SubjectReferenceFactory;
import me.lucko.luckperms.sponge.service.storage.SubjectStorage;
import org.spongepowered.api.plugin.PluginContainer;
@@ -211,8 +211,8 @@ public class LuckPermsService implements LPPermissionService {
}
@Override
public ImmutableList<SubjectReference> sortSubjects(Collection<SubjectReference> s) {
List<SubjectReference> ret = new ArrayList<>(s);
public ImmutableList<LPSubjectReference> sortSubjects(Collection<LPSubjectReference> s) {
List<LPSubjectReference> ret = new ArrayList<>(s);
ret.sort(Collections.reverseOrder((o1, o2) -> {
if (o1.equals(o2)) {
return 0;
@@ -40,7 +40,7 @@ import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.node.NodeFactory;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectData;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import org.spongepowered.api.service.permission.PermissionService;
@@ -178,11 +178,11 @@ public class LuckPermsSubjectData implements LPSubjectData {
}
@Override
public ImmutableMap<ImmutableContextSet, ImmutableList<SubjectReference>> getAllParents() {
Map<ImmutableContextSet, ImmutableList.Builder<SubjectReference>> parents = new HashMap<>();
public ImmutableMap<ImmutableContextSet, ImmutableList<LPSubjectReference>> getAllParents() {
Map<ImmutableContextSet, ImmutableList.Builder<LPSubjectReference>> parents = new HashMap<>();
for (Map.Entry<ImmutableContextSet, Collection<Node>> e : (this.enduring ? this.holder.getEnduringNodes() : this.holder.getTransientNodes()).asMap().entrySet()) {
ImmutableList.Builder<SubjectReference> results = ImmutableList.builder();
ImmutableList.Builder<LPSubjectReference> results = ImmutableList.builder();
for (Node n : e.getValue()) {
if (n.isGroupNode()) {
results.add(this.service.getGroupSubjects().loadSubject(n.getGroupName()).join().toReference());
@@ -191,15 +191,15 @@ public class LuckPermsSubjectData implements LPSubjectData {
parents.put(e.getKey(), results);
}
ImmutableMap.Builder<ImmutableContextSet, ImmutableList<SubjectReference>> map = ImmutableMap.builder();
for (Map.Entry<ImmutableContextSet, ImmutableList.Builder<SubjectReference>> e : parents.entrySet()) {
ImmutableMap.Builder<ImmutableContextSet, ImmutableList<LPSubjectReference>> map = ImmutableMap.builder();
for (Map.Entry<ImmutableContextSet, ImmutableList.Builder<LPSubjectReference>> e : parents.entrySet()) {
map.put(e.getKey(), e.getValue().build());
}
return map.build();
}
@Override
public CompletableFuture<Boolean> addParent(ImmutableContextSet contexts, SubjectReference subject) {
public CompletableFuture<Boolean> addParent(ImmutableContextSet contexts, LPSubjectReference subject) {
Objects.requireNonNull(contexts, "contexts");
Objects.requireNonNull(subject, "subject");
@@ -228,7 +228,7 @@ public class LuckPermsSubjectData implements LPSubjectData {
}
@Override
public CompletableFuture<Boolean> removeParent(ImmutableContextSet contexts, SubjectReference subject) {
public CompletableFuture<Boolean> removeParent(ImmutableContextSet contexts, LPSubjectReference subject) {
Objects.requireNonNull(contexts, "contexts");
Objects.requireNonNull(subject, "subject");
@@ -45,7 +45,7 @@ import me.lucko.luckperms.sponge.processors.SpongeWildcardProcessor;
import me.lucko.luckperms.sponge.service.model.LPPermissionService;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectData;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import java.util.HashMap;
import java.util.List;
@@ -70,7 +70,7 @@ public class CalculatedSubjectData implements LPSubjectData {
private final String calculatorDisplayName;
private final Map<ImmutableContextSet, Map<String, Boolean>> permissions = new ConcurrentHashMap<>();
private final Map<ImmutableContextSet, Set<SubjectReference>> parents = new ConcurrentHashMap<>();
private final Map<ImmutableContextSet, Set<LPSubjectReference>> parents = new ConcurrentHashMap<>();
private final Map<ImmutableContextSet, Map<String, String>> options = new ConcurrentHashMap<>();
private final LoadingCache<ImmutableContextSet, CalculatorHolder> permissionCache = Caffeine.newBuilder()
@@ -121,10 +121,10 @@ public class CalculatedSubjectData implements LPSubjectData {
this.service.invalidateAllCaches(LPSubject.CacheLevel.PERMISSION);
}
public void replaceParents(Map<ImmutableContextSet, List<SubjectReference>> map) {
public void replaceParents(Map<ImmutableContextSet, List<LPSubjectReference>> map) {
this.parents.clear();
for (Map.Entry<ImmutableContextSet, List<SubjectReference>> e : map.entrySet()) {
Set<SubjectReference> set = ConcurrentHashMap.newKeySet();
for (Map.Entry<ImmutableContextSet, List<LPSubjectReference>> e : map.entrySet()) {
Set<LPSubjectReference> set = ConcurrentHashMap.newKeySet();
set.addAll(e.getValue());
this.parents.put(e.getKey(), set);
}
@@ -194,17 +194,17 @@ public class CalculatedSubjectData implements LPSubjectData {
}
@Override
public ImmutableMap<ImmutableContextSet, ImmutableList<SubjectReference>> getAllParents() {
ImmutableMap.Builder<ImmutableContextSet, ImmutableList<SubjectReference>> map = ImmutableMap.builder();
for (Map.Entry<ImmutableContextSet, Set<SubjectReference>> e : this.parents.entrySet()) {
public ImmutableMap<ImmutableContextSet, ImmutableList<LPSubjectReference>> getAllParents() {
ImmutableMap.Builder<ImmutableContextSet, ImmutableList<LPSubjectReference>> map = ImmutableMap.builder();
for (Map.Entry<ImmutableContextSet, Set<LPSubjectReference>> e : this.parents.entrySet()) {
map.put(e.getKey(), this.service.sortSubjects(e.getValue()));
}
return map.build();
}
@Override
public CompletableFuture<Boolean> addParent(ImmutableContextSet contexts, SubjectReference parent) {
Set<SubjectReference> set = this.parents.computeIfAbsent(contexts, c -> ConcurrentHashMap.newKeySet());
public CompletableFuture<Boolean> addParent(ImmutableContextSet contexts, LPSubjectReference parent) {
Set<LPSubjectReference> set = this.parents.computeIfAbsent(contexts, c -> ConcurrentHashMap.newKeySet());
boolean b = set.add(parent);
if (b) {
this.service.invalidateAllCaches(LPSubject.CacheLevel.PARENT);
@@ -213,8 +213,8 @@ public class CalculatedSubjectData implements LPSubjectData {
}
@Override
public CompletableFuture<Boolean> removeParent(ImmutableContextSet contexts, SubjectReference parent) {
Set<SubjectReference> set = this.parents.get(contexts);
public CompletableFuture<Boolean> removeParent(ImmutableContextSet contexts, LPSubjectReference parent) {
Set<LPSubjectReference> set = this.parents.get(contexts);
boolean b = set != null && set.remove(parent);
if (b) {
this.service.invalidateAllCaches(LPSubject.CacheLevel.PARENT);
@@ -235,7 +235,7 @@ public class CalculatedSubjectData implements LPSubjectData {
@Override
public CompletableFuture<Boolean> clearParents(ImmutableContextSet contexts) {
Set<SubjectReference> set = this.parents.get(contexts);
Set<LPSubjectReference> set = this.parents.get(contexts);
if (set == null) {
return CompletableFuture.completedFuture(false);
}
@@ -27,7 +27,7 @@ package me.lucko.luckperms.sponge.service.legacy;
import me.lucko.luckperms.api.context.ImmutableContextSet;
import me.lucko.luckperms.sponge.service.model.LPPermissionService;
import me.lucko.luckperms.sponge.service.model.SubjectReferenceFactory;
import me.lucko.luckperms.sponge.service.reference.SubjectReferenceFactory;
import me.lucko.luckperms.sponge.service.storage.SubjectStorageModel;
import java.util.List;
@@ -40,12 +40,13 @@ import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.ProxyFactory;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.LPSubjectCollection;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import me.lucko.luckperms.sponge.service.storage.SubjectStorageModel;
import org.spongepowered.api.service.permission.SubjectCollection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
@@ -73,7 +74,9 @@ public class PersistedCollection implements LPSubjectCollection {
Map<String, SubjectStorageModel> holders = this.service.getStorage().loadAllFromFile(this.identifier);
for (Map.Entry<String, SubjectStorageModel> e : holders.entrySet()) {
PersistedSubject subject = this.subjects.get(e.getKey().toLowerCase());
subject.loadData(e.getValue());
if (subject != null) {
subject.loadData(e.getValue());
}
}
}
@@ -104,7 +107,7 @@ public class PersistedCollection implements LPSubjectCollection {
@Override
public Optional<LPSubject> getSubject(String identifier) {
return Optional.of(this.subjects.get(identifier.toLowerCase()));
return Optional.of(Objects.requireNonNull(this.subjects.get(identifier.toLowerCase())));
}
@Override
@@ -116,7 +119,7 @@ public class PersistedCollection implements LPSubjectCollection {
public CompletableFuture<ImmutableCollection<LPSubject>> loadSubjects(Set<String> identifiers) {
ImmutableSet.Builder<LPSubject> ret = ImmutableSet.builder();
for (String id : identifiers) {
ret.add(this.subjects.get(id.toLowerCase()));
ret.add(Objects.requireNonNull(this.subjects.get(id.toLowerCase())));
}
return CompletableFuture.completedFuture(ret.build());
}
@@ -132,13 +135,13 @@ public class PersistedCollection implements LPSubjectCollection {
}
@Override
public CompletableFuture<ImmutableMap<SubjectReference, Boolean>> getAllWithPermission(String permission) {
public CompletableFuture<ImmutableMap<LPSubjectReference, Boolean>> getAllWithPermission(String permission) {
return CompletableFuture.completedFuture(getLoadedWithPermission(permission).entrySet().stream()
.collect(ImmutableCollectors.toMap(e -> e.getKey().toReference(), Map.Entry::getValue)));
}
@Override
public CompletableFuture<ImmutableMap<SubjectReference, Boolean>> getAllWithPermission(ImmutableContextSet contexts, String permission) {
public CompletableFuture<ImmutableMap<LPSubjectReference, Boolean>> getAllWithPermission(ImmutableContextSet contexts, String permission) {
return CompletableFuture.completedFuture(getLoadedWithPermission(contexts, permission).entrySet().stream()
.collect(ImmutableCollectors.toMap(e -> e.getKey().toReference(), Map.Entry::getValue)));
}
@@ -37,7 +37,7 @@ import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.ProxyFactory;
import me.lucko.luckperms.sponge.service.calculated.CalculatedSubjectData;
import me.lucko.luckperms.sponge.service.model.LPSubject;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import me.lucko.luckperms.sponge.service.storage.SubjectStorageModel;
import org.spongepowered.api.command.CommandSource;
@@ -66,7 +66,7 @@ public class PersistedSubject implements LPSubject {
.expireAfterAccess(20, TimeUnit.MINUTES)
.build(lookup -> lookupPermissionValue(lookup.getContexts(), lookup.getNode()));
private final LoadingCache<ImmutableContextSet, ImmutableList<SubjectReference>> parentLookupCache = Caffeine.newBuilder()
private final LoadingCache<ImmutableContextSet, ImmutableList<LPSubjectReference>> parentLookupCache = Caffeine.newBuilder()
.expireAfterAccess(20, TimeUnit.MINUTES)
.build(this::lookupParents);
@@ -194,7 +194,7 @@ public class PersistedSubject implements LPSubject {
}
}
for (SubjectReference parent : getParents(contexts)) {
for (LPSubjectReference parent : getParents(contexts)) {
res = parent.resolveLp().join().getPermissionValue(contexts, node);
if (res != Tristate.UNDEFINED) {
return res;
@@ -214,8 +214,8 @@ public class PersistedSubject implements LPSubject {
return res;
}
private ImmutableList<SubjectReference> lookupParents(ImmutableContextSet contexts) {
List<SubjectReference> s = new ArrayList<>();
private ImmutableList<LPSubjectReference> lookupParents(ImmutableContextSet contexts) {
List<LPSubjectReference> s = new ArrayList<>();
s.addAll(this.subjectData.getParents(contexts));
s.addAll(this.transientSubjectData.getParents(contexts));
@@ -253,7 +253,7 @@ public class PersistedSubject implements LPSubject {
}
}
for (SubjectReference parent : getParents(contexts)) {
for (LPSubjectReference parent : getParents(contexts)) {
res = parent.resolveLp().join().getOption(contexts, key);
if (res.isPresent()) {
return res;
@@ -283,7 +283,7 @@ public class PersistedSubject implements LPSubject {
}
@Override
public boolean isChildOf(ImmutableContextSet contexts, SubjectReference subject) {
public boolean isChildOf(ImmutableContextSet contexts, LPSubjectReference subject) {
Objects.requireNonNull(contexts, "contexts");
Objects.requireNonNull(subject, "subject");
@@ -299,7 +299,7 @@ public class PersistedSubject implements LPSubject {
}
@Override
public ImmutableList<SubjectReference> getParents(ImmutableContextSet contexts) {
public ImmutableList<LPSubjectReference> getParents(ImmutableContextSet contexts) {
Objects.requireNonNull(contexts, "contexts");
return this.parentLookupCache.get(contexts);
}
@@ -308,9 +308,4 @@ public class PersistedSubject implements LPSubject {
public Optional<String> getOption(ImmutableContextSet contexts, String key) {
return this.optionLookupCache.get(OptionLookupKey.of(key, contexts));
}
@Override
public ImmutableContextSet getActiveContextSet() {
return this.service.getPlugin().getContextManager().getApplicableContext(sponge());
}
}
@@ -29,7 +29,7 @@ import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.api.context.ImmutableContextSet;
import me.lucko.luckperms.sponge.service.LuckPermsService;
import me.lucko.luckperms.sponge.service.calculated.CalculatedSubjectData;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
@@ -79,12 +79,12 @@ public class PersistedSubjectData extends CalculatedSubjectData implements Funct
}
@Override
public CompletableFuture<Boolean> addParent(ImmutableContextSet contexts, SubjectReference parent) {
public CompletableFuture<Boolean> addParent(ImmutableContextSet contexts, LPSubjectReference parent) {
return super.addParent(contexts, parent).thenApply(this);
}
@Override
public CompletableFuture<Boolean> removeParent(ImmutableContextSet contexts, SubjectReference parent) {
public CompletableFuture<Boolean> removeParent(ImmutableContextSet contexts, LPSubjectReference parent) {
return super.removeParent(contexts, parent).thenApply(this);
}
@@ -38,8 +38,8 @@ import me.lucko.luckperms.common.contexts.ContextSetJsonSerializer;
import me.lucko.luckperms.common.utils.CollationKeyCache;
import me.lucko.luckperms.sponge.service.calculated.CalculatedSubjectData;
import me.lucko.luckperms.sponge.service.model.LPPermissionService;
import me.lucko.luckperms.sponge.service.model.SubjectReference;
import me.lucko.luckperms.sponge.service.model.SubjectReferenceFactory;
import me.lucko.luckperms.sponge.service.reference.LPSubjectReference;
import me.lucko.luckperms.sponge.service.reference.SubjectReferenceFactory;
import java.util.ArrayList;
import java.util.List;
@@ -52,9 +52,9 @@ public class SubjectStorageModel {
private final LPPermissionService service;
private final Map<ImmutableContextSet, Map<String, Boolean>> permissions;
private final Map<ImmutableContextSet, Map<String, String>> options;
private final Map<ImmutableContextSet, List<SubjectReference>> parents;
private final Map<ImmutableContextSet, List<LPSubjectReference>> parents;
public SubjectStorageModel(LPPermissionService service, Map<ImmutableContextSet, ? extends Map<String, Boolean>> permissions, Map<ImmutableContextSet, ? extends Map<String, String>> options, Map<ImmutableContextSet, ? extends List<SubjectReference>> parents) {
public SubjectStorageModel(LPPermissionService service, Map<ImmutableContextSet, ? extends Map<String, Boolean>> permissions, Map<ImmutableContextSet, ? extends Map<String, String>> options, Map<ImmutableContextSet, ? extends List<LPSubjectReference>> parents) {
this.service = service;
ImmutableMap.Builder<ImmutableContextSet, Map<String, Boolean>> permissionsBuilder = ImmutableMap.builder();
@@ -69,8 +69,8 @@ public class SubjectStorageModel {
}
this.options = optionsBuilder.build();
ImmutableMap.Builder<ImmutableContextSet, List<SubjectReference>> parentsBuilder = ImmutableMap.builder();
for (Map.Entry<ImmutableContextSet, ? extends List<SubjectReference>> e : parents.entrySet()) {
ImmutableMap.Builder<ImmutableContextSet, List<LPSubjectReference>> parentsBuilder = ImmutableMap.builder();
for (Map.Entry<ImmutableContextSet, ? extends List<LPSubjectReference>> e : parents.entrySet()) {
parentsBuilder.put(e.getKey(), ImmutableList.copyOf(e.getValue()));
}
this.parents = parentsBuilder.build();
@@ -137,7 +137,7 @@ public class SubjectStorageModel {
}
this.options = optionsBuilder.build();
ImmutableMap.Builder<ImmutableContextSet, List<SubjectReference>> parentsBuilder = ImmutableMap.builder();
ImmutableMap.Builder<ImmutableContextSet, List<LPSubjectReference>> parentsBuilder = ImmutableMap.builder();
for (JsonElement e : parents) {
if (!e.isJsonObject()) {
continue;
@@ -151,7 +151,7 @@ public class SubjectStorageModel {
JsonArray data = section.get("data").getAsJsonArray();
ImmutableContextSet contextSet = ContextSetJsonSerializer.deserializeContextSet(context).makeImmutable();
ImmutableList.Builder<SubjectReference> pars = ImmutableList.builder();
ImmutableList.Builder<LPSubjectReference> pars = ImmutableList.builder();
for (JsonElement p : data) {
if (!p.isJsonObject()) {
continue;
@@ -228,7 +228,7 @@ public class SubjectStorageModel {
root.add("options", options);
JsonArray parents = new JsonArray();
for (Map.Entry<ImmutableContextSet, List<SubjectReference>> e : sortContextMap(this.parents)) {
for (Map.Entry<ImmutableContextSet, List<LPSubjectReference>> e : sortContextMap(this.parents)) {
if (e.getValue().isEmpty()) {
continue;
}
@@ -237,7 +237,7 @@ public class SubjectStorageModel {
section.add("context", ContextSetJsonSerializer.serializeContextSet(e.getKey()));
JsonArray data = new JsonArray();
for (SubjectReference ref : e.getValue()) {
for (LPSubjectReference ref : e.getValue()) {
JsonObject parent = new JsonObject();
parent.addProperty("collection", ref.getCollectionIdentifier());
parent.addProperty("subject", ref.getCollectionIdentifier());