From b572beb151db60620ab13305c6c9dda78aaf2ae5 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 30 Jan 2021 15:36:00 +0100
Subject: [PATCH] #562 - extended backup state by a third state "unknown":

- shown if no backup has run before
- adapt localization
---
 .../budgetmaster/backup/BackupService.java        |  8 ++++----
 .../budgetmaster/backup/BackupStatus.java         |  8 ++++++++
 .../budgetmaster/backup/BackupTask.java           | 12 ++++++------
 .../budgetmaster/backup/GitBackupTask.java        |  2 +-
 .../budgetmaster/backup/LocalBackupTask.java      |  1 +
 .../budgetmaster/backup/LocalGitBackupTask.java   |  4 ++--
 .../budgetmaster/backup/RemoteGitBackupTask.java  |  4 ++--
 .../budgetmaster/settings/SettingsController.java |  2 +-
 src/main/resources/languages/base_de.properties   |  9 +++++----
 src/main/resources/languages/base_en.properties   |  9 +++++----
 .../templates/settings/settingsMacros.ftl         | 15 +++++++++------
 11 files changed, 44 insertions(+), 30 deletions(-)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/backup/BackupStatus.java

diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/BackupService.java b/src/main/java/de/deadlocker8/budgetmaster/backup/BackupService.java
index 6531bdcfc..263abe222 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/BackupService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/BackupService.java
@@ -95,19 +95,19 @@ public class BackupService
 		return Optional.empty();
 	}
 
-	public boolean hasErrors()
+	public BackupStatus getBackupStatus()
 	{
 		final Settings settings = settingsService.getSettings();
 		if(settings.isAutoBackupActive())
 		{
 			if(backupTask == null)
 			{
-				return false;
+				return BackupStatus.UNKNOWN;
 			}
 
-			return backupTask.hasErrors();
+			return backupTask.getBackupStatus();
 		}
 
-		return false;
+		return BackupStatus.UNKNOWN;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/BackupStatus.java b/src/main/java/de/deadlocker8/budgetmaster/backup/BackupStatus.java
new file mode 100644
index 000000000..63ce3a4a2
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/BackupStatus.java
@@ -0,0 +1,8 @@
+package de.deadlocker8.budgetmaster.backup;
+
+public enum BackupStatus
+{
+	UNKNOWN,
+	OK,
+	ERROR
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/BackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/BackupTask.java
index 5714bed5b..6fbcd15de 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/BackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/BackupTask.java
@@ -14,7 +14,7 @@ public abstract class BackupTask implements Runnable
 	protected final DatabaseService databaseService;
 	protected final SettingsService settingsService;
 	private final Path backupFolder;
-	private boolean hasErrors;
+	private BackupStatus backupStatus;
 
 	protected BackupTask(DatabaseService databaseService, SettingsService settingsService)
 	{
@@ -24,7 +24,7 @@ public abstract class BackupTask implements Runnable
 		final Path applicationSupportFolder = Main.getApplicationSupportFolder();
 		this.backupFolder = applicationSupportFolder.resolve("backups");
 
-		this.hasErrors = false;
+		this.backupStatus = BackupStatus.UNKNOWN;
 	}
 
 	protected Path getBackupFolder()
@@ -32,14 +32,14 @@ public abstract class BackupTask implements Runnable
 		return backupFolder;
 	}
 
-	public boolean hasErrors()
+	public BackupStatus getBackupStatus()
 	{
-		return hasErrors;
+		return backupStatus;
 	}
 
-	protected void setHasErrors(boolean hasErrors)
+	public void setBackupStatus(BackupStatus backupStatus)
 	{
-		this.hasErrors = hasErrors;
+		this.backupStatus = backupStatus;
 	}
 
 	public abstract void cleanup(Settings previousSettings, Settings newSettings);
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java
index 429c49ea5..9b67f427d 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java
@@ -44,7 +44,7 @@ public abstract class GitBackupTask extends BackupTask
 		// check if database file is successfully added
 		if(!GitHelper.isFileAddedOrChanged(git, DATABASE_FILE_NAME))
 		{
-			setHasErrors(true);
+			setBackupStatus(BackupStatus.ERROR);
 			throw new RuntimeException(MessageFormat.format("Error adding \"{0}\" to git", DATABASE_FILE_NAME));
 		}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java
index 7b39b272c..10eae1ddd 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java
@@ -25,6 +25,7 @@ public class LocalBackupTask extends BackupTask
 	{
 		LOGGER.debug(MessageFormat.format("Starting backup with strategy \"{0}\"", AutoBackupStrategy.LOCAL));
 		databaseService.backupDatabase(getBackupFolder());
+		setBackupStatus(BackupStatus.OK);
 		LOGGER.debug("Backup DONE");
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java
index 1bd92a097..b046cee25 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java
@@ -48,14 +48,14 @@ public class LocalGitBackupTask extends GitBackupTask
 				final Git git = new Git(repository);
 				addAndCommitChanges(git);
 
-				setHasErrors(false);
+				setBackupStatus(BackupStatus.OK);
 				LOGGER.debug("Backup DONE");
 			}
 		}
 		catch(IOException | GitAPIException e)
 		{
 			e.printStackTrace();
-			setHasErrors(true);
+			setBackupStatus(BackupStatus.ERROR);
 		}
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/RemoteGitBackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/RemoteGitBackupTask.java
index 1816ae3f7..83327d847 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/RemoteGitBackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/RemoteGitBackupTask.java
@@ -56,7 +56,7 @@ public class RemoteGitBackupTask extends GitBackupTask
 		catch(IOException | GitAPIException | URISyntaxException e)
 		{
 			e.printStackTrace();
-			setHasErrors(true);
+			setBackupStatus(BackupStatus.ERROR);
 		}
 	}
 
@@ -79,7 +79,7 @@ public class RemoteGitBackupTask extends GitBackupTask
 				GitHelper.push(git, credentialsProvider);
 			}
 
-			setHasErrors(false);
+			setBackupStatus(BackupStatus.OK);
 			LOGGER.debug("Backup DONE");
 		}
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
index 4eebe7070..c0a56c261 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
@@ -380,6 +380,6 @@ public class SettingsController extends BaseController
 
 		final Optional<DateTime> nextBackupTimeOptional = scheduleTaskService.getNextRun();
 		nextBackupTimeOptional.ifPresent(date -> model.addAttribute("nextBackupTime", date));
-		model.addAttribute("autoBackupHasErrors", scheduleTaskService.hasErrors());
+		model.addAttribute("autoBackupStatus", scheduleTaskService.getBackupStatus());
 	}
 }
\ No newline at end of file
diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties
index 554b1f106..45ce4ce36 100644
--- a/src/main/resources/languages/base_de.properties
+++ b/src/main/resources/languages/base_de.properties
@@ -213,10 +213,11 @@ settings.backup.auto.strategy.git.remote.help=Einrichtungshilfe
 settings.backup.auto.strategy.git.remote.help.url=https://github.com/deadlocker8/BudgetMaster/wiki/Automatic-backup
 settings.backup.auto.files.to.keep=Anzahl aufzubewahrender Backups (0 für unbegrenzt)
 settings.backup.auto.next=Nächste Ausführung
-settings.backup.auto.has.errors=Letztes Backup
-settings.backup.auto.has.errors.true=Fehler
-settings.backup.auto.has.errors.details=Details finden sich im Log.
-settings.backup.auto.has.errors.false=OK
+settings.backup.auto.status=Letztes Backup
+settings.backup.auto.status.error=Fehler
+settings.backup.auto.status.error.details=Details finden sich im Log.
+settings.backup.auto.status.ok=OK
+settings.backup.auto.status.unknown=unbekannt
 settings.backup.auto.git.url=Adresse des Git-Servers
 settings.backup.auto.git.branch.name=Name des Branches
 settings.backup.auto.git.user.name=Git Nutzername
diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties
index 257009a02..2d0802748 100644
--- a/src/main/resources/languages/base_en.properties
+++ b/src/main/resources/languages/base_en.properties
@@ -213,10 +213,11 @@ settings.backup.auto.strategy.git.remote.help=Configuration help
 settings.backup.auto.strategy.git.remote.help.url=https://github.com/deadlocker8/BudgetMaster/wiki/Automatic-backup
 settings.backup.auto.files.to.keep=Number of backups to keep (0 for unlimited)
 settings.backup.auto.next=Next execution
-settings.backup.auto.has.errors=Last backup
-settings.backup.auto.has.errors.true=Error
-settings.backup.auto.has.errors.details=Log may contain details.
-settings.backup.auto.has.errors.false=OK
+settings.backup.auto.status=Last backup
+settings.backup.auto.status.error=Error
+settings.backup.auto.status.error.details=Log may contain details.
+settings.backup.auto.status.ok=OK
+settings.backup.auto.status.unknown=unknown
 settings.backup.auto.git.url=Git server address
 settings.backup.auto.git.branch.name=Git branch name
 settings.backup.auto.git.user.name=Git user name
diff --git a/src/main/resources/templates/settings/settingsMacros.ftl b/src/main/resources/templates/settings/settingsMacros.ftl
index e19aad89a..fca96559f 100644
--- a/src/main/resources/templates/settings/settingsMacros.ftl
+++ b/src/main/resources/templates/settings/settingsMacros.ftl
@@ -190,16 +190,19 @@
         </div>
 
         <div class="col s6 m6 l4 right-align">
-            <#if autoBackupHasErrors>
+            <#if autoBackupStatus.name() == "ERROR">
                 <#assign autoBackupStatusBannerClasses="budgetmaster-red white-text">
-                <#assign autoBackupStatusBannerText=locale.getString("settings.backup.auto.has.errors.true")>
-            <#else>
+                <#assign autoBackupStatusBannerText=locale.getString("settings.backup.auto.status.error")>
+            <#elseif autoBackupStatus.name() == "OK">
                 <#assign autoBackupStatusBannerClasses="budgetmaster-green white-text">
-                <#assign autoBackupStatusBannerText=locale.getString("settings.backup.auto.has.errors.false")>
+                <#assign autoBackupStatusBannerText=locale.getString("settings.backup.auto.status.ok")>
+            <#elseif autoBackupStatus.name() == "UNKNOWN">
+                <#assign autoBackupStatusBannerClasses="budgetmaster-grey black-text">
+                <#assign autoBackupStatusBannerText=locale.getString("settings.backup.auto.status.unknown")>
             </#if>
 
-            ${locale.getString("settings.backup.auto.has.errors")}:
-            <div class="banner ${autoBackupStatusBannerClasses} tooltipped" data-position="bottom" data-tooltip="${locale.getString("settings.backup.auto.has.errors.details")}">
+            ${locale.getString("settings.backup.auto.status")}:
+            <div class="banner ${autoBackupStatusBannerClasses} tooltipped" data-position="bottom" data-tooltip="${locale.getString("settings.backup.auto.status.error.details")}">
                 ${autoBackupStatusBannerText}
             </div>
         </div>
-- 
GitLab