From a415a2705ff5aff6b3b7247accaa5e610962aa94 Mon Sep 17 00:00:00 2001 From: Luck Date: Mon, 18 Dec 2017 17:03:59 +0000 Subject: [PATCH] Return the loaded objects from storage methods as opposed to success flags --- .../me/lucko/luckperms/api/ChatMetaType.java | 14 +- .../api/delegates/model/ApiStorage.java | 30 ++-- .../commands/abstraction/SubCommand.java | 36 +++-- .../impl/generic/other/HolderShowTracks.java | 5 +- .../impl/generic/parent/ParentAdd.java | 2 +- .../impl/generic/parent/ParentAddTemp.java | 2 +- .../impl/generic/parent/ParentClearTrack.java | 2 +- .../impl/generic/parent/ParentSet.java | 2 +- .../impl/generic/parent/ParentSetTrack.java | 4 +- .../commands/impl/group/CreateGroup.java | 7 +- .../commands/impl/group/DeleteGroup.java | 7 +- .../commands/impl/group/GroupMainCommand.java | 2 +- .../commands/impl/group/GroupRename.java | 12 +- .../commands/impl/group/ListGroups.java | 6 +- .../commands/impl/misc/BulkUpdateCommand.java | 5 +- .../commands/impl/track/CreateTrack.java | 7 +- .../commands/impl/track/DeleteTrack.java | 7 +- .../commands/impl/track/ListTracks.java | 5 +- .../commands/impl/track/TrackAppend.java | 2 +- .../commands/impl/track/TrackInsert.java | 2 +- .../commands/impl/track/TrackMainCommand.java | 2 +- .../commands/impl/track/TrackRename.java | 12 +- .../common/commands/impl/user/UserDemote.java | 4 +- .../commands/impl/user/UserMainCommand.java | 6 +- .../commands/impl/user/UserPromote.java | 4 +- .../common/storage/AbstractStorage.java | 129 ++++++++---------- .../luckperms/common/storage/Storage.java | 31 +++-- .../common/storage/dao/AbstractDao.java | 31 +++-- .../common/storage/dao/SplitStorageDao.java | 58 ++++---- .../storage/dao/file/ConfigurateDao.java | 67 +++++---- .../common/storage/dao/mongodb/MongoDao.java | 108 ++++++++------- .../common/storage/dao/sql/SqlDao.java | 89 ++++++------ .../wrappings/BufferedOutputStorage.java | 20 +-- .../storage/wrappings/PhasedStorage.java | 31 +++-- .../luckperms/common/utils/LoginHelper.java | 9 +- .../sponge/service/LuckPermsSubjectData.java | 20 +-- 36 files changed, 414 insertions(+), 366 deletions(-) diff --git a/api/src/main/java/me/lucko/luckperms/api/ChatMetaType.java b/api/src/main/java/me/lucko/luckperms/api/ChatMetaType.java index 27a55761a..b62b81d36 100644 --- a/api/src/main/java/me/lucko/luckperms/api/ChatMetaType.java +++ b/api/src/main/java/me/lucko/luckperms/api/ChatMetaType.java @@ -44,17 +44,18 @@ public enum ChatMetaType { */ PREFIX { @Override - public boolean matches(Node node) { + public boolean matches(@Nonnull Node node) { return Preconditions.checkNotNull(node, "node").isPrefix(); } @Override - public boolean shouldIgnore(Node node) { + public boolean shouldIgnore(@Nonnull Node node) { return !Preconditions.checkNotNull(node, "node").isPrefix(); } + @Nonnull @Override - public Map.Entry getEntry(Node node) { + public Map.Entry getEntry(@Nonnull Node node) { return Preconditions.checkNotNull(node, "node").getPrefix(); } }, @@ -64,17 +65,18 @@ public enum ChatMetaType { */ SUFFIX { @Override - public boolean matches(Node node) { + public boolean matches(@Nonnull Node node) { return Preconditions.checkNotNull(node, "node").isSuffix(); } @Override - public boolean shouldIgnore(Node node) { + public boolean shouldIgnore(@Nonnull Node node) { return !Preconditions.checkNotNull(node, "node").isSuffix(); } + @Nonnull @Override - public Map.Entry getEntry(Node node) { + public Map.Entry getEntry(@Nonnull Node node) { return Preconditions.checkNotNull(node, "node").getSuffix(); } }; 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 efc7b9d33..c6414e3d1 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 @@ -41,6 +41,8 @@ import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -76,7 +78,7 @@ public class ApiStorage implements Storage { @Override public CompletableFuture logAction(@NonNull LogEntry entry) { - return handle.noBuffer().logAction(entry); + return handle.noBuffer().logAction(entry).thenApply(x -> true); } @Override @@ -86,12 +88,12 @@ public class ApiStorage implements Storage { @Override public CompletableFuture loadUser(@NonNull UUID uuid, String username) { - return handle.noBuffer().loadUser(uuid, username == null ? null : checkUsername(username)); + return handle.noBuffer().loadUser(uuid, username == null ? null : checkUsername(username)).thenApply(Objects::nonNull); } @Override public CompletableFuture saveUser(@NonNull User user) { - return handle.noBuffer().saveUser(ApiUser.cast(user)); + return handle.noBuffer().saveUser(ApiUser.cast(user)).thenApply(x -> true); } @Override @@ -106,22 +108,22 @@ public class ApiStorage implements Storage { @Override public CompletableFuture createAndLoadGroup(@NonNull String name) { - return handle.noBuffer().createAndLoadGroup(checkName(name), CreationCause.API); + return handle.noBuffer().createAndLoadGroup(checkName(name), CreationCause.API).thenApply(Objects::nonNull); } @Override public CompletableFuture loadGroup(@NonNull String name) { - return handle.noBuffer().loadGroup(checkName(name)); + return handle.noBuffer().loadGroup(checkName(name)).thenApply(Optional::isPresent); } @Override public CompletableFuture loadAllGroups() { - return handle.noBuffer().loadAllGroups(); + return handle.noBuffer().loadAllGroups().thenApply(x -> true); } @Override public CompletableFuture saveGroup(@NonNull Group group) { - return handle.noBuffer().saveGroup(ApiGroup.cast(group)); + return handle.noBuffer().saveGroup(ApiGroup.cast(group)).thenApply(x -> true); } @Override @@ -129,7 +131,7 @@ public class ApiStorage implements Storage { if (group.getName().equalsIgnoreCase(plugin.getConfiguration().get(ConfigKeys.DEFAULT_GROUP_NAME))) { throw new IllegalArgumentException("Cannot delete the default group."); } - return handle.noBuffer().deleteGroup(ApiGroup.cast(group), DeletionCause.API); + return handle.noBuffer().deleteGroup(ApiGroup.cast(group), DeletionCause.API).thenApply(x -> true); } @Override @@ -139,32 +141,32 @@ public class ApiStorage implements Storage { @Override public CompletableFuture createAndLoadTrack(@NonNull String name) { - return handle.noBuffer().createAndLoadTrack(checkName(name), CreationCause.API); + return handle.noBuffer().createAndLoadTrack(checkName(name), CreationCause.API).thenApply(Objects::nonNull); } @Override public CompletableFuture loadTrack(@NonNull String name) { - return handle.noBuffer().loadTrack(checkName(name)); + return handle.noBuffer().loadTrack(checkName(name)).thenApply(Optional::isPresent); } @Override public CompletableFuture loadAllTracks() { - return handle.noBuffer().loadAllTracks(); + return handle.noBuffer().loadAllTracks().thenApply(x -> true); } @Override public CompletableFuture saveTrack(@NonNull Track track) { - return handle.noBuffer().saveTrack(ApiTrack.cast(track)); + return handle.noBuffer().saveTrack(ApiTrack.cast(track)).thenApply(x -> true); } @Override public CompletableFuture deleteTrack(@NonNull Track track) { - return handle.noBuffer().deleteTrack(ApiTrack.cast(track), DeletionCause.API); + return handle.noBuffer().deleteTrack(ApiTrack.cast(track), DeletionCause.API).thenApply(x -> true); } @Override public CompletableFuture saveUUIDData(@NonNull String username, @NonNull UUID uuid) { - return handle.noBuffer().saveUUIDData(uuid, checkUsername(username)); + return handle.noBuffer().saveUUIDData(uuid, checkUsername(username)).thenApply(x -> true); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/SubCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/SubCommand.java index 089fb4f80..8b4411f46 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/SubCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/SubCommand.java @@ -173,7 +173,13 @@ public abstract class SubCommand extends Command { } public static void save(User user, Sender sender, LuckPermsPlugin plugin) { - boolean success = plugin.getStorage().noBuffer().saveUser(user).join(); + try { + plugin.getStorage().noBuffer().saveUser(user).get(); + } catch (Exception e) { + e.printStackTrace(); + Message.USER_SAVE_ERROR.send(sender, user.getFriendlyName()); + return; + } if (sender.isImport()) { user.getRefreshBuffer().request(); @@ -187,14 +193,16 @@ public abstract class SubCommand extends Command { messagingService.get().getUpdateBuffer().request(); } } - - if (!success) { - Message.USER_SAVE_ERROR.send(sender, user.getFriendlyName()); - } } public static void save(Group group, Sender sender, LuckPermsPlugin plugin) { - boolean success = plugin.getStorage().noBuffer().saveGroup(group).join(); + try { + plugin.getStorage().noBuffer().saveGroup(group).get(); + } catch (Exception e) { + e.printStackTrace(); + Message.GROUP_SAVE_ERROR.send(sender, group.getFriendlyName()); + return; + } if (sender.isImport()) { plugin.getUpdateTaskBuffer().request(); @@ -208,14 +216,16 @@ public abstract class SubCommand extends Command { messagingService.get().getUpdateBuffer().request(); } } - - if (!success) { - Message.GROUP_SAVE_ERROR.send(sender, group.getFriendlyName()); - } } public static void save(Track track, Sender sender, LuckPermsPlugin plugin) { - boolean success = plugin.getStorage().noBuffer().saveTrack(track).join(); + try { + plugin.getStorage().noBuffer().saveTrack(track).get(); + } catch (Exception e) { + e.printStackTrace(); + Message.TRACK_SAVE_ERROR.send(sender, track.getName()); + return; + } if (sender.isImport()) { plugin.getUpdateTaskBuffer().request(); @@ -229,9 +239,5 @@ public abstract class SubCommand extends Command { messagingService.get().getUpdateBuffer().request(); } } - - if (!success) { - Message.TRACK_SAVE_ERROR.send(sender, track.getName()); - } } } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderShowTracks.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderShowTracks.java index 5c911bee9..1133d9ef6 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderShowTracks.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderShowTracks.java @@ -61,7 +61,10 @@ public class HolderShowTracks extends SubCommand return CommandResult.NO_PERMISSION; } - if (!plugin.getStorage().loadAllTracks().join()) { + try { + plugin.getStorage().loadAllTracks().get(); + } catch (Exception e) { + e.printStackTrace(); Message.TRACKS_LOAD_ERROR.send(sender); return CommandResult.LOADING_ERROR; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAdd.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAdd.java index b17143083..3e3fc757c 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAdd.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAdd.java @@ -64,7 +64,7 @@ public class ParentAdd extends SharedSubCommand { String groupName = ArgumentUtils.handleName(0, args); MutableContextSet context = ArgumentUtils.handleContext(1, args, plugin); - if (!plugin.getStorage().loadGroup(groupName).join()) { + if (!plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, groupName); return CommandResult.INVALID_ARGS; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAddTemp.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAddTemp.java index 0f0e0c796..c71dce416 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAddTemp.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentAddTemp.java @@ -71,7 +71,7 @@ public class ParentAddTemp extends SharedSubCommand { MutableContextSet context = ArgumentUtils.handleContext(2, args, plugin); TemporaryModifier modifier = plugin.getConfiguration().get(ConfigKeys.TEMPORARY_ADD_BEHAVIOUR); - if (!plugin.getStorage().loadGroup(groupName).join()) { + if (!plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, groupName); return CommandResult.INVALID_ARGS; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClearTrack.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClearTrack.java index da406ef6e..1eddba336 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClearTrack.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClearTrack.java @@ -67,7 +67,7 @@ public class ParentClearTrack extends SharedSubCommand { return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().loadTrack(trackName).join()) { + if (!plugin.getStorage().loadTrack(trackName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, trackName); return CommandResult.INVALID_ARGS; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSet.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSet.java index 307a58400..2abaaace0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSet.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSet.java @@ -64,7 +64,7 @@ public class ParentSet extends SharedSubCommand { String groupName = ArgumentUtils.handleName(0, args); MutableContextSet context = ArgumentUtils.handleContext(1, args, plugin); - if (!plugin.getStorage().loadGroup(groupName).join()) { + if (!plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, groupName); return CommandResult.INVALID_ARGS; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java index 5ff1c3010..3d3d26843 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java @@ -69,7 +69,7 @@ public class ParentSetTrack extends SharedSubCommand { return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().loadTrack(trackName).join()) { + if (!plugin.getStorage().loadTrack(trackName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, trackName); return CommandResult.INVALID_ARGS; } @@ -104,7 +104,7 @@ public class ParentSetTrack extends SharedSubCommand { MutableContextSet context = ArgumentUtils.handleContext(2, args, plugin); - if (!plugin.getStorage().loadGroup(groupName).join()) { + if (!plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, groupName); return CommandResult.INVALID_ARGS; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/CreateGroup.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/CreateGroup.java index 2e1d55099..bb45cfb8e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/CreateGroup.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/CreateGroup.java @@ -59,12 +59,15 @@ public class CreateGroup extends SingleCommand { return CommandResult.INVALID_ARGS; } - if (plugin.getStorage().loadGroup(groupName).join()) { + if (plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.ALREADY_EXISTS.send(sender, groupName); return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().createAndLoadGroup(groupName, CreationCause.COMMAND).join()) { + try { + plugin.getStorage().createAndLoadGroup(groupName, CreationCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.CREATE_ERROR.send(sender, groupName); return CommandResult.FAILURE; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/DeleteGroup.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/DeleteGroup.java index 285e80e00..c159dea54 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/DeleteGroup.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/DeleteGroup.java @@ -62,7 +62,7 @@ public class DeleteGroup extends SingleCommand { return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().loadGroup(groupName).join()) { + if (!plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, groupName); return CommandResult.INVALID_ARGS; } @@ -73,7 +73,10 @@ public class DeleteGroup extends SingleCommand { return CommandResult.LOADING_ERROR; } - if (!plugin.getStorage().deleteGroup(group, DeletionCause.COMMAND).join()) { + try { + plugin.getStorage().deleteGroup(group, DeletionCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.DELETE_ERROR.send(sender, group.getFriendlyName()); return CommandResult.FAILURE; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupMainCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupMainCommand.java index 3ef74a162..8cdfce5a5 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupMainCommand.java @@ -84,7 +84,7 @@ public class GroupMainCommand extends MainCommand { @Override protected Group getTarget(String target, LuckPermsPlugin plugin, Sender sender) { - if (!plugin.getStorage().loadGroup(target).join()) { + if (!plugin.getStorage().loadGroup(target).join().isPresent()) { // failed to load, but it might be a display name. // nope, not a display name diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupRename.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupRename.java index 001966e77..c47a3f2ee 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupRename.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/GroupRename.java @@ -56,12 +56,15 @@ public class GroupRename extends SubCommand { return CommandResult.INVALID_ARGS; } - if (plugin.getStorage().loadGroup(newGroupName).join()) { + if (plugin.getStorage().loadGroup(newGroupName).join().isPresent()) { Message.ALREADY_EXISTS.send(sender, newGroupName); return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().createAndLoadGroup(newGroupName, CreationCause.COMMAND).join()) { + try { + plugin.getStorage().createAndLoadGroup(newGroupName, CreationCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.CREATE_ERROR.send(sender, newGroupName); return CommandResult.FAILURE; } @@ -72,7 +75,10 @@ public class GroupRename extends SubCommand { return CommandResult.LOADING_ERROR; } - if (!plugin.getStorage().deleteGroup(group, DeletionCause.COMMAND).join()) { + try { + plugin.getStorage().deleteGroup(group, DeletionCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.DELETE_ERROR.send(sender, group.getFriendlyName()); return CommandResult.FAILURE; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/ListGroups.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/ListGroups.java index c15ef7f35..52d503a1b 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/ListGroups.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/group/ListGroups.java @@ -54,7 +54,11 @@ public class ListGroups extends SingleCommand { @Override public CommandResult execute(LuckPermsPlugin plugin, Sender sender, List args, String label) { - if (!plugin.getStorage().loadAllGroups().join()) { + + try { + plugin.getStorage().loadAllGroups().get(); + } catch (Exception e) { + e.printStackTrace(); Message.GROUPS_LOAD_ERROR.send(sender); return CommandResult.LOADING_ERROR; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/BulkUpdateCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/BulkUpdateCommand.java index 72d7bc5d4..78feb30df 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/BulkUpdateCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/BulkUpdateCommand.java @@ -72,11 +72,12 @@ public class BulkUpdateCommand extends SingleCommand { } Message.BULK_UPDATE_STARTING.send(sender); - plugin.getStorage().applyBulkUpdate(operation).thenAcceptAsync(b -> { - if (b) { + plugin.getStorage().applyBulkUpdate(operation).whenCompleteAsync((v, ex) -> { + if (ex == null) { plugin.getUpdateTaskBuffer().requestDirectly(); Message.BULK_UPDATE_SUCCESS.send(sender); } else { + ex.printStackTrace(); Message.BULK_UPDATE_FAILURE.send(sender); } }, plugin.getScheduler().async()); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/CreateTrack.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/CreateTrack.java index 33c7fe686..e1e0d97ed 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/CreateTrack.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/CreateTrack.java @@ -59,12 +59,15 @@ public class CreateTrack extends SingleCommand { return CommandResult.INVALID_ARGS; } - if (plugin.getStorage().loadTrack(trackName).join()) { + if (plugin.getStorage().loadTrack(trackName).join().isPresent()) { Message.ALREADY_EXISTS.send(sender, trackName); return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().createAndLoadTrack(trackName, CreationCause.COMMAND).join()) { + try { + plugin.getStorage().createAndLoadTrack(trackName, CreationCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.CREATE_ERROR.send(sender, trackName); return CommandResult.FAILURE; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/DeleteTrack.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/DeleteTrack.java index a08fc784e..e22899af8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/DeleteTrack.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/DeleteTrack.java @@ -55,7 +55,7 @@ public class DeleteTrack extends SingleCommand { } String trackName = args.get(0).toLowerCase(); - if (!plugin.getStorage().loadTrack(trackName).join()) { + if (!plugin.getStorage().loadTrack(trackName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, trackName); return CommandResult.INVALID_ARGS; } @@ -66,7 +66,10 @@ public class DeleteTrack extends SingleCommand { return CommandResult.LOADING_ERROR; } - if (!plugin.getStorage().deleteTrack(track, DeletionCause.COMMAND).join()) { + try { + plugin.getStorage().deleteTrack(track, DeletionCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.DELETE_ERROR.send(sender, track.getName()); return CommandResult.FAILURE; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/ListTracks.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/ListTracks.java index 66a4a0ec9..705a8735d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/ListTracks.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/ListTracks.java @@ -46,7 +46,10 @@ public class ListTracks extends SingleCommand { @Override public CommandResult execute(LuckPermsPlugin plugin, Sender sender, List args, String label) { - if (!plugin.getStorage().loadAllTracks().join()) { + try { + plugin.getStorage().loadAllTracks().get(); + } catch (Exception e) { + e.printStackTrace(); Message.TRACKS_LOAD_ERROR.send(sender); return CommandResult.LOADING_ERROR; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackAppend.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackAppend.java index 7641700eb..6fd5e646e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackAppend.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackAppend.java @@ -57,7 +57,7 @@ public class TrackAppend extends SubCommand { return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().loadGroup(groupName).join()) { + if (!plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, groupName); return CommandResult.INVALID_ARGS; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackInsert.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackInsert.java index f04606fe3..dd6affdcd 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackInsert.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackInsert.java @@ -65,7 +65,7 @@ public class TrackInsert extends SubCommand { return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().loadGroup(groupName).join()) { + if (!plugin.getStorage().loadGroup(groupName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, groupName); return CommandResult.INVALID_ARGS; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackMainCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackMainCommand.java index 46d532fcc..dc791be38 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackMainCommand.java @@ -73,7 +73,7 @@ public class TrackMainCommand extends MainCommand { @Override protected Track getTarget(String target, LuckPermsPlugin plugin, Sender sender) { - if (!plugin.getStorage().loadTrack(target).join()) { + if (!plugin.getStorage().loadTrack(target).join().isPresent()) { Message.TRACK_NOT_FOUND.send(sender, target); return null; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackRename.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackRename.java index b622656e2..b44504c30 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackRename.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/track/TrackRename.java @@ -56,12 +56,15 @@ public class TrackRename extends SubCommand { return CommandResult.INVALID_ARGS; } - if (plugin.getStorage().loadTrack(newTrackName).join()) { + if (plugin.getStorage().loadTrack(newTrackName).join().isPresent()) { Message.ALREADY_EXISTS.send(sender, newTrackName); return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().createAndLoadTrack(newTrackName, CreationCause.COMMAND).join()) { + try { + plugin.getStorage().createAndLoadTrack(newTrackName, CreationCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.CREATE_ERROR.send(sender, newTrackName); return CommandResult.FAILURE; } @@ -72,7 +75,10 @@ public class TrackRename extends SubCommand { return CommandResult.LOADING_ERROR; } - if (!plugin.getStorage().deleteTrack(track, DeletionCause.COMMAND).join()) { + try { + plugin.getStorage().deleteTrack(track, DeletionCause.COMMAND).get(); + } catch (Exception e) { + e.printStackTrace(); Message.DELETE_ERROR.send(sender, track.getName()); return CommandResult.FAILURE; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserDemote.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserDemote.java index d9896cb49..c3cc29dea 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserDemote.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserDemote.java @@ -71,7 +71,7 @@ public class UserDemote extends SubCommand { return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().loadTrack(trackName).join()) { + if (!plugin.getStorage().loadTrack(trackName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, trackName); return CommandResult.INVALID_ARGS; } @@ -142,7 +142,7 @@ public class UserDemote extends SubCommand { return CommandResult.SUCCESS; } - if (!plugin.getStorage().loadGroup(previous).join()) { + if (!plugin.getStorage().loadGroup(previous).join().isPresent()) { Message.USER_DEMOTE_ERROR_MALFORMED.send(sender, previous); return CommandResult.STATE_ERROR; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserMainCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserMainCommand.java index 022c99fef..f4181a1f8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserMainCommand.java @@ -118,7 +118,11 @@ public class UserMainCommand extends MainCommand { @Override protected User getTarget(UserIdentifier target, LuckPermsPlugin plugin, Sender sender) { - if (!plugin.getStorage().loadUser(target.getUuid(), target.getUsername().orElse(null)).join()) { + + try { + plugin.getStorage().loadUser(target.getUuid(), target.getUsername().orElse(null)).get(); + } catch (Exception e) { + e.printStackTrace(); Message.LOADING_ERROR.send(sender); return null; } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserPromote.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserPromote.java index 196c508ea..e9674c147 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserPromote.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/user/UserPromote.java @@ -69,7 +69,7 @@ public class UserPromote extends SubCommand { return CommandResult.INVALID_ARGS; } - if (!plugin.getStorage().loadTrack(trackName).join()) { + if (!plugin.getStorage().loadTrack(trackName).join().isPresent()) { Message.DOES_NOT_EXIST.send(sender, trackName); return CommandResult.INVALID_ARGS; } @@ -149,7 +149,7 @@ public class UserPromote extends SubCommand { return CommandResult.STATE_ERROR; } - if (!plugin.getStorage().loadGroup(next).join()) { + if (!plugin.getStorage().loadGroup(next).join().isPresent()) { Message.USER_PROMOTE_ERROR_MALFORMED.send(sender, next); return CommandResult.STATE_ERROR; } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java index bc402f129..735a1092f 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java @@ -48,6 +48,7 @@ import me.lucko.luckperms.common.storage.wrappings.PhasedStorage; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; @@ -88,6 +89,21 @@ public class AbstractStorage implements Storage { }, dao.getPlugin().getScheduler().async()); } + private CompletableFuture makeFuture(ThrowingRunnable runnable) { + return CompletableFuture.runAsync(() -> { + try { + runnable.run(); + } catch (Exception e) { + Throwables.propagateIfPossible(e); + throw new CompletionException(e); + } + }, dao.getPlugin().getScheduler().async()); + } + + private interface ThrowingRunnable { + void run() throws Exception; + } + @Override public String getName() { return dao.getName(); @@ -124,7 +140,7 @@ public class AbstractStorage implements Storage { } @Override - public CompletableFuture logAction(LogEntry entry) { + public CompletableFuture logAction(LogEntry entry) { return makeFuture(() -> dao.logAction(entry)); } @@ -134,26 +150,23 @@ public class AbstractStorage implements Storage { } @Override - public CompletableFuture applyBulkUpdate(BulkUpdate bulkUpdate) { + public CompletableFuture applyBulkUpdate(BulkUpdate bulkUpdate) { return makeFuture(() -> dao.applyBulkUpdate(bulkUpdate)); } @Override - public CompletableFuture loadUser(UUID uuid, String username) { + public CompletableFuture loadUser(UUID uuid, String username) { return makeFuture(() -> { - if (dao.loadUser(uuid, username)) { - User u = plugin.getUserManager().getIfLoaded(uuid); - if (u != null) { - plugin.getApiProvider().getEventFactory().handleUserLoad(u); - } - return true; + User user = dao.loadUser(uuid, username); + if (user != null) { + plugin.getApiProvider().getEventFactory().handleUserLoad(user); } - return false; + return user; }); } @Override - public CompletableFuture saveUser(User user) { + public CompletableFuture saveUser(User user) { return makeFuture(() -> dao.saveUser(user)); } @@ -168,57 +181,45 @@ public class AbstractStorage implements Storage { } @Override - public CompletableFuture createAndLoadGroup(String name, CreationCause cause) { + public CompletableFuture createAndLoadGroup(String name, CreationCause cause) { return makeFuture(() -> { - if (dao.createAndLoadGroup(name)) { - Group g = plugin.getGroupManager().getIfLoaded(name); - if (g != null) { - plugin.getApiProvider().getEventFactory().handleGroupCreate(g, cause); - } - return true; + Group group = dao.createAndLoadGroup(name); + if (group != null) { + plugin.getApiProvider().getEventFactory().handleGroupCreate(group, cause); } - return false; + return group; }); } @Override - public CompletableFuture loadGroup(String name) { + public CompletableFuture> loadGroup(String name) { return makeFuture(() -> { - if (dao.loadGroup(name)) { - Group g = plugin.getGroupManager().getIfLoaded(name); - if (g != null) { - plugin.getApiProvider().getEventFactory().handleGroupLoad(g); - } - return true; + Optional group = dao.loadGroup(name); + if (group.isPresent()) { + plugin.getApiProvider().getEventFactory().handleGroupLoad(group.get()); } - return false; + return group; }); } @Override - public CompletableFuture loadAllGroups() { + public CompletableFuture loadAllGroups() { return makeFuture(() -> { - if (dao.loadAllGroups()) { - plugin.getApiProvider().getEventFactory().handleGroupLoadAll(); - return true; - } - return false; + dao.loadAllGroups(); + plugin.getApiProvider().getEventFactory().handleGroupLoadAll(); }); } @Override - public CompletableFuture saveGroup(Group group) { + public CompletableFuture saveGroup(Group group) { return makeFuture(() -> dao.saveGroup(group)); } @Override - public CompletableFuture deleteGroup(Group group, DeletionCause cause) { + public CompletableFuture deleteGroup(Group group, DeletionCause cause) { return makeFuture(() -> { - if (dao.deleteGroup(group)) { - plugin.getApiProvider().getEventFactory().handleGroupDelete(group, cause); - return true; - } - return false; + dao.deleteGroup(group); + plugin.getApiProvider().getEventFactory().handleGroupDelete(group, cause); }); } @@ -228,62 +229,50 @@ public class AbstractStorage implements Storage { } @Override - public CompletableFuture createAndLoadTrack(String name, CreationCause cause) { + public CompletableFuture createAndLoadTrack(String name, CreationCause cause) { return makeFuture(() -> { - if (dao.createAndLoadTrack(name)) { - Track t = plugin.getTrackManager().getIfLoaded(name); - if (t != null) { - plugin.getApiProvider().getEventFactory().handleTrackCreate(t, cause); - } - return true; + Track track = dao.createAndLoadTrack(name); + if (track != null) { + plugin.getApiProvider().getEventFactory().handleTrackCreate(track, cause); } - return false; + return track; }); } @Override - public CompletableFuture loadTrack(String name) { + public CompletableFuture> loadTrack(String name) { return makeFuture(() -> { - if (dao.loadTrack(name)) { - Track t = plugin.getTrackManager().getIfLoaded(name); - if (t != null) { - plugin.getApiProvider().getEventFactory().handleTrackLoad(t); - } - return true; + Optional track = dao.loadTrack(name); + if (track.isPresent()) { + plugin.getApiProvider().getEventFactory().handleTrackLoad(track.get()); } - return false; + return track; }); } @Override - public CompletableFuture loadAllTracks() { + public CompletableFuture loadAllTracks() { return makeFuture(() -> { - if (dao.loadAllTracks()) { - plugin.getApiProvider().getEventFactory().handleTrackLoadAll(); - return true; - } - return false; + dao.loadAllTracks(); + plugin.getApiProvider().getEventFactory().handleTrackLoadAll(); }); } @Override - public CompletableFuture saveTrack(Track track) { + public CompletableFuture saveTrack(Track track) { return makeFuture(() -> dao.saveTrack(track)); } @Override - public CompletableFuture deleteTrack(Track track, DeletionCause cause) { + public CompletableFuture deleteTrack(Track track, DeletionCause cause) { return makeFuture(() -> { - if (dao.deleteTrack(track)) { - plugin.getApiProvider().getEventFactory().handleTrackDelete(track, cause); - return true; - } - return false; + dao.deleteTrack(track); + plugin.getApiProvider().getEventFactory().handleTrackDelete(track, cause); }); } @Override - public CompletableFuture saveUUIDData(UUID uuid, String username) { + public CompletableFuture saveUUIDData(UUID uuid, String username) { return makeFuture(() -> dao.saveUUIDData(uuid, username)); } 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 6d1f5f709..6f6e2037e 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 @@ -38,6 +38,7 @@ import me.lucko.luckperms.common.model.User; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -59,43 +60,43 @@ public interface Storage { Map getMeta(); - CompletableFuture logAction(LogEntry entry); + CompletableFuture logAction(LogEntry entry); CompletableFuture getLog(); - CompletableFuture applyBulkUpdate(BulkUpdate bulkUpdate); + CompletableFuture applyBulkUpdate(BulkUpdate bulkUpdate); - CompletableFuture loadUser(UUID uuid, String username); + CompletableFuture loadUser(UUID uuid, String username); - CompletableFuture saveUser(User user); + CompletableFuture saveUser(User user); CompletableFuture> getUniqueUsers(); CompletableFuture>> getUsersWithPermission(String permission); - CompletableFuture createAndLoadGroup(String name, CreationCause cause); + CompletableFuture createAndLoadGroup(String name, CreationCause cause); - CompletableFuture loadGroup(String name); + CompletableFuture> loadGroup(String name); - CompletableFuture loadAllGroups(); + CompletableFuture loadAllGroups(); - CompletableFuture saveGroup(Group group); + CompletableFuture saveGroup(Group group); - CompletableFuture deleteGroup(Group group, DeletionCause cause); + CompletableFuture deleteGroup(Group group, DeletionCause cause); CompletableFuture>> getGroupsWithPermission(String permission); - CompletableFuture createAndLoadTrack(String name, CreationCause cause); + CompletableFuture createAndLoadTrack(String name, CreationCause cause); - CompletableFuture loadTrack(String name); + CompletableFuture> loadTrack(String name); - CompletableFuture loadAllTracks(); + CompletableFuture loadAllTracks(); - CompletableFuture saveTrack(Track track); + CompletableFuture saveTrack(Track track); - CompletableFuture deleteTrack(Track track, DeletionCause cause); + CompletableFuture deleteTrack(Track track, DeletionCause cause); - CompletableFuture saveUUIDData(UUID uuid, String username); + CompletableFuture saveUUIDData(UUID uuid, String username); CompletableFuture getUUID(String username); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java index 51fb72607..472c6feb0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java @@ -41,6 +41,7 @@ import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -61,43 +62,43 @@ public abstract class AbstractDao { return Collections.emptyMap(); } - public abstract boolean logAction(LogEntry entry) throws Exception; + public abstract void logAction(LogEntry entry) throws Exception; public abstract Log getLog() throws Exception; - public abstract boolean applyBulkUpdate(BulkUpdate bulkUpdate) throws Exception; + public abstract void applyBulkUpdate(BulkUpdate bulkUpdate) throws Exception; - public abstract boolean loadUser(UUID uuid, String username) throws Exception; + public abstract User loadUser(UUID uuid, String username) throws Exception; - public abstract boolean saveUser(User user) throws Exception; + public abstract void saveUser(User user) throws Exception; public abstract Set getUniqueUsers() throws Exception; public abstract List> getUsersWithPermission(String permission) throws Exception; - public abstract boolean createAndLoadGroup(String name) throws Exception; + public abstract Group createAndLoadGroup(String name) throws Exception; - public abstract boolean loadGroup(String name) throws Exception; + public abstract Optional loadGroup(String name) throws Exception; - public abstract boolean loadAllGroups() throws Exception; + public abstract void loadAllGroups() throws Exception; - public abstract boolean saveGroup(Group group) throws Exception; + public abstract void saveGroup(Group group) throws Exception; - public abstract boolean deleteGroup(Group group) throws Exception; + public abstract void deleteGroup(Group group) throws Exception; public abstract List> getGroupsWithPermission(String permission) throws Exception; - public abstract boolean createAndLoadTrack(String name) throws Exception; + public abstract Track createAndLoadTrack(String name) throws Exception; - public abstract boolean loadTrack(String name) throws Exception; + public abstract Optional loadTrack(String name) throws Exception; - public abstract boolean loadAllTracks() throws Exception; + public abstract void loadAllTracks() throws Exception; - public abstract boolean saveTrack(Track track) throws Exception; + public abstract void saveTrack(Track track) throws Exception; - public abstract boolean deleteTrack(Track track) throws Exception; + public abstract void deleteTrack(Track track) throws Exception; - public abstract boolean saveUUIDData(UUID uuid, String username) throws Exception; + public abstract void saveUUIDData(UUID uuid, String username) throws Exception; public abstract UUID getUUID(String username) throws Exception; diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java index 6cf9a561c..933264acd 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java @@ -39,6 +39,7 @@ import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -90,8 +91,8 @@ public class SplitStorageDao extends AbstractDao { } @Override - public boolean logAction(LogEntry entry) throws Exception { - return backing.get(types.get("log")).logAction(entry); + public void logAction(LogEntry entry) throws Exception { + backing.get(types.get("log")).logAction(entry); } @Override @@ -100,27 +101,26 @@ public class SplitStorageDao extends AbstractDao { } @Override - public boolean applyBulkUpdate(BulkUpdate bulkUpdate) throws Exception { + public void applyBulkUpdate(BulkUpdate bulkUpdate) throws Exception { String userType = types.get("user"); String groupType = types.get("group"); - boolean ret = backing.get(userType).applyBulkUpdate(bulkUpdate); + backing.get(userType).applyBulkUpdate(bulkUpdate); + + // if differs if (!userType.equals(groupType)) { - if (!backing.get(groupType).applyBulkUpdate(bulkUpdate)) { - ret = false; - } + backing.get(groupType).applyBulkUpdate(bulkUpdate); } - return ret; } @Override - public boolean loadUser(UUID uuid, String username) throws Exception { + public User loadUser(UUID uuid, String username) throws Exception { return backing.get(types.get("user")).loadUser(uuid, username); } @Override - public boolean saveUser(User user) throws Exception { - return backing.get(types.get("user")).saveUser(user); + public void saveUser(User user) throws Exception { + backing.get(types.get("user")).saveUser(user); } @Override @@ -134,28 +134,28 @@ public class SplitStorageDao extends AbstractDao { } @Override - public boolean createAndLoadGroup(String name) throws Exception { + public Group createAndLoadGroup(String name) throws Exception { return backing.get(types.get("group")).createAndLoadGroup(name); } @Override - public boolean loadGroup(String name) throws Exception { + public Optional loadGroup(String name) throws Exception { return backing.get(types.get("group")).loadGroup(name); } @Override - public boolean loadAllGroups() throws Exception { - return backing.get(types.get("group")).loadAllGroups(); + public void loadAllGroups() throws Exception { + backing.get(types.get("group")).loadAllGroups(); } @Override - public boolean saveGroup(Group group) throws Exception { - return backing.get(types.get("group")).saveGroup(group); + public void saveGroup(Group group) throws Exception { + backing.get(types.get("group")).saveGroup(group); } @Override - public boolean deleteGroup(Group group) throws Exception { - return backing.get(types.get("group")).deleteGroup(group); + public void deleteGroup(Group group) throws Exception { + backing.get(types.get("group")).deleteGroup(group); } @Override @@ -164,33 +164,33 @@ public class SplitStorageDao extends AbstractDao { } @Override - public boolean createAndLoadTrack(String name) throws Exception { + public Track createAndLoadTrack(String name) throws Exception { return backing.get(types.get("track")).createAndLoadTrack(name); } @Override - public boolean loadTrack(String name) throws Exception { + public Optional loadTrack(String name) throws Exception { return backing.get(types.get("track")).loadTrack(name); } @Override - public boolean loadAllTracks() throws Exception { - return backing.get(types.get("track")).loadAllTracks(); + public void loadAllTracks() throws Exception { + backing.get(types.get("track")).loadAllTracks(); } @Override - public boolean saveTrack(Track track) throws Exception { - return backing.get(types.get("track")).saveTrack(track); + public void saveTrack(Track track) throws Exception { + backing.get(types.get("track")).saveTrack(track); } @Override - public boolean deleteTrack(Track track) throws Exception { - return backing.get(types.get("track")).deleteTrack(track); + public void deleteTrack(Track track) throws Exception { + backing.get(types.get("track")).deleteTrack(track); } @Override - public boolean saveUUIDData(UUID uuid, String username) throws Exception { - return backing.get(types.get("uuid")).saveUUIDData(uuid, username); + public void saveUUIDData(UUID uuid, String username) throws Exception { + backing.get(types.get("uuid")).saveUUIDData(uuid, username); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/ConfigurateDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/ConfigurateDao.java index e5fed18fc..81dbc74dc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/ConfigurateDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/ConfigurateDao.java @@ -73,6 +73,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.logging.FileHandler; @@ -303,7 +304,7 @@ public abstract class ConfigurateDao extends AbstractDao { } @Override - public boolean logAction(LogEntry entry) { + public void logAction(LogEntry entry) { actionLogger.info(String.format(LOG_FORMAT, (entry.getActor().equals(Constants.CONSOLE_UUID) ? "" : entry.getActor() + " "), entry.getActorName(), @@ -312,7 +313,6 @@ public abstract class ConfigurateDao extends AbstractDao { entry.getActedName(), entry.getAction()) ); - return true; } @Override @@ -322,7 +322,7 @@ public abstract class ConfigurateDao extends AbstractDao { } @Override - public boolean applyBulkUpdate(BulkUpdate bulkUpdate) throws Exception { + public void applyBulkUpdate(BulkUpdate bulkUpdate) throws Exception { if (bulkUpdate.getDataType().isIncludingUsers()) { File[] files = getDirectory(StorageLocation.USER).listFiles(getFileTypeFilter()); if (files == null) { @@ -374,11 +374,10 @@ public abstract class ConfigurateDao extends AbstractDao { } } } - return true; } @Override - public boolean loadUser(UUID uuid, String username) throws Exception { + public User loadUser(UUID uuid, String username) throws Exception { User user = plugin.getUserManager().getOrMake(UserIdentifier.of(uuid, username)); user.getIoLock().lock(); try { @@ -412,11 +411,11 @@ public abstract class ConfigurateDao extends AbstractDao { user.getIoLock().unlock(); } user.getRefreshBuffer().requestDirectly(); - return true; + return user; } @Override - public boolean saveUser(User user) throws Exception { + public void saveUser(User user) throws Exception { user.getIoLock().lock(); try { if (!GenericUserManager.shouldSave(user)) { @@ -437,7 +436,6 @@ public abstract class ConfigurateDao extends AbstractDao { } finally { user.getIoLock().unlock(); } - return true; } @Override @@ -478,7 +476,7 @@ public abstract class ConfigurateDao extends AbstractDao { } @Override - public boolean createAndLoadGroup(String name) throws Exception { + public Group createAndLoadGroup(String name) throws Exception { Group group = plugin.getGroupManager().getOrMake(name); group.getIoLock().lock(); try { @@ -502,11 +500,11 @@ public abstract class ConfigurateDao extends AbstractDao { group.getIoLock().unlock(); } group.getRefreshBuffer().requestDirectly(); - return true; + return group; } @Override - public boolean loadGroup(String name) throws Exception { + public Optional loadGroup(String name) throws Exception { Group group = plugin.getGroupManager().getIfLoaded(name); if (group != null) { group.getIoLock().lock(); @@ -516,7 +514,7 @@ public abstract class ConfigurateDao extends AbstractDao { ConfigurationNode object = readFile(StorageLocation.GROUP, name); if (object == null) { - return false; + return Optional.empty(); } if (group == null) { @@ -536,13 +534,15 @@ public abstract class ConfigurateDao extends AbstractDao { } } group.getRefreshBuffer().requestDirectly(); - return true; + return Optional.of(group); } @Override - public boolean loadAllGroups() { + public void loadAllGroups() throws IOException { String[] fileNames = groupsDirectory.list(getFileTypeFilter()); - if (fileNames == null) return false; + if (fileNames == null) { + throw new IOException("Not a directory"); + } List groups = Arrays.stream(fileNames) .map(s -> s.substring(0, s.length() - fileExtension.length())) .collect(Collectors.toList()); @@ -565,12 +565,10 @@ public abstract class ConfigurateDao extends AbstractDao { gm.getAll().values().stream() .filter(g -> !groups.contains(g.getName())) .forEach(gm::unload); - - return true; } @Override - public boolean saveGroup(Group group) throws Exception { + public void saveGroup(Group group) throws Exception { group.getIoLock().lock(); try { ConfigurationNode data = SimpleConfigurationNode.root(); @@ -585,11 +583,10 @@ public abstract class ConfigurateDao extends AbstractDao { } finally { group.getIoLock().unlock(); } - return true; } @Override - public boolean deleteGroup(Group group) throws Exception { + public void deleteGroup(Group group) throws Exception { group.getIoLock().lock(); try { File groupFile = new File(groupsDirectory, group.getName() + fileExtension); @@ -603,7 +600,7 @@ public abstract class ConfigurateDao extends AbstractDao { } finally { group.getIoLock().unlock(); } - return true; + plugin.getGroupManager().unload(group); } @Override @@ -634,7 +631,7 @@ public abstract class ConfigurateDao extends AbstractDao { } @Override - public boolean createAndLoadTrack(String name) throws Exception { + public Track createAndLoadTrack(String name) throws Exception { Track track = plugin.getTrackManager().getOrMake(name); track.getIoLock().lock(); try { @@ -658,11 +655,11 @@ public abstract class ConfigurateDao extends AbstractDao { } finally { track.getIoLock().unlock(); } - return true; + return track; } @Override - public boolean loadTrack(String name) throws Exception { + public Optional loadTrack(String name) throws Exception { Track track = plugin.getTrackManager().getIfLoaded(name); if (track != null) { track.getIoLock().lock(); @@ -672,7 +669,7 @@ public abstract class ConfigurateDao extends AbstractDao { ConfigurationNode object = readFile(StorageLocation.TRACK, name); if (object == null) { - return false; + return Optional.empty(); } if (track == null) { @@ -693,13 +690,15 @@ public abstract class ConfigurateDao extends AbstractDao { track.getIoLock().unlock(); } } - return true; + return Optional.of(track); } @Override - public boolean loadAllTracks() { + public void loadAllTracks() throws IOException { String[] fileNames = tracksDirectory.list(getFileTypeFilter()); - if (fileNames == null) return false; + if (fileNames == null) { + throw new IOException("Not a directory"); + } List tracks = Arrays.stream(fileNames) .map(s -> s.substring(0, s.length() - fileExtension.length())) .collect(Collectors.toList()); @@ -722,12 +721,10 @@ public abstract class ConfigurateDao extends AbstractDao { tm.getAll().values().stream() .filter(t -> !tracks.contains(t.getName())) .forEach(tm::unload); - - return true; } @Override - public boolean saveTrack(Track track) throws Exception { + public void saveTrack(Track track) throws Exception { track.getIoLock().lock(); try { ConfigurationNode data = SimpleConfigurationNode.root(); @@ -739,11 +736,10 @@ public abstract class ConfigurateDao extends AbstractDao { } finally { track.getIoLock().unlock(); } - return true; } @Override - public boolean deleteTrack(Track track) throws Exception { + public void deleteTrack(Track track) throws Exception { track.getIoLock().lock(); try { File trackFile = new File(tracksDirectory, track.getName() + fileExtension); @@ -757,13 +753,12 @@ public abstract class ConfigurateDao extends AbstractDao { } finally { track.getIoLock().unlock(); } - return true; + plugin.getTrackManager().unload(track); } @Override - public boolean saveUUIDData(UUID uuid, String username) { + public void saveUUIDData(UUID uuid, String username) { uuidCache.addMapping(uuid, username); - return true; } @Override 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 3b70ef9fd..a31205820 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 @@ -69,6 +69,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -144,7 +145,7 @@ public class MongoDao extends AbstractDao { } @Override - public boolean logAction(LogEntry entry) { + public void logAction(LogEntry entry) { MongoCollection c = database.getCollection(prefix + "action"); Document doc = new Document() .append("timestamp", entry.getTimestamp()) @@ -159,7 +160,6 @@ public class MongoDao extends AbstractDao { } c.insertOne(doc); - return true; } @Override @@ -192,7 +192,7 @@ public class MongoDao extends AbstractDao { } @Override - public boolean applyBulkUpdate(BulkUpdate bulkUpdate) { + public void applyBulkUpdate(BulkUpdate bulkUpdate) { if (bulkUpdate.getDataType().isIncludingUsers()) { MongoCollection c = database.getCollection(prefix + "users"); try (MongoCursor cursor = c.find().iterator()) { @@ -242,11 +242,10 @@ public class MongoDao extends AbstractDao { } } } - return true; } @Override - public boolean loadUser(UUID uuid, String username) { + public User loadUser(UUID uuid, String username) { User user = plugin.getUserManager().getOrMake(UserIdentifier.of(uuid, username)); user.getIoLock().lock(); try { @@ -283,18 +282,18 @@ public class MongoDao extends AbstractDao { user.getIoLock().unlock(); } user.getRefreshBuffer().requestDirectly(); - return true; + return user; } @Override - public boolean saveUser(User user) { + public void saveUser(User user) { user.getIoLock().lock(); try { MongoCollection c = database.getCollection(prefix + "users"); if (!GenericUserManager.shouldSave(user)) { - return c.deleteOne(new Document("_id", user.getUuid())).wasAcknowledged(); + c.deleteOne(new Document("_id", user.getUuid())); } else { - return c.replaceOne(new Document("_id", user.getUuid()), userToDoc(user), new UpdateOptions().upsert(true)).wasAcknowledged(); + c.replaceOne(new Document("_id", user.getUuid()), userToDoc(user), new UpdateOptions().upsert(true)); } } finally { user.getIoLock().unlock(); @@ -336,7 +335,7 @@ public class MongoDao extends AbstractDao { } @Override - public boolean createAndLoadGroup(String name) { + public Group createAndLoadGroup(String name) { Group group = plugin.getGroupManager().getOrMake(name); group.getIoLock().lock(); try { @@ -354,18 +353,25 @@ public class MongoDao extends AbstractDao { group.getIoLock().unlock(); } group.getRefreshBuffer().requestDirectly(); - return true; + return group; } @Override - public boolean loadGroup(String name) { - Group group = plugin.getGroupManager().getOrMake(name); - group.getIoLock().lock(); + public Optional loadGroup(String name) { + Group group = plugin.getGroupManager().getIfLoaded(name); + if (group != null) { + group.getIoLock().lock(); + } try { MongoCollection c = database.getCollection(prefix + "groups"); - try (MongoCursor cursor = c.find(new Document("_id", group.getName())).iterator()) { + try (MongoCursor cursor = c.find(new Document("_id", name)).iterator()) { if (!cursor.hasNext()) { - return false; + return Optional.empty(); + } + + if (group == null) { + group = plugin.getGroupManager().getOrMake(name); + group.getIoLock().lock(); } Document d = cursor.next(); @@ -373,14 +379,16 @@ public class MongoDao extends AbstractDao { group.setEnduringNodes(nodes); } } finally { - group.getIoLock().unlock(); + if (group != null) { + group.getIoLock().unlock(); + } } group.getRefreshBuffer().requestDirectly(); - return true; + return Optional.of(group); } @Override - public boolean loadAllGroups() { + public void loadAllGroups() { List groups = new ArrayList<>(); MongoCollection c = database.getCollection(prefix + "groups"); try (MongoCursor cursor = c.find().iterator()) { @@ -408,27 +416,25 @@ public class MongoDao extends AbstractDao { gm.getAll().values().stream() .filter(g -> !groups.contains(g.getName())) .forEach(gm::unload); - - return true; } @Override - public boolean saveGroup(Group group) { + public void saveGroup(Group group) { group.getIoLock().lock(); try { MongoCollection c = database.getCollection(prefix + "groups"); - return c.replaceOne(new Document("_id", group.getName()), groupToDoc(group), new UpdateOptions().upsert(true)).wasAcknowledged(); + c.replaceOne(new Document("_id", group.getName()), groupToDoc(group), new UpdateOptions().upsert(true)); } finally { group.getIoLock().unlock(); } } @Override - public boolean deleteGroup(Group group) { + public void deleteGroup(Group group) { group.getIoLock().lock(); try { MongoCollection c = database.getCollection(prefix + "groups"); - return c.deleteOne(new Document("_id", group.getName())).wasAcknowledged(); + c.deleteOne(new Document("_id", group.getName())); } finally { group.getIoLock().unlock(); } @@ -456,7 +462,7 @@ public class MongoDao extends AbstractDao { } @Override - public boolean createAndLoadTrack(String name) { + public Track createAndLoadTrack(String name) { Track track = plugin.getTrackManager().getOrMake(name); track.getIoLock().lock(); try { @@ -473,31 +479,42 @@ public class MongoDao extends AbstractDao { } finally { track.getIoLock().unlock(); } - return true; + return track; } @Override - public boolean loadTrack(String name) { - Track track = plugin.getTrackManager().getOrMake(name); - track.getIoLock().lock(); + public Optional loadTrack(String name) { + Track track = plugin.getTrackManager().getIfLoaded(name); + if (track != null) { + track.getIoLock().lock(); + } + try { MongoCollection c = database.getCollection(prefix + "tracks"); - try (MongoCursor cursor = c.find(new Document("_id", track.getName())).iterator()) { - if (cursor.hasNext()) { - Document d = cursor.next(); - //noinspection unchecked - track.setGroups((List) d.get("groups")); - return true; + try (MongoCursor cursor = c.find(new Document("_id", name)).iterator()) { + if (!cursor.hasNext()) { + return Optional.empty(); } - return false; + + if (track == null) { + track = plugin.getTrackManager().getOrMake(name); + track.getIoLock().lock(); + } + + Document d = cursor.next(); + //noinspection unchecked + track.setGroups((List) d.get("groups")); } } finally { - track.getIoLock().unlock(); + if (track != null) { + track.getIoLock().unlock(); + } } + return Optional.of(track); } @Override - public boolean loadAllTracks() { + public void loadAllTracks() { List tracks = new ArrayList<>(); MongoCollection c = database.getCollection(prefix + "tracks"); try (MongoCursor cursor = c.find().iterator()) { @@ -525,37 +542,34 @@ public class MongoDao extends AbstractDao { tm.getAll().values().stream() .filter(t -> !tracks.contains(t.getName())) .forEach(tm::unload); - - return true; } @Override - public boolean saveTrack(Track track) { + public void saveTrack(Track track) { track.getIoLock().lock(); try { MongoCollection c = database.getCollection(prefix + "tracks"); - return c.replaceOne(new Document("_id", track.getName()), trackToDoc(track)).wasAcknowledged(); + c.replaceOne(new Document("_id", track.getName()), trackToDoc(track)); } finally { track.getIoLock().unlock(); } } @Override - public boolean deleteTrack(Track track) { + public void deleteTrack(Track track) { track.getIoLock().lock(); try { MongoCollection c = database.getCollection(prefix + "tracks"); - return c.deleteOne(new Document("_id", track.getName())).wasAcknowledged(); + c.deleteOne(new Document("_id", track.getName())); } finally { track.getIoLock().unlock(); } } @Override - public boolean saveUUIDData(UUID uuid, String username) { + public void saveUUIDData(UUID uuid, String username) { MongoCollection c = database.getCollection(prefix + "uuid"); c.replaceOne(new Document("_id", uuid), new Document("_id", uuid).append("name", username.toLowerCase()), new UpdateOptions().upsert(true)); - return true; } @Override 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 fd0da4c05..627afe504 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 @@ -69,6 +69,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -228,7 +229,7 @@ public class SqlDao extends AbstractDao { } @Override - public boolean logAction(LogEntry entry) throws SQLException { + public void logAction(LogEntry entry) throws SQLException { try (Connection c = provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(prefix.apply(ACTION_INSERT))) { ps.setLong(1, entry.getTimestamp()); @@ -239,7 +240,6 @@ public class SqlDao extends AbstractDao { ps.setString(6, entry.getActedName()); ps.setString(7, entry.getAction()); ps.execute(); - return true; } } } @@ -271,11 +271,10 @@ public class SqlDao extends AbstractDao { } @Override - public boolean applyBulkUpdate(BulkUpdate bulkUpdate) throws SQLException { + public void applyBulkUpdate(BulkUpdate bulkUpdate) throws SQLException { String queryString = bulkUpdate.buildAsSql(); try (Connection c = provider.getConnection()) { - if (bulkUpdate.getDataType().isIncludingUsers()) { String table = prefix.apply("{prefix}user_permissions"); try (Statement s = c.createStatement()) { @@ -290,11 +289,10 @@ public class SqlDao extends AbstractDao { } } } - return true; } @Override - public boolean loadUser(UUID uuid, String username) throws SQLException { + public User loadUser(UUID uuid, String username) throws SQLException { User user = plugin.getUserManager().getOrMake(UserIdentifier.of(uuid, username)); user.getIoLock().lock(); try { @@ -368,11 +366,11 @@ public class SqlDao extends AbstractDao { user.getIoLock().unlock(); } user.getRefreshBuffer().requestDirectly(); - return true; + return user; } @Override - public boolean saveUser(User user) throws SQLException { + public void saveUser(User user) throws SQLException { user.getIoLock().lock(); try { // Empty data - just delete from the DB. @@ -388,7 +386,7 @@ public class SqlDao extends AbstractDao { ps.execute(); } } - return true; + return; } // Get a snapshot of current data. @@ -482,8 +480,6 @@ public class SqlDao extends AbstractDao { } } - - return true; } finally { user.getIoLock().unlock(); } @@ -530,7 +526,7 @@ public class SqlDao extends AbstractDao { } @Override - public boolean createAndLoadGroup(String name) throws SQLException { + public Group createAndLoadGroup(String name) throws SQLException { String query; switch (provider.getName()) { case "H2": @@ -554,11 +550,11 @@ public class SqlDao extends AbstractDao { } } - return loadGroup(name); + return loadGroup(name).get(); } @Override - public boolean loadGroup(String name) throws SQLException { + public Optional loadGroup(String name) throws SQLException { // Check the group actually exists List groups = new ArrayList<>(); try (Connection c = provider.getConnection()) { @@ -573,7 +569,7 @@ public class SqlDao extends AbstractDao { } if (!groups.contains(name)) { - return false; + return Optional.empty(); } Group group = plugin.getGroupManager().getOrMake(name); @@ -609,11 +605,11 @@ public class SqlDao extends AbstractDao { group.getIoLock().unlock(); } group.getRefreshBuffer().requestDirectly(); - return true; + return Optional.of(group); } @Override - public boolean loadAllGroups() throws SQLException { + public void loadAllGroups() throws SQLException { List groups = new ArrayList<>(); try (Connection c = provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(prefix.apply(GROUP_SELECT_ALL))) { @@ -643,12 +639,10 @@ public class SqlDao extends AbstractDao { gm.getAll().values().stream() .filter(g -> !groups.contains(g.getName())) .forEach(gm::unload); - - return true; } @Override - public boolean saveGroup(Group group) throws SQLException { + public void saveGroup(Group group) throws SQLException { group.getIoLock().lock(); try { // Empty data, just delete. @@ -659,7 +653,7 @@ public class SqlDao extends AbstractDao { ps.execute(); } } - return true; + return; } // Get a snapshot of current data @@ -724,15 +718,13 @@ public class SqlDao extends AbstractDao { } } } - - return true; } finally { group.getIoLock().unlock(); } } @Override - public boolean deleteGroup(Group group) throws SQLException { + public void deleteGroup(Group group) throws SQLException { group.getIoLock().lock(); try { try (Connection c = provider.getConnection()) { @@ -746,10 +738,11 @@ public class SqlDao extends AbstractDao { ps.execute(); } } - return true; } finally { group.getIoLock().unlock(); } + + plugin.getGroupManager().unload(group); } @Override @@ -777,7 +770,7 @@ public class SqlDao extends AbstractDao { } @Override - public boolean createAndLoadTrack(String name) throws SQLException { + public Track createAndLoadTrack(String name) throws SQLException { Track track = plugin.getTrackManager().getOrMake(name); track.getIoLock().lock(); try { @@ -799,7 +792,6 @@ public class SqlDao extends AbstractDao { if (exists.get()) { // Track exists, let's load. track.setGroups(gson.fromJson(groups.get(), LIST_STRING_TYPE)); - return true; } else { String json = gson.toJson(track.getGroups()); try (Connection c = provider.getConnection()) { @@ -809,43 +801,52 @@ public class SqlDao extends AbstractDao { ps.execute(); } } - return true; } - } finally { track.getIoLock().unlock(); } + return track; } @Override - public boolean loadTrack(String name) throws SQLException { - Track track = plugin.getTrackManager().getOrMake(name); - track.getIoLock().lock(); + public Optional loadTrack(String name) throws SQLException { + Track track = plugin.getTrackManager().getIfLoaded(name); + if (track != null) { + track.getIoLock().lock(); + } try { AtomicReference groups = new AtomicReference<>(null); + try (Connection c = provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(prefix.apply(TRACK_SELECT))) { - ps.setString(1, track.getName()); + ps.setString(1, name); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { groups.set(rs.getString("groups")); } else { - return false; + return Optional.empty(); } } } } + if (track == null) { + track = plugin.getTrackManager().getOrMake(name); + track.getIoLock().lock(); + } + track.setGroups(gson.fromJson(groups.get(), LIST_STRING_TYPE)); - return true; + return Optional.of(track); } finally { - track.getIoLock().unlock(); + if (track != null) { + track.getIoLock().unlock(); + } } } @Override - public boolean loadAllTracks() throws SQLException { + public void loadAllTracks() throws SQLException { List tracks = new ArrayList<>(); try (Connection c = provider.getConnection()) { try (PreparedStatement ps = c.prepareStatement(prefix.apply(TRACK_SELECT_ALL))) { @@ -875,12 +876,10 @@ public class SqlDao extends AbstractDao { tm.getAll().values().stream() .filter(t -> !tracks.contains(t.getName())) .forEach(tm::unload); - - return true; } @Override - public boolean saveTrack(Track track) throws SQLException { + public void saveTrack(Track track) throws SQLException { track.getIoLock().lock(); try { String s = gson.toJson(track.getGroups()); @@ -891,14 +890,13 @@ public class SqlDao extends AbstractDao { ps.execute(); } } - return true; } finally { track.getIoLock().unlock(); } } @Override - public boolean deleteTrack(Track track) throws SQLException { + public void deleteTrack(Track track) throws SQLException { track.getIoLock().lock(); try { try (Connection c = provider.getConnection()) { @@ -912,11 +910,10 @@ public class SqlDao extends AbstractDao { } plugin.getTrackManager().unload(track); - return true; } @Override - public boolean saveUUIDData(UUID uuid, String username) throws SQLException { + public void saveUUIDData(UUID uuid, String username) throws SQLException { final String u = username.toLowerCase(); AtomicReference remoteUserName = new AtomicReference<>(null); @@ -943,7 +940,7 @@ public class SqlDao extends AbstractDao { if (remoteUserName.get() != null) { // the value is already correct if (remoteUserName.get().equals(u)) { - return true; + return; } try (Connection c = provider.getConnection()) { @@ -953,7 +950,6 @@ public class SqlDao extends AbstractDao { ps.execute(); } } - return true; } else { // first time we've seen this uuid try (Connection c = provider.getConnection()) { @@ -964,7 +960,6 @@ public class SqlDao extends AbstractDao { ps.execute(); } } - return true; } } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/BufferedOutputStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/BufferedOutputStorage.java index 9685946a0..e5dc9f7ef 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/BufferedOutputStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/BufferedOutputStorage.java @@ -48,9 +48,9 @@ public class BufferedOutputStorage implements Storage, Runnable { private final long flushTime; - private final Buffer userOutputBuffer = Buffer.of(user -> BufferedOutputStorage.this.delegate.saveUser(user).join()); - private final Buffer groupOutputBuffer = Buffer.of(group -> BufferedOutputStorage.this.delegate.saveGroup(group).join()); - private final Buffer trackOutputBuffer = Buffer.of(track -> BufferedOutputStorage.this.delegate.saveTrack(track).join()); + private final Buffer userOutputBuffer = Buffer.of(user -> BufferedOutputStorage.this.delegate.saveUser(user).join()); + private final Buffer groupOutputBuffer = Buffer.of(group -> BufferedOutputStorage.this.delegate.saveGroup(group).join()); + private final Buffer trackOutputBuffer = Buffer.of(track -> BufferedOutputStorage.this.delegate.saveTrack(track).join()); @Override public void run() { @@ -79,25 +79,25 @@ public class BufferedOutputStorage implements Storage, Runnable { } @Override - public CompletableFuture saveUser(User user) { + public CompletableFuture saveUser(User user) { return userOutputBuffer.enqueue(user); } @Override - public CompletableFuture saveGroup(Group group) { + public CompletableFuture saveGroup(Group group) { return groupOutputBuffer.enqueue(group); } @Override - public CompletableFuture saveTrack(Track track) { + public CompletableFuture saveTrack(Track track) { return trackOutputBuffer.enqueue(track); } private interface Exclude { Storage noBuffer(); - CompletableFuture shutdown(); - CompletableFuture saveUser(User user); - CompletableFuture saveGroup(Group group); - CompletableFuture saveTrack(Track track); + void shutdown(); + CompletableFuture saveUser(User user); + CompletableFuture saveGroup(Group group); + CompletableFuture saveTrack(Track track); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/PhasedStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/PhasedStorage.java index 2383f5e38..bc82209cd 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/PhasedStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/wrappings/PhasedStorage.java @@ -42,6 +42,7 @@ import me.lucko.luckperms.common.storage.Storage; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -100,7 +101,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture logAction(LogEntry entry) { + public CompletableFuture logAction(LogEntry entry) { phaser.register(); try { return delegate.logAction(entry); @@ -120,7 +121,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture applyBulkUpdate(BulkUpdate bulkUpdate) { + public CompletableFuture applyBulkUpdate(BulkUpdate bulkUpdate) { phaser.register(); try { return delegate.applyBulkUpdate(bulkUpdate); @@ -130,7 +131,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture loadUser(UUID uuid, String username) { + public CompletableFuture loadUser(UUID uuid, String username) { phaser.register(); try { return delegate.loadUser(uuid, username); @@ -140,7 +141,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture saveUser(User user) { + public CompletableFuture saveUser(User user) { phaser.register(); try { return delegate.saveUser(user); @@ -170,7 +171,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture createAndLoadGroup(String name, CreationCause cause) { + public CompletableFuture createAndLoadGroup(String name, CreationCause cause) { phaser.register(); try { return delegate.createAndLoadGroup(name, cause); @@ -180,7 +181,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture loadGroup(String name) { + public CompletableFuture> loadGroup(String name) { phaser.register(); try { return delegate.loadGroup(name); @@ -190,7 +191,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture loadAllGroups() { + public CompletableFuture loadAllGroups() { phaser.register(); try { return delegate.loadAllGroups(); @@ -200,7 +201,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture saveGroup(Group group) { + public CompletableFuture saveGroup(Group group) { phaser.register(); try { return delegate.saveGroup(group); @@ -210,7 +211,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture deleteGroup(Group group, DeletionCause cause) { + public CompletableFuture deleteGroup(Group group, DeletionCause cause) { phaser.register(); try { return delegate.deleteGroup(group, cause); @@ -230,7 +231,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture createAndLoadTrack(String name, CreationCause cause) { + public CompletableFuture createAndLoadTrack(String name, CreationCause cause) { phaser.register(); try { return delegate.createAndLoadTrack(name, cause); @@ -240,7 +241,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture loadTrack(String name) { + public CompletableFuture> loadTrack(String name) { phaser.register(); try { return delegate.loadTrack(name); @@ -250,7 +251,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture loadAllTracks() { + public CompletableFuture loadAllTracks() { phaser.register(); try { return delegate.loadAllTracks(); @@ -260,7 +261,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture saveTrack(Track track) { + public CompletableFuture saveTrack(Track track) { phaser.register(); try { return delegate.saveTrack(track); @@ -270,7 +271,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture deleteTrack(Track track, DeletionCause cause) { + public CompletableFuture deleteTrack(Track track, DeletionCause cause) { phaser.register(); try { return delegate.deleteTrack(track, cause); @@ -280,7 +281,7 @@ public class PhasedStorage implements Storage { } @Override - public CompletableFuture saveUUIDData(UUID uuid, String username) { + public CompletableFuture saveUUIDData(UUID uuid, String username) { phaser.register(); try { return delegate.saveUUIDData(uuid, username); diff --git a/common/src/main/java/me/lucko/luckperms/common/utils/LoginHelper.java b/common/src/main/java/me/lucko/luckperms/common/utils/LoginHelper.java index f7348e237..b835fbc15 100644 --- a/common/src/main/java/me/lucko/luckperms/common/utils/LoginHelper.java +++ b/common/src/main/java/me/lucko/luckperms/common/utils/LoginHelper.java @@ -53,7 +53,7 @@ public class LoginHelper { // No previous data for this player plugin.getApiProvider().getEventFactory().handleUserFirstLogin(u, username); cache.addToCache(u, u); - CompletableFuture future = plugin.getStorage().noBuffer().saveUUIDData(u, username); + CompletableFuture future = plugin.getStorage().noBuffer().saveUUIDData(u, username); if (joinUuidSave) { future.join(); } @@ -65,16 +65,15 @@ public class LoginHelper { } // Online mode, no cache needed. This is just for name -> uuid lookup. - CompletableFuture future = plugin.getStorage().noBuffer().saveUUIDData(u, username); + CompletableFuture future = plugin.getStorage().noBuffer().saveUUIDData(u, username); if (joinUuidSave) { future.join(); } } - plugin.getStorage().noBuffer().loadUser(cache.getUUID(u), username).join(); - User user = plugin.getUserManager().getIfLoaded(cache.getUUID(u)); + User user = plugin.getStorage().noBuffer().loadUser(cache.getUUID(u), username).join(); if (user == null) { - throw new RuntimeException("Failed to load user"); + throw new NullPointerException("User is null"); } else { // Setup defaults for the user boolean save = false; diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsSubjectData.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsSubjectData.java index 0fffe1bf9..79dde0531 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsSubjectData.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsSubjectData.java @@ -450,22 +450,26 @@ public class LuckPermsSubjectData implements LPSubjectData { } else { if (t.getType().isUser()) { User user = ((User) t); - return service.getPlugin().getStorage().saveUser(user).thenComposeAsync(success -> { - if (!success) { - return CompletableFuture.completedFuture(null); + CompletableFuture fut = new CompletableFuture<>(); + service.getPlugin().getStorage().saveUser(user).whenCompleteAsync((v, ex) -> { + if (ex != null) { + fut.complete(null); } - return user.getRefreshBuffer().request(); + user.getRefreshBuffer().request().thenAccept(fut::complete); }, service.getPlugin().getScheduler().async()); + return fut; } else { Group group = ((Group) t); - return service.getPlugin().getStorage().saveGroup(group).thenComposeAsync(success -> { - if (!success) { - return CompletableFuture.completedFuture(null); + CompletableFuture fut = new CompletableFuture<>(); + service.getPlugin().getStorage().saveGroup(group).whenCompleteAsync((v, ex) -> { + if (ex != null) { + fut.complete(null); } - return service.getPlugin().getUpdateTaskBuffer().request(); + service.getPlugin().getUpdateTaskBuffer().request().thenAccept(fut::complete); }, service.getPlugin().getScheduler().async()); + return fut; } } }