diff --git a/src/main/java/org/mvplugins/multiverse/core/utils/result/FailureReason.java b/src/main/java/org/mvplugins/multiverse/core/utils/result/FailureReason.java index c21eede1f..4eae2fa24 100644 --- a/src/main/java/org/mvplugins/multiverse/core/utils/result/FailureReason.java +++ b/src/main/java/org/mvplugins/multiverse/core/utils/result/FailureReason.java @@ -3,12 +3,21 @@ import co.aikar.locales.MessageKey; import co.aikar.locales.MessageKeyProvider; +import org.jetbrains.annotations.ApiStatus; import org.mvplugins.multiverse.core.locale.MVCorei18n; /** * Represents a failure reason for an {@link Attempt}. */ public interface FailureReason extends MessageKeyProvider { + /** + * A generic failure reason that can be used when no specific reason is applicable. + * + * @since 5.2 + */ + @ApiStatus.AvailableSince("5.2") + FailureReason GENERIC = new FailureReason() { }; + default MessageKey getMessageKey() { return MVCorei18n.GENERIC_FAILURE.getMessageKey(); } diff --git a/src/main/java/org/mvplugins/multiverse/core/utils/result/SuccessReason.java b/src/main/java/org/mvplugins/multiverse/core/utils/result/SuccessReason.java index 685201fc0..b8a345d6f 100644 --- a/src/main/java/org/mvplugins/multiverse/core/utils/result/SuccessReason.java +++ b/src/main/java/org/mvplugins/multiverse/core/utils/result/SuccessReason.java @@ -3,9 +3,21 @@ import co.aikar.locales.MessageKey; import co.aikar.locales.MessageKeyProvider; +import org.jetbrains.annotations.ApiStatus; import org.mvplugins.multiverse.core.locale.MVCorei18n; +/** + * Represents a success reason for an {@link Attempt}. + */ public interface SuccessReason extends MessageKeyProvider { + /** + * A generic success reason that can be used when no specific reason is applicable. + * + * @since 5.2 + */ + @ApiStatus.AvailableSince("5.2") + SuccessReason GENERIC = new SuccessReason() { }; + default MessageKey getMessageKey() { return MVCorei18n.GENERIC_SUCCESS.getMessageKey(); } diff --git a/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java b/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java index 734e5594e..2c42f7e4f 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java @@ -169,7 +169,11 @@ private void loadNewWorldConfigs(Collection newWorldConfigs) { } private void removeWorldsNotInConfigs(Collection removedWorlds) { - removedWorlds.forEach(worldName -> removeWorld(worldName) + removedWorlds.forEach(worldName -> getWorld(worldName) + .fold( + () -> Attempt.failure(FailureReason.GENERIC, Message.of("world already removed")), + world -> removeWorld(RemoveWorldOptions.world(world)) + ) .onFailure(failure -> Logging.severe("Failed to unload world %s: %s", worldName, failure)) .onSuccess(success -> Logging.fine("Unloaded world %s as it was removed from config", worldName))); } @@ -513,10 +517,14 @@ private Attempt removeLoadedMultiverseWorl * * @param worldName The name of the world to remove. * @return The result of the remove. + * + * @deprecated Get the {@link MultiverseWorld} yourself and use {@link #removeWorld(RemoveWorldOptions)} instead. */ + @Deprecated(since = "5.2", forRemoval = true) + @ApiStatus.ScheduledForRemoval(inVersion = "6.0") public Attempt removeWorld(@NotNull String worldName) { return getWorld(worldName) - .map(this::removeWorld) + .map(world -> removeWorld(RemoveWorldOptions.world(world))) .getOrElse(() -> worldActionResult(RemoveFailureReason.WORLD_NON_EXISTENT, worldName)); } @@ -526,7 +534,11 @@ public Attempt removeWorld(@NotNull String worldNam * * @param world The multiverse world to remove. * @return The result of the remove. + * + * @deprecated Use {@link #removeWorld(RemoveWorldOptions)} instead. */ + @Deprecated(since = "5.2", forRemoval = true) + @ApiStatus.ScheduledForRemoval(inVersion = "6.0") public Attempt removeWorld(@NotNull MultiverseWorld world) { return removeWorld(RemoveWorldOptions.world(world)); } @@ -537,9 +549,13 @@ public Attempt removeWorld(@NotNull MultiverseWorld * * @param loadedWorld The multiverse world to remove. * @return The result of the remove. + * + * @deprecated Use {@link #removeWorld(RemoveWorldOptions)} instead. */ + @Deprecated(since = "5.2", forRemoval = true) + @ApiStatus.ScheduledForRemoval(inVersion = "6.0") public Attempt removeWorld(@NotNull LoadedMultiverseWorld loadedWorld) { - return unloadBeforeRemoveWorld(loadedWorld, RemoveWorldOptions.world(loadedWorld)); + return removeWorld(RemoveWorldOptions.world(loadedWorld)); } /** @@ -620,7 +636,11 @@ private Attempt doDeleteWorld(@NotNull LoadedMultiv ? Attempt.failure(DeleteFailureReason.EVENT_CANCELLED) : Attempt.success(null); }) - .mapAttempt(() -> removeWorld(world).transform(DeleteFailureReason.REMOVE_FAILED)) + .mapAttempt(() -> removeWorld(RemoveWorldOptions + .world(world) + .unloadBukkitWorld(true) + .saveBukkitWorld(false) + ).transform(DeleteFailureReason.REMOVE_FAILED)) .mapAttempt(() -> fileUtils.deleteFolder(worldFolder.get(), options.keepFiles()).fold( exception -> worldActionResult(DeleteFailureReason.FAILED_TO_DELETE_FOLDER, world.getName(), exception), diff --git a/src/main/java/org/mvplugins/multiverse/core/world/reasons/RemoveFailureReason.java b/src/main/java/org/mvplugins/multiverse/core/world/reasons/RemoveFailureReason.java index dedeec798..8ca74ddc3 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/reasons/RemoveFailureReason.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/reasons/RemoveFailureReason.java @@ -3,8 +3,10 @@ import co.aikar.locales.MessageKey; import co.aikar.locales.MessageKeyProvider; +import org.jetbrains.annotations.ApiStatus; import org.mvplugins.multiverse.core.locale.MVCorei18n; import org.mvplugins.multiverse.core.utils.result.FailureReason; +import org.mvplugins.multiverse.core.world.WorldManager; /** * Result of a world removal operation. @@ -12,7 +14,11 @@ public enum RemoveFailureReason implements FailureReason { /** * The world does not exist. + * + * @deprecated No longer in use as {@link WorldManager#removeWorld(String)} is now deprecated. */ + @Deprecated(forRemoval = true, since = "5.2") + @ApiStatus.ScheduledForRemoval(inVersion = "6.0") WORLD_NON_EXISTENT(MVCorei18n.REMOVEWORLD_WORLDNONEXISTENT), /** diff --git a/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt b/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt index 72b69bd73..2aa872fe2 100644 --- a/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt +++ b/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt @@ -11,6 +11,7 @@ import org.mvplugins.multiverse.core.world.options.CloneWorldOptions import org.mvplugins.multiverse.core.world.options.CreateWorldOptions import org.mvplugins.multiverse.core.world.options.DeleteWorldOptions import org.mvplugins.multiverse.core.world.options.RegenWorldOptions +import org.mvplugins.multiverse.core.world.options.RemoveWorldOptions import org.mvplugins.multiverse.core.world.options.UnloadWorldOptions import org.mvplugins.multiverse.core.world.reasons.CloneFailureReason import org.mvplugins.multiverse.core.world.reasons.CreateFailureReason @@ -102,7 +103,7 @@ class WorldManagerTest : TestWithMockBukkit() { @Test fun `Remove world`() { - assertTrue(worldManager.removeWorld(world).isSuccess) + assertTrue(worldManager.removeWorld(RemoveWorldOptions.world(world)).isSuccess) assertFalse(worldManager.getWorld("world").isDefined) assertFalse(worldManager.getLoadedWorld("world").isDefined) assertFalse(worldManager.getUnloadedWorld("world").isDefined)