From 758bb40d9d66a78e545e317007523a8c6e1b55d2 Mon Sep 17 00:00:00 2001 From: Baptiste Douxami Date: Sat, 2 Dec 2023 12:23:22 +0100 Subject: [PATCH 1/3] [FEAT] Add auto_saving --- src/main/java/application/UPMTApp.java | 30 ++++++++++++++++++- .../appCommands/CloseApplicationCommand.java | 3 +- .../appCommands/SaveProjectCommand.java | 20 +++++++++++++ src/main/java/models/Project.java | 8 +++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/main/java/application/UPMTApp.java b/src/main/java/application/UPMTApp.java index ec251721..a882b0b4 100644 --- a/src/main/java/application/UPMTApp.java +++ b/src/main/java/application/UPMTApp.java @@ -47,6 +47,7 @@ public UPMTApp(Stage primaryStage) throws IOException { appCommandFactory.openProjectManagerCommand().execute(); } + startAutoSave(); FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource("/views/MainView/MainView.fxml")); @@ -79,5 +80,32 @@ public void restartApp() { if(getCurrentProject() != null) setCurrentProject(getCurrentProject(), currentProjectPath); } - + + private void startAutoSave() { + if (currentProject != null) { + Thread autoSaveThread = new Thread(() -> { + while (true) { + try { + // Effectuez la sauvegarde automatique uniquement si le projet a été modifié + if (currentProject.isModified()) { + currentProject.saveAs("auto_save", getCurrentProjectPath()); + System.out.println(getCurrentProjectPath()); + appCommandFactory.saveProject().execute2(); + + // Marquez le projet comme non modifié après la sauvegarde + currentProject.setModified(false); + } + + // Pause pour l'intervalle spécifié + Thread.sleep(2000); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + // Gérer les exceptions si nécessaire + } + } + }); + autoSaveThread.setDaemon(true); + autoSaveThread.start(); + } + } } \ No newline at end of file diff --git a/src/main/java/application/appCommands/CloseApplicationCommand.java b/src/main/java/application/appCommands/CloseApplicationCommand.java index 0ab6ddb1..cc959c3d 100644 --- a/src/main/java/application/appCommands/CloseApplicationCommand.java +++ b/src/main/java/application/appCommands/CloseApplicationCommand.java @@ -44,7 +44,8 @@ public Void execute() { } } } - if(workUnsaved) { + System.out.println(upmtApp.getCurrentProjectPath()); + if(upmtApp.getCurrentProjectPath() == null) { Alert alert = new Alert(AlertType.CONFIRMATION); alert.setHeaderText(""); alert.setTitle(Configuration.langBundle.getString("alert_unsaved_project_title")); diff --git a/src/main/java/application/appCommands/SaveProjectCommand.java b/src/main/java/application/appCommands/SaveProjectCommand.java index ca7fe7b3..7c066724 100644 --- a/src/main/java/application/appCommands/SaveProjectCommand.java +++ b/src/main/java/application/appCommands/SaveProjectCommand.java @@ -31,4 +31,24 @@ public Void execute() { } return null; } + + public Void execute2() { + // Vérifiez s'il y a un projet en cours. + if (upmtApp.getCurrentProjectPath() != null) { + try { + System.out.println("ici"); + ProjectSaver.save(upmtApp.getCurrentProject(), Configuration.getProjectsPath()[0]); + //upmtApp.setLastSavedCommandId(HistoryManager.getCurrentCommandId()); + //new ProjectSavingStatusChangedCommand(upmtApp).execute(); + + + } catch (Exception e) { + ProjectDialogBox.projectSavingFailed(); + e.printStackTrace(); + } + } else { + new SaveProjectAsCommand(upmtApp).execute(); + } + return null; + } } diff --git a/src/main/java/models/Project.java b/src/main/java/models/Project.java index 10846165..017d3d50 100644 --- a/src/main/java/models/Project.java +++ b/src/main/java/models/Project.java @@ -20,6 +20,7 @@ public class Project implements Serializable { private ReadOnlyListWrapper readOnlyInterviews; private SimpleObjectProperty selectedInterview; + private boolean modified; public Project(String name, SchemaTreeRoot baseScheme) { this.name = new SimpleStringProperty(name); @@ -29,8 +30,13 @@ public Project(String name, SchemaTreeRoot baseScheme) { this.readOnlyInterviews = new ReadOnlyListWrapper<>(this.interviews); this.selectedInterview = new SimpleObjectProperty<>(); + + this.modified = false; } + public void setModified(boolean modified) {this.modified = modified;} + public boolean isModified() {return modified;} + public String getName() { return this.name.get(); } public StringProperty nameProperty() { return this.name; } @@ -39,9 +45,11 @@ public Project(String name, SchemaTreeRoot baseScheme) { public void addInterview(Interview i) { interviews.add(i); + setModified(true); } public void removeInterview(Interview i) { interviews.remove(i); + setModified(true); } public ReadOnlyListWrapper interviewsProperty() { return readOnlyInterviews; } From fe41f44c13cecc1acb09a32c4c978a10a4cb580c Mon Sep 17 00:00:00 2001 From: Baptiste Douxami Date: Mon, 4 Dec 2023 18:33:49 +0100 Subject: [PATCH 2/3] [FIX] Change auto_saving method --- src/main/java/application/UPMTApp.java | 33 +++++++++++-------- .../appCommands/CloseApplicationCommand.java | 25 +++----------- .../appCommands/SaveProjectCommand.java | 22 ++----------- src/main/java/models/ConcreteCategory.java | 1 + src/main/java/models/Project.java | 7 ---- 5 files changed, 26 insertions(+), 62 deletions(-) diff --git a/src/main/java/application/UPMTApp.java b/src/main/java/application/UPMTApp.java index a882b0b4..fecaf658 100644 --- a/src/main/java/application/UPMTApp.java +++ b/src/main/java/application/UPMTApp.java @@ -7,27 +7,33 @@ import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; +import javafx.application.Platform; import models.Project; - import java.io.IOException; import java.util.UUID; + public class UPMTApp { private Stage primaryStage; private RootLayoutController rootLayoutController; private ApplicationCommandFactory appCommandFactory; - private Project currentProject; + private static Project currentProject; private String currentProjectPath; private UUID lastSavedCommandId; + private long autoSaveIntervalMillis; + + public UPMTApp(Stage primaryStage) throws IOException { this.primaryStage = primaryStage; this.appCommandFactory = new ApplicationCommandFactory(this); this.rootLayoutController = new RootLayoutController(appCommandFactory); + this.autoSaveIntervalMillis = 10000; + Configuration.loadAppConfiguration(); HistoryManager.init(appCommandFactory); @@ -57,6 +63,7 @@ public UPMTApp(Stage primaryStage) throws IOException { } + public Stage getPrimaryStage() { return primaryStage; } @@ -66,7 +73,7 @@ public void setCurrentProject(Project project, String path) { currentProjectPath = path; rootLayoutController.setProject(project); } - public Project getCurrentProject() { + public static Project getCurrentProject() { return currentProject; } public String getCurrentProjectPath() { return currentProjectPath; } @@ -81,31 +88,29 @@ public void restartApp() { setCurrentProject(getCurrentProject(), currentProjectPath); } - private void startAutoSave() { + public void startAutoSave() { if (currentProject != null) { + // Créez et démarrez un nouveau thread pour la sauvegarde automatique Thread autoSaveThread = new Thread(() -> { while (true) { try { - // Effectuez la sauvegarde automatique uniquement si le projet a été modifié - if (currentProject.isModified()) { - currentProject.saveAs("auto_save", getCurrentProjectPath()); - System.out.println(getCurrentProjectPath()); - appCommandFactory.saveProject().execute2(); + // Effectuez la sauvegarde automatique + currentProject.saveAs("auto_save", getCurrentProjectPath()); - // Marquez le projet comme non modifié après la sauvegarde - currentProject.setModified(false); - } + // Utilisez Platform.runLater() pour exécuter l'opération sur le thread de l'interface utilisateur + Platform.runLater(() -> appCommandFactory.saveProject().execute()); // Pause pour l'intervalle spécifié - Thread.sleep(2000); + Thread.sleep(autoSaveIntervalMillis); } catch (IOException | InterruptedException e) { e.printStackTrace(); // Gérer les exceptions si nécessaire } } }); - autoSaveThread.setDaemon(true); + autoSaveThread.setDaemon(true); // Le thread s'exécutera en arrière-plan et se terminera lorsque le programme principal se termine autoSaveThread.start(); } } + } \ No newline at end of file diff --git a/src/main/java/application/appCommands/CloseApplicationCommand.java b/src/main/java/application/appCommands/CloseApplicationCommand.java index cc959c3d..e50c0354 100644 --- a/src/main/java/application/appCommands/CloseApplicationCommand.java +++ b/src/main/java/application/appCommands/CloseApplicationCommand.java @@ -26,26 +26,7 @@ public CloseApplicationCommand(ApplicationCommandFactory appCommandFactory, UPMT @Override public Void execute() { - - System.out.println("Test checking project unsaved"); - //TODO check for unsaved work - boolean workUnsaved = false; - String currentTitle = upmtApp.getPrimaryStage().getTitle(); - UUID currentCommandId = HistoryManager.getCurrentCommandId(); - UUID lastSavedCommandId = upmtApp.getLastSavedCommandId(); - if(currentCommandId != null ){ - if(lastSavedCommandId == null){ - workUnsaved = true; - }else { - if (HistoryManager.getCurrentCommandId().equals(lastSavedCommandId)) { - System.out.println("Projet sauvegardé"); - } else { - workUnsaved = true; - } - } - } - System.out.println(upmtApp.getCurrentProjectPath()); - if(upmtApp.getCurrentProjectPath() == null) { + if (upmtApp.getCurrentProjectPath() == null) { Alert alert = new Alert(AlertType.CONFIRMATION); alert.setHeaderText(""); alert.setTitle(Configuration.langBundle.getString("alert_unsaved_project_title")); @@ -58,7 +39,7 @@ public Void execute() { alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeCancel); Optional result = alert.showAndWait(); - if (result.get() == buttonTypeOne){ + if (result.get() == buttonTypeOne) { // ... user chose "Save And Quit" appCommandFactory.saveProject().execute(); System.exit(0); @@ -69,6 +50,8 @@ public Void execute() { // ... user chose CANCEL or closed the dialog event.consume(); } + } else { + appCommandFactory.saveProject().execute(); } return null; } diff --git a/src/main/java/application/appCommands/SaveProjectCommand.java b/src/main/java/application/appCommands/SaveProjectCommand.java index 7c066724..7ab67e94 100644 --- a/src/main/java/application/appCommands/SaveProjectCommand.java +++ b/src/main/java/application/appCommands/SaveProjectCommand.java @@ -21,6 +21,8 @@ public Void execute() { ProjectSaver.save(upmtApp.getCurrentProject(), Configuration.getProjectsPath()[0]); upmtApp.setLastSavedCommandId(HistoryManager.getCurrentCommandId()); new ProjectSavingStatusChangedCommand(upmtApp).execute(); + System.out.println("Projet saved"); + } catch (Exception e) { ProjectDialogBox.projectSavingFailed(); e.printStackTrace(); @@ -31,24 +33,4 @@ public Void execute() { } return null; } - - public Void execute2() { - // Vérifiez s'il y a un projet en cours. - if (upmtApp.getCurrentProjectPath() != null) { - try { - System.out.println("ici"); - ProjectSaver.save(upmtApp.getCurrentProject(), Configuration.getProjectsPath()[0]); - //upmtApp.setLastSavedCommandId(HistoryManager.getCurrentCommandId()); - //new ProjectSavingStatusChangedCommand(upmtApp).execute(); - - - } catch (Exception e) { - ProjectDialogBox.projectSavingFailed(); - e.printStackTrace(); - } - } else { - new SaveProjectAsCommand(upmtApp).execute(); - } - return null; - } } diff --git a/src/main/java/models/ConcreteCategory.java b/src/main/java/models/ConcreteCategory.java index 952f7efe..4805552a 100644 --- a/src/main/java/models/ConcreteCategory.java +++ b/src/main/java/models/ConcreteCategory.java @@ -1,5 +1,6 @@ package models; +import application.UPMTApp; import components.modelisationSpace.category.controllers.ConcreteCategoryController; import components.modelisationSpace.property.appCommands.AddConcretePropertyCommand; import components.modelisationSpace.property.appCommands.RemoveConcretePropertyCommand; diff --git a/src/main/java/models/Project.java b/src/main/java/models/Project.java index 017d3d50..5333b7e3 100644 --- a/src/main/java/models/Project.java +++ b/src/main/java/models/Project.java @@ -20,7 +20,6 @@ public class Project implements Serializable { private ReadOnlyListWrapper readOnlyInterviews; private SimpleObjectProperty selectedInterview; - private boolean modified; public Project(String name, SchemaTreeRoot baseScheme) { this.name = new SimpleStringProperty(name); @@ -31,12 +30,8 @@ public Project(String name, SchemaTreeRoot baseScheme) { this.selectedInterview = new SimpleObjectProperty<>(); - this.modified = false; } - public void setModified(boolean modified) {this.modified = modified;} - public boolean isModified() {return modified;} - public String getName() { return this.name.get(); } public StringProperty nameProperty() { return this.name; } @@ -45,11 +40,9 @@ public Project(String name, SchemaTreeRoot baseScheme) { public void addInterview(Interview i) { interviews.add(i); - setModified(true); } public void removeInterview(Interview i) { interviews.remove(i); - setModified(true); } public ReadOnlyListWrapper interviewsProperty() { return readOnlyInterviews; } From aa0a8150b96080de9c709eec732154a74483f938 Mon Sep 17 00:00:00 2001 From: Baptiste Douxami Date: Mon, 4 Dec 2023 18:41:00 +0100 Subject: [PATCH 3/3] [FIX] Change auto_saving method --- src/main/java/application/UPMTApp.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/application/UPMTApp.java b/src/main/java/application/UPMTApp.java index fecaf658..54aa4c18 100644 --- a/src/main/java/application/UPMTApp.java +++ b/src/main/java/application/UPMTApp.java @@ -95,14 +95,14 @@ public void startAutoSave() { while (true) { try { // Effectuez la sauvegarde automatique - currentProject.saveAs("auto_save", getCurrentProjectPath()); + //currentProject.saveAs("auto_save", getCurrentProjectPath()); // Utilisez Platform.runLater() pour exécuter l'opération sur le thread de l'interface utilisateur Platform.runLater(() -> appCommandFactory.saveProject().execute()); // Pause pour l'intervalle spécifié Thread.sleep(autoSaveIntervalMillis); - } catch (IOException | InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); // Gérer les exceptions si nécessaire }