diff --git a/src/de/deadlocker8/budgetmaster/logic/Updater.java b/src/de/deadlocker8/budgetmaster/logic/updater/Updater.java similarity index 55% rename from src/de/deadlocker8/budgetmaster/logic/Updater.java rename to src/de/deadlocker8/budgetmaster/logic/updater/Updater.java index c8701a4d7db38b322ddab5b575a0a13243c43fca..f969d027697615e491abf257f7c84bcf70ca5531 100644 --- a/src/de/deadlocker8/budgetmaster/logic/Updater.java +++ b/src/de/deadlocker8/budgetmaster/logic/updater/Updater.java @@ -1,22 +1,32 @@ -package de.deadlocker8.budgetmaster.logic; +package de.deadlocker8.budgetmaster.logic.updater; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import de.deadlocker8.budgetmaster.logic.updater.VersionInformation; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import logger.Logger; +import tools.Localization; +import tools.PathUtils; public class Updater { private VersionInformation latestVersion; private static final String LATEST_VERSION_INFO_URL = "https://raw.githubusercontent.com/deadlocker8/BudgetMaster/master/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties"; private static final String CHANGELOG_URL = "https://raw.githubusercontent.com/deadlocker8/BudgetMaster/master/src/de/deadlocker8/budgetmaster/resources/changelog.json"; + private static final String BUILD_FOLDER = "https://github.com/deadlocker8/BudgetMaster/raw/master/build/"; public Updater() { @@ -102,4 +112,64 @@ public class Updater } return null; } + + private void downloadLatestUpdater() throws IOException + { + //download into temp directory and file + Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/Updater.jar"); + download(BUILD_FOLDER + "Updater.jar", target); + } + + private File getCurrentExecutableName() + { + return new File(Updater.class.getProtectionDomain().getCodeSource().getLocation().getPath()); + } + + + public void downloadLatestVersion() throws IOException + { + File currentExecutable = getCurrentExecutableName(); + File currentFolder = currentExecutable.getParentFile(); + String currentFileName = currentExecutable.getName(); + String fileEnding; + + //check if BudgetMaster is running from executable + //no updating procedure if running from source + if(currentFileName.contains(".")) + { + fileEnding = currentExecutable.getAbsolutePath().substring(currentExecutable.getAbsolutePath().indexOf("."), currentExecutable.getAbsolutePath().length()); + } + else + { + Logger.debug("Update procedure will be skipped because BudgetMaster is running from source"); + return; + } + + PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER))); + + //download latest updater.jar + downloadLatestUpdater(); + + //download into temp directory and file + if(fileEnding.equalsIgnoreCase("exe")) + { + Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/update_BudgetMaster.exe"); + download(BUILD_FOLDER + "BudgetMaster.exe", target); + } + else + { + Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/update_BudgetMasterClient.jar"); + download(BUILD_FOLDER + "BudgetMasterClient.jar", target); + } + + //TODO start upater with params + //--> move temp jar/exe to currentFolder with currentFileName + } + + public void download(String url, Path target) throws IOException + { + URL website = new URL(url); + InputStream in = website.openStream(); + Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING); + } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java index 1d8693f632532ded522ce0fe57954fd1dcfadbe3..c018357fb1b0dc181e0341a93ecec7debe89efe8 100644 --- a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java +++ b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java @@ -41,6 +41,7 @@ public class Strings public static final String LOAD_DATABASE_EXPORT = "load.database.export"; public static final String LOAD_DATABASE_IMPORT = "load.database.import"; public static final String LOAD_DATABASE_DELETE = "load.database.delete"; + public static final String LOAD_UPDATE = "load.update"; //MISC public static final String CATEGORY_NONE = "category.none"; @@ -183,4 +184,5 @@ public class Strings public static final String ERROR_DATABASE_IMPORT_WRONG_FILE = "error.database.import.wrong.file"; public static final String ERROR_PASSWORD_SAVE = "error.password.save"; public static final String ERROR_UPDATER_GET_LATEST_VERSION = "error.updater.get.latest.version"; + public static final String ERROR_UPDATER_DOWNLOAD_LATEST_VERSION = "error.updater.download.latest.version"; } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties index 85268750b60aec53721a06b3593e8c8c16ad2887..3a8c9004931bb7fd7056e05ddd957d5315e27273 100644 --- a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties +++ b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties @@ -39,6 +39,7 @@ load.report=Der Monatsbericht wird erstellt, bitte warten... load.database.export=Die Datenbank wird exportiert, bitte warten... load.database.import=Die Datenbank wird importiert, bitte warten... load.database.delete=Die Datenbank wird gel�scht, bitte warten... +load.update=Update wird heruntergeladen, bitte warten... # MISC category.none=Keine Kategorie @@ -180,6 +181,7 @@ error.database.import=Beim Einlesen der Datei ist ein Fehler aufgetreten. error.database.import.wrong.file=Die angegebene Datei enth�lt kein g�ltiges BudgetMaster-Datenformat und kann daher nicht importiert werden. error.password.save=Beim Speichern des Passworts ist ein Fehler aufgetreten. error.updater.get.latest.version=Beim �berpr�fen auf Updates ist ein Fehler aufgetreten. Informationen zu neuen Versionen konnten nicht abgerufen werden. Versuche es sp�ter noch einmal. +error.updater.download.latest.version=Beim Herunterladen des Updates ist ein Fehler aufgetreten.\n\n{0} # UI categorytab.button.category.new=\ Neue Kategorie diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties index a1d9e6dd66aa79279f4f77e43213ac823d5886b2..eeda9a8d506e74c321a3c593e03b88836e94abb9 100644 --- a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties +++ b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties @@ -39,6 +39,7 @@ load.report=Please wait while the report is being generated... load.database.export=Please wait while the database is being exported... load.database.import=Please wait while the database is being imported... load.database.delete=Please wait while the database is being deleted... +load.update=Please wait while the update is being downloaded... # MISC category.none=No Category @@ -180,6 +181,7 @@ error.database.import=An error occurred while reading the file. error.database.import.wrong.file=The specified file does not contain a valid BudgetMaster data format thus can not be imported. error.password.save=An error occurred while saving the password. error.updater.get.latest.version=An error occurred while checking for updates. Information about latest versions could not be retrieved. Please try again later. +error.updater.download.latest.version=An error occurred while downloading the update.\n\n{0} # UI categorytab.button.category.new=\ New Category diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java index c35bb05415888b0f0675ba7d9963a80cf5637d83..e6be8ee3043cc89465906dcfa5ba59bea4d15220 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java @@ -12,9 +12,9 @@ import de.deadlocker8.budgetmaster.logic.FilterSettings; import de.deadlocker8.budgetmaster.logic.NormalPayment; import de.deadlocker8.budgetmaster.logic.PaymentHandler; 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.Updater; import de.deadlocker8.budgetmaster.logic.updater.VersionInformation; import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.Helpers; @@ -97,10 +97,15 @@ public class Controller updater = new Updater(); if(settings.isAutoUpdateCheckEnabled()) - { + { checkForUpdates(); } - + + initUI(); + } + + private void initUI() + { try { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/de/deadlocker8/budgetmaster/ui/fxml/HomeTab.fxml")); @@ -347,35 +352,69 @@ public class Controller try { boolean updateAvailable = updater.isUpdateAvailable(Integer.parseInt(Localization.getString(Strings.VERSION_CODE))); - String changes = updater.getChangelog(updater.getLatestVersion().getVersionCode()); + //DEBUG + //String changes = updater.getChangelog(updater.getLatestVersion().getVersionCode()); + String changes = ""; if(!updateAvailable) return; - Alert alert = new Alert(AlertType.INFORMATION); - alert.setTitle(Localization.getString(Strings.INFO_TITLE_UPDATE_AVAILABLE)); - alert.setHeaderText(""); - alert.setContentText(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE, - updater.getLatestVersion().getVersionName(), - changes)); - Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); - dialogStage.getIcons().add(icon); - - ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE_NOW)); - ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.CANCEL)); - alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo); - - Optional<ButtonType> result = alert.showAndWait(); - if (result.get() == buttonTypeOne) - { - //TODO update - } - else - { - alert.close(); - } + Platform.runLater(()->{ + Alert alert = new Alert(AlertType.INFORMATION); + alert.setTitle(Localization.getString(Strings.INFO_TITLE_UPDATE_AVAILABLE)); + alert.setHeaderText(""); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE, + updater.getLatestVersion().getVersionName(), + changes)); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(icon); + + ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE_NOW)); + ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.CANCEL)); + alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo); + + Optional<ButtonType> result = alert.showAndWait(); + if (result.get() == buttonTypeOne) + { + //TODO download latest updater first + + Stage modalStage = Helpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), stage, icon); + + Worker.runLater(() -> { + try + { + updater.downloadLatestVersion(); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + }); + } + catch(IOException ex) + { + Logger.error(ex); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_UPDATER_DOWNLOAD_LATEST_VERSION, ex.getMessage()), + icon, null, null, true); + } + }); + } + }); + } + else + { + alert.close(); + } + }); } - catch(NumberFormatException | IOException e) + catch(IOException e) { Logger.error(e); AlertGenerator.showAlert(AlertType.ERROR, @@ -448,8 +487,7 @@ public class Controller categoryHandler = new CategoryHandler(connection.getCategories()); categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); - paymentHandler.filter(newFilterSettings); - + paymentHandler.filter(newFilterSettings); Platform.runLater(() -> { if(modalStage != null) diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java b/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java index 7af334bae27f95da802da482f22f48c5c79673b7..57c1e1190e9859ce75056ae8dd843cf57a41d467 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java @@ -6,9 +6,9 @@ import java.util.ArrayList; import java.util.Optional; 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.Updater; import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.FileHelper; import de.deadlocker8.budgetmaster.logic.utils.Helpers;