From dad0018c7f2db7a109276ffa82d9f9f958d1d80a Mon Sep 17 00:00:00 2001 From: Tosox <57193602+Tosox@users.noreply.github.com> Date: Sat, 2 May 2026 00:47:08 +0200 Subject: [PATCH] feat: Validate saved resume ID (#75) Closes #75 --- locales/en-US.json | 2 ++ .../zonerelay/ui/MainFrameController.java | 34 ++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/locales/en-US.json b/locales/en-US.json index 6cb1cd0..60d2185 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -36,6 +36,8 @@ "DLG_RESUME_TITLE": "Resume Installation", "DLG_RESUME_MESSAGE": "Previous installation was interrupted at \"{0}\". Resume from there?", + "DLG_STALE_PROGRESS_TITLE": "Progress Discarded", + "DLG_STALE_PROGRESS_MESSAGE": "The saved progress file refers to a mod that no longer exists in the modlist. Press OK to start a full installation, or Cancel to abort.", "DLG_HASH_MISMATCH_TITLE": "Hash Mismatch", "DLG_HASH_MISMATCH_UPDATE_TITLE": "Update Hashes", diff --git a/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java b/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java index 9bd5604..df83de0 100644 --- a/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java +++ b/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.nio.file.Files; import java.util.List; +import java.util.Optional; import java.util.stream.Stream; @Singleton @@ -91,8 +92,12 @@ public void onInstallClick() { return; } - String resumeFromId = promptForResume(config); + Optional resumeResult = promptForResume(config); + if (resumeResult.isEmpty()) { + return; + } + String resumeFromId = resumeResult.get().isEmpty() ? null : resumeResult.get(); installCoordinator.startInstallation(config, mainFrame.isFullInstallSelected(), resumeFromId); } @@ -113,33 +118,46 @@ public void onLaunchClick() { } } - private String promptForResume(ModlistConfig config) { + private Optional promptForResume(ModlistConfig config) { if (!progressStore.hasSavedState()) { - return null; + return Optional.of(""); } String savedId = progressStore.load(); if (savedId == null) { - return null; + return Optional.of(""); } String entryName = findEntryNameById(config, savedId); - String displayName = (entryName != null) ? entryName : savedId; + if (entryName == null) { + int choice = JOptionPane.showConfirmDialog( + mainFrame, + localizer.translate("DLG_STALE_PROGRESS_MESSAGE"), + localizer.translate("DLG_STALE_PROGRESS_TITLE"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.WARNING_MESSAGE + ); + if (choice != JOptionPane.OK_OPTION) { + return Optional.empty(); + } + progressStore.clear(); + return Optional.of(""); + } int choice = JOptionPane.showConfirmDialog( mainFrame, - localizer.translate("DLG_RESUME_MESSAGE", displayName), + localizer.translate("DLG_RESUME_MESSAGE", entryName), localizer.translate("DLG_RESUME_TITLE"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ); if (choice == JOptionPane.YES_OPTION) { - return savedId; + return Optional.of(savedId); } progressStore.clear(); - return null; + return Optional.of(""); } private String findEntryNameById(ModlistConfig config, String id) {