From 8b963adb4fb324963f39d8e9822e93e724ba4f95 Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Thu, 7 May 2026 13:27:51 +0200 Subject: [PATCH] Bugfix: Scheduler-Close-Guard liest Use Case dynamisch installSchedulerCloseGuard hat den Scheduler-Use-Case bisher nur einmalig aus dem unveraenderlichen GuiStartupContext gelesen. Bei normalem GUI-Start ohne --config war dieser Optional leer; der nach dem Auto-Load verdrahtete Use Case wurde nicht erfasst und der Close-Guard griff nie. Der Close-Handler wird jetzt unabhaengig vom Startup-Context installiert und liest den Aktiv-Status zur Laufzeit ueber den Workspace, der den im GuiSchedulerTab live verdrahteten Use Case kennt. Co-Authored-By: Claude Opus 4.7 --- .../gui/GuiConfigurationEditorWorkspace.java | 19 ++++++++++ .../in/gui/PdfUmbenennerGuiApplication.java | 37 ++++++++++--------- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java index 47b4e90..db3c605 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java @@ -1174,6 +1174,25 @@ public final class GuiConfigurationEditorWorkspace { .ifPresent(uc -> onSchedulerStatusRefresh(uc.getStatus())); } + /** + * Prüft, ob der aktuell verdrahtete Scheduler-Use-Case in einem aktiven + * Zustand (Zustand != {@code STOPPED}) ist. + *

+ * Liest den Use Case dynamisch aus dem {@link GuiSchedulerTab}, damit auch + * der nach erfolgreichem Datei-Öffnen erst zur Laufzeit verdrahtete Use Case + * erfasst wird. Ist kein Use Case verdrahtet, wird {@code false} zurückgegeben. + *

+ * Muss auf dem JavaFX Application Thread aufgerufen werden. + * + * @return {@code true}, wenn ein Use Case verdrahtet ist und sein Zustand + * als aktiv gilt; sonst {@code false} + */ + public boolean isSchedulerActive() { + return schedulerTab.currentSchedulerUseCase() + .map(uc -> uc.getStatus().state().isActive()) + .orElse(false); + } + /** * Aktualisiert den Sperr-Zustand des Konfig-Tabs anhand des aktuellen Scheduler-Status. *

diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/PdfUmbenennerGuiApplication.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/PdfUmbenennerGuiApplication.java index b8103d4..c405553 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/PdfUmbenennerGuiApplication.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/PdfUmbenennerGuiApplication.java @@ -196,24 +196,25 @@ public class PdfUmbenennerGuiApplication extends Application { * @param stage das primäre Fenster; darf nicht {@code null} sein */ private void installSchedulerCloseGuard(Stage stage) { - guiStartupContext.schedulerControlUseCase().ifPresent(uc -> { - EventHandler existingHandler = stage.getOnCloseRequest(); - stage.setOnCloseRequest(event -> { - if (uc.getStatus().state().isActive()) { - event.consume(); - Alert alert = new Alert(Alert.AlertType.INFORMATION); - alert.setTitle("Anwendung kann nicht beendet werden"); - alert.setHeaderText(null); - alert.setContentText( - "Ein Lauf ist aktiv oder der Scheduler läuft.\n" - + "Bitte beende den Scheduler bzw. warte auf das Ende des Laufs."); - alert.showAndWait(); - return; - } - if (existingHandler != null) { - existingHandler.handle(event); - } - }); + EventHandler existingHandler = stage.getOnCloseRequest(); + stage.setOnCloseRequest(event -> { + // Use Case dynamisch über den Workspace lesen, weil der Scheduler erst + // nach erfolgreichem Datei-Öffnen (z. B. Auto-Load) verdrahtet wird und + // damit nicht zwingend im unveränderlichen GuiStartupContext steht. + if (workspace.isSchedulerActive()) { + event.consume(); + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Anwendung kann nicht beendet werden"); + alert.setHeaderText(null); + alert.setContentText( + "Ein Lauf ist aktiv oder der Scheduler läuft.\n" + + "Bitte beende den Scheduler bzw. warte auf das Ende des Laufs."); + alert.showAndWait(); + return; + } + if (existingHandler != null) { + existingHandler.handle(event); + } }); }