From 0e7c1d0e8e9dfd023639bd9383df33ff4dcb0475 Mon Sep 17 00:00:00 2001 From: DennisTurco Date: Wed, 25 Feb 2026 17:22:18 +0100 Subject: [PATCH] business logic separation from the ui --- .../Controllers/BackupProgressController.java | 9 - .../Controllers/EntryUserController.java | 20 ++ .../Controllers/TimePickerController.java | 56 ++++++ .../Dialogs/EntryUserDialog.java | 14 +- .../backupmanager/Dialogs/TimePicker.java | 44 +---- .../backupmanager/GUI/BackupManagerGUI.form | 2 +- .../backupmanager/GUI/BackupManagerGUI.java | 178 +++--------------- .../backupmanager/GUI/BackupProgressGUI.java | 10 +- .../Controllers/BackupManagerController.java | 166 ++++++++++++++++ .../Controllers/BackupProgressController.java | 22 +++ .../backupmanager/Helpers/BackupHelper.java | 16 +- .../backupmanager/Services/BackupService.java | 62 ++++++ 12 files changed, 373 insertions(+), 226 deletions(-) delete mode 100644 src/main/java/backupmanager/Controllers/BackupProgressController.java create mode 100644 src/main/java/backupmanager/Controllers/EntryUserController.java create mode 100644 src/main/java/backupmanager/Controllers/TimePickerController.java create mode 100644 src/main/java/backupmanager/GUI/Controllers/BackupManagerController.java create mode 100644 src/main/java/backupmanager/GUI/Controllers/BackupProgressController.java create mode 100644 src/main/java/backupmanager/Services/BackupService.java diff --git a/src/main/java/backupmanager/Controllers/BackupProgressController.java b/src/main/java/backupmanager/Controllers/BackupProgressController.java deleted file mode 100644 index fa4d3b09..00000000 --- a/src/main/java/backupmanager/Controllers/BackupProgressController.java +++ /dev/null @@ -1,9 +0,0 @@ -package backupmanager.Controllers; - -import backupmanager.Services.ZippingThread; - -public class BackupProgressController { - public void cancelBackup() { - ZippingThread.stopExecutorService(1); - } -} diff --git a/src/main/java/backupmanager/Controllers/EntryUserController.java b/src/main/java/backupmanager/Controllers/EntryUserController.java new file mode 100644 index 00000000..5e0ed2c5 --- /dev/null +++ b/src/main/java/backupmanager/Controllers/EntryUserController.java @@ -0,0 +1,20 @@ +package backupmanager.Controllers; + +import javax.swing.JOptionPane; + +import backupmanager.Email.EmailValidator; +import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; +import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; + +public class EntryUserController { + public boolean isInputOkAndShowErrorIfNecessary(javax.swing.JDialog dialog, String name, String surname, String email) { + if (name.isEmpty() || surname.isEmpty() || email.isEmpty()) { + JOptionPane.showMessageDialog(dialog, TranslationCategory.USER_DIALOG.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_MISSING_DATA), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); + return false; + } else if (!EmailValidator.isValidEmail(email)) { + JOptionPane.showMessageDialog(dialog, TranslationCategory.USER_DIALOG.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_WRONG_EMAIL), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); + return false; + } + return true; + } +} diff --git a/src/main/java/backupmanager/Controllers/TimePickerController.java b/src/main/java/backupmanager/Controllers/TimePickerController.java new file mode 100644 index 00000000..587c89cc --- /dev/null +++ b/src/main/java/backupmanager/Controllers/TimePickerController.java @@ -0,0 +1,56 @@ +package backupmanager.Controllers; + +import javax.swing.JOptionPane; + +import backupmanager.Entities.TimeInterval; +import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; +import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; + +public class TimePickerController { + + private TimeInterval timeInterval; + private boolean closeOk; + + public TimePickerController(TimeInterval timeInterval, boolean closeOk) { + this.timeInterval = timeInterval; + this.closeOk = closeOk; + } + + public void handleOkButton(javax.swing.JDialog dialog, int days, int hours, int minutes) { + if (isLongTimeCorrect(days, hours, minutes)) { + if (isShortTimeCorrect(days, hours) && !showWarningMessageForShortTimeAndGetIfItOkayResponse(dialog)) + return; + + timeInterval = new TimeInterval(days, hours, minutes); + closeOk = true; + dialog.dispose(); + } + else + showErrorMessageForLongTime(dialog); + } + + public TimeInterval getTimeInterval() { + if (closeOk) return timeInterval; + return null; + } + public void setCloseOk(boolean closeOk) { this.closeOk = closeOk; } + + + private boolean isLongTimeCorrect(int days, int hours, int minutes) { + return days >= 0 && hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59 && + (days != 0 || hours != 0 || minutes != 0); + } + + private boolean isShortTimeCorrect(int days, int hours) { + return days == 0 && hours == 0; + } + + private void showErrorMessageForLongTime(javax.swing.JDialog dialog) { + JOptionPane.showMessageDialog(dialog, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_WRONG_TIME_INTERVAL), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); + } + + private boolean showWarningMessageForShortTimeAndGetIfItOkayResponse(javax.swing.JDialog dialog) { + int response = JOptionPane.showConfirmDialog(dialog, TranslationCategory.DIALOGS.getTranslation(TranslationKey.WARNING_SHORT_TIME_INTERVAL_MESSAGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.WARNING_GENERIC_TITLE), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); + return response == JOptionPane.YES_OPTION; + } +} diff --git a/src/main/java/backupmanager/Dialogs/EntryUserDialog.java b/src/main/java/backupmanager/Dialogs/EntryUserDialog.java index 3c6edcb7..c8e1d78e 100644 --- a/src/main/java/backupmanager/Dialogs/EntryUserDialog.java +++ b/src/main/java/backupmanager/Dialogs/EntryUserDialog.java @@ -1,9 +1,8 @@ package backupmanager.Dialogs; -import javax.swing.JOptionPane; import backupmanager.LimitDocument; -import backupmanager.Email.EmailValidator; +import backupmanager.Controllers.EntryUserController; import backupmanager.Entities.User; import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; @@ -11,9 +10,13 @@ public class EntryUserDialog extends javax.swing.JDialog { private User user; + private final EntryUserController userController; public EntryUserDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); + + userController = new EntryUserController(); + initComponents(); nameTextField.setDocument(new LimitDocument(20)); @@ -142,13 +145,8 @@ private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:e String surname = surnameTextField.getText(); String email = emailTextField.getText(); - if (name.isEmpty() || surname.isEmpty() || email.isEmpty()) { - JOptionPane.showMessageDialog(this, TranslationCategory.USER_DIALOG.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_MISSING_DATA), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); + if (!userController.isInputOkAndShowErrorIfNecessary(this, name, surname, email)) return; - } else if (!EmailValidator.isValidEmail(email)) { - JOptionPane.showMessageDialog(this, TranslationCategory.USER_DIALOG.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_WRONG_EMAIL), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); - return; - } user = new User(name, surname, email); diff --git a/src/main/java/backupmanager/Dialogs/TimePicker.java b/src/main/java/backupmanager/Dialogs/TimePicker.java index bae9f9ef..7d13612a 100644 --- a/src/main/java/backupmanager/Dialogs/TimePicker.java +++ b/src/main/java/backupmanager/Dialogs/TimePicker.java @@ -5,21 +5,19 @@ import backupmanager.Controllers.GuiController; import backupmanager.Entities.TimeInterval; -import javax.swing.JOptionPane; +import backupmanager.Controllers.TimePickerController; public class TimePicker extends javax.swing.JDialog { - private TimeInterval timeInterval; - private boolean closeOk; + private final TimePickerController timePickerController; public TimePicker(java.awt.Dialog parent, TimeInterval timeInterval, boolean modal) { super(parent, modal); - closeOk = false; + timePickerController = new TimePickerController(timeInterval, false); initComponents(); - this.timeInterval = timeInterval; if (timeInterval != null) { daysSpinner.setValue(timeInterval.days()); hoursSpinner.setValue(timeInterval.hours()); @@ -32,8 +30,7 @@ public TimePicker(java.awt.Dialog parent, TimeInterval timeInterval, boolean mod } public TimeInterval getTimeInterval() { - if (closeOk) return timeInterval; - return null; + return timePickerController.getTimeInterval(); } private void daysIntervalSpinnerChange() { @@ -64,19 +61,6 @@ private void minutesIntervalSpinnerChange() { } } - private boolean checkInputCorrectness() { - Integer days = (Integer) daysSpinner.getValue(); - Integer hours = (Integer) hoursSpinner.getValue(); - Integer minutes = (Integer) minutesSpinner.getValue(); - return (days != null && days >= 0 && hours != null && hours >= 0 && hours <= 23 && minutes != null && minutes >= 0 && minutes <= 59 && (days != 0 || hours != 0 || minutes != 0)); - } - - private boolean checkShortTimeInterval() { - Integer days = (Integer) daysSpinner.getValue(); - Integer hours = (Integer) hoursSpinner.getValue(); - return (days == 0 && hours == 0); - } - private void mouseWeel(java.awt.event.MouseWheelEvent evt) { javax.swing.JSpinner spinner = (javax.swing.JSpinner) evt.getSource(); int rotation = evt.getWheelRotation(); @@ -247,27 +231,11 @@ private void minutesSpinnerMouseWheelMoved(java.awt.event.MouseWheelEvent evt) { }//GEN-LAST:event_minutesSpinnerMouseWheelMoved private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed - if (checkInputCorrectness()) { - - if (checkShortTimeInterval()) { - // check for small time interval setted - int response = JOptionPane.showConfirmDialog(this, TranslationCategory.DIALOGS.getTranslation(TranslationKey.WARNING_SHORT_TIME_INTERVAL_MESSAGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.WARNING_GENERIC_TITLE), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); - if (response != JOptionPane.YES_OPTION) { - return; - } - } - - timeInterval = new TimeInterval((int)daysSpinner.getValue(), (int)hoursSpinner.getValue(), (int)minutesSpinner.getValue()); - closeOk = true; - this.dispose(); - } - else { - JOptionPane.showMessageDialog(this, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_WRONG_TIME_INTERVAL), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); - } + timePickerController.handleOkButton(this, (Integer) daysSpinner.getValue(), (Integer) hoursSpinner.getValue(), (Integer) minutesSpinner.getValue()); }//GEN-LAST:event_btnOkActionPerformed private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed - closeOk = false; + timePickerController.setCloseOk(false); this.dispose(); }//GEN-LAST:event_jButton2ActionPerformed diff --git a/src/main/java/backupmanager/GUI/BackupManagerGUI.form b/src/main/java/backupmanager/GUI/BackupManagerGUI.form index 0126731a..45880cec 100644 --- a/src/main/java/backupmanager/GUI/BackupManagerGUI.form +++ b/src/main/java/backupmanager/GUI/BackupManagerGUI.form @@ -464,7 +464,7 @@ - + diff --git a/src/main/java/backupmanager/GUI/BackupManagerGUI.java b/src/main/java/backupmanager/GUI/BackupManagerGUI.java index 91fb32b1..a2cdc721 100644 --- a/src/main/java/backupmanager/GUI/BackupManagerGUI.java +++ b/src/main/java/backupmanager/GUI/BackupManagerGUI.java @@ -1,14 +1,11 @@ package backupmanager.GUI; -import java.awt.Dimension; -import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Locale; import javax.swing.AbstractAction; import javax.swing.ActionMap; @@ -27,17 +24,14 @@ import com.formdev.flatlaf.FlatClientProperties; import backupmanager.Controllers.GuiController; -import backupmanager.Dialogs.EntryUserDialog; -import backupmanager.Email.EmailSender; import backupmanager.Entities.ConfigurationBackup; import backupmanager.Entities.Confingurations; -import backupmanager.Entities.User; import backupmanager.Enums.ConfigKey; -import backupmanager.Enums.LanguagesEnum; import backupmanager.Enums.MenuItems; import backupmanager.Enums.TranslationLoaderEnum; import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; +import backupmanager.GUI.Controllers.BackupManagerController; import backupmanager.GUI.Controllers.BackupMenuController; import backupmanager.GUI.Controllers.BackupPopupController; import backupmanager.Helpers.BackupHelper; @@ -48,22 +42,18 @@ import backupmanager.Managers.ExportManager; import backupmanager.Managers.ThemeManager; import backupmanager.Services.BackupObserver; -import backupmanager.Services.RunningBackupService; +import backupmanager.Services.BackupService; import backupmanager.Table.BackupTable; import backupmanager.Table.BackupTableModel; import backupmanager.Table.CheckboxCellRenderer; import backupmanager.Table.StripedRowRenderer; -import backupmanager.Table.TableDataManager; import backupmanager.Widgets.SideMenuPanel; import backupmanager.database.Repositories.BackupConfigurationRepository; -import backupmanager.database.Repositories.UserRepository; -/** - * @author Dennis Turco - */ public final class BackupManagerGUI extends javax.swing.JFrame { private static final Logger logger = LoggerFactory.getLogger(BackupManagerGUI.class); + private final BackupManagerController backupManagerController; private final BackupObserver observer; public static List backups; public static DefaultTableModel model; @@ -78,6 +68,8 @@ public BackupManagerGUI() { initComponents(); + backupManagerController = new BackupManagerController(new BackupService()); + sp = new SideMenuPanel(this); this.setIconImage(GuiController.getIcon(this.getClass())); @@ -95,7 +87,7 @@ public BackupManagerGUI() { interruptBackupPopupItem.setEnabled(false); setSvgImages(); - checkForFirstAccess(); + backupManagerController.checkForFirstAccess(this); jSeparator5.setVisible(false); // TODO: remove this @@ -104,41 +96,6 @@ public BackupManagerGUI() { initSidebar(); } - private void checkForFirstAccess() { - logger.debug("Checking for first access"); - User user = UserRepository.getLastUser(); - - if (user == null) { // first access - setLanguageBasedOnPcLanguage(); - createNewUser(); - } else { - logger.info("Current user: " + user.toString()); - } - } - - private void createNewUser() { - User newUser = null; - - while (newUser == null) { - newUser = openUserDialogAndObtainTheResult(); - } - - UserRepository.insertUser(newUser); - - sendRegistrationEmail(newUser); - } - - private User openUserDialogAndObtainTheResult() { - EntryUserDialog userDialog = new EntryUserDialog(this, true); - userDialog.setVisible(true); - return userDialog.getUser(); - } - - private void sendRegistrationEmail(User user) { - EmailSender.sendUserCreationEmail(user); - EmailSender.sendConfirmEmailToUser(user); - } - private void initSidebar() { sp.setMain(null); sp.setMinWidth(55); @@ -148,24 +105,6 @@ private void initSidebar() { sp.setResponsiveMinWidth(1300); } - private void setLanguageBasedOnPcLanguage() { - Locale defaultLocale = Locale.getDefault(); - String language = defaultLocale.getLanguage(); - - logger.info("Setting default language to: " + language); - - switch (language) { - case "en" -> Confingurations.setLanguage(LanguagesEnum.ENG); - case "it" -> Confingurations.setLanguage(LanguagesEnum.ITA); - case "es" -> Confingurations.setLanguage(LanguagesEnum.ESP); - case "de" -> Confingurations.setLanguage(LanguagesEnum.DEU); - case "fr" -> Confingurations.setLanguage(LanguagesEnum.FRA); - default -> Confingurations.setLanguage(LanguagesEnum.ENG); - } - - reloadPreferences(); - } - public void showWindow() { setVisible(true); toFront(); @@ -173,11 +112,8 @@ public void showWindow() { } private void setScreenSize() { - Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); - int width = Math.min((int) size.getWidth(), Integer.parseInt(ConfigKey.GUI_WIDTH.getValue())); - int height = Math.min((int) size.getHeight(), Integer.parseInt(ConfigKey.GUI_HEIGHT.getValue())); - - this.setSize(width,height); + int[] screenSize = backupManagerController.getScreenSize(); + this.setSize(screenSize[0], screenSize[1]); } public void reloadPreferences() { @@ -228,13 +164,7 @@ private void displayBackupList() { actionMap.put("enterKey", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - int selectedRow = backupTable.getSelectedRow(); - if (selectedRow == -1) return; - - logger.debug("Enter key pressed on row: " + selectedRow); - BackupHelper.openBackupByName((String) backupTable.getValueAt(selectedRow, 0), main); - - BackupHelper.openBackupEntryDialog(main); + backupManagerController.handleEnterKeyPressOnTable(main, backupTable); } }); @@ -243,19 +173,7 @@ public void actionPerformed(ActionEvent e) { actionMap.put("deleteKey", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - int[] selectedRows = backupTable.getSelectedRows(); - if (selectedRows.length == 0) return; - - logger.debug("Delete key pressed on rows: " + Arrays.toString(selectedRows)); - - int response = JOptionPane.showConfirmDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.CONFIRMATION_DELETION_MESSAGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.CONFIRMATION_DELETION_TITLE), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - if (response != JOptionPane.YES_OPTION) { - return; - } - - for (int row : selectedRows) { - BackupHelper.deleteBackup(row, backupTable, false); - } + backupManagerController.handleDeleteKeyPressOnTable(backupTable); } }); @@ -288,25 +206,6 @@ public void mouseClicked(java.awt.event.MouseEvent evt) { scrollPane.setViewportView(table); // Replace the table in the scroll pane } - private void researchInTable() { - List tempBackups = new ArrayList<>(); - - String research = researchField.getText(); - - for (ConfigurationBackup backup : backups) { - if (backup.getName().contains(research) || - backup.getTargetPath().contains(research) || - backup.getDestinationPath().contains(research) || - (backup.getLastBackupDate() != null && backup.getLastBackupDate().toString().contains(research)) || - (backup.getNextBackupDate() != null && backup.getNextBackupDate().toString().contains(research)) || - (backup.getTimeIntervalBackup() != null && backup.getTimeIntervalBackup().toString().contains(research))) { - tempBackups.add(backup); - } - } - - TableDataManager.updateTableWithNewBackupList(tempBackups, formatter); - } - /** * This method is called from within the constructor to initialize the form. * @@ -536,8 +435,8 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { researchField.setToolTipText("Research bar"); researchField.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyTyped(java.awt.event.KeyEvent evt) { - researchFieldKeyTyped(evt); + public void keyReleased(java.awt.event.KeyEvent evt) { + researchFieldKeyReleased(evt); } }); @@ -998,10 +897,6 @@ private void DeletePopupItemActionPerformed(java.awt.event.ActionEvent evt) {//G BackupPopupController.popupItemDelete(selectedRow, backupTable); }//GEN-LAST:event_DeletePopupItemActionPerformed - private void researchFieldKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_researchFieldKeyTyped - researchInTable(); - }//GEN-LAST:event_researchFieldKeyTyped - private void tableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableMouseClicked selectedRow = table.rowAtPoint(evt.getPoint()); // get index of the row @@ -1009,20 +904,16 @@ private void tableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event table.clearSelection(); // deselect any selected row detailsLabel.setText(""); // clear the label } else { - // get correct backup String backupName = (String) backupTable.getValueAt(selectedRow, 0); - ConfigurationBackup backup = ConfigurationBackup.getBackupByName(backups, backupName); - logger.debug("Selected backup: " + backupName); - // Handling right mouse button click if (SwingUtilities.isRightMouseButton(evt)) { - logger.info("Right click on row: " + selectedRow); - AutoBackupMenuItem.setSelected(backup.isAutomatic()); + logger.debug("Right click on row: " + selectedRow); + AutoBackupMenuItem.setSelected(backupManagerController.isAutomaticBackup(backupName)); table.setRowSelectionInterval(selectedRow, selectedRow); // select clicked row - TablePopup.show(evt.getComponent(), evt.getX(), evt.getY()); // show popup + TablePopup.show(evt.getComponent(), evt.getX(), evt.getY()); - boolean isRunning = RunningBackupService.getRunningBackupByName(backupName).isPresent(); + boolean isRunning = backupManagerController.isBackupRunning(backupName); DeletePopupItem.setEnabled(!isRunning); interruptBackupPopupItem.setEnabled(isRunning); @@ -1030,38 +921,12 @@ private void tableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event // Handling left mouse button double-click else if (SwingUtilities.isLeftMouseButton(evt) && evt.getClickCount() == 2) { - logger.info("Double-click on row: " + selectedRow); - BackupHelper.openBackupByName(backupName, this); + backupManagerController.openBackup(backupName, this); } - // Handling single left mouse button click else if (SwingUtilities.isLeftMouseButton(evt)) { - String backupNameStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.BACKUP_NAME_DETAIL); - String initialPathStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.INITIAL_PATH_DETAIL); - String destinationPathStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.DESTINATION_PATH_DETAIL); - String lastBackupStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.LAST_BACKUP_DETAIL); - String nextBackupStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.NEXT_BACKUP_DATE_DETAIL); - String timeIntervalBackupStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.TIME_INTERVAL_DETAIL); - String creationDateStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.CREATION_DATE_DETAIL); - String lastUpdateDateStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.LAST_UPDATE_DATE_DETAIL); - String backupCountStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.BACKUP_COUNT_DETAIL); - String notesStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.NOTES_DETAIL); - String maxBackupsToKeepStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.MAX_BACKUPS_TO_KEEP_DETAIL); - - detailsLabel.setText( - "" + backupNameStr + ": " + backup.getName() + ", " + - "" + initialPathStr + ": " + backup.getTargetPath() + ", " + - "" + destinationPathStr + ": " + backup.getDestinationPath() + ", " + - "" + lastBackupStr + ": " + (backup.getLastBackupDate() != null ? backup.getLastBackupDate().format(formatter) : "") + ", " + - "" + nextBackupStr + ": " + (backup.getNextBackupDate() != null ? backup.getNextBackupDate().format(formatter) : "_") + ", " + - "" + timeIntervalBackupStr + ": " + (backup.getTimeIntervalBackup() != null ? backup.getTimeIntervalBackup().toString() : "_") + ", " + - "" + creationDateStr + ": " + (backup.getCreationDate() != null ? backup.getCreationDate().format(formatter) : "_") + ", " + - "" + lastUpdateDateStr + ": " + (backup.getLastUpdateDate() != null ? backup.getLastUpdateDate().format(formatter) : "_") + ", " + - "" + backupCountStr + ": " + (backup.getCount()) + ", " + - "" + maxBackupsToKeepStr + ": " + (backup.getMaxToKeep()) + ", " + - "" + notesStr + ": " + (backup.getNotes()) + - "" - ); + String details = backupManagerController.getBackupDetails(backupName); + detailsLabel.setText(details); } } }//GEN-LAST:event_tableMouseClicked @@ -1150,6 +1015,11 @@ private void MenuBuyMeACoffeDonateActionPerformed(java.awt.event.ActionEvent evt BackupMenuController.menuItemDonateViaBuymeacoffe(); }//GEN-LAST:event_MenuBuyMeACoffeDonateActionPerformed + private void researchFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_researchFieldKeyReleased + String research = researchField.getText(); + backupManagerController.researchInTable(research); + }//GEN-LAST:event_researchFieldKeyReleased + private void setTranslations() { // update table translations if (backups != null) diff --git a/src/main/java/backupmanager/GUI/BackupProgressGUI.java b/src/main/java/backupmanager/GUI/BackupProgressGUI.java index fa52a31a..06840476 100644 --- a/src/main/java/backupmanager/GUI/BackupProgressGUI.java +++ b/src/main/java/backupmanager/GUI/BackupProgressGUI.java @@ -1,11 +1,9 @@ package backupmanager.GUI; -import javax.swing.JOptionPane; - -import backupmanager.Controllers.BackupProgressController; import backupmanager.Controllers.GuiController; import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; +import backupmanager.GUI.Controllers.BackupProgressController; public class BackupProgressGUI extends javax.swing.JDialog { @@ -153,11 +151,7 @@ private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F }//GEN-LAST:event_closeButtonActionPerformed private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed - int response = JOptionPane.showConfirmDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.INTERRUPT_BACKUP_PROCESS_MESSAGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.CONFIRMATION_REQUIRED_TITLE), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - if (response == JOptionPane.YES_OPTION) { - progressController.cancelBackup(); - this.dispose(); - } + progressController.handleCancelButtonRequest(this); }//GEN-LAST:event_CancelButtonActionPerformed private void setTranslations() { diff --git a/src/main/java/backupmanager/GUI/Controllers/BackupManagerController.java b/src/main/java/backupmanager/GUI/Controllers/BackupManagerController.java new file mode 100644 index 00000000..412014b0 --- /dev/null +++ b/src/main/java/backupmanager/GUI/Controllers/BackupManagerController.java @@ -0,0 +1,166 @@ +package backupmanager.GUI.Controllers; + +import java.awt.Dimension; +import java.awt.Toolkit; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import javax.swing.JOptionPane; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import backupmanager.Dialogs.EntryUserDialog; +import backupmanager.Email.EmailSender; +import backupmanager.Entities.ConfigurationBackup; +import backupmanager.Entities.Confingurations; +import backupmanager.Entities.User; +import backupmanager.Enums.ConfigKey; +import backupmanager.Enums.LanguagesEnum; +import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; +import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; +import backupmanager.GUI.BackupManagerGUI; +import static backupmanager.GUI.BackupManagerGUI.backups; +import backupmanager.Helpers.BackupHelper; +import static backupmanager.Helpers.BackupHelper.formatter; +import backupmanager.Services.BackupService; +import backupmanager.Table.BackupTable; +import backupmanager.Table.TableDataManager; +import backupmanager.database.Repositories.UserRepository; + +public class BackupManagerController { + + private static final Logger logger = LoggerFactory.getLogger(BackupManagerGUI.class); + private final BackupService backupService; + + public BackupManagerController(BackupService backupService) { + this.backupService = backupService; + } + + public void checkForFirstAccess(BackupManagerGUI mainGui) { + logger.debug("Checking for first access"); + User user = UserRepository.getLastUser(); + + if (user == null) { + setLanguageBasedOnPcLanguage(mainGui); + createNewUser(mainGui); + } else { + logger.info("Current user: " + user.toString()); + } + } + + public int[] getScreenSize() { + Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); + int width = Math.min((int) size.getWidth(), Integer.parseInt(ConfigKey.GUI_WIDTH.getValue())); + int height = Math.min((int) size.getHeight(), Integer.parseInt(ConfigKey.GUI_HEIGHT.getValue())); + return new int[]{width, height}; + } + + public void researchInTable(String research) { + List tempBackups = new ArrayList<>(); + research = research.toLowerCase(); + + for (ConfigurationBackup backup : backups) { + if (backup.getName().toLowerCase().contains(research) || + backup.getTargetPath().toLowerCase().contains(research) || + backup.getDestinationPath().toLowerCase().contains(research) || + (backup.getLastBackupDate() != null && backup.getLastBackupDate().toString().toLowerCase().contains(research)) || + (backup.getNextBackupDate() != null && backup.getNextBackupDate().toString().toLowerCase().contains(research)) || + (backup.getTimeIntervalBackup() != null && backup.getTimeIntervalBackup().toString().toLowerCase().contains(research))) { + tempBackups.add(backup); + } + } + + TableDataManager.updateTableWithNewBackupList(tempBackups, formatter); + } + + public String getBackupDetails(String backupName) { + return backupService.getBackupDetails(backupName); + } + + public void deleteBackups(List names) { + backupService.deleteBackups(names); + } + + public boolean isBackupRunning(String name) { + return backupService.isRunning(name); + } + + public boolean isAutomaticBackup(String backupName) { + ConfigurationBackup backup = ConfigurationBackup.getBackupByName(backups, backupName); + return backup != null && backup.isAutomatic(); + } + + public void openBackup(String name, java.awt.Frame frame) { + logger.info("Double-click on row: " + name); + BackupHelper.openBackupByName(name, frame); + } + + public void handleEnterKeyPressOnTable(java.awt.Frame frame, BackupTable backupTable) { + int selectedRow = backupTable.getSelectedRow(); + if (selectedRow == -1) return; + + logger.debug("Enter key pressed on row: " + selectedRow); + BackupHelper.openBackupByName((String) backupTable.getValueAt(selectedRow, 0), frame); + + BackupHelper.openBackupEntryDialog(frame); + } + + public void handleDeleteKeyPressOnTable(BackupTable backupTable) { + int[] selectedRows = backupTable.getSelectedRows(); + if (selectedRows.length == 0) + return; + + logger.debug("Delete key pressed on rows: " + Arrays.toString(selectedRows)); + + int response = JOptionPane.showConfirmDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.CONFIRMATION_DELETION_MESSAGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.CONFIRMATION_DELETION_TITLE), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (response != JOptionPane.YES_OPTION) + return; + + for (int row : selectedRows) + BackupHelper.deleteBackup(row, backupTable, false); + } + + private void createNewUser(BackupManagerGUI mainGui) { + User newUser = null; + + while (newUser == null) { + newUser = openUserDialogAndObtainTheResult(mainGui); + } + + UserRepository.insertUser(newUser); + + sendRegistrationEmail(newUser); + } + + private void setLanguageBasedOnPcLanguage(BackupManagerGUI mainGui) { + Locale defaultLocale = Locale.getDefault(); + String language = defaultLocale.getLanguage(); + + logger.info("Setting default language to: " + language); + + switch (language) { + case "en" -> Confingurations.setLanguage(LanguagesEnum.ENG); + case "it" -> Confingurations.setLanguage(LanguagesEnum.ITA); + case "es" -> Confingurations.setLanguage(LanguagesEnum.ESP); + case "de" -> Confingurations.setLanguage(LanguagesEnum.DEU); + case "fr" -> Confingurations.setLanguage(LanguagesEnum.FRA); + default -> Confingurations.setLanguage(LanguagesEnum.ENG); + } + + mainGui.reloadPreferences(); + } + + private User openUserDialogAndObtainTheResult(BackupManagerGUI mainGui) { + EntryUserDialog userDialog = new EntryUserDialog(mainGui, true); + userDialog.setVisible(true); + return userDialog.getUser(); + } + + private void sendRegistrationEmail(User user) { + EmailSender.sendUserCreationEmail(user); + EmailSender.sendConfirmEmailToUser(user); + } +} diff --git a/src/main/java/backupmanager/GUI/Controllers/BackupProgressController.java b/src/main/java/backupmanager/GUI/Controllers/BackupProgressController.java new file mode 100644 index 00000000..70562398 --- /dev/null +++ b/src/main/java/backupmanager/GUI/Controllers/BackupProgressController.java @@ -0,0 +1,22 @@ +package backupmanager.GUI.Controllers; + +import javax.swing.JOptionPane; + +import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; +import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; +import backupmanager.Services.ZippingThread; + +public class BackupProgressController { + + public void handleCancelButtonRequest(javax.swing.JDialog dialog) { + int response = JOptionPane.showConfirmDialog(dialog, TranslationCategory.DIALOGS.getTranslation(TranslationKey.INTERRUPT_BACKUP_PROCESS_MESSAGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.CONFIRMATION_REQUIRED_TITLE), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (response == JOptionPane.YES_OPTION) { + cancelBackup(); + dialog.dispose(); + } + } + + private void cancelBackup() { + ZippingThread.stopExecutorService(1); + } +} diff --git a/src/main/java/backupmanager/Helpers/BackupHelper.java b/src/main/java/backupmanager/Helpers/BackupHelper.java index 9a61b449..3e5280e7 100644 --- a/src/main/java/backupmanager/Helpers/BackupHelper.java +++ b/src/main/java/backupmanager/Helpers/BackupHelper.java @@ -30,19 +30,19 @@ public class BackupHelper { public static final DateTimeFormatter dateForfolderNameFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy'T'HH-mm-ss"); public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"); - public static void openBackupById(int id, BackupManagerGUI main) { + public static void openBackupById(int id, java.awt.Frame frame) { logger.info("Event --> opening backup"); ConfigurationBackup backup = BackupConfigurationRepository.getBackupById(id); - BackupEntryDialog dialog = new BackupEntryDialog(main, false, backup); + BackupEntryDialog dialog = new BackupEntryDialog(frame, false, backup); dialog.setVisible(true); } - public static void newBackup(BackupProgressGUI progressBar, BackupManagerGUI main) { + public static void newBackup(BackupProgressGUI progressBar, java.awt.Frame frame) { logger.info("Event --> new backup"); - BackupEntryDialog dialog = new BackupEntryDialog(main, false); + BackupEntryDialog dialog = new BackupEntryDialog(frame, false); dialog.setVisible(true); } @@ -104,17 +104,17 @@ public static void showMessageActivationAutoBackup(TimeInterval timeInterval, St "AutoBackup", 1); } - public static void openBackupByName(String backupName, BackupManagerGUI main) { + public static void openBackupByName(String backupName, java.awt.Frame frame) { logger.info("Event --> opening backup"); ConfigurationBackup backup = BackupConfigurationRepository.getBackupByName(backupName); - BackupEntryDialog dialog = new BackupEntryDialog(main, false, backup); + BackupEntryDialog dialog = new BackupEntryDialog(frame, false, backup); dialog.setVisible(true); } - public static void openBackupEntryDialog(BackupManagerGUI main) { - BackupEntryDialog dialog = new BackupEntryDialog(main, false); + public static void openBackupEntryDialog(java.awt.Frame frame) { + BackupEntryDialog dialog = new BackupEntryDialog(frame, false); dialog.setVisible(true); } diff --git a/src/main/java/backupmanager/Services/BackupService.java b/src/main/java/backupmanager/Services/BackupService.java new file mode 100644 index 00000000..4a446caa --- /dev/null +++ b/src/main/java/backupmanager/Services/BackupService.java @@ -0,0 +1,62 @@ +package backupmanager.Services; + +import java.util.List; + +import backupmanager.Entities.ConfigurationBackup; +import backupmanager.Enums.TranslationLoaderEnum.TranslationCategory; +import backupmanager.Enums.TranslationLoaderEnum.TranslationKey; +import static backupmanager.Helpers.BackupHelper.formatter; +import backupmanager.database.Repositories.BackupConfigurationRepository; + +public class BackupService { + public List getAllBackups() { + return BackupConfigurationRepository.getBackupList(); + } + + public boolean isRunning(String name) { + return RunningBackupService.getRunningBackupByName(name).isPresent(); + } + + public void deleteBackups(List names) { + names.forEach(name -> { + ConfigurationBackup backup = BackupConfigurationRepository.getBackupByName(name); + if (backup != null) { + BackupConfigurationRepository.deleteBackup(backup.getId()); + } + }); + } + + public String getBackupDetails(String name) { + ConfigurationBackup backup = BackupConfigurationRepository.getBackupByName(name); + return buildDetails(backup); + } + + private String buildDetails(ConfigurationBackup backup) { + String backupNameStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.BACKUP_NAME_DETAIL); + String initialPathStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.INITIAL_PATH_DETAIL); + String destinationPathStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.DESTINATION_PATH_DETAIL); + String lastBackupStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.LAST_BACKUP_DETAIL); + String nextBackupStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.NEXT_BACKUP_DATE_DETAIL); + String timeIntervalBackupStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.TIME_INTERVAL_DETAIL); + String creationDateStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.CREATION_DATE_DETAIL); + String lastUpdateDateStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.LAST_UPDATE_DATE_DETAIL); + String backupCountStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.BACKUP_COUNT_DETAIL); + String notesStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.NOTES_DETAIL); + String maxBackupsToKeepStr = TranslationCategory.BACKUP_LIST.getTranslation(TranslationKey.MAX_BACKUPS_TO_KEEP_DETAIL); + + return ( + "" + backupNameStr + ": " + backup.getName() + ", " + + "" + initialPathStr + ": " + backup.getTargetPath() + ", " + + "" + destinationPathStr + ": " + backup.getDestinationPath() + ", " + + "" + lastBackupStr + ": " + (backup.getLastBackupDate() != null ? backup.getLastBackupDate().format(formatter) : "") + ", " + + "" + nextBackupStr + ": " + (backup.getNextBackupDate() != null ? backup.getNextBackupDate().format(formatter) : "_") + ", " + + "" + timeIntervalBackupStr + ": " + (backup.getTimeIntervalBackup() != null ? backup.getTimeIntervalBackup().toString() : "_") + ", " + + "" + creationDateStr + ": " + (backup.getCreationDate() != null ? backup.getCreationDate().format(formatter) : "_") + ", " + + "" + lastUpdateDateStr + ": " + (backup.getLastUpdateDate() != null ? backup.getLastUpdateDate().format(formatter) : "_") + ", " + + "" + backupCountStr + ": " + (backup.getCount()) + ", " + + "" + maxBackupsToKeepStr + ": " + (backup.getMaxToKeep()) + ", " + + "" + notesStr + ": " + (backup.getNotes()) + + "" + ); + } +}