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