From 01a8a8cb81cddc6a39f11907507b106d36bdf63c Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Thu, 24 Aug 2017 14:55:37 +0200
Subject: [PATCH] Fixed #131 - Automatic update check on start --> error on
 start if server and client version are not compatible

---
 .../serverconnection/ServerConnection.java    |  8 ++++---
 .../budgetmaster/logic/utils/Strings.java     |  2 ++
 .../resources/languages/_de.properties        |  3 ++-
 .../resources/languages/_en.properties        |  1 +
 .../ui/controller/Controller.java             | 23 +++++++++++++++++++
 .../ui/controller/SplashScreenController.java |  2 +-
 .../budgetmasterserver/main/Main.java         |  8 ++++++-
 .../server/SparkServer.java                   |  9 ++++----
 .../server/version/VersionGet.java            | 13 +++++++----
 9 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
index 27bd2292b..bfd251cfe 100644
--- a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
+++ b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
@@ -27,6 +27,7 @@ import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
 import de.deadlocker8.budgetmaster.logic.Settings;
+import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmasterserver.logic.database.Database;
 import tools.Read;
@@ -37,7 +38,7 @@ public class ServerConnection
 	private Gson gson;
 
 	public ServerConnection(Settings settings) throws Exception
-	{		
+	{			
 		this.settings = settings;
 		this.gson = new Gson();
 
@@ -494,7 +495,7 @@ public class ServerConnection
 	/*
 	 * VERSION
 	 */
-	public int getServerVersion() throws Exception
+	public VersionInformation getServerVersion() throws Exception
 	{
 		URL url = new URL(settings.getUrl() + "/version?secret=" + Helpers.getURLEncodedString(settings.getSecret()));
 		HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection();
@@ -503,7 +504,8 @@ public class ServerConnection
 
 		if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK)
 		{
-			return Integer.parseInt(Read.getStringFromInputStream(httpsCon.getInputStream()));
+			String result = Read.getStringFromInputStream(httpsCon.getInputStream());			
+			return gson.fromJson(result, VersionInformation.class);
 		}
 		else
 		{
diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java
index 1318e3fd0..1d8693f63 100644
--- a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java
+++ b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java
@@ -58,6 +58,7 @@ public class Strings
     public static final String URL_PLACEHOLDER = "url.placeholder";
     public static final String CURRENCY_PLACEHOLDER = "currency.placeholder";
     public static final String TRUSTED_HOSTS_PLACEHOLDER = "trusted.hosts.placeholder";
+    public static final String VERSION = "version";
     
     //REPORT
     public static final String REPORT_POSITION = "report.position";
@@ -159,6 +160,7 @@ public class Strings
     public static final String WARNING_WRONG_VERIFICATION_CODE = "warning.wrong.verificationcode";
     public static final String WARNING_EMPTY_PASSWORD = "warning.empty.password";
     public static final String WARNING_WRONG_PASSWORD = "warning.wrong.password";
+    public static final String WARNING_SERVER_VERSION = "warning.server.version";
     
     //ERROR
     public static final String ERROR_UNKNOWN_HOST = "error.unknown.host";
diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
index 16a7e7316..85268750b 100644
--- a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
+++ b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
@@ -1,6 +1,6 @@
 # DEFAULT
 app.name=BudgetMaster
-version.code=1
+version.code=9
 version.name=1.5.0_alpha
 version.date=23.08.17
 author=Robert Goldmann
@@ -157,6 +157,7 @@ warning.empty.currency=Bitte gib deine gew
 warning.wrong.verificationcode=Die Eingabe stimmt nicht mit dem Best�tigungscode �berein.
 warning.empty.password=Bitte gib dein Passwort ein.
 warning.wrong.password=Das Passwort ist nicht korrekt.
+warning.server.version=Die installierte Serverversion (Version: {0}) ist nicht kompatibel mit deinem Client (Version: {1}).\n\nBitte aktualisiere deinen Server:\nSchritt 1: Server stoppen\nSchritt 2: BudgetMasterServer.jar mit aktuellester Version ersetzen\nSchritt 3: Server starten
 
 # ERROR
 error.unknown.host=Es konnte keine Verbindung mit dem Internet hergestellt werden.
diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties
index a54e0f137..a1d9e6dd6 100644
--- a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties
+++ b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties
@@ -157,6 +157,7 @@ warning.empty.currency=Please enter your desired currency.
 warning.wrong.verificationcode=The input does not match the verification code.
 warning.empty.password=Please enter your password.
 warning.wrong.password=The password is not correct.
+warning.server.version=The installed server version (version: {0}) is not compatible with your client (version: {1}).\n\nPlease update your server:\nStep 1: stop server\nStep 2: replace BudgetMasterServer.jar with latest version\nStep 3: start server
 
 # ERROR
 error.unknown.host=Could not connect to the Internet.
diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java
index 5d976acd0..c35bb0541 100644
--- a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java
+++ b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java
@@ -15,6 +15,7 @@ import de.deadlocker8.budgetmaster.logic.Settings;
 import de.deadlocker8.budgetmaster.logic.Updater;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
@@ -411,6 +412,28 @@ public class Controller
 			{
 				ServerConnection connection = new ServerConnection(settings);
 				
+				//check if server is compatible with client
+				VersionInformation serverVersion = connection.getServerVersion();
+				if(serverVersion.getVersionCode() < Integer.parseInt(Localization.getString(Strings.VERSION_CODE)))
+				{
+					Platform.runLater(()->{;
+						AlertGenerator.showAlert(AlertType.WARNING,
+												Localization.getString(Strings.TITLE_WARNING), 
+												"",
+												Localization.getString(Strings.WARNING_SERVER_VERSION, serverVersion.getVersionName(), Localization.getString(Strings.VERSION_NAME)), 
+												icon, stage, null, false);					
+					
+						if(modalStage != null)
+						{
+							modalStage.close();
+						};
+						categoryHandler = new CategoryHandler(null);					
+						toggleAllTabsExceptSettings(true);
+						tabPane.getSelectionModel().select(tabSettings);	
+					});
+					return;
+				}				
+				
 				paymentHandler = new PaymentHandler();
 				paymentHandler.getPayments().addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear()));
 				paymentHandler.getPayments().addAll(connection.getRepeatingPayments(currentDate.getYear(), currentDate.getMonthOfYear()));			
diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java b/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java
index 04920fa91..2279f648c 100644
--- a/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java
@@ -173,7 +173,7 @@ public class SplashScreenController
 			Parent root = (Parent)fxmlLoader.load();
 			Stage newStage = new Stage();
 			newStage.setTitle(Localization.getString(Strings.APP_NAME));
-			newStage.setScene(new Scene(root, 650, 675));
+			newStage.setScene(new Scene(root, 650, 700));
 			newStage.getIcons().add(icon);			
 			newStage.setResizable(true);
 			newStage.setMinHeight(650);
diff --git a/src/de/deadlocker8/budgetmasterserver/main/Main.java b/src/de/deadlocker8/budgetmasterserver/main/Main.java
index c19196096..435a3378e 100644
--- a/src/de/deadlocker8/budgetmasterserver/main/Main.java
+++ b/src/de/deadlocker8/budgetmasterserver/main/Main.java
@@ -9,6 +9,7 @@ import java.nio.file.Paths;
 import java.util.Locale;
 import java.util.ResourceBundle;
 
+import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.Utils;
 import de.deadlocker8.budgetmasterserver.server.SparkServer;
@@ -60,7 +61,12 @@ public class Main
 			try
 			{
 				settings = Utils.loadSettings();
-				new SparkServer(settings, bundle.getString("version.code"));
+				VersionInformation versionInfo = new VersionInformation();
+				versionInfo.setVersionCode(Integer.parseInt(bundle.getString("version.code")));
+				versionInfo.setVersionName(bundle.getString("version.name"));
+				versionInfo.setDate(bundle.getString("version.date"));
+				
+				new SparkServer(settings, versionInfo);
 			}
 			catch(IOException | URISyntaxException e)
 			{
diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
index ce364e936..72771a73b 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
@@ -17,6 +17,7 @@ import org.joda.time.DateTime;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
+import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
@@ -51,11 +52,9 @@ public class SparkServer
 {	
 	private Gson gson;
 	private DatabaseHandler handler;
-	private String versionCode;
 	
-	public SparkServer(Settings settings, String versionCode)
-	{				
-		this.versionCode = versionCode;
+	public SparkServer(Settings settings, VersionInformation versionInfo)
+	{
 		Logger.info("Initializing SparkServer...");
 
 		gson = new GsonBuilder().setPrettyPrinting().create();
@@ -130,7 +129,7 @@ public class SparkServer
 		post("/database", new DatabaseImport(handler, gson));
 		delete("/database", new DatabaseDelete(handler, settings));
 		
-		get("/version", new VersionGet(versionCode));
+		get("/version", new VersionGet(gson, versionInfo));
 
 		after((request, response) -> {
 			new RepeatingPaymentUpdater(handler).updateRepeatingPayments(DateTime.now());
diff --git a/src/de/deadlocker8/budgetmasterserver/server/version/VersionGet.java b/src/de/deadlocker8/budgetmasterserver/server/version/VersionGet.java
index 5e9b3e5d9..dfbb05e48 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/version/VersionGet.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/version/VersionGet.java
@@ -1,21 +1,26 @@
 package de.deadlocker8.budgetmasterserver.server.version;
 
+import com.google.gson.Gson;
+
+import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import spark.Request;
 import spark.Response;
 import spark.Route;
 
 public class VersionGet implements Route
 {	
-	private String versionCode;
+	private Gson gson;
+	private VersionInformation versionInfo;
 
-	public VersionGet( String versionCode)
+	public VersionGet(Gson gson, VersionInformation versionInfo)
 	{
-		this.versionCode = versionCode;
+		this.gson=gson;
+		this.versionInfo = versionInfo;
 	}
 
 	@Override
 	public Object handle(Request req, Response res) throws Exception
 	{
-		return versionCode;
+		return gson.toJson(versionInfo);
 	}
 }
\ No newline at end of file
-- 
GitLab