diff --git a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiPlatform.java b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiPlatform.java index 558ff703b..d19884c76 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiPlatform.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiPlatform.java @@ -52,7 +52,8 @@ public class ApiPlatform implements Platform, PluginMetadata { @Override public @NonNull String getApiVersion() { - return "5.2"; + String[] version = this.plugin.getBootstrap().getVersion().split("\\."); + return version[0] + '.' + version[1]; } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java b/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java index e1130e25d..a275b6c52 100644 --- a/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java +++ b/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java @@ -81,6 +81,7 @@ import net.luckperms.api.event.track.mutate.TrackAddGroupEvent; import net.luckperms.api.event.track.mutate.TrackClearEvent; import net.luckperms.api.event.track.mutate.TrackRemoveGroupEvent; import net.luckperms.api.event.type.Cancellable; +import net.luckperms.api.event.type.ResultEvent; import net.luckperms.api.event.user.UserCacheLoadEvent; import net.luckperms.api.event.user.UserDataRecalculateEvent; import net.luckperms.api.event.user.UserFirstLoginEvent; @@ -100,7 +101,6 @@ import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Supplier; public final class EventDispatcher { private final AbstractEventBus eventBus; @@ -113,27 +113,58 @@ public final class EventDispatcher { return this.eventBus; } - private boolean shouldPost(Class eventClass) { - return this.eventBus.shouldPost(eventClass); - } - - private void post(LuckPermsEvent event) { - this.eventBus.post(event); - } - - private void post(Class eventClass, Supplier supplier) { + private void postAsync(Class eventClass, Object... params) { + // check against common mistakes - events with any sort of result shouldn't be posted async if (Cancellable.class.isAssignableFrom(eventClass)) { throw new RuntimeException("Cancellable event cannot be posted async (" + eventClass + ")"); } + if (ResultEvent.class.isAssignableFrom(eventClass)) { + throw new RuntimeException("ResultEvent event cannot be posted async (" + eventClass + ")"); + } + // if there aren't any handlers registered for the event, don't bother trying to post it + if (!this.eventBus.shouldPost(eventClass)) { + return; + } + + // async: generate an event class and post it this.eventBus.getPlugin().getBootstrap().getScheduler().executeAsync(() -> { - if (!shouldPost(eventClass)) { - return; - } - T event = supplier.get(); - post(event); + T event = generate(eventClass, params); + this.eventBus.post(event); }); } + + private void postSync(Class eventClass, Object... params) { + // if there aren't any handlers registered for our event, don't bother trying to post it + if (!this.eventBus.shouldPost(eventClass)) { + return; + } + + // generate an event class and post it + T event = generate(eventClass, params); + this.eventBus.post(event); + } + + private boolean postCancellable(Class eventClass, Object... params) { + // extract the initial state from the first parameter + boolean initialState = (boolean) params[0]; + + // if there aren't any handlers registered for the event, just return the initial state + if (!this.eventBus.shouldPost(eventClass)) { + return initialState; + } + + // otherwise: + // - initialise an AtomicBoolean for the result with the initial state + // - replace the boolean with the AtomicBoolean in the params array + // - post the event + AtomicBoolean cancel = new AtomicBoolean(initialState); + params[0] = cancel; + postSync(eventClass, params); + + // return the final status + return cancel.get(); + } @SuppressWarnings("unchecked") private T generate(Class eventClass, Object... params) { @@ -145,235 +176,171 @@ public final class EventDispatcher { } public void dispatchContextUpdate(Object subject) { - if (!shouldPost(ContextUpdateEvent.class)) { - return; - } - - post(generate(ContextUpdateEvent.class, subject)); + postSync(ContextUpdateEvent.class, subject); } public void dispatchExtensionLoad(Extension extension) { - post(ExtensionLoadEvent.class, () -> generate(ExtensionLoadEvent.class, extension)); + postAsync(ExtensionLoadEvent.class, extension); } public void dispatchGroupCacheLoad(Group group, GroupCachedDataManager data) { - post(GroupCacheLoadEvent.class, () -> generate(GroupCacheLoadEvent.class, group.getApiProxy(), data)); + postAsync(GroupCacheLoadEvent.class, group.getApiProxy(), data); } public void dispatchGroupCreate(Group group, CreationCause cause) { - post(GroupCreateEvent.class, () -> generate(GroupCreateEvent.class, group.getApiProxy(), cause)); + postAsync(GroupCreateEvent.class, group.getApiProxy(), cause); } public void dispatchGroupDelete(Group group, DeletionCause cause) { - post(GroupDeleteEvent.class, () -> generate(GroupDeleteEvent.class, group.getName(), ImmutableSet.copyOf(group.normalData().asSet()), cause)); + postAsync(GroupDeleteEvent.class, group.getName(), ImmutableSet.copyOf(group.normalData().asSet()), cause); } public void dispatchGroupLoadAll() { - post(GroupLoadAllEvent.class, () -> generate(GroupLoadAllEvent.class)); + postAsync(GroupLoadAllEvent.class); } public void dispatchGroupLoad(Group group) { - post(GroupLoadEvent.class, () -> generate(GroupLoadEvent.class, group.getApiProxy())); + postAsync(GroupLoadEvent.class, group.getApiProxy()); } public boolean dispatchLogBroadcast(boolean initialState, Action entry, LogBroadcastEvent.Origin origin) { - if (!shouldPost(LogBroadcastEvent.class)) { - return initialState; - } - - AtomicBoolean cancel = new AtomicBoolean(initialState); - post(generate(LogBroadcastEvent.class, cancel, entry, origin)); - return cancel.get(); + return postCancellable(LogBroadcastEvent.class, initialState, entry, origin); } public boolean dispatchLogPublish(boolean initialState, Action entry) { - if (!shouldPost(LogPublishEvent.class)) { - return initialState; - } - - AtomicBoolean cancel = new AtomicBoolean(initialState); - post(generate(LogPublishEvent.class, cancel, entry)); - return cancel.get(); + return postCancellable(LogPublishEvent.class, initialState, entry); } public boolean dispatchLogNetworkPublish(boolean initialState, UUID id, Action entry) { - if (!shouldPost(LogNetworkPublishEvent.class)) { - return initialState; - } - - AtomicBoolean cancel = new AtomicBoolean(initialState); - post(generate(LogNetworkPublishEvent.class, cancel, id, entry)); - return cancel.get(); + return postCancellable(LogNetworkPublishEvent.class, initialState, id, entry); } public boolean dispatchLogNotify(boolean initialState, Action entry, LogNotifyEvent.Origin origin, Sender sender) { - if (!shouldPost(LogNotifyEvent.class)) { - return initialState; - } - - AtomicBoolean cancel = new AtomicBoolean(initialState); - post(generate(LogNotifyEvent.class, cancel, entry, origin, new SenderPlatformEntity(sender))); - return cancel.get(); + return postCancellable(LogNotifyEvent.class, initialState, entry, origin, new SenderPlatformEntity(sender)); } public void dispatchLogReceive(UUID id, Action entry) { - post(LogReceiveEvent.class, () -> generate(LogReceiveEvent.class, id, entry)); + postAsync(LogReceiveEvent.class, id, entry); } public void dispatchNodeAdd(Node node, PermissionHolder target, DataType dataType, Collection before, Collection after) { - post(NodeAddEvent.class, () -> generate(NodeAddEvent.class, proxy(target), dataType, ImmutableSet.copyOf(before), ImmutableSet.copyOf(after), node)); + postAsync(NodeAddEvent.class, proxy(target), dataType, ImmutableSet.copyOf(before), ImmutableSet.copyOf(after), node); } public void dispatchNodeClear(PermissionHolder target, DataType dataType, Collection before, Collection after) { - post(NodeClearEvent.class, () -> generate(NodeClearEvent.class, proxy(target), dataType, ImmutableSet.copyOf(before), ImmutableSet.copyOf(after))); + postAsync(NodeClearEvent.class, proxy(target), dataType, ImmutableSet.copyOf(before), ImmutableSet.copyOf(after)); } public void dispatchNodeRemove(Node node, PermissionHolder target, DataType dataType, Collection before, Collection after) { - post(NodeRemoveEvent.class, () -> generate(NodeRemoveEvent.class, proxy(target), dataType, ImmutableSet.copyOf(before), ImmutableSet.copyOf(after), node)); + postAsync(NodeRemoveEvent.class, proxy(target), dataType, ImmutableSet.copyOf(before), ImmutableSet.copyOf(after), node); } public void dispatchConfigReload() { - post(ConfigReloadEvent.class, () -> generate(ConfigReloadEvent.class)); + postAsync(ConfigReloadEvent.class); } public void dispatchPostSync() { - post(PostSyncEvent.class, () -> generate(PostSyncEvent.class)); + postAsync(PostSyncEvent.class); } public boolean dispatchNetworkPreSync(boolean initialState, UUID id) { - if (!shouldPost(PreNetworkSyncEvent.class)) { - return initialState; - } - - AtomicBoolean cancel = new AtomicBoolean(initialState); - post(generate(PreNetworkSyncEvent.class, cancel, id)); - return cancel.get(); + return postCancellable(PreNetworkSyncEvent.class, initialState, id); } public boolean dispatchPreSync(boolean initialState) { - if (!shouldPost(PreSyncEvent.class)) { - return initialState; - } - - AtomicBoolean cancel = new AtomicBoolean(initialState); - post(generate(PreSyncEvent.class, cancel)); - return cancel.get(); + return postCancellable(PreSyncEvent.class, initialState); } public void dispatchTrackCreate(Track track, CreationCause cause) { - post(TrackCreateEvent.class, () -> generate(TrackCreateEvent.class, track.getApiProxy(), cause)); + postAsync(TrackCreateEvent.class, track.getApiProxy(), cause); } public void dispatchTrackDelete(Track track, DeletionCause cause) { - post(TrackDeleteEvent.class, () -> generate(TrackDeleteEvent.class, track.getName(), ImmutableList.copyOf(track.getGroups()), cause)); + postAsync(TrackDeleteEvent.class, track.getName(), ImmutableList.copyOf(track.getGroups()), cause); } public void dispatchTrackLoadAll() { - post(TrackLoadAllEvent.class, () -> generate(TrackLoadAllEvent.class)); + postAsync(TrackLoadAllEvent.class); } public void dispatchTrackLoad(Track track) { - post(TrackLoadEvent.class, () -> generate(TrackLoadEvent.class, track.getApiProxy())); + postAsync(TrackLoadEvent.class, track.getApiProxy()); } public void dispatchTrackAddGroup(Track track, String group, List before, List after) { - post(TrackAddGroupEvent.class, () -> generate(TrackAddGroupEvent.class, track.getApiProxy(), ImmutableList.copyOf(before), ImmutableList.copyOf(after), group)); + postAsync(TrackAddGroupEvent.class, track.getApiProxy(), ImmutableList.copyOf(before), ImmutableList.copyOf(after), group); } public void dispatchTrackClear(Track track, List before) { - post(TrackClearEvent.class, () -> generate(TrackClearEvent.class, track.getApiProxy(), ImmutableList.copyOf(before), ImmutableList.of())); + postAsync(TrackClearEvent.class, track.getApiProxy(), ImmutableList.copyOf(before), ImmutableList.of()); } public void dispatchTrackRemoveGroup(Track track, String group, List before, List after) { - post(TrackRemoveGroupEvent.class, () -> generate(TrackRemoveGroupEvent.class, track.getApiProxy(), ImmutableList.copyOf(before), ImmutableList.copyOf(after), group)); + postAsync(TrackRemoveGroupEvent.class, track.getApiProxy(), ImmutableList.copyOf(before), ImmutableList.copyOf(after), group); } public void dispatchUserCacheLoad(User user, UserCachedDataManager data) { - post(UserCacheLoadEvent.class, () -> generate(UserCacheLoadEvent.class, user.getApiProxy(), data)); + postAsync(UserCacheLoadEvent.class, user.getApiProxy(), data); } public void dispatchDataRecalculate(PermissionHolder holder) { if (holder.getType() == HolderType.USER) { User user = (User) holder; - post(UserDataRecalculateEvent.class, () -> generate(UserDataRecalculateEvent.class, user.getApiProxy(), user.getCachedData())); + postAsync(UserDataRecalculateEvent.class, user.getApiProxy(), user.getCachedData()); } else { Group group = (Group) holder; - post(GroupDataRecalculateEvent.class, () -> generate(GroupDataRecalculateEvent.class, group.getApiProxy(), group.getCachedData())); + postAsync(GroupDataRecalculateEvent.class, group.getApiProxy(), group.getCachedData()); } } public void dispatchUserFirstLogin(UUID uniqueId, String username) { - post(UserFirstLoginEvent.class, () -> generate(UserFirstLoginEvent.class, uniqueId, username)); + postAsync(UserFirstLoginEvent.class, uniqueId, username); } public void dispatchPlayerLoginProcess(UUID uniqueId, String username, User user) { - if (!shouldPost(PlayerLoginProcessEvent.class)) { - return; - } - - post(generate(PlayerLoginProcessEvent.class, uniqueId, username, user.getApiProxy())); + postSync(PlayerLoginProcessEvent.class, uniqueId, username, user.getApiProxy()); } public void dispatchPlayerDataSave(UUID uniqueId, String username, PlayerSaveResult result) { - post(PlayerDataSaveEvent.class, () -> generate(PlayerDataSaveEvent.class, uniqueId, username, result)); + postAsync(PlayerDataSaveEvent.class, uniqueId, username, result); } public String dispatchUniqueIdDetermineType(UUID uniqueId, String initialType) { - if (!shouldPost(UniqueIdDetermineTypeEvent.class)) { - return initialType; - } - AtomicReference result = new AtomicReference<>(initialType); - post(generate(UniqueIdDetermineTypeEvent.class, result, uniqueId)); + postSync(UniqueIdDetermineTypeEvent.class, result, uniqueId); return result.get(); } public UUID dispatchUniqueIdLookup(String username, UUID initial) { - if (!shouldPost(UniqueIdLookupEvent.class)) { - return initial; - } - AtomicReference result = new AtomicReference<>(initial); - post(generate(UniqueIdLookupEvent.class, result, username)); + postSync(UniqueIdLookupEvent.class, result, username); return result.get(); } public String dispatchUsernameLookup(UUID uniqueId, String initial) { - if (!shouldPost(UsernameLookupEvent.class)) { - return initial; - } - AtomicReference result = new AtomicReference<>(initial); - post(generate(UsernameLookupEvent.class, result, uniqueId)); + postSync(UsernameLookupEvent.class, result, uniqueId); return result.get(); } public boolean dispatchUsernameValidityCheck(String username, boolean initialState) { - if (!shouldPost(UsernameValidityCheckEvent.class)) { - return initialState; - } - AtomicBoolean result = new AtomicBoolean(initialState); - post(generate(UsernameValidityCheckEvent.class, username, result)); + postSync(UsernameValidityCheckEvent.class, username, result); return result.get(); } public void dispatchUserLoad(User user) { - post(UserLoadEvent.class, () -> generate(UserLoadEvent.class, user.getApiProxy())); + postAsync(UserLoadEvent.class, user.getApiProxy()); } - public void dispatchUserDemote(User user, Track track, String from, String to, @Nullable Sender source) { - post(UserDemoteEvent.class, () -> { - Source s = source == null ? UnknownSource.INSTANCE : new EntitySourceImpl(new SenderPlatformEntity(source)); - return generate(UserDemoteEvent.class, s, track.getApiProxy(), user.getApiProxy(), Optional.ofNullable(from), Optional.ofNullable(to)); - }); + public void dispatchUserDemote(User user, Track track, String from, String to, @Nullable Sender sender) { + Source source = sender == null ? UnknownSource.INSTANCE : new EntitySourceImpl(new SenderPlatformEntity(sender)); + postAsync(UserDemoteEvent.class, source, track.getApiProxy(), user.getApiProxy(), Optional.ofNullable(from), Optional.ofNullable(to)); } - public void dispatchUserPromote(User user, Track track, String from, String to, @Nullable Sender source) { - post(UserPromoteEvent.class, () -> { - Source s = source == null ? UnknownSource.INSTANCE : new EntitySourceImpl(new SenderPlatformEntity(source)); - return generate(UserPromoteEvent.class, s, track.getApiProxy(), user.getApiProxy(), Optional.ofNullable(from), Optional.ofNullable(to)); - }); + public void dispatchUserPromote(User user, Track track, String from, String to, @Nullable Sender sender) { + Source source = sender == null ? UnknownSource.INSTANCE : new EntitySourceImpl(new SenderPlatformEntity(sender)); + postAsync(UserPromoteEvent.class, source, track.getApiProxy(), user.getApiProxy(), Optional.ofNullable(from), Optional.ofNullable(to)); } private static ApiPermissionHolder proxy(PermissionHolder holder) { diff --git a/common/src/main/java/me/lucko/luckperms/common/query/FlagUtils.java b/common/src/main/java/me/lucko/luckperms/common/query/FlagUtils.java index 653885f9e..a2e73a661 100644 --- a/common/src/main/java/me/lucko/luckperms/common/query/FlagUtils.java +++ b/common/src/main/java/me/lucko/luckperms/common/query/FlagUtils.java @@ -35,7 +35,7 @@ final class FlagUtils { private static final EnumSet DEFAULT_FLAGS_SET = EnumSet.allOf(Flag.class); private static final int DEFAULT_FLAGS_SIZE = DEFAULT_FLAGS_SET.size(); - static final byte DEFAULT_FLAGS = encodeAsByte(DEFAULT_FLAGS_SET); + static final byte DEFAULT_FLAGS = toByte0(DEFAULT_FLAGS_SET); /* bitwise utility methods */ @@ -48,10 +48,10 @@ final class FlagUtils { if (settings.size() == DEFAULT_FLAGS_SIZE) { return DEFAULT_FLAGS; } - return encodeAsByte(settings); + return toByte0(settings); } - private static byte encodeAsByte(Set settings) { + private static byte toByte0(Set settings) { byte b = 0; for (Flag setting : settings) { b |= (1 << setting.ordinal()); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java b/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java index c3b3a1c92..9cfacbb89 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java @@ -81,7 +81,7 @@ public class Storage { } } - private CompletableFuture makeFuture(Callable supplier) { + private CompletableFuture future(Callable supplier) { return CompletableFuture.supplyAsync(() -> { try { return supplier.call(); @@ -94,7 +94,7 @@ public class Storage { }, this.plugin.getBootstrap().getScheduler().async()); } - private CompletableFuture makeFuture(Throwing.Runnable runnable) { + private CompletableFuture future(Throwing.Runnable runnable) { return CompletableFuture.runAsync(() -> { try { runnable.run(); @@ -132,19 +132,19 @@ public class Storage { } public CompletableFuture logAction(Action entry) { - return makeFuture(() -> this.implementation.logAction(entry)); + return future(() -> this.implementation.logAction(entry)); } public CompletableFuture getLog() { - return makeFuture(this.implementation::getLog); + return future(this.implementation::getLog); } public CompletableFuture applyBulkUpdate(BulkUpdate bulkUpdate) { - return makeFuture(() -> this.implementation.applyBulkUpdate(bulkUpdate)); + return future(() -> this.implementation.applyBulkUpdate(bulkUpdate)); } public CompletableFuture loadUser(UUID uniqueId, String username) { - return makeFuture(() -> { + return future(() -> { User user = this.implementation.loadUser(uniqueId, username); if (user != null) { this.plugin.getEventDispatcher().dispatchUserLoad(user); @@ -154,15 +154,15 @@ public class Storage { } public CompletableFuture saveUser(User user) { - return makeFuture(() -> this.implementation.saveUser(user)); + return future(() -> this.implementation.saveUser(user)); } public CompletableFuture> getUniqueUsers() { - return makeFuture(this.implementation::getUniqueUsers); + return future(this.implementation::getUniqueUsers); } public CompletableFuture>> searchUserNodes(ConstraintNodeMatcher constraint) { - return makeFuture(() -> { + return future(() -> { List> result = this.implementation.searchUserNodes(constraint); result.removeIf(entry -> entry.getNode().hasExpired()); return ImmutableList.copyOf(result); @@ -170,7 +170,7 @@ public class Storage { } public CompletableFuture createAndLoadGroup(String name, CreationCause cause) { - return makeFuture(() -> { + return future(() -> { Group group = this.implementation.createAndLoadGroup(name.toLowerCase()); if (group != null) { this.plugin.getEventDispatcher().dispatchGroupCreate(group, cause); @@ -180,7 +180,7 @@ public class Storage { } public CompletableFuture> loadGroup(String name) { - return makeFuture(() -> { + return future(() -> { Optional group = this.implementation.loadGroup(name.toLowerCase()); if (group.isPresent()) { this.plugin.getEventDispatcher().dispatchGroupLoad(group.get()); @@ -190,25 +190,25 @@ public class Storage { } public CompletableFuture loadAllGroups() { - return makeFuture(() -> { + return future(() -> { this.implementation.loadAllGroups(); this.plugin.getEventDispatcher().dispatchGroupLoadAll(); }); } public CompletableFuture saveGroup(Group group) { - return makeFuture(() -> this.implementation.saveGroup(group)); + return future(() -> this.implementation.saveGroup(group)); } public CompletableFuture deleteGroup(Group group, DeletionCause cause) { - return makeFuture(() -> { + return future(() -> { this.implementation.deleteGroup(group); this.plugin.getEventDispatcher().dispatchGroupDelete(group, cause); }); } public CompletableFuture>> searchGroupNodes(ConstraintNodeMatcher constraint) { - return makeFuture(() -> { + return future(() -> { List> result = this.implementation.searchGroupNodes(constraint); result.removeIf(entry -> entry.getNode().hasExpired()); return ImmutableList.copyOf(result); @@ -216,7 +216,7 @@ public class Storage { } public CompletableFuture createAndLoadTrack(String name, CreationCause cause) { - return makeFuture(() -> { + return future(() -> { Track track = this.implementation.createAndLoadTrack(name.toLowerCase()); if (track != null) { this.plugin.getEventDispatcher().dispatchTrackCreate(track, cause); @@ -226,7 +226,7 @@ public class Storage { } public CompletableFuture> loadTrack(String name) { - return makeFuture(() -> { + return future(() -> { Optional track = this.implementation.loadTrack(name.toLowerCase()); if (track.isPresent()) { this.plugin.getEventDispatcher().dispatchTrackLoad(track.get()); @@ -236,25 +236,25 @@ public class Storage { } public CompletableFuture loadAllTracks() { - return makeFuture(() -> { + return future(() -> { this.implementation.loadAllTracks(); this.plugin.getEventDispatcher().dispatchTrackLoadAll(); }); } public CompletableFuture saveTrack(Track track) { - return makeFuture(() -> this.implementation.saveTrack(track)); + return future(() -> this.implementation.saveTrack(track)); } public CompletableFuture deleteTrack(Track track, DeletionCause cause) { - return makeFuture(() -> { + return future(() -> { this.implementation.deleteTrack(track); this.plugin.getEventDispatcher().dispatchTrackDelete(track, cause); }); } public CompletableFuture savePlayerData(UUID uniqueId, String username) { - return makeFuture(() -> { + return future(() -> { PlayerSaveResult result = this.implementation.savePlayerData(uniqueId, username); if (result != null) { this.plugin.getEventDispatcher().dispatchPlayerDataSave(uniqueId, username, result); @@ -264,14 +264,14 @@ public class Storage { } public CompletableFuture deletePlayerData(UUID uniqueId) { - return makeFuture(() -> this.implementation.deletePlayerData(uniqueId)); + return future(() -> this.implementation.deletePlayerData(uniqueId)); } public CompletableFuture getPlayerUniqueId(String username) { - return makeFuture(() -> this.implementation.getPlayerUniqueId(username)); + return future(() -> this.implementation.getPlayerUniqueId(username)); } public CompletableFuture getPlayerName(UUID uniqueId) { - return makeFuture(() -> this.implementation.getPlayerName(uniqueId)); + return future(() -> this.implementation.getPlayerName(uniqueId)); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/tasks/ExpireTemporaryTask.java b/common/src/main/java/me/lucko/luckperms/common/tasks/ExpireTemporaryTask.java index 25dc358ae..628f26783 100644 --- a/common/src/main/java/me/lucko/luckperms/common/tasks/ExpireTemporaryTask.java +++ b/common/src/main/java/me/lucko/luckperms/common/tasks/ExpireTemporaryTask.java @@ -30,6 +30,8 @@ import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; +import java.util.concurrent.locks.Lock; + public class ExpireTemporaryTask implements Runnable { private final LuckPermsPlugin plugin; @@ -67,15 +69,17 @@ public class ExpireTemporaryTask implements Runnable { // return true if the holder's io lock is currently held, false otherwise private static boolean shouldSkip(PermissionHolder holder) { + Lock lock = holder.getIoLock(); + // if the holder is currently being manipulated by the storage impl, // don't attempt to audit temporary permissions - if (!holder.getIoLock().tryLock()) { + if (!lock.tryLock()) { // if #tryLock returns false, it means it's held by something else return true; } // immediately release the lock & return false - holder.getIoLock().unlock(); + lock.unlock(); return false; } } \ No newline at end of file diff --git a/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java b/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java index 8315993c3..c2248d93d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java +++ b/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java @@ -61,7 +61,9 @@ public class PermissionRegistry implements AutoCloseable { } public List rootAsList() { - return this.rootNode.makeImmutableCopy().getNodeEndings().stream().map(Map.Entry::getValue).collect(ImmutableCollectors.toList()); + return this.rootNode.makeImmutableCopy().getNodeEndings().stream() + .map(Map.Entry::getValue) + .collect(ImmutableCollectors.toList()); } public void offer(String permission) { @@ -92,7 +94,7 @@ public class PermissionRegistry implements AutoCloseable { private void doInsert(String permission) { // split the permission up into parts - List parts = DOT_SPLIT.splitToList(permission); + Iterable parts = DOT_SPLIT.split(permission); // insert the permission into the node structure TreeNode current = this.rootNode;