diff --git a/.gitignore b/.gitignore index ae91f72929d3edca467a68702753e6a8bdcebe87..a3f7c058fb3c7b891c9a28efde06d27ac96daa75 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ bin/ target/ certs/ +*.db + build/[0-9]*.[0-9]*.[0-9]* \ No newline at end of file diff --git a/BudgetMasterClient/pom.xml b/BudgetMasterClient/pom.xml index 0a0d153d7cf0e647f26c69d19c020193662daa46..4670c84085b337379957f991b1dc51f714b4a9cb 100644 --- a/BudgetMasterClient/pom.xml +++ b/BudgetMasterClient/pom.xml @@ -3,7 +3,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>de.deadlocker8</groupId> <artifactId>BudgetMasterClient</artifactId> - <version>1.7.1</version> + <version>1.8.0</version> <name>BudgetMasterClient</name> <build> <plugins> @@ -105,7 +105,7 @@ <dependency> <groupId>de.deadlocker8</groupId> <artifactId>tools</artifactId> - <version>0.0.1-SNAPSHOT</version> + <version>1.0.0</version> </dependency> </dependencies> </project> \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java index 0931c1111789c583f1a412046d00c46919277132..774cc3c8bb09291e3ed6d01274511514ff966a81 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java @@ -6,6 +6,7 @@ import java.util.Locale; import de.deadlocker8.budgetmaster.logic.Settings; import de.deadlocker8.budgetmaster.logic.utils.FileHelper; import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.ShutdownHandler; import de.deadlocker8.budgetmasterclient.ui.controller.SplashScreenController; import javafx.application.Application; import javafx.scene.image.Image; @@ -30,9 +31,11 @@ public class Main extends Application { Localization.loadLanguage(settings.getLanguage().getLocale()); } + + ShutdownHandler shutdownHandler = new ShutdownHandler(); Image icon = new Image("/de/deadlocker8/budgetmaster/icon.png"); - new SplashScreenController(stage, icon, getParameters().getNamed().get("update") != null); + new SplashScreenController(stage, icon, getParameters().getNamed().get("update") != null, shutdownHandler); } @Override diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java index 34db5c8f2d9fe417a95f4c5863e71acdb22471a2..faa92647c4d44772c9c0ebbc8b8361ab3ce574f4 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java @@ -62,12 +62,12 @@ public class RestartHandler Optional<ButtonType> result = alert.showAndWait(); if (result.get() == buttonTypeOne) { - controller.getStage().close(); + controller.getStage().close(); Localization.loadLanguage(controller.getSettings().getLanguage().getLocale()); Image icon = new Image("/de/deadlocker8/budgetmaster/icon.png"); - new SplashScreenController(Main.primaryStage, icon, false); + new SplashScreenController(Main.primaryStage, icon, false, controller.getShutdownHandler()); } else { diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/ShutdownHandler.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/ShutdownHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..616beec09c3d5a5e6ee2a4b95a2d229a44a4e724 --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/ShutdownHandler.java @@ -0,0 +1,49 @@ +package de.deadlocker8.budgetmasterclient.ui; + +import de.deadlocker8.budgetmaster.logic.ServerType; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import logger.Logger; +import tools.Worker; + +public class ShutdownHandler +{ + private Thread shutdownThread; + private Controller controller; + + public ShutdownHandler() + { + shutdownThread = new Thread(() -> { + shutdown(); + }); + } + + public Thread getShutdownThread() + { + return shutdownThread; + } + + public void setController(Controller controller) + { + this.controller = controller; + } + + public void shutdown() + { + if(controller.getSettings().getServerType().equals(ServerType.LOCAL)) + { + Logger.debug("Stopping local BudgetMasterServer..."); + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + connection.shutdownServer(); + } + catch(Exception e) + { + Logger.error(e); + } + } + Worker.shutdown(); + System.exit(0); + } +} diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java index 908c651ebf7e790a02e610907a1f19f498b29c7b..71d1842051e3fe76a17ae5fdadfb7105ca48296f 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java @@ -3,9 +3,9 @@ package de.deadlocker8.budgetmasterclient.ui.cells; import java.util.Optional; import de.deadlocker8.budgetmaster.logic.category.Category; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.controller.CategoryController; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -64,7 +64,7 @@ public class CategoryCell extends ListCell<Category> HBox.setHgrow(r, Priority.ALWAYS); Button buttonEdit = new Button(); - buttonEdit.setGraphic(Helpers.getFontIcon(FontIconType.PENCIL, 16, Color.web("#212121"))); + buttonEdit.setGraphic(new FontIcon(FontIconType.PENCIL, 16, Color.web("#212121"))); buttonEdit.setPrefHeight(HEIGHT); buttonEdit.getStyleClass().add("greylabel"); buttonEdit.setStyle("-fx-background-color: transparent"); @@ -75,7 +75,7 @@ public class CategoryCell extends ListCell<Category> HBox.setMargin(buttonEdit, new Insets(0, 0, 0, 25)); Button buttonDelete = new Button(); - buttonDelete.setGraphic(Helpers.getFontIcon(FontIconType.TRASH, 16, Color.web("#212121"))); + buttonDelete.setGraphic(new FontIcon(FontIconType.TRASH, 16, Color.web("#212121"))); buttonDelete.setPrefHeight(HEIGHT); buttonDelete.getStyleClass().add("greylabel"); buttonDelete.setStyle("-fx-background-color: transparent"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java index 6219baf6ba69c2689393c6ba768729efd08d6d54..cb20223ae5585a4d795ccb6e41c82308d5dc2867 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java @@ -15,6 +15,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.controller.PaymentController; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.animation.FadeTransition; import javafx.geometry.Insets; @@ -23,13 +24,13 @@ import javafx.scene.Node; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar.ButtonData; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; import javafx.scene.control.ButtonType; import javafx.scene.control.DialogPane; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.Tooltip; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.Region; @@ -86,11 +87,11 @@ public class PaymentCell extends ListCell<Payment> Label labelRepeating = new Label(); if(item instanceof RepeatingPaymentEntry) { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.web("#212121"))); + labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.web("#212121"))); } else { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT)); + labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT)); } labelRepeating.setPrefHeight(HEIGHT); labelRepeating.setStyle("-fx-font-size: 15; -fx-text-fill: #212121"); @@ -158,7 +159,7 @@ public class PaymentCell extends ListCell<Payment> } Button buttonDelete = new Button(); - buttonDelete.setGraphic(Helpers.getFontIcon(FontIconType.TRASH, 16, Color.web("#212121"))); + buttonDelete.setGraphic(new FontIcon(FontIconType.TRASH, 16, Color.web("#212121"))); buttonDelete.setPrefHeight(HEIGHT); buttonDelete.getStyleClass().add("greylabel"); buttonDelete.setStyle("-fx-background-color: transparent"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java index a639e3f8c343cd0f825d81aa7f2fdf2a70de938a..9500ffcc09ae4734f80789f96d5dc532d1c46a29 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java @@ -14,6 +14,7 @@ import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmasterclient.ui.controller.SearchController; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -74,11 +75,11 @@ public class SearchCell extends ListCell<Payment> Label labelRepeating = new Label(); if(item instanceof RepeatingPayment) { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.web("#212121"))); + labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.web("#212121"))); } else { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT)); + labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT)); } labelRepeating.setPrefHeight(HEIGHT); labelRepeating.setStyle("-fx-font-size: 15; -fx-text-fill: #212121"); @@ -146,7 +147,7 @@ public class SearchCell extends ListCell<Payment> } Button buttonGoto = new Button(); - buttonGoto.setGraphic(Helpers.getFontIcon(FontIconType.EXTERNAL_LINK_SQUARE, 16, Color.web("#212121"))); + buttonGoto.setGraphic(new FontIcon(FontIconType.EXTERNAL_LINK_SQUARE, 16, Color.web("#212121"))); buttonGoto.setPrefHeight(HEIGHT); buttonGoto.getStyleClass().add("greylabel"); buttonGoto.setStyle("-fx-background-color: transparent"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java index 3131ef8d89a920fc03653f9305a2bd6bb3e24db6..e8bda03afe9ba7ef6bb51d10626b7c0bcaae8db1 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java @@ -2,7 +2,7 @@ package de.deadlocker8.budgetmasterclient.ui.cells.report.table; import de.deadlocker8.budgetmaster.logic.report.ReportItem; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.geometry.Pos; import javafx.scene.control.Label; @@ -18,11 +18,11 @@ public class ReportTableRatingCell extends TableCell<ReportItem, Integer> Label labelRepeating = new Label(); if(item > 0) { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.PLUS, 14, Colors.TEXT)); + labelRepeating.setGraphic(new FontIcon(FontIconType.PLUS, 14, Colors.TEXT)); } else { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.MINUS, 14, Colors.TEXT)); + labelRepeating.setGraphic(new FontIcon(FontIconType.MINUS, 14, Colors.TEXT)); } labelRepeating.setStyle("-fx-font-weight: bold; -fx-font-size: 14; -fx-text-fill: #212121"); labelRepeating.setAlignment(Pos.CENTER); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java index c608583eca9323eeceaeed85077a76f8f3124f4b..a9841bc98a6abf6b30440c81a12c559150db21bd 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java @@ -2,7 +2,7 @@ package de.deadlocker8.budgetmasterclient.ui.cells.report.table; import de.deadlocker8.budgetmaster.logic.report.ReportItem; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.geometry.Pos; import javafx.scene.control.Label; @@ -19,11 +19,11 @@ public class ReportTableRepeatingCell extends TableCell<ReportItem, Boolean> Label labelRepeating = new Label(); if(item) { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 16, Colors.TEXT)); + labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 16, Colors.TEXT)); } else { - labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 16, Color.TRANSPARENT)); + labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 16, Color.TRANSPARENT)); } labelRepeating.setStyle("-fx-font-weight: bold; -fx-font-size: 14; -fx-text-fill: #212121"); labelRepeating.setAlignment(Pos.CENTER); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java index a4c587b2fceeecd418c2b72e82f8fedae0659b1f..7c58c7dd231a80f00b587ce542a55d3550d7ce84 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java @@ -7,11 +7,11 @@ import de.deadlocker8.budgetmaster.logic.category.Category; import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Refreshable; import de.deadlocker8.budgetmasterclient.ui.Styleable; import de.deadlocker8.budgetmasterclient.ui.cells.CategoryCell; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.application.Platform; import javafx.beans.value.ChangeListener; @@ -118,7 +118,7 @@ public class CategoryController extends BaseController implements Refreshable, S @Override public void applyStyle() { - buttonCategory.setGraphic(Helpers.getFontIcon(FontIconType.PLUS, 18, Color.WHITE)); + buttonCategory.setGraphic(new FontIcon(FontIconType.PLUS, 18, Color.WHITE)); anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); buttonCategory.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java index 8ddc953455a4a15eb6bda5a23e34eb98b40f8454..0dbc75472000dc13bfe4966a41d26aad801d7523 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java @@ -21,7 +21,8 @@ import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Refreshable; import de.deadlocker8.budgetmasterclient.ui.Styleable; -import de.deadlocker8.budgetmasterclient.utils.UIHelpers; +import de.deadlocker8.budgetmasterclient.utils.LoadingModal; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.application.Platform; import javafx.collections.FXCollections; @@ -38,7 +39,6 @@ import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; -import javafx.stage.Stage; import logger.Logger; import tools.AlertGenerator; import tools.ConvertTo; @@ -248,7 +248,7 @@ public class ChartController implements Refreshable, Styleable @Override public void refresh() { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_CHARTS), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_CHARTS), controller.getStage(), controller.getIcon()); // prepare chart categories LocalDate startDate = LocalDate.parse(controller.getCurrentDate().withDayOfMonth(1).toString("yyyy-MM-dd")); @@ -269,10 +269,7 @@ public class ChartController implements Refreshable, Styleable chartMonthShow(); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); }); }); } @@ -286,15 +283,15 @@ public class ChartController implements Refreshable, Styleable vboxChartMonth.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); buttonChartCategoriesShow.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE)); - buttonChartCategoriesShow.setGraphic(Helpers.getFontIcon(FontIconType.CHECK, 16, Color.WHITE)); + buttonChartCategoriesShow.setGraphic(new FontIcon(FontIconType.CHECK, 16, Color.WHITE)); buttonChartCategoriesExport.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE)); - buttonChartCategoriesExport.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 16, Color.WHITE)); + buttonChartCategoriesExport.setGraphic(new FontIcon(FontIconType.SAVE, 16, Color.WHITE)); buttonChartMonthShow.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE)); - buttonChartMonthShow.setGraphic(Helpers.getFontIcon(FontIconType.CHECK, 16, Color.WHITE)); + buttonChartMonthShow.setGraphic(new FontIcon(FontIconType.CHECK, 16, Color.WHITE)); buttonChartMonthExport.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE)); - buttonChartMonthExport.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 16, Color.WHITE)); + buttonChartMonthExport.setGraphic(new FontIcon(FontIconType.SAVE, 16, Color.WHITE)); } } \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java index 25da0855bf8ab5817adb7aba1e54ce6087517b64..068b72c5f9d690da5a3c65e9173d501efbe91094 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java @@ -14,6 +14,7 @@ import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import de.deadlocker8.budgetmaster.logic.FilterSettings; +import de.deadlocker8.budgetmaster.logic.ServerType; import de.deadlocker8.budgetmaster.logic.Settings; import de.deadlocker8.budgetmaster.logic.category.CategoryBudget; import de.deadlocker8.budgetmaster.logic.category.CategoryHandler; @@ -27,11 +28,14 @@ import de.deadlocker8.budgetmaster.logic.tag.TagHandler; 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; import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.ShutdownHandler; import de.deadlocker8.budgetmasterclient.ui.commandLine.CommandBundle; import de.deadlocker8.budgetmasterclient.ui.commandLine.CommandLine; -import de.deadlocker8.budgetmasterclient.utils.UIHelpers; +import de.deadlocker8.budgetmasterclient.ui.controller.settings.LocalServerSettingsController; +import de.deadlocker8.budgetmasterclient.ui.controller.settings.SettingsController; +import de.deadlocker8.budgetmasterclient.utils.LoadingModal; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.animation.FadeTransition; import javafx.animation.SequentialTransition; @@ -97,6 +101,7 @@ public class Controller extends BaseController private Image icon = new Image("de/deadlocker8/budgetmaster/icon.png"); private Settings settings; + private ShutdownHandler shutdownHandler; private DateTime currentDate; private ArrayList<CategoryBudget> categoryBudgets; private PaymentHandler paymentHandler; @@ -110,9 +115,10 @@ public class Controller extends BaseController private boolean alertIsShowing = false; private static DateTimeFormatter DATE_FORMAT; - public Controller(Settings settings) + public Controller(Settings settings, ShutdownHandler shutdownHandler) { - this.settings = settings; + this.settings = settings; + this.shutdownHandler = shutdownHandler; DATE_FORMAT = DateTimeFormat.forPattern("MMMM yyyy").withLocale(this.settings.getLanguage().getLocale()); load("/de/deadlocker8/budgetmaster/ui/fxml/GUI.fxml", Localization.getBundle()); getStage().show(); @@ -130,15 +136,31 @@ public class Controller extends BaseController stage.setMinHeight(650); stage.getScene().getStylesheets().add("/de/deadlocker8/budgetmaster/ui/style.css"); } - + @Override public void init() - { + { + this.shutdownHandler.setController(this); + getStage().setOnCloseRequest((event)->{ - Worker.shutdown(); - System.exit(0); + Runtime.getRuntime().removeShutdownHook(shutdownHandler.getShutdownThread()); + shutdownHandler.shutdown(); }); + try + { + Runtime.getRuntime().addShutdownHook(shutdownHandler.getShutdownThread()); + } + catch(IllegalArgumentException e) + { + } + + if(settings.getServerType() == null) + { + settings.setServerType(ServerType.ONLINE); + } + Logger.info("Running with ServerType: " + settings.getServerType()); + currentDate = DateTime.now(); buttonDate.setText(currentDate.toString(DATE_FORMAT)); @@ -186,7 +208,7 @@ public class Controller extends BaseController { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fileName)); fxmlLoader.setResources(Localization.getBundle()); - Parent nodeTab = (Parent)fxmlLoader.load(); + Parent nodeTab = (Parent)fxmlLoader.load(); tab.setContent(nodeTab); return fxmlLoader.getController(); } @@ -222,8 +244,7 @@ public class Controller extends BaseController } }); - settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml", tabSettings); - settingsController.init(this); + loadSettingsTab(); } catch(IOException e) { @@ -233,10 +254,10 @@ public class Controller extends BaseController }); } - buttonLeft.setGraphic(Helpers.getFontIcon(FontIconType.CHEVRON_LEFT, 20, Colors.TEXT)); - buttonRight.setGraphic(Helpers.getFontIcon(FontIconType.CHEVRON_RIGHT, 20, Colors.TEXT)); - buttonToday.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR_ALT, 20, Colors.TEXT)); - buttonAbout.setGraphic(Helpers.getFontIcon(FontIconType.INFO, 20, Colors.TEXT)); + buttonLeft.setGraphic(new FontIcon(FontIconType.CHEVRON_LEFT, 20, Colors.TEXT)); + buttonRight.setGraphic(new FontIcon(FontIconType.CHEVRON_RIGHT, 20, Colors.TEXT)); + buttonToday.setGraphic(new FontIcon(FontIconType.CALENDAR_ALT, 20, Colors.TEXT)); + buttonAbout.setGraphic(new FontIcon(FontIconType.INFO, 20, Colors.TEXT)); // apply theme anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_MAIN)); @@ -256,7 +277,35 @@ public class Controller extends BaseController buttonAbout.setStyle("-fx-background-color: transparent;"); buttonAbout.getStyleClass().add("button-hoverable"); - + } + + public void loadSettingsTab() + { + try + { + if(settings.getServerType().equals(ServerType.ONLINE)) + { + settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml", tabSettings); + settingsController.init(this); + } + else + { + settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml", tabSettings); + settingsController.init(this); + } + + } + catch(IOException e) + { + Logger.error(e); + Platform.runLater(() -> { + AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_CREATE_UI), icon, getStage(), null, false); + }); + } + } + + public boolean checkSettings() + { if(!settings.isComplete()) { Platform.runLater(() -> { @@ -264,11 +313,9 @@ public class Controller extends BaseController tabPane.getSelectionModel().select(tabSettings); AlertGenerator.showAlert(AlertType.INFORMATION, Localization.getString(Strings.TITLE_INFO), "", Localization.getString(Strings.INFO_FIRST_START), icon, getStage(), null, false); }); + return false; } - else - { - refresh(filterSettings); - } + return true; } public Image getIcon() @@ -285,6 +332,11 @@ public class Controller extends BaseController { this.settings = settings; } + + public ShutdownHandler getShutdownHandler() + { + return shutdownHandler; + } public void showNotification(String text) { @@ -348,6 +400,12 @@ public class Controller extends BaseController { new DatePickerController(getStage(), this, currentDate); } + + public void forceSettingsTab() + { + toggleAllTabsExceptSettings(true); + tabPane.getSelectionModel().select(tabSettings); + } public void showConnectionErrorAlert(String errorMessage) { @@ -571,32 +629,26 @@ public class Controller extends BaseController Optional<ButtonType> result = alert.showAndWait(); if (result.get() == buttonTypeOne) { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), getStage(), icon); + LoadingModal.showModal(this, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), getStage(), icon); Worker.runLater(() -> { try { updater.downloadLatestVersion(); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); }); } catch(Exception 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, getStage(), null, true); - } + LoadingModal.closeModal(); + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_UPDATER_DOWNLOAD_LATEST_VERSION, ex.getMessage()), + icon, getStage(), null, true); }); } }); @@ -741,7 +793,10 @@ public class Controller extends BaseController public void refresh(FilterSettings newFilterSettings) { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATA), getStage(), icon); + Logger.debug("Starting main refresh..."); + Platform.runLater(()->{ + LoadingModal.showModal(this, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATA), getStage(), icon); + }); Worker.runLater(() -> { try @@ -751,39 +806,53 @@ public class Controller extends BaseController //check if server is compatible with client try { + Logger.debug("Checking server compatibility..."); 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, getStage(), null, false); - - if(modalStage != null) - { - modalStage.close(); - }; - categoryHandler = new CategoryHandler(null); - toggleAllTabsExceptSettings(true); - tabPane.getSelectionModel().select(tabSettings); - }); + Logger.debug("Server (versionCode: " + serverVersion.getVersionCode() + ") is incompatible with client (versionCode: " + Localization.getString(Strings.VERSION_CODE) + ")"); + if(settings.getServerType().equals(ServerType.ONLINE)) + { + 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, getStage(), null, false); + + LoadingModal.closeModal(); + categoryHandler = new CategoryHandler(null); + toggleAllTabsExceptSettings(true); + tabPane.getSelectionModel().select(tabSettings); + }); + } + else + { + Platform.runLater(()->{ + LoadingModal.closeModal(); + categoryHandler = new CategoryHandler(null); + toggleAllTabsExceptSettings(true); + tabPane.getSelectionModel().select(tabSettings); + ((LocalServerSettingsController)settingsController).handleIncompatibleServer(); + }); + } return; } + else + { + Logger.debug("Found compatible server (versionCode: " + serverVersion.getVersionCode() + ")"); + } } catch(Exception e1) { Logger.error(e1); Platform.runLater(()->{ - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); }); if(e1.getMessage().contains("404")) { + Logger.debug("Server version is incompatible with current client version (" + Localization.getString(Strings.VERSION_CODE) + ")"); //old server Platform.runLater(()->{ AlertGenerator.showAlert(AlertType.WARNING, @@ -805,6 +874,8 @@ public class Controller extends BaseController return; } + Logger.debug("Connected"); + paymentHandler = new PaymentHandler(); paymentHandler.getPayments().addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear())); paymentHandler.getPayments().addAll(connection.getRepeatingPayments(currentDate.getYear(), currentDate.getMonthOfYear())); @@ -820,12 +891,10 @@ public class Controller extends BaseController categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); paymentHandler.filter(newFilterSettings, new TagHandler(settings)); + Logger.debug("Main refresh done"); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); toggleAllTabsExceptSettings(false); refreshAllTabs(); }); @@ -834,11 +903,7 @@ public class Controller extends BaseController { Logger.error(e); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - Logger.error(e); + LoadingModal.closeModal(); categoryHandler = new CategoryHandler(null); showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); refreshAllTabs(); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java index 7de27b30b12246dd740a86ebdd42373146a5106d..8420aba70be1cf53902b2f5aa7abdfc9736f1307 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java @@ -7,6 +7,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Styleable; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.fxml.FXML; import javafx.scene.control.Alert.AlertType; @@ -114,8 +115,8 @@ public class DatePickerController extends BaseController implements Styleable @Override public void applyStyle() { - buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE)); - buttonConfirm.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 17, Color.WHITE)); + buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE)); + buttonConfirm.setGraphic(new FontIcon(FontIconType.SAVE, 17, Color.WHITE)); buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); buttonConfirm.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java index 43ebe49ac556a87a80aa14b2475a33f824ea7748..8ef7e2be2afc81f503ea92d4b8268e1fd37cbe60 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java @@ -9,9 +9,9 @@ import javax.imageio.ImageIO; import de.deadlocker8.budgetmaster.logic.charts.ChartExportable; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Styleable; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.embed.swing.SwingFXUtils; import javafx.fxml.FXML; @@ -225,7 +225,7 @@ public class ExportChartController extends BaseController implements Styleable alert.setTitle(Localization.getString(Strings.INFO_TITLE_CHART_EXPORT)); alert.initOwner(controller.getController().getStage()); alert.setHeaderText(""); - alert.setContentText(Localization.getString(Strings.INFO_TEXT_CHART_EXPORT)); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_CHART_EXPORT)); Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); dialogStage.getIcons().add(controller.getController().getIcon()); @@ -315,12 +315,12 @@ public class ExportChartController extends BaseController implements Styleable anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); buttonChooseFile.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); - buttonChooseFile.setGraphic(Helpers.getFontIcon(FontIconType.FOLDER_OPEN, 14, Color.WHITE)); + buttonChooseFile.setGraphic(new FontIcon(FontIconType.FOLDER_OPEN, 14, Color.WHITE)); buttonExport.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); - buttonExport.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 14, Color.WHITE)); + buttonExport.setGraphic(new FontIcon(FontIconType.SAVE, 14, Color.WHITE)); buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); - buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 14, Color.WHITE)); + buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 14, Color.WHITE)); } } \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java index 870246f417cedc957e94c2779856288873d61b93..c092a851c31ab9b5359cd9b6c4dd8555ea8c2bbf 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java @@ -8,9 +8,9 @@ import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; import de.deadlocker8.budgetmaster.logic.serverconnection.ServerTagConnection; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Styleable; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.fxml.FXML; import javafx.scene.Node; @@ -253,9 +253,9 @@ public class FilterController extends BaseController implements Styleable @Override public void applyStyle() { - buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE)); - buttonReset.setGraphic(Helpers.getFontIcon(FontIconType.UNDO, 17, Color.WHITE)); - buttonFilter.setGraphic(Helpers.getFontIcon(FontIconType.FILTER, 17, Color.WHITE)); + buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE)); + buttonReset.setGraphic(new FontIcon(FontIconType.UNDO, 17, Color.WHITE)); + buttonFilter.setGraphic(new FontIcon(FontIconType.FILTER, 17, Color.WHITE)); scrollPane.setStyle("-fx-background-color: transparent"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java index b173d805b38430363d7c586fb8ad6380c3347408..24545fc527f779015893d6de00850a10934efaa4 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java @@ -1,18 +1,75 @@ package de.deadlocker8.budgetmasterclient.ui.controller; +import java.util.Optional; + +import de.deadlocker8.budgetmaster.logic.utils.Strings; import javafx.fxml.FXML; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; import javafx.scene.control.Label; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.stage.Modality; import javafx.stage.Stage; +import javafx.stage.WindowEvent; +import logger.Logger; +import tools.Localization; public class ModalController { @FXML private Label labelMessage; + private Alert alert; - public void init(Stage stage, String message) + public void init(Controller controller, Stage stage, String message) { labelMessage.setText(message); stage.setOnCloseRequest((e)->{ + alert = new Alert(AlertType.CONFIRMATION); + alert.setTitle(Localization.getString(Strings.INFO_TITLE_SHUTDOWN)); + alert.initModality(Modality.APPLICATION_MODAL); + alert.initOwner(controller.getStage()); + alert.setHeaderText(""); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_SHUTDOWN)); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + + ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.CANCEL)); + ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.OK)); + alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo); + + DialogPane dialogPane = alert.getDialogPane(); + dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> { + if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button) + { + ((Button)event.getTarget()).fire(); + } + })); + + Optional<ButtonType> result = alert.showAndWait(); + if (result.get() == buttonTypeTwo) + { + Logger.debug("Shutting down during operation due to client request..."); + controller.getStage().fireEvent(new WindowEvent(controller.getStage(), WindowEvent.WINDOW_CLOSE_REQUEST)); + } + e.consume(); }); } + + public void setMessage(String message) + { + labelMessage.setText(message); + } + + public void closeAlert() + { + if(alert != null && alert.isShowing()) + { + Button cancelButton = ( Button ) alert.getDialogPane().lookupButton(alert.getButtonTypes().get(0)); + cancelButton.fire(); + } + } } \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java index d5a37d753dc62b57d631d34e32f5f9ee619d4752..91dfbd525809f8c4f2eb9a69864015c518f425aa 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java @@ -13,6 +13,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Styleable; import de.deadlocker8.budgetmasterclient.ui.colorPick.ColorView; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.fxml.FXML; import javafx.scene.control.Alert.AlertType; @@ -203,8 +204,8 @@ public class NewCategoryController extends BaseController implements Styleable @Override public void applyStyle() { - buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE)); - buttonSave.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 17, Color.WHITE)); + buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE)); + buttonSave.setGraphic(new FontIcon(FontIconType.SAVE, 17, Color.WHITE)); buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java index e2e5f75e823feea28abe183f4d821bcb36d54b25..66a16cd4aec8cda175ca78542d1d79bbb3ab7279 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java @@ -1,5 +1,6 @@ package de.deadlocker8.budgetmasterclient.ui.controller; +import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; @@ -22,6 +23,7 @@ import de.deadlocker8.budgetmasterclient.ui.cells.ButtonCategoryCell; import de.deadlocker8.budgetmasterclient.ui.cells.RepeatingDayCell; import de.deadlocker8.budgetmasterclient.ui.cells.SmallCategoryCell; import de.deadlocker8.budgetmasterclient.ui.tagField.TagField; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.fxml.FXML; import javafx.geometry.Insets; @@ -70,6 +72,7 @@ public class NewPaymentController extends BaseController implements Styleable @FXML private TextArea textArea; @FXML private HBox hboxTags; @FXML private Button buttonTagsHelp; + @FXML private CheckBox checkBoxEndDate; private Stage parentStage; private Controller controller; @@ -247,6 +250,10 @@ public class NewPaymentController extends BaseController implements Styleable } } }); + + checkBoxEndDate.selectedProperty().addListener((obs, oldValue, newValue)->{ + datePickerEnddate.setDisable(!newValue); + }); } private void initSpinnerRepeatingPeriod() @@ -333,6 +340,8 @@ public class NewPaymentController extends BaseController implements Styleable toggleRepeatingArea(true); comboBoxRepeatingDay.getSelectionModel().select(currentPayment.getRepeatMonthDay()-1); } + + checkBoxEndDate.setSelected(currentPayment.getRepeatEndDate() != null); if(currentPayment.getRepeatEndDate() != null) { datePickerEnddate.setValue(LocalDate.parse(currentPayment.getRepeatEndDate())); @@ -389,7 +398,7 @@ public class NewPaymentController extends BaseController implements Styleable } String amountText = textFieldAmount.getText(); - if(!amountText.matches("^-?\\d+(,\\d+)*(\\.\\d+(e\\d+)?)?$")) + if(!amountText.matches("^-?\\d+(,\\d+)?(\\.\\d+)?$")) { showWarning(Localization.getString(Strings.WARNING_PAYMENT_AMOUNT)); return; @@ -403,7 +412,7 @@ public class NewPaymentController extends BaseController implements Styleable } int amount = 0; - amount = (int)(Double.parseDouble(amountText.replace(",", ".")) * 100); + amount = new BigDecimal(amountText.replace(",", ".")).multiply(new BigDecimal(100)).toBigInteger().intValue(); if(isPayment) { amount = -amount; @@ -412,7 +421,7 @@ public class NewPaymentController extends BaseController implements Styleable String description = textArea.getText(); if(description != null) { - if(description.length() > 150) + if(description.length() > 200) { showWarning(Localization.getString(Strings.WARNING_DESCRIPTION_CHARACTER_LIMIT_REACHED_150)); return; @@ -444,17 +453,18 @@ public class NewPaymentController extends BaseController implements Styleable return; } - if(datePickerEnddate.getValue() != null && datePickerEnddate.getValue().isBefore(date)) + if(checkBoxEndDate.isSelected() && datePickerEnddate.getValue() != null && datePickerEnddate.getValue().isBefore(date)) { showWarning(Localization.getString(Strings.WARNING_ENDDATE_BEFORE_STARTDATE)); return; } if(edit) - { + { try - { - RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval, Helpers.getDateString(datePickerEnddate.getValue()), repeatingDay); + { + LocalDate endDate = checkBoxEndDate.isSelected() ? datePickerEnddate.getValue() : null; + RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval, Helpers.getDateString(endDate), repeatingDay); ServerConnection connection = new ServerConnection(controller.getSettings()); if(payment instanceof NormalPayment) @@ -480,7 +490,8 @@ public class NewPaymentController extends BaseController implements Styleable } else { - RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval,Helpers.getDateString(datePickerEnddate.getValue()), repeatingDay); + LocalDate endDate = checkBoxEndDate.isSelected() ? datePickerEnddate.getValue() : null; + RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval, Helpers.getDateString(endDate), repeatingDay); try { ServerConnection connection = new ServerConnection(controller.getSettings()); @@ -598,7 +609,8 @@ public class NewPaymentController extends BaseController implements Styleable spinnerRepeatingPeriod.setDisable(!selected); comboBoxRepeatingDay.setDisable(!selected); } - datePickerEnddate.setDisable(!selected); + checkBoxEndDate.setDisable(!selected); + datePickerEnddate.setDisable(!selected || !checkBoxEndDate.isSelected()); radioButtonPeriod.setDisable(!selected); radioButtonDay.setDisable(!selected); labelText1.setDisable(!selected); @@ -679,9 +691,9 @@ public class NewPaymentController extends BaseController implements Styleable @Override public void applyStyle() { - buttonTagsHelp.setGraphic(Helpers.getFontIcon(FontIconType.QUESTION, 13, Colors.TEXT)); - buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE)); - buttonSave.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 17, Color.WHITE)); + buttonTagsHelp.setGraphic(new FontIcon(FontIconType.QUESTION, 13, Colors.TEXT)); + buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE)); + buttonSave.setGraphic(new FontIcon(FontIconType.SAVE, 17, Color.WHITE)); scrollPane.setStyle("-fx-background-color: transparent"); buttonTagsHelp.setStyle("-fx-background-color: transparent; -fx-border-radius: 50%; -fx-border-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java index c489114a84a5498c9fc8b417b2abe22c752185b2..c05c1822a5f1053b5331f109ba465859d93758f8 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java @@ -16,6 +16,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Refreshable; import de.deadlocker8.budgetmasterclient.ui.Styleable; import de.deadlocker8.budgetmasterclient.ui.cells.PaymentCell; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.application.Platform; import javafx.beans.value.ChangeListener; @@ -205,11 +206,11 @@ public class PaymentController implements Refreshable, Styleable @Override public void applyStyle() { - buttonNewIncome.setGraphic(Helpers.getFontIcon(FontIconType.DOWNLOAD, 18, Color.WHITE)); - buttonFilter.setGraphic(Helpers.getFontIcon(FontIconType.FILTER, 18, Color.WHITE)); - buttonNewPayment.setGraphic(Helpers.getFontIcon(FontIconType.UPLOAD, 18, Color.WHITE)); - labelFilterActive.setGraphic(Helpers.getFontIcon(FontIconType.WARNING, 13, Colors.TEXT)); - buttonSearch.setGraphic(Helpers.getFontIcon(FontIconType.SEARCH, 18, Color.WHITE)); + buttonNewIncome.setGraphic(new FontIcon(FontIconType.DOWNLOAD, 18, Color.WHITE)); + buttonFilter.setGraphic(new FontIcon(FontIconType.FILTER, 18, Color.WHITE)); + buttonNewPayment.setGraphic(new FontIcon(FontIconType.UPLOAD, 18, Color.WHITE)); + labelFilterActive.setGraphic(new FontIcon(FontIconType.WARNING, 13, Colors.TEXT)); + buttonSearch.setGraphic(new FontIcon(FontIconType.SEARCH, 18, Color.WHITE)); anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); labelIncome.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java index a99a28ee7b3f6ae657f70273fcabfbf49deee779..e9fb0cd84fdb15adef6cadef08153758a7532801 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java @@ -28,14 +28,14 @@ import de.deadlocker8.budgetmaster.logic.report.ReportSorting; import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; import de.deadlocker8.budgetmaster.logic.tag.TagHandler; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.FileHelper; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Refreshable; import de.deadlocker8.budgetmasterclient.ui.Styleable; import de.deadlocker8.budgetmasterclient.ui.cells.report.table.ReportTableRatingCell; import de.deadlocker8.budgetmasterclient.ui.cells.report.table.ReportTableRepeatingCell; -import de.deadlocker8.budgetmasterclient.utils.UIHelpers; +import de.deadlocker8.budgetmasterclient.utils.LoadingModal; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; @@ -67,6 +67,7 @@ import logger.Logger; import tools.AlertGenerator; import tools.ConvertTo; import tools.Localization; +import tools.ObjectJSONHandler; import tools.Worker; public class ReportController implements Refreshable, Styleable @@ -196,9 +197,9 @@ public class ReportController implements Refreshable, Styleable private void applyReportPreferences() { - tableView.getColumns().clear(); + tableView.getColumns().clear(); - Object loadedObject = FileHelper.loadObjectFromJSON("reportPreferences", new ReportPreferences()); + Object loadedObject = ObjectJSONHandler.loadObjectFromJSON(Localization.getString(Strings.FOLDER), "reportPreferences", new ReportPreferences()); if(loadedObject != null) { reportPreferences = (ReportPreferences)loadedObject; @@ -613,7 +614,7 @@ public class ReportController implements Refreshable, Styleable { try { - FileHelper.saveObjectToJSON("reportPreferences", reportPreferences); + ObjectJSONHandler.saveObjectToJSON(Localization.getString(Strings.FOLDER), "reportPreferences", reportPreferences); } catch(IOException e) { @@ -652,7 +653,7 @@ public class ReportController implements Refreshable, Styleable controller.getCurrentDate(), budget); - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT), controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try @@ -660,10 +661,7 @@ public class ReportController implements Refreshable, Styleable reportGenerator.generate(); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); controller.showNotification(Localization.getString(Strings.NOTIFICATION_REPORT_SAVE)); @@ -737,10 +735,7 @@ public class ReportController implements Refreshable, Styleable { Logger.error(e); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", @@ -763,7 +758,7 @@ public class ReportController implements Refreshable, Styleable @Override public void refresh() { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT_TAB), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT_TAB), controller.getStage(), controller.getIcon()); if(controller.getFilterSettings().equals(new FilterSettings())) { @@ -787,11 +782,7 @@ public class ReportController implements Refreshable, Styleable refreshTableView(); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - + LoadingModal.closeModal(); applyReportPreferences(); tableView.refresh(); }); @@ -801,9 +792,9 @@ public class ReportController implements Refreshable, Styleable @Override public void applyStyle() { - buttonFilter.setGraphic(Helpers.getFontIcon(FontIconType.FILTER, 18, Color.WHITE)); - buttonGenerate.setGraphic(Helpers.getFontIcon(FontIconType.COGS, 18, Color.WHITE)); - labelFilterActive.setGraphic(Helpers.getFontIcon(FontIconType.WARNING, 16, Colors.TEXT)); + buttonFilter.setGraphic(new FontIcon(FontIconType.FILTER, 18, Color.WHITE)); + buttonGenerate.setGraphic(new FontIcon(FontIconType.COGS, 18, Color.WHITE)); + labelFilterActive.setGraphic(new FontIcon(FontIconType.WARNING, 16, Colors.TEXT)); anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); labelFilterActive.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java index 1fab017b8c4b1537d727d2b6798dcc4e0f380c50..930d015ae397027f02532bc5fd8beceeb41f4435 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java @@ -9,11 +9,11 @@ import de.deadlocker8.budgetmaster.logic.search.SearchPreferences; import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.Styleable; import de.deadlocker8.budgetmasterclient.ui.cells.SearchCell; -import de.deadlocker8.budgetmasterclient.utils.UIHelpers; +import de.deadlocker8.budgetmasterclient.utils.LoadingModal; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.application.Platform; import javafx.beans.value.ChangeListener; @@ -98,10 +98,11 @@ public class SearchController extends BaseController implements Styleable if(cell.getItem().getCategoryID() != 2) { controller.getPaymentController().payment(!cell.getItem().isIncome(), true, cell.getItem()); + search(); } } }); - cell.prefWidthProperty().bind(listView.widthProperty().subtract(2)); + cell.prefWidthProperty().bind(listView.widthProperty().subtract(4)); return cell; } }); @@ -261,7 +262,7 @@ public class SearchController extends BaseController implements Styleable searchPreferences.setMinAmount((int)rangeSlider.getLowValue()); searchPreferences.setMaxAmount((int)rangeSlider.getHighValue()); - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_SEARCH), getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_SEARCH), getStage(), controller.getIcon()); Worker.runLater(() -> { try @@ -283,20 +284,14 @@ public class SearchController extends BaseController implements Styleable listView.getItems().setAll(payments); } - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); }); } catch(Exception e) { Logger.error(e); Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } + LoadingModal.closeModal(); controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); }); } @@ -323,8 +318,8 @@ public class SearchController extends BaseController implements Styleable labelSeparator.setMinHeight(1); labelSeparator.setMaxHeight(1); - buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE)); - buttonSearch.setGraphic(Helpers.getFontIcon(FontIconType.SEARCH, 17, Color.WHITE)); + buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE)); + buttonSearch.setGraphic(new FontIcon(FontIconType.SEARCH, 17, Color.WHITE)); buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); buttonSearch.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java index 28071b5355d3ce73337c65457637e12afd880ad5..2bc64ec98de85fad20ace075f99e63af86f418d8 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java @@ -7,8 +7,10 @@ import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.FileHelper; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.ShutdownHandler; import de.deadlocker8.budgetmasterclient.ui.Styleable; import de.deadlocker8.budgetmasterclient.ui.customAlert.CustomAlertController; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.application.Platform; import javafx.fxml.FXML; @@ -40,12 +42,14 @@ public class SplashScreenController extends BaseController implements Styleable private Settings settings; private boolean isFirstStart; private boolean isStartingAfterUpdate; + private ShutdownHandler shutdownHandler; - public SplashScreenController(Stage parentStage, Image icon, boolean isStartingAfterUpdate) + public SplashScreenController(Stage parentStage, Image icon, boolean isStartingAfterUpdate, ShutdownHandler shutdownHandler) { this.parentStage = parentStage; this.icon = icon; this.isStartingAfterUpdate = isStartingAfterUpdate; + this.shutdownHandler = shutdownHandler; load("/de/deadlocker8/budgetmaster/ui/fxml/SplashScreen.fxml", Localization.getBundle()); getStage().show(); } @@ -177,7 +181,7 @@ public class SplashScreenController extends BaseController implements Styleable private void openBudgetMaster() { - new Controller(settings); + new Controller(settings, shutdownHandler); } public Image getIcon() @@ -188,7 +192,7 @@ public class SplashScreenController extends BaseController implements Styleable @Override public void applyStyle() { - buttonLogin.setGraphic(Helpers.getFontIcon(FontIconType.SIGN_IN, 18, Color.WHITE)); + buttonLogin.setGraphic(new FontIcon(FontIconType.SIGN_IN, 18, Color.WHITE)); buttonLogin.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); buttonLogin.setPadding(new Insets(3, 7, 3, 7)); } diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java new file mode 100644 index 0000000000000000000000000000000000000000..edba3b99cff975d088cea5cfe6bb4c3ecce74f5c --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java @@ -0,0 +1,406 @@ +package de.deadlocker8.budgetmasterclient.ui.controller.settings; + +import java.io.IOException; +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.ServerType; +import de.deadlocker8.budgetmaster.logic.Settings; +import de.deadlocker8.budgetmaster.logic.localserver.LocalServerException; +import de.deadlocker8.budgetmaster.logic.localserver.LocalServerHandler; +import de.deadlocker8.budgetmaster.logic.localserver.LocalServerStatus; +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; +import de.deadlocker8.budgetmaster.logic.utils.LanguageType; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.RestartHandler; +import de.deadlocker8.budgetmasterclient.ui.cells.LanguageCell; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import de.deadlocker8.budgetmasterclient.utils.LoadingModal; +import javafx.application.Platform; +import javafx.fxml.FXML; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.Button; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; +import logger.Logger; +import tools.AlertGenerator; +import tools.ConvertTo; +import tools.HashUtils; +import tools.Localization; +import tools.Worker; + +public class LocalServerSettingsController extends SettingsController +{ + @FXML private AnchorPane anchorPaneMain; + @FXML private ScrollPane scrollPane; + @FXML private HBox hboxSettings; + @FXML private ToggleButton toggleButtonOnline; + @FXML private ToggleButton toggleButtonLocal; + @FXML private Label labelStatus; + @FXML private Label labelLocalServerStatus; + @FXML private Button buttonLocalServerAction; + @FXML private Label labelClientSecret; + @FXML private TextField textFieldClientSecret; + @FXML private TextField textFieldCurrency; + @FXML private Label labelCurrency; + @FXML private Button buttonSave; + @FXML private Button buttonExportDB; + @FXML private Button buttonImportDB; + @FXML private Button buttonDeleteDB; + @FXML private RadioButton radioButtonRestActivated; + @FXML private RadioButton radioButtonRestDeactivated; + @FXML private ComboBox<LanguageType> comboBoxLanguage; + @FXML private CheckBox checkboxEnableAutoUpdate; + @FXML private Button buttonSearchUpdates; + @FXML private Label labelCurrentVersion; + @FXML private Label labelLatestVersion; + + private LanguageType previousLanguage; + + private final int MILLIS_UNTIL_NEXT_RETRY = 2000; + private final int MAX_NUMBER_OF_RETRIES = 5; + + @Override + public void init(Controller controller) + { + super.controller = controller; + + ToggleGroup toggleGroupServerType = new ToggleGroup(); + toggleButtonOnline.setToggleGroup(toggleGroupServerType); + toggleButtonLocal.setToggleGroup(toggleGroupServerType); + toggleButtonOnline.setOnAction((event) -> { + controller.getSettings().setServerType(ServerType.ONLINE); + controller.loadSettingsTab(); + }); + + textFieldClientSecret.setText("******"); + + comboBoxLanguage.setCellFactory((view) -> { + return new LanguageCell(true); + }); + + comboBoxLanguage.getItems().addAll(LanguageType.values()); + comboBoxLanguage.setButtonCell(new LanguageCell(false)); + comboBoxLanguage.setValue(LanguageType.ENGLISH); + previousLanguage = LanguageType.ENGLISH; + checkboxEnableAutoUpdate.setSelected(true); + + applyStyle(); + + textFieldCurrency.setPromptText(Localization.getString(Strings.CURRENCY_PLACEHOLDER)); + + ToggleGroup toggleGroup = new ToggleGroup(); + radioButtonRestActivated.setToggleGroup(toggleGroup); + radioButtonRestDeactivated.setToggleGroup(toggleGroup); + + hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25)); + + refreshLabelsUpdate(); + prefill(); + checkServerStatus(); + } + + @Override + public void prefill() + { + textFieldCurrency.setText(controller.getSettings().getCurrency()); + + if(controller.getSettings().isRestActivated()) + { + radioButtonRestActivated.setSelected(true); + } + else + { + radioButtonRestDeactivated.setSelected(true); + } + + if(controller.getSettings().getLanguage() != null) + { + LanguageType language = controller.getSettings().getLanguage(); + comboBoxLanguage.setValue(language); + previousLanguage = language; + } + + checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled()); + } + + private void checkServerStatus() + { + LocalServerHandler serverHandler = new LocalServerHandler(); + switch(serverHandler.getServerStatus()) + { + case ACTIVE: + labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_OK)); + buttonLocalServerAction.setVisible(false); + refreshLabelsUpdate(); + save(); + break; + case INACTIVE: + Platform.runLater(()->{ + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); + }); + labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_NOT_STARTED)); + buttonLocalServerAction.setVisible(false); + Worker.runLater(() -> { + try + { + Logger.debug("Starting local Server..."); + serverHandler.createServerSettingsIfNotExists(); + serverHandler.startServer(); + + Logger.debug("Trying to connect to local server..."); + Platform.runLater(()->{LoadingModal.setMessage(Localization.getString(Strings.LOAD_LOCAL_SERVER_CONNECT));}); + int retryCount = 1; + while(retryCount <= MAX_NUMBER_OF_RETRIES) + { + final int retries = retryCount; + boolean isActive = serverHandler.getServerStatus().equals(LocalServerStatus.ACTIVE); + if(isActive) + { + Logger.debug("Connected to local server"); + break; + } + + if(retryCount == MAX_NUMBER_OF_RETRIES) + { + Logger.debug("Couldn't connect to local server. Giving up after " + retryCount + " retries."); + throw new LocalServerException(""); + } + else + { + Logger.debug("Couldn't connect to local server. Retry " + retryCount + "/" + MAX_NUMBER_OF_RETRIES + ". Next Retry in " + MILLIS_UNTIL_NEXT_RETRY/1000 + " Seconds..."); + Platform.runLater(()->{LoadingModal.setMessage(Localization.getString(Strings.LOAD_LOCAL_SERVER_RETRY, retries, MAX_NUMBER_OF_RETRIES));}); + retryCount++; + try + { + Thread.sleep(MILLIS_UNTIL_NEXT_RETRY); + } + catch(InterruptedException e) + { + } + } + } + } + catch(IOException e) + { + Logger.debug("Error while starting local server"); + Logger.error(e); + Platform.runLater(()->{ + LoadingModal.closeModal(); + AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_START, e.getMessage()), controller.getIcon(), controller.getStage(), null, false); + controller.forceSettingsTab(); + }); + return; + } + catch(LocalServerException ex) + { + Logger.debug("Error while starting local server"); + Platform.runLater(()->{ + LoadingModal.closeModal(); + AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_START, ""), controller.getIcon(), controller.getStage(), null, false); + controller.refresh(controller.getFilterSettings()); + buttonLocalServerAction.setText(Localization.getString(Strings.LOCAL_SERVER_ACTION_NOT_STARTED)); + buttonLocalServerAction.setVisible(true); + buttonLocalServerAction.setDisable(false); + + buttonLocalServerAction.setOnAction((event) -> { + buttonLocalServerAction.setDisable(true); + checkServerStatus(); + }); + }); + return; + } + + Platform.runLater(()->{ + checkServerStatus(); + LoadingModal.closeModal(); + }); + }); + break; + case MISSING: + controller.forceSettingsTab(); + labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_NOT_PRESENT)); + buttonLocalServerAction.setText(Localization.getString(Strings.LOCAL_SERVER_ACTION_NOT_PRESENT)); + buttonLocalServerAction.setVisible(true); + buttonLocalServerAction.setDisable(false); + + buttonLocalServerAction.setOnAction((event) -> { + buttonLocalServerAction.setDisable(true); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + serverHandler.downloadServer(Localization.getString(Strings.VERSION_NAME)); + serverHandler.createServerSettingsIfNotExists(); + Platform.runLater(()->{ + checkServerStatus(); + LoadingModal.closeModal(); + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(()->{ + LoadingModal.closeModal(); + AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_DOWNLOAD, e.getMessage()), controller.getIcon(), controller.getStage(), null, false); + buttonLocalServerAction.setDisable(false); + }); + } + }); + }); + break; + default: + break; + } + } + + @Override + void refreshLabelsUpdate() + { + Updater updater = controller.getUpdater(); + labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME)); + labelLatestVersion.setText(updater.getLatestVersion().getVersionName()); + } + + @Override + public void save() + { + String clientSecret = textFieldClientSecret.getText(); + String currency = textFieldCurrency.getText(); + + if(clientSecret == null || clientSecret.trim().equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), "", Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT), controller.getIcon(), controller.getStage(), null, false); + return; + } + clientSecret = clientSecret.trim(); + + if(currency == null || currency.trim().equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), "", Localization.getString(Strings.WARNING_EMPTY_CURRENCY), controller.getIcon(), controller.getStage(), null, false); + return; + } + currency = currency.trim(); + + if(controller.getSettings().isComplete()) + { + if(!clientSecret.equals("******")) + { + controller.getSettings().setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); + } + + controller.getSettings().setCurrency(currency); + controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected()); + controller.getSettings().setLanguage(comboBoxLanguage.getValue()); + controller.getSettings().setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + } + else + { + Settings settings = new Settings(); + + if(!clientSecret.equals("******")) + { + settings.setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); + } + else + { + settings.setClientSecret(controller.getSettings().getClientSecret()); + } + + settings.setCurrency(currency); + settings.setRestActivated(radioButtonRestActivated.isSelected()); + settings.setLanguage(comboBoxLanguage.getValue()); + settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + controller.setSettings(settings); + } + + controller.getSettings().setServerType(ServerType.LOCAL); + controller.getSettings().setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT)); + controller.getSettings().setUrl("https://localhost:9000"); + ArrayList<String> trustedHosts = new ArrayList<>(); + trustedHosts.add("localhost"); + controller.getSettings().setTrustedHosts(trustedHosts); + + try + { + FileHelper.saveSettings(controller.getSettings()); + } + catch(IOException e) + { + Logger.error(e); + AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_SETTINGS_SAVE), controller.getIcon(), controller.getStage(), null, false); + } + + textFieldClientSecret.setText("******"); + + RestartHandler restartHandler = new RestartHandler(controller); + restartHandler.handleRestart(previousLanguage); + refreshLabelsUpdate(); + } + + public void handleIncompatibleServer() + { + labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_INCOMPATIBLE)); + buttonLocalServerAction.setText(Localization.getString(Strings.LOCAL_SERVER_ACTION_INCOMPATIBLE)); + buttonLocalServerAction.setVisible(true); + buttonLocalServerAction.setDisable(false); + + buttonLocalServerAction.setOnAction((event) -> { + buttonLocalServerAction.setDisable(true); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + LocalServerHandler serverHandler = new LocalServerHandler(); + serverHandler.shutdownServer(); + Thread.sleep(3000); + serverHandler.downloadServer(Localization.getString(Strings.VERSION_NAME)); + serverHandler.createServerSettingsIfNotExists(); + Platform.runLater(()->{ + checkServerStatus(); + LoadingModal.closeModal(); + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(()->{ + LoadingModal.closeModal(); + AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_DOWNLOAD, e.getMessage()), controller.getIcon(), controller.getStage(), null, false); + buttonLocalServerAction.setDisable(false); + }); + } + }); + }); + } + + @Override + public void applyStyle() + { + anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); + scrollPane.setStyle("-fx-background-color: transparent"); + labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + labelStatus.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + labelCurrency.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + toggleButtonOnline.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 3 0 0 3"); + toggleButtonLocal.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_DARK_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 0 3 3 0; -fx-effect: innershadow(gaussian, rgba(0,0,0,0.7), 10,0,0,0);"); + buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); + buttonLocalServerAction.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonExportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonImportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonDeleteDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_RED) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonSearchUpdates.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/OnlineServerSettingsController.java similarity index 51% rename from BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java rename to BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/OnlineServerSettingsController.java index c481192e7f8166d22821f9f7096090dfa7fa2770..44665753d8c9e3ea86025300c8eef8aa7fc882a3 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/OnlineServerSettingsController.java @@ -1,14 +1,10 @@ -package de.deadlocker8.budgetmasterclient.ui.controller; +package de.deadlocker8.budgetmasterclient.ui.controller.settings; -import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.Optional; +import de.deadlocker8.budgetmaster.logic.ServerType; import de.deadlocker8.budgetmaster.logic.Settings; -import de.deadlocker8.budgetmaster.logic.database.Database; -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; @@ -16,46 +12,35 @@ import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.LanguageType; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.RestartHandler; -import de.deadlocker8.budgetmasterclient.ui.Styleable; import de.deadlocker8.budgetmasterclient.ui.cells.LanguageCell; -import de.deadlocker8.budgetmasterclient.utils.UIHelpers; -import javafx.application.Platform; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; import javafx.fxml.FXML; -import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; -import javafx.scene.control.ButtonBar.ButtonData; -import javafx.scene.control.ButtonType; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; -import javafx.scene.control.DialogPane; import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; -import javafx.scene.control.TextInputDialog; +import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; -import javafx.stage.FileChooser; -import javafx.stage.Stage; import logger.Logger; import tools.AlertGenerator; -import tools.BASE58Type; import tools.ConvertTo; import tools.HashUtils; import tools.Localization; -import tools.RandomCreations; -import tools.Worker; -public class SettingsController implements Styleable +public class OnlineServerSettingsController extends SettingsController { @FXML private AnchorPane anchorPaneMain; @FXML private ScrollPane scrollPane; @FXML private HBox hboxSettings; + @FXML private ToggleButton toggleButtonOnline; + @FXML private ToggleButton toggleButtonLocal; @FXML private Label labelClientSecret; @FXML private TextField textFieldClientSecret; @FXML private TextField textFieldURL; @@ -77,12 +62,20 @@ public class SettingsController implements Styleable @FXML private Label labelCurrentVersion; @FXML private Label labelLatestVersion; - private Controller controller; private LanguageType previousLanguage; + @Override public void init(Controller controller) { - this.controller = controller; + super.controller = controller; + + ToggleGroup toggleGroupServerType = new ToggleGroup(); + toggleButtonOnline.setToggleGroup(toggleGroupServerType); + toggleButtonLocal.setToggleGroup(toggleGroupServerType); + toggleButtonLocal.setOnAction((event)->{ + controller.getSettings().setServerType(ServerType.LOCAL); + controller.loadSettingsTab(); + }); textFieldClientSecret.setText("******"); @@ -111,15 +104,21 @@ public class SettingsController implements Styleable hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25)); refreshLabelsUpdate(); + + if(controller.checkSettings()) + { + controller.refresh(controller.getFilterSettings()); + } } + @Override public void prefill() { if(controller.getSettings().isComplete()) { textFieldURL.setText(controller.getSettings().getUrl()); textFieldSecret.setText("******"); - textFieldCurrency.setText(controller.getSettings().getCurrency()); + textFieldCurrency.setText(controller.getSettings().getCurrency()); } if(controller.getSettings().isRestActivated()) @@ -141,7 +140,8 @@ public class SettingsController implements Styleable checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled()); } - private void refreshLabelsUpdate() + @Override + void refreshLabelsUpdate() { Updater updater = controller.getUpdater(); labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME)); @@ -166,14 +166,15 @@ public class SettingsController implements Styleable } } + @Override public void save() { - String clientSecret = textFieldClientSecret.getText().trim(); - String url = textFieldURL.getText().trim(); - String secret = textFieldSecret.getText().trim(); - String currency = textFieldCurrency.getText().trim(); + String clientSecret = textFieldClientSecret.getText(); + String url = textFieldURL.getText(); + String secret = textFieldSecret.getText(); + String currency = textFieldCurrency.getText(); - if(clientSecret == null || clientSecret.equals("")) + if(clientSecret == null || clientSecret.trim().equals("")) { AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), @@ -185,8 +186,9 @@ public class SettingsController implements Styleable false); return; } + clientSecret = clientSecret.trim(); - if(url == null || url.equals("")) + if(url == null || url.trim().equals("")) { AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), @@ -198,8 +200,9 @@ public class SettingsController implements Styleable false); return; } + url = url.trim(); - if(secret == null || secret.equals("")) + if(secret == null || secret.trim().equals("")) { AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), @@ -211,8 +214,9 @@ public class SettingsController implements Styleable false); return; } + secret = secret.trim(); - if(currency == null || currency.equals("")) + if(currency == null || currency.trim().equals("")) { AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), @@ -224,6 +228,7 @@ public class SettingsController implements Styleable false); return; } + currency = currency.trim(); ArrayList<String> trustedHosts = new ArrayList<>(); String trustedHostText = textAreaTrustedHosts.getText(); @@ -255,6 +260,7 @@ public class SettingsController implements Styleable controller.getSettings().setTrustedHosts(trustedHosts); controller.getSettings().setLanguage(comboBoxLanguage.getValue()); controller.getSettings().setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + controller.getSettings().setServerType(ServerType.ONLINE); } else { @@ -283,6 +289,7 @@ public class SettingsController implements Styleable settings.setTrustedHosts(trustedHosts); settings.setLanguage(comboBoxLanguage.getValue()); settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + settings.setServerType(ServerType.ONLINE); controller.setSettings(settings); } @@ -311,261 +318,13 @@ public class SettingsController implements Styleable refreshLabelsUpdate(); } - public void exportDB() - { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_EXPORT)); - FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); - fileChooser.getExtensionFilters().add(extFilter); - File file = fileChooser.showSaveDialog(controller.getStage()); - if(file != null) - { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon()); - - Worker.runLater(() -> { - try - { - ServerConnection connection = new ServerConnection(controller.getSettings()); - String databaseJSON = connection.exportDatabase(); - FileHelper.saveDatabaseJSON(file, databaseJSON); - - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - AlertGenerator.showAlert(AlertType.INFORMATION, - Localization.getString(Strings.INFO_TITLE_DATABASE_EXPORT), - "", - Localization.getString(Strings.INFO_TEXT_DATABASE_EXPORT), - controller.getIcon(), - controller.getStage(), - null, - false); - }); - } - catch(Exception e) - { - Logger.error(e); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); - }); - } - }); - } - } - - private void importDatabase() - { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_IMPORT)); - FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); - fileChooser.getExtensionFilters().add(extFilter); - File file = fileChooser.showOpenDialog(controller.getStage()); - if(file != null) - { - Database database; - try - { - database = FileHelper.loadDatabaseJSON(file); - System.out.println(database); - if(database.getCategories() == null - || database.getNormalPayments() == null - || database.getRepeatingPayments() == null - || database.getTags() == null - || database.getTagMatches() == null) - { - AlertGenerator.showAlert(AlertType.ERROR, - Localization.getString(Strings.TITLE_ERROR), - "", - Localization.getString(Strings.ERROR_DATABASE_IMPORT_WRONG_FILE), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - } - catch(IOException e1) - { - Logger.error(e1); - AlertGenerator.showAlert(AlertType.ERROR, - Localization.getString(Strings.TITLE_ERROR), - "", - Localization.getString(Strings.ERROR_DATABASE_IMPORT), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon()); - - Worker.runLater(() -> { - try - { - ServerConnection connection = new ServerConnection(controller.getSettings()); - connection.importDatabase(database); - - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - - AlertGenerator.showAlert(AlertType.INFORMATION, - Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT), - "", - Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT), - controller.getIcon(), - controller.getStage(), - null, - false); - - controller.refresh(controller.getFilterSettings()); - }); - } - catch(Exception e) - { - Logger.error(e); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); - }); - } - }); - } - else - { - controller.refresh(controller.getFilterSettings()); - } - } - - public void importDB() - { - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT_DIALOG)); - alert.setHeaderText(""); - alert.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG)); - Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); - dialogStage.getIcons().add(controller.getIcon()); - dialogStage.initOwner(controller.getStage()); - - ButtonType buttonTypeDelete = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_DELETE)); - ButtonType buttonTypeAppend = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_APPEND)); - ButtonType buttonTypeCancel = new ButtonType(Localization.getString(Strings.CANCEL), ButtonData.CANCEL_CLOSE); - alert.getButtonTypes().setAll(buttonTypeDelete, buttonTypeAppend, buttonTypeCancel); - - DialogPane dialogPane = alert.getDialogPane(); - dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> { - if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button) - { - ((Button)event.getTarget()).fire(); - } - })); - - Optional<ButtonType> result = alert.showAndWait(); - if(result.get() == buttonTypeDelete) - { - deleteDatabase(true); - } - else if(result.get() == buttonTypeAppend) - { - importDatabase(); - } - } - - public void deleteDB() - { - deleteDatabase(false); - } - - public void deleteDatabase(boolean importPending) - { - String verificationCode = ConvertTo.toBase58(RandomCreations.generateRandomMixedCaseString(4, true), true, BASE58Type.UPPER); - - TextInputDialog dialog = new TextInputDialog(); - dialog.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_DELETE)); - dialog.setHeaderText(Localization.getString(Strings.INFO_HEADER_TEXT_DATABASE_DELETE)); - dialog.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_DELETE, verificationCode)); - Stage dialogStage = (Stage)dialog.getDialogPane().getScene().getWindow(); - dialogStage.getIcons().add(controller.getIcon()); - dialogStage.initOwner(controller.getStage()); - - Optional<String> result = dialog.showAndWait(); - if(result.isPresent()) - { - if(result.get().equals(verificationCode)) - { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon()); - - Worker.runLater(() -> { - try - { - ServerConnection connection = new ServerConnection(controller.getSettings()); - connection.deleteDatabase(); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - if(importPending) - { - importDatabase(); - } - else - { - controller.refresh(controller.getFilterSettings()); - } - } - }); - } - catch(Exception e) - { - Logger.error(e); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); - }); - } - }); - } - else - { - AlertGenerator.showAlert(AlertType.WARNING, - Localization.getString(Strings.TITLE_WARNING), - "", - Localization.getString(Strings.WARNING_WRONG_VERIFICATION_CODE), - controller.getIcon(), - controller.getStage(), - null, - false); - deleteDatabase(importPending); - } - } - } - - public void checkForUpdates() - { - controller.checkForUpdates(true); - refreshLabelsUpdate(); - } - @Override public void applyStyle() { anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); scrollPane.setStyle("-fx-background-color: transparent"); + toggleButtonOnline.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_DARK_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 3 0 0 3; -fx-effect: innershadow(gaussian, rgba(0,0,0,0.7), 10,0,0,0);"); + toggleButtonLocal.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 0 3 3 0"); labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); labelSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); labelURL.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/SettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/SettingsController.java new file mode 100644 index 0000000000000000000000000000000000000000..43dd3187ea2fa6d1850109c146be462ad70a35bb --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/SettingsController.java @@ -0,0 +1,44 @@ +package de.deadlocker8.budgetmasterclient.ui.controller.settings; + +import de.deadlocker8.budgetmasterclient.ui.Styleable; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import de.deadlocker8.budgetmasterclient.utils.DatabaseDeleter; +import de.deadlocker8.budgetmasterclient.utils.DatabaseExporter; +import de.deadlocker8.budgetmasterclient.utils.DatabaseImporter; + +public abstract class SettingsController implements Styleable +{ + Controller controller; + + public abstract void init(Controller controller); + + public abstract void prefill(); + + abstract void refreshLabelsUpdate(); + + public abstract void save(); + + public void exportDB() + { + DatabaseExporter exporter = new DatabaseExporter(controller); + exporter.exportDatabase(); + } + + public void importDB() + { + DatabaseImporter importer = new DatabaseImporter(controller); + importer.importDatabase(); + } + + public void deleteDB() + { + DatabaseDeleter deleter = new DatabaseDeleter(controller); + deleter.deleteDatabase(false); + } + + public void checkForUpdates() + { + controller.checkForUpdates(true); + refreshLabelsUpdate(); + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java index 536a52cdcf4cd1c33542a1170e4ad3895a4b64ea..82b3728e3081507a29bd4a7f17666925412bdbb5 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java @@ -8,9 +8,9 @@ import org.controlsfx.control.textfield.TextFields; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmasterclient.ui.controller.NewPaymentController; +import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -69,6 +69,11 @@ public class TagField extends VBox } }); + textField.setOnMousePressed((event)->{ + textField.setText(" "); + textField.setText(""); + }); + TextFields.bindAutoCompletion(textField, new Callback<AutoCompletionBinding.ISuggestionRequest, Collection<String>>() { @Override @@ -210,7 +215,7 @@ public class TagField extends VBox hboxTag.getChildren().add(labelTagName); Button buttonDelete = new Button(); - buttonDelete.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 13, Colors.TEXT)); + buttonDelete.setGraphic(new FontIcon(FontIconType.TIMES, 13, Colors.TEXT)); buttonDelete.setStyle("-fx-background-color: transparent;"); buttonDelete.getStyleClass().add("button-hoverable"); buttonDelete.setOnAction((event)->{ diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java new file mode 100644 index 0000000000000000000000000000000000000000..83474efdfbe9aaf1c41eb834b0d581a624d62fe8 --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java @@ -0,0 +1,91 @@ +package de.deadlocker8.budgetmasterclient.utils; + +import java.util.Optional; + +import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import javafx.application.Platform; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.TextInputDialog; +import javafx.stage.Stage; +import logger.Logger; +import tools.AlertGenerator; +import tools.BASE58Type; +import tools.ConvertTo; +import tools.Localization; +import tools.RandomCreations; +import tools.Worker; + +public class DatabaseDeleter +{ + private Controller controller; + + public DatabaseDeleter(Controller controller) + { + this.controller = controller; + } + + public void deleteDatabase(boolean importPending) + { + String verificationCode = ConvertTo.toBase58(RandomCreations.generateRandomMixedCaseString(4, true), true, BASE58Type.UPPER); + + TextInputDialog dialog = new TextInputDialog(); + dialog.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_DELETE)); + dialog.setHeaderText(Localization.getString(Strings.INFO_HEADER_TEXT_DATABASE_DELETE)); + dialog.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_DELETE, verificationCode)); + Stage dialogStage = (Stage)dialog.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + dialogStage.initOwner(controller.getStage()); + + Optional<String> result = dialog.showAndWait(); + if(result.isPresent()) + { + if(result.get().equals(verificationCode)) + { + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + connection.deleteDatabase(); + Platform.runLater(() -> { + LoadingModal.closeModal(); + if(importPending) + { + DatabaseImporter importer = new DatabaseImporter(controller); + importer.importDB(); + } + else + { + controller.refresh(controller.getFilterSettings()); + } + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + LoadingModal.closeModal(); + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); + } + }); + } + else + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_WRONG_VERIFICATION_CODE), + controller.getIcon(), + controller.getStage(), + null, + false); + deleteDatabase(importPending); + } + } + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java new file mode 100644 index 0000000000000000000000000000000000000000..8a92711fc41b4daaa7ff32f334a8b584a284ac1b --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java @@ -0,0 +1,69 @@ +package de.deadlocker8.budgetmasterclient.utils; + +import java.io.File; + +import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmaster.logic.utils.FileHelper; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import javafx.application.Platform; +import javafx.scene.control.Alert.AlertType; +import javafx.stage.FileChooser; +import logger.Logger; +import tools.AlertGenerator; +import tools.Localization; +import tools.Worker; + +public class DatabaseExporter +{ + private Controller controller; + + public DatabaseExporter(Controller controller) + { + this.controller = controller; + } + + public void exportDatabase() + { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_EXPORT)); + FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); + fileChooser.getExtensionFilters().add(extFilter); + File file = fileChooser.showSaveDialog(controller.getStage()); + if(file != null) + { + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + String databaseJSON = connection.exportDatabase(); + FileHelper.saveDatabaseJSON(file, databaseJSON); + + Platform.runLater(() -> { + LoadingModal.closeModal(); + AlertGenerator.showAlert(AlertType.INFORMATION, + Localization.getString(Strings.INFO_TITLE_DATABASE_EXPORT), + "", + Localization.getString(Strings.INFO_TEXT_DATABASE_EXPORT), + controller.getIcon(), + controller.getStage(), + null, + false); + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + LoadingModal.closeModal(); + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); + } + }); + } + + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java new file mode 100644 index 0000000000000000000000000000000000000000..5d6ac00ff20aeb98668fcad0e8edca6792ae43d3 --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java @@ -0,0 +1,155 @@ +package de.deadlocker8.budgetmasterclient.utils; + +import java.io.File; +import java.io.IOException; +import java.util.Optional; + +import de.deadlocker8.budgetmaster.logic.database.Database; +import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmaster.logic.utils.FileHelper; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import javafx.application.Platform; +import javafx.scene.control.Alert; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonBar.ButtonData; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import logger.Logger; +import tools.AlertGenerator; +import tools.Localization; +import tools.Worker; + +public class DatabaseImporter +{ + private Controller controller; + + public DatabaseImporter(Controller controller) + { + this.controller = controller; + } + + public void importDatabase() + { + Alert alert = new Alert(AlertType.CONFIRMATION); + alert.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT_DIALOG)); + alert.setHeaderText(""); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG)); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + dialogStage.initOwner(controller.getStage()); + + ButtonType buttonTypeDelete = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_DELETE)); + ButtonType buttonTypeAppend = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_APPEND)); + ButtonType buttonTypeCancel = new ButtonType(Localization.getString(Strings.CANCEL), ButtonData.CANCEL_CLOSE); + alert.getButtonTypes().setAll(buttonTypeDelete, buttonTypeAppend, buttonTypeCancel); + + DialogPane dialogPane = alert.getDialogPane(); + dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> { + if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button) + { + ((Button)event.getTarget()).fire(); + } + })); + + Optional<ButtonType> result = alert.showAndWait(); + if(result.get() == buttonTypeDelete) + { + DatabaseDeleter deleter = new DatabaseDeleter(controller); + deleter.deleteDatabase(true); + } + else if(result.get() == buttonTypeAppend) + { + importDB(); + } + } + + public void importDB() + { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_IMPORT)); + FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); + fileChooser.getExtensionFilters().add(extFilter); + File file = fileChooser.showOpenDialog(controller.getStage()); + if(file != null) + { + Database database; + try + { + database = FileHelper.loadDatabaseJSON(file); + if(database.getCategories() == null + || database.getNormalPayments() == null + || database.getRepeatingPayments() == null + || database.getTags() == null + || database.getTagMatches() == null) + { + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_DATABASE_IMPORT_WRONG_FILE), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + } + catch(IOException e1) + { + Logger.error(e1); + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_DATABASE_IMPORT), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + connection.importDatabase(database); + + Platform.runLater(() -> { + LoadingModal.closeModal(); + + AlertGenerator.showAlert(AlertType.INFORMATION, + Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT), + "", + Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT), + controller.getIcon(), + controller.getStage(), + null, + false); + + controller.refresh(controller.getFilterSettings()); + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + LoadingModal.closeModal(); + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); + } + }); + } + else + { + controller.refresh(controller.getFilterSettings()); + } + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/UIHelpers.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java similarity index 50% rename from BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/UIHelpers.java rename to BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java index 88035fcb1da69d55f23adf6570343466f034dc26..748c5ee5e3c9144f5a62db145b0670a1b64a60e3 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/UIHelpers.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java @@ -3,6 +3,7 @@ package de.deadlocker8.budgetmasterclient.utils; import java.io.IOException; import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; import de.deadlocker8.budgetmasterclient.ui.controller.ModalController; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -13,9 +14,42 @@ import javafx.stage.Stage; import logger.Logger; import tools.Localization; -public class UIHelpers +public class LoadingModal { - public static Stage showModal(String title, String message, Stage owner, Image icon) + private static Stage modalStage; + private static ModalController modalController; + + public static void showModal(Controller controller, String title, String message, Stage owner, Image icon) + { + closeModal(); + modalStage = createModal(controller, title, message, owner, icon); + } + + public static void setMessage(String message) + { + if(modalController != null) + { + modalController.setMessage(message); + } + } + + public static void closeModal() + { + if(modalStage != null) + { + modalController.closeAlert(); + modalStage.close(); + modalStage = null; + modalController = null; + } + } + + public static boolean isShowing() + { + return modalStage != null && modalStage.isShowing(); + } + + private static Stage createModal(Controller controller, String title, String message, Stage owner, Image icon) { try { @@ -29,8 +63,8 @@ public class UIHelpers newStage.setScene(new Scene(root)); newStage.getIcons().add(icon); newStage.setResizable(false); - ModalController newController = fxmlLoader.getController(); - newController.init(newStage, message); + modalController = fxmlLoader.getController(); + modalController.init(controller, newStage, message); newStage.show(); return newStage; @@ -41,4 +75,4 @@ public class UIHelpers return null; } } -} \ No newline at end of file +} diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties index 81951d930556fffb50b58fd5fa42cef0e9c0b73a..ec351e3a352c2b0d027e065f23f7b2b8ba21b261 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties @@ -1,10 +1,10 @@ # DEFAULT app.name=BudgetMaster -version.code=12 -version.name=1.7.1 -version.date=07.11.17 +version.code=13 +version.name=1.8.0 +version.date=17.12.17 author=Robert Goldmann -credits=L�nderflaggen von Freepik auf https://www.flaticon.com\nVerwendete Schriftarten: OpenSans +credits=L�nderflaggen von Freepik auf https://www.flaticon.com\nVerwendete Schriftarten: OpenSans\nVerwendete Bibliotheken:\ngson 2.8.1\njoda-time 2.9.7\nitextpdf 5.0.6\nlaunch4j-maven-plugin 1.7.21\nspark-core 2.5.4\nslf4j 1.7.21\nmysql-connector 6.0.5\njunit 4.12\nsqlite-jdbc 3.21.0 folder=Deadlocker/BudgetMaster roadmap.url=https://deadlocker.thecodelabs.de/roadmap/php/index.php?id=1 @@ -47,6 +47,10 @@ 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... load.search=Buchungen werden gesucht, bitte warten... +load.local.server=Starte lokalen Server, bitte warten... +load.download.local.server=Lade lokalen Server herunter, bitte warten... +load.local.server.connect=Verbinde mit lokalem Server, bitte warten... +load.local.server.retry=Verbinde mit lokalem Server... (Versuch {0}/{1}) # MISC category.none=Keine Kategorie @@ -67,6 +71,13 @@ trusted.hosts.placeholder=z.B. localhost undefined=unbekannt tagfield.placeholder=Neuen Tag hier eingeben shortcut.dev.console=F12 +local.server.status.ok=Server ist gestartet. +local.server.status.not.started=Server konnte nicht gestartet werden. +local.server.action.not.started=Starten +local.server.status.not.present=Server nicht gefunden. +local.server.action.not.present=Herunterladen +local.server.status.incompatible=Server nicht kompatibel. +local.server.action.incompatible=Aktualisieren # REPORT report.position=Nr. @@ -155,8 +166,10 @@ info.text.update.available.show.changes.detailed=(detaillierte Infos auf GitHub. info.text.update.available.now=Jetzt updaten info.title.start.after.update=Update erfolgreich info.header.text.start.after.update=BudgetMaster wurde erfolgreich auf Version {0} aktualisiert -info.text.start.after.update=Hinweis: Der BudgetMasterServer muss manuell von dir geupdated werden! +info.text.start.after.update=Hinweis: Der BudgetMasterServer muss manuell von dir geupdated werden, sofern es sich um keinen lokalen Server handelt! info.tags=Es erscheinen Vorschl�ge basierend auf bereits verwendeten Tags sobald du zu tippen beginnst.\n\nEnter - F�gt den Inhalt des Eingabefelds als neuen Tag hinzu.\nPfeil nach unten - �ffnet die Vorschl�ge, wenn das Eingabefeld leer ist. +info.title.shutdown=BudgetMaster beenden +info.text.shutdown=M�chtest du BudgetMaster wirklich beenden?\nDies kann w�hrend der Ausf�hrung von Aufgaben zu unvorhersebaren Konsequenzen f�hren. # WARNING warning.enddate.before.startdate=Das Enddatum darf zeitlich nicht vor dem Startdatum liegen. @@ -169,7 +182,7 @@ warning.empty.category.name=Das Feld f warning.empty.payment.name=Das Feld f�r den Namen darf nicht leer sein. warning.name.character.limit.reached.45=Der Name darf maximal 45 Zeichen lang sein. warning.name.character.limit.reached.150=Der Name darf maximal 150 Zeichen lang sein. -warning.description.character.limit.reached.150=Die Notiz darf maximal 150 Zeichen lang sein. +warning.description.character.limit.reached.200=Die Notiz darf maximal 200 Zeichen lang sein. warning.tag.character.limit.reached.45=Der Name eines Tags darf maximal 45 Zeichen lang sein. warning.payment.amount=Gib eine g�ltige Zahl f�r den Betrag ein. warning.empty.payment.date=Bitte w�hle ein Datum aus. @@ -208,6 +221,8 @@ 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} error.open.browser=Beim �ffnen des Standardwebbrowsers ist ein Fehler aufgetreten. +error.local.server.start=Beim Starten des BudgetMasterServers ist ein Fehler aufgetreten.\n\n{0} +error.local.server.download=Beim Herunterladen des BudgetMasterServers ist ein Fehler aufgetreten.\n\n{0} # UI categorytab.button.category.new=\ Neue Kategorie @@ -267,7 +282,8 @@ category.new.label.color=Farbe: category.new.button.save=Speichern payment.new.label.name=Name: -payment.new.label.max.characters=(max. 150 Zeichen) +payment.new.label.max.characters.name=(max. 150 Zeichen) +payment.new.label.max.characters.description=(max. 200 Zeichen) payment.new.label.amount=Betrag: payment.new.label.category=Kategorie: payment.new.label.date=Datum: @@ -277,7 +293,7 @@ payment.new.label.repeating=Wiederholung: payment.new.label.repeating.all=Alle payment.new.label.repeating.days=Tage payment.new.label.repeating.monthday=jeden Monat am: -payment.new.label.enddate=Enddatum +payment.new.label.enddate=Enddatum: payment.new.button.save=Speichern paymenttab.button.new.income=\ Neue Einnahme @@ -294,6 +310,7 @@ reporttab.checkbox.inclue.categorybudgets=Verbrauch nach Kategorien hinzuf reporttab.button.generate.report=Bericht erzeugen settingstab.label.secret.client=Client Passwort: +settingstab.label.status=Status: settingstab.label.url=Server URL: settingstab.label.secret.server=Server Passwort: settingstab.label.currency=W�hrung: @@ -312,7 +329,9 @@ settingstab.button.updates.search=Suchen settingstab.button.updates.automatic=Automatisch suchen settingstab.label.updates.current.version=Installiert: settingstab.label.updates.latest.version=Verf�gbar: -settings.tab.button.save=Speichern +settingstab.button.save=Speichern +settingstab.button.server.online=Online Server +settingstab.button.server.local=Lokaler Server splashscreen.label.password=Passwort: @@ -325,7 +344,7 @@ about= about.roadmap.link=Roadmap �ffnen about.version=Version: about.date=Datum: -about.author=Author: +about.author=Autor: about.roadmap=Roadmap: about.sourcecode=Quellcode: about.credits=Credits: diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties index a796625baa65663bd8257e251732a05e62a98fe0..4157b60f9dac6646fcfd11697aba3b693336f15a 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties @@ -1,10 +1,10 @@ # DEFAULT app.name=BudgetMaster -version.code=12 -version.name=1.7.1 -version.date=07.11.17 +version.code=13 +version.name=1.8.0 +version.date=17.12.17 author=Robert Goldmann -credits=Flags by Freepik on https://www.flaticon.com\nFonts used: OpenSans +credits=Flags by Freepik on https://www.flaticon.com\nFonts used: OpenSans\nLibraries used:\ngson 2.8.1\njoda-time 2.9.7\nitextpdf 5.0.6\nlaunch4j-maven-plugin 1.7.21\nspark-core 2.5.4\nslf4j 1.7.21\nmysql-connector 6.0.5\njunit 4.12\nsqlite-jdbc 3.21.0 folder=Deadlocker/BudgetMaster roadmap.url=https://deadlocker.thecodelabs.de/roadmap/php/index.php?id=2 @@ -47,6 +47,10 @@ 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... load.search=Please wait while payments are being searched... +load.local.server=Please wait while the local server is being started... +load.download.local.server=Please wait while the local server is being downloaded... +load.local.server.connect=Connecting to local server... +load.local.server.retry=Connecting to local server... (Retry {0}/{1}) # MISC category.none=No Category @@ -67,6 +71,13 @@ trusted.hosts.placeholder=e.g. localhost undefined=undefined tagfield.placeholder=Enter new Tag here shortcut.dev.console=F12 +local.server.status.ok=Server is running. +local.server.status.not.started=Server couldn't be started. +local.server.action.not.started=Start +local.server.status.not.present=Server not found. +local.server.action.not.present=Download +local.server.status.incompatible=Server is incompatible. +local.server.action.incompatible=Update # REPORT report.position=No. @@ -153,10 +164,12 @@ info.text.update.available=An update is available.\nNew version: {0}\n\n info.text.update.available.show.changes=Show Changes (opens web browsers) info.text.update.available.show.changes.detailed=(detailed information on GitHub.com) info.text.update.available.now=Update Now -info.title.start.after.update=Update successfull +info.title.start.after.update=Update successful info.header.text.start.after.update=Successfully updated BudgetMaster to version {0} -info.text.start.after.update=Note: You have to update the BudgetMasterServer manually! +info.text.start.after.update=Note: You have to update the BudgetMasterServer manually, if it's no local server! info.tags=Suggestions based on already used tags will show up once you start typing.\n\nEnter - Appends the current input field content as a new tag.\nArrow Down - Opens the suggestions if the input field is empty. +info.title.shutdown=Shutdown BudgetMaster +info.text.shutdown=Do you really want to shutdown BudgetMaster? This could lead to unforeseen consequences during running tasks. # WARNING warning.enddate.before.startdate=The end date can not be earlier than the start date. @@ -169,7 +182,7 @@ warning.empty.category.name=The field for the name can not be empty. warning.empty.payment.name=The field for the name can not be empty. warning.name.character.limit.reached.45=The name must not exceed 45 characters in length. warning.name.character.limit.reached.150=The name must not exceed 150 characters in length. -warning.description.character.limit.reached.150=The description must not exceed 150 characters in length. +warning.description.character.limit.reached.200=The description must not exceed 200 characters in length. warning.tag.character.limit.reached.45=A tag name must not exceed 45 characters in length. warning.payment.amount=Please enter a valid number in the amount field. warning.empty.payment.date=Please select a date. @@ -208,6 +221,8 @@ 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} error.open.browser=An error occurred while opening the default web browser. +error.local.server.start=An error occurred while starting the BudgetMasterServer.\n\n{0} +error.local.server.download=An error occurred while downloading the BudgetMasterServer.\n\n{0} # UI categorytab.button.category.new=\ New Category @@ -267,7 +282,8 @@ category.new.label.color=Color: category.new.button.save=Save payment.new.label.name=Name: -payment.new.label.max.characters=(up to 150 characters) +payment.new.label.max.characters.name=(up to 150 characters) +payment.new.label.max.characters.description=(up to 200 characters) payment.new.label.amount=Amount: payment.new.label.category=Category: payment.new.label.date=Date: @@ -277,7 +293,7 @@ payment.new.label.repeating=Repeating: payment.new.label.repeating.all=every payment.new.label.repeating.days=days payment.new.label.repeating.monthday=every month at: -payment.new.label.enddate=Enddate +payment.new.label.enddate=Enddate: payment.new.button.save=Save paymenttab.button.new.income=\ New Income @@ -294,6 +310,7 @@ reporttab.checkbox.inclue.categorybudgets=Include consumption by categories reporttab.button.generate.report=Create Report settingstab.label.secret.client=Client Password: +settingstab.label.status=Status: settingstab.label.url=Server URL: settingstab.label.secret.server=Server Password: settingstab.label.currency=Currency: @@ -312,7 +329,9 @@ settingstab.button.updates.search=Search settingstab.button.updates.automatic=Automatic search settingstab.label.updates.current.version=Current Version: settingstab.label.updates.latest.version=Latest Version: -settings.tab.button.save=Save +settingstab.button.save=Save +settingstab.button.server.online=Online Server +settingstab.button.server.local=Local Server splashscreen.label.password=Password: diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml index a387c946ed7d6510e40e3d1630f61220b53fd1b5..3035ad10f079602fa1eff6efa1a6dc966af80919 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml @@ -96,8 +96,8 @@ <Font name="System Bold" size="16.0" /> </font> </Label> - <ComboBox fx:id="comboBoxStartMonth" prefHeight="25.0" prefWidth="110.0" /> - <ComboBox fx:id="comboBoxStartYear" prefWidth="70.0" /> + <ComboBox fx:id="comboBoxStartMonth" prefHeight="25.0" prefWidth="115.0" /> + <ComboBox fx:id="comboBoxStartYear" prefWidth="100.0" HBox.hgrow="ALWAYS" /> </children> </HBox> <HBox alignment="CENTER_LEFT" spacing="10.0"> @@ -107,8 +107,8 @@ <Font name="System Bold" size="16.0" /> </font> </Label> - <ComboBox fx:id="comboBoxEndMonth" prefWidth="110.0" /> - <ComboBox fx:id="comboBoxEndYear" prefWidth="70.0" /> + <ComboBox fx:id="comboBoxEndMonth" prefWidth="115.0" /> + <ComboBox fx:id="comboBoxEndYear" prefWidth="100.0" /> </children> </HBox> </children> diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml index 77b86bc0a1dc9b58c5bec77965f3fbcbdb01f77e..822227df871ae698269f5400859ade651801cb7c 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml @@ -6,7 +6,7 @@ <?import javafx.scene.layout.HBox?> <?import javafx.scene.text.Font?> -<AnchorPane fx:id="anchorPaneMain" prefHeight="100.0" prefWidth="375.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.ModalController"> +<AnchorPane fx:id="anchorPaneMain" prefHeight="100.0" prefWidth="450.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.ModalController"> <children> <HBox alignment="CENTER_LEFT" spacing="10.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> <children> diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml index caffbf8e6bc624e604153a6bbe9a71f18a02541c..fc79d7620bd15adae658ba5f490b8edb948caeb1 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml @@ -32,7 +32,7 @@ <Font name="System Bold" size="14.0" /> </font> </Label> - <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters"> + <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters.name"> <font> <Font size="11.0" /> </font> @@ -95,7 +95,7 @@ <Font name="System Bold" size="14.0" /> </font> </Label> - <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters"> + <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters.description"> <font> <Font size="11.0" /> </font> @@ -190,6 +190,7 @@ <Font name="System Bold" size="14.0" /> </font> </Label> + <CheckBox fx:id="checkBoxEndDate" mnemonicParsing="false" /> <DatePicker fx:id="datePickerEnddate" maxWidth="1.7976931348623157E308" prefHeight="29.0" HBox.hgrow="ALWAYS" /> </children> </HBox> diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml deleted file mode 100644 index c853b86e2034c064b80f6435fc5bd2381fd02d5d..0000000000000000000000000000000000000000 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml +++ /dev/null @@ -1,224 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<?import javafx.geometry.Insets?> -<?import javafx.scene.control.Button?> -<?import javafx.scene.control.CheckBox?> -<?import javafx.scene.control.ComboBox?> -<?import javafx.scene.control.Label?> -<?import javafx.scene.control.RadioButton?> -<?import javafx.scene.control.ScrollPane?> -<?import javafx.scene.control.TextArea?> -<?import javafx.scene.control.TextField?> -<?import javafx.scene.layout.AnchorPane?> -<?import javafx.scene.layout.HBox?> -<?import javafx.scene.layout.Region?> -<?import javafx.scene.layout.VBox?> -<?import javafx.scene.text.Font?> - -<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.SettingsController"> - <children> - <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> - <children> - <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS"> - <content> - <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0"> - <children> - <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0"> - <children> - <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelURL" prefHeight="25.0" text="%settingstab.label.url"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret" prefHeight="25.0" text="%settingstab.label.secret.server"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelSecret111" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" minHeight="60.0" prefWidth="158.0" text="%settingstab.label.trusted.hosts" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="-7.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret1111" alignment="CENTER" contentDisplay="CENTER" maxHeight="-Infinity" text="%settingstab.label.trusted.hosts.info" textAlignment="CENTER" wrapText="true" VBox.vgrow="ALWAYS"> - <font> - <Font size="14.0" /> - </font> - <VBox.margin> - <Insets top="-20.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="50.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="5.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="5.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="15.0" /> - </VBox.margin> - </Label> - <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" /> - </children> - <HBox.margin> - <Insets right="25.0" /> - </HBox.margin> - </VBox> - <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS"> - <children> - <TextField fx:id="textFieldClientSecret" /> - <TextField fx:id="textFieldURL" /> - <TextField fx:id="textFieldSecret" /> - <TextField fx:id="textFieldCurrency" /> - <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> - <children> - <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated"> - <font> - <Font size="14.0" /> - </font> - <HBox.margin> - <Insets /> - </HBox.margin> - </RadioButton> - <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS"> - <font> - <Font size="14.0" /> - </font> - </RadioButton> - </children> - </HBox> - <TextArea fx:id="textAreaTrustedHosts" maxHeight="122.0" minHeight="122.0" prefHeight="122.0" prefWidth="539.0"> - <VBox.margin> - <Insets /> - </VBox.margin> - </TextArea> - <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" /> - <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> - <children> - <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - </Button> - <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - </Button> - <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - </Button> - </children> - <VBox.margin> - <Insets /> - </VBox.margin> - </HBox> - <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0"> - <children> - <VBox minWidth="210.0" spacing="10.0" HBox.hgrow="ALWAYS"> - <children> - <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" /> - <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic"> - <font> - <Font size="13.0" /> - </font> - </CheckBox> - </children> - </VBox> - <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> - <children> - <Label fx:id="labelSecret11111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true"> - <font> - <Font name="System Bold" size="13.0" /> - </font> - </Label> - <Label fx:id="labelSecret111111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true"> - <font> - <Font name="System Bold" size="13.0" /> - </font> - <VBox.margin> - <Insets /> - </VBox.margin> - </Label> - </children> - </VBox> - <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> - <children> - <Label fx:id="labelCurrentVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> - <font> - <Font size="13.0" /> - </font> - </Label> - <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> - <font> - <Font size="13.0" /> - </font> - </Label> - </children> - </VBox> - </children> - </HBox> - <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settings.tab.button.save"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - <VBox.margin> - <Insets top="15.0" /> - </VBox.margin> - </Button> - <Region prefWidth="158.0" VBox.vgrow="ALWAYS" /> - </children> - </VBox> - </children> - </HBox> - </content> - </ScrollPane> - </children> - </VBox> - </children> -</AnchorPane> diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml new file mode 100644 index 0000000000000000000000000000000000000000..effda26ce6112e3705520d9762a2544708a2221b --- /dev/null +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.CheckBox?> +<?import javafx.scene.control.ComboBox?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.ScrollPane?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Region?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Font?> + +<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.settings.LocalServerSettingsController"> + <children> + <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> + <children> + <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS"> + <content> + <VBox spacing="14.0"> + <children> + <HBox alignment="TOP_CENTER"> + <children> + <ToggleButton fx:id="toggleButtonOnline" mnemonicParsing="false" text="%settingstab.button.server.online" /> + <ToggleButton fx:id="toggleButtonLocal" mnemonicParsing="false" text="%settingstab.button.server.local" /> + </children> + </HBox> + <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0"> + <children> + <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0"> + <children> + <Label fx:id="labelStatus" prefHeight="25.0" text="%settingstab.label.status"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Label> + <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + <HBox.margin> + <Insets right="25.0" /> + </HBox.margin> + <padding> + <Insets top="3.0" /> + </padding> + </VBox> + <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS"> + <children> + <HBox alignment="CENTER_LEFT" spacing="10.0"> + <children> + <Label fx:id="labelLocalServerStatus" prefHeight="25.0"> + <font> + <Font size="14.0" /> + </font> + </Label> + <Button fx:id="buttonLocalServerAction" mnemonicParsing="false"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + </children> + </HBox> + <TextField fx:id="textFieldClientSecret" /> + <TextField fx:id="textFieldCurrency" /> + <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated"> + <font> + <Font size="14.0" /> + </font> + <HBox.margin> + <Insets /> + </HBox.margin> + </RadioButton> + <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS"> + <font> + <Font size="14.0" /> + </font> + </RadioButton> + </children> + </HBox> + <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" /> + <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + </children> + <VBox.margin> + <Insets /> + </VBox.margin> + </HBox> + <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0"> + <children> + <VBox spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" /> + <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic"> + <font> + <Font size="13.0" /> + </font> + </CheckBox> + </children> + </VBox> + <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label contentDisplay="CENTER" minHeight="30.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + </Label> + <Label alignment="TOP_LEFT" contentDisplay="CENTER" minHeight="25.0" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + </children> + </VBox> + <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label fx:id="labelCurrentVersion" contentDisplay="CENTER" minHeight="30.0" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + </children> + </VBox> + </children> + </HBox> + <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settingstab.button.save"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Button> + <Region prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + </VBox> + </children> + </HBox> + </children> + </VBox> + </content> + </ScrollPane> + </children> + </VBox> + </children> +</AnchorPane> diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml new file mode 100644 index 0000000000000000000000000000000000000000..69d8a1e129035349e20592a74ab7b44cb55cebdc --- /dev/null +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml @@ -0,0 +1,235 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.CheckBox?> +<?import javafx.scene.control.ComboBox?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.ScrollPane?> +<?import javafx.scene.control.TextArea?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Region?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Font?> + +<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.settings.OnlineServerSettingsController"> + <children> + <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> + <children> + <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS"> + <content> + <VBox spacing="14.0"> + <children> + <HBox alignment="TOP_CENTER"> + <children> + <ToggleButton fx:id="toggleButtonOnline" mnemonicParsing="false" text="%settingstab.button.server.online" /> + <ToggleButton fx:id="toggleButtonLocal" mnemonicParsing="false" text="%settingstab.button.server.local" /> + </children> + </HBox> + <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0"> + <children> + <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0"> + <children> + <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelURL" prefHeight="25.0" text="%settingstab.label.url"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret" prefHeight="25.0" text="%settingstab.label.secret.server"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret111" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" minHeight="60.0" prefWidth="158.0" text="%settingstab.label.trusted.hosts" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="-7.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret1111" alignment="CENTER" contentDisplay="CENTER" maxHeight="-Infinity" text="%settingstab.label.trusted.hosts.info" textAlignment="CENTER" wrapText="true" VBox.vgrow="ALWAYS"> + <font> + <Font size="14.0" /> + </font> + <VBox.margin> + <Insets top="-20.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="50.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Label> + <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + <HBox.margin> + <Insets right="25.0" /> + </HBox.margin> + </VBox> + <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS"> + <children> + <TextField fx:id="textFieldClientSecret" /> + <TextField fx:id="textFieldURL" /> + <TextField fx:id="textFieldSecret" /> + <TextField fx:id="textFieldCurrency" /> + <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated"> + <font> + <Font size="14.0" /> + </font> + <HBox.margin> + <Insets /> + </HBox.margin> + </RadioButton> + <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS"> + <font> + <Font size="14.0" /> + </font> + </RadioButton> + </children> + </HBox> + <TextArea fx:id="textAreaTrustedHosts" maxHeight="122.0" minHeight="122.0" prefHeight="122.0" prefWidth="539.0"> + <VBox.margin> + <Insets /> + </VBox.margin> + </TextArea> + <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" /> + <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + </children> + <VBox.margin> + <Insets /> + </VBox.margin> + </HBox> + <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0"> + <children> + <VBox spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" /> + <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic"> + <font> + <Font size="13.0" /> + </font> + </CheckBox> + </children> + </VBox> + <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label contentDisplay="CENTER" minHeight="30.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + </Label> + <Label alignment="TOP_LEFT" contentDisplay="CENTER" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + </children> + </VBox> + <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label fx:id="labelCurrentVersion" contentDisplay="CENTER" minHeight="30.0" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + </children> + </VBox> + </children> + </HBox> + <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settingstab.button.save"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Button> + <Region prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + </VBox> + </children> + </HBox> + </children> + </VBox> + </content> + </ScrollPane> + </children> + </VBox> + </children> +</AnchorPane> diff --git a/BudgetMasterCore/pom.xml b/BudgetMasterCore/pom.xml index 378e55ce7636d2d06a38be2dacd30be6a3d3dae1..73e1ad26d5b81d6e1d7e7a5b67b9a7826db301e6 100644 --- a/BudgetMasterCore/pom.xml +++ b/BudgetMasterCore/pom.xml @@ -37,7 +37,7 @@ <dependency> <groupId>de.deadlocker8</groupId> <artifactId>tools</artifactId> - <version>1.0</version> + <version>1.0.0</version> <scope>system</scope> <systemPath>${basedir}/../lib/Tools.jar</systemPath> </dependency> diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java new file mode 100644 index 0000000000000000000000000000000000000000..9db45810d8bf6e7bbb5569e4b0eea0f87383d701 --- /dev/null +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java @@ -0,0 +1,6 @@ +package de.deadlocker8.budgetmaster.logic; + +public enum ServerType +{ + ONLINE, LOCAL; +} \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java index a0dbe9f2ae1bfa96612bde1769ea1b7d2f492e62..dd115b4e200e52e761e7a6c934a6a3324f582fbd 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java @@ -13,11 +13,14 @@ public class Settings * --> 1 * initial * + * --> 2 + * added field for "serverType" + * */ - @SuppressWarnings("unused") private final String TYPE = SaveFileType.BUDGETMASTER_SETTINGS.toString(); - private final int VERSION = 1; + private final int VERSION = 2; + private ServerType serverType; private String clientSecret; private String url; private String secret; @@ -30,7 +33,17 @@ public class Settings public Settings() { - } + } + + public ServerType getServerType() + { + return serverType; + } + + public void setServerType(ServerType serverType) + { + this.serverType = serverType; + } public String getClientSecret() { @@ -132,7 +145,7 @@ public class Settings @Override public String toString() { - return "Settings [TYPE=" + TYPE + ", VERSION=" + VERSION + ", clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + ", language=" + language + ", autoUpdateCheckEnabled=" - + autoUpdateCheckEnabled + "]"; + return "Settings [TYPE=" + TYPE + ", VERSION=" + VERSION + ", serverType=" + serverType + ", clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + ", language=" + language + + ", autoUpdateCheckEnabled=" + autoUpdateCheckEnabled + "]"; } } \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerException.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerException.java new file mode 100644 index 0000000000000000000000000000000000000000..13c3778cb70c92e56936aa3a834a75ea0920b0a7 --- /dev/null +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerException.java @@ -0,0 +1,11 @@ +package de.deadlocker8.budgetmaster.logic.localserver; + +public class LocalServerException extends Exception +{ + private static final long serialVersionUID = 3925464782915168752L; + + public LocalServerException(String message) + { + super(message); + } +} \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerHandler.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..3e438320b1f83747feeaf48f4650a6eea7b28b75 --- /dev/null +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerHandler.java @@ -0,0 +1,144 @@ +package de.deadlocker8.budgetmaster.logic.localserver; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.net.URL; +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 de.deadlocker8.budgetmaster.logic.Settings; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import logger.Logger; +import tools.HashUtils; +import tools.Localization; +import tools.PathUtils; + +public class LocalServerHandler +{ + private static final String BUILD_FOLDER = "https://github.com/deadlocker8/BudgetMaster/raw/{}/build/"; + + public LocalServerHandler() + { + + } + + public boolean isServerPresent() + { + File file = new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMasterServer.jar"); + return file.exists(); + } + + public boolean isServerRunning() + { + try + { + Settings settings = new Settings(); + settings.setUrl("https://localhost:9000"); + settings.setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT)); + ArrayList<String> trustedHosts = new ArrayList<>(); + trustedHosts.add("localhost"); + settings.setTrustedHosts(trustedHosts); + ServerConnection connection = new ServerConnection(settings); + connection.getServerInfo(); + + return true; + } + catch(Exception e) + { + Logger.debug(e); + return false; + } + } + + public void shutdownServer() throws Exception + { + Settings settings = new Settings(); + settings.setUrl("https://localhost:9000"); + settings.setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT)); + ArrayList<String> trustedHosts = new ArrayList<>(); + trustedHosts.add("localhost"); + settings.setTrustedHosts(trustedHosts); + ServerConnection connection = new ServerConnection(settings); + connection.shutdownServer(); + } + + public void createServerSettingsIfNotExists() throws FileNotFoundException + { + File settingsFile = new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/settings.json"); + if(settingsFile.exists()) + { + return; + } + Logger.debug("Creating settings file for local server..."); + + String databasePath = PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMaster.db"; + String settings = "{\"databaseType\": \"sqlite\"," + + "\"databaseUrl\": \"" + databasePath.replace("\\", "/") + "\"," + + "\"databaseName\": \"budgetmaster\"," + + "\"databaseUsername\": \"root\"," + + "\"databasePassword\": \"\"," + + "\"serverPort\": 9000," + + "\"serverSecret\": \"BudgetMaster\"," + + "\"keystorePath\": \"default\"," + + "\"keystorePassword\": \"BudgetMaster\"}"; + PrintWriter writer = new PrintWriter(settingsFile); + writer.println(settings); + writer.close(); + } + + public void downloadServer(String versionName) throws Exception + { + Logger.debug("Downloading BudgetMasterServer from " + BUILD_FOLDER.replace("{}", "v" + versionName)); + PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer")); + + //download into temp directory and file + Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMasterServer.jar"); + download(BUILD_FOLDER.replace("{}", "v" + "1.7.0") + "BudgetMasterServer.jar", target); + Logger.debug("Successfully downloaded BudgetMasterServer " + versionName); + } + + private void download(String url, Path target) throws IOException + { + URL website = new URL(url); + InputStream in = website.openStream(); + Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING); + } + + public Process startServer() throws IOException + { + ProcessBuilder pb = new ProcessBuilder("java", "-jar", Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMasterServer.jar").toString()); + return pb.start(); + } + + public LocalServerStatus getServerStatus() + { + LocalServerHandler serverHandler = new LocalServerHandler(); + if(serverHandler.isServerPresent()) + { + Logger.debug("Local server found"); + if(serverHandler.isServerRunning()) + { + Logger.debug("Local server is running"); + return LocalServerStatus.ACTIVE; + } + else + { + Logger.debug("Local server is NOT running"); + return LocalServerStatus.INACTIVE; + } + } + else + { + Logger.debug("Local server NOT found"); + return LocalServerStatus.MISSING; + } + } +} \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerStatus.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerStatus.java new file mode 100644 index 0000000000000000000000000000000000000000..7f36dcd26e0a4cb093f2783293089044c82dd86f --- /dev/null +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerStatus.java @@ -0,0 +1,6 @@ +package de.deadlocker8.budgetmaster.logic.localserver; + +public enum LocalServerStatus +{ + ACTIVE, INACTIVE, MISSING; +} \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java index 780c74199c5d76709ea2667640cf462e138574b5..73166530c9db3bce34c556496334264efbbe85d2 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java @@ -87,6 +87,7 @@ public class ReportGenerator PdfPCell cell = new PdfPCell(new Phrase(column.getName(), font)); cell.setBackgroundColor(GrayColor.LIGHT_GRAY); cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); table.addCell(cell); } @@ -114,6 +115,7 @@ public class ReportGenerator PdfPCell cell = new PdfPCell(new Phrase(getProperty(currentItem, column), font)); cell.setBackgroundColor(new BaseColor(Color.WHITE)); cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); table.addCell(cell); } } @@ -141,6 +143,7 @@ public class ReportGenerator cellTotal.setBackgroundColor(new BaseColor(Color.WHITE)); cellTotal.setColspan(numberOfColumns); cellTotal.setHorizontalAlignment(Element.ALIGN_RIGHT); + cellTotal.setVerticalAlignment(Element.ALIGN_MIDDLE); table.addCell(cellTotal); return table; @@ -245,11 +248,13 @@ public class ReportGenerator PdfPCell cellName = new PdfPCell(new Phrase(budget.getCategory().getName(), font)); cellName.setBackgroundColor(new BaseColor(Color.WHITE)); cellName.setHorizontalAlignment(Element.ALIGN_CENTER); + cellName.setVerticalAlignment(Element.ALIGN_MIDDLE); table.addCell(cellName); PdfPCell cellAmount = new PdfPCell(new Phrase(Helpers.getCurrencyString(budget.getBudget() / 100.0, currency), font)); cellAmount.setBackgroundColor(new BaseColor(Color.WHITE)); cellAmount.setHorizontalAlignment(Element.ALIGN_CENTER); + cellAmount.setVerticalAlignment(Element.ALIGN_MIDDLE); table.addCell(cellAmount); } diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java index cd04ca5d70863a407fd6ca139a189ea4eb86570d..92ea3b1cfd035e865888bd082df97b96900eace6 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java @@ -3,9 +3,11 @@ package de.deadlocker8.budgetmaster.logic.serverconnection; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.lang.reflect.Type; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.security.cert.X509Certificate; import java.util.ArrayList; @@ -492,7 +494,7 @@ public class ServerConnection httpsCon.setRequestProperty("Accept", "application/json"); httpsCon.setDoInput(true); httpsCon.setDoOutput(true); - PrintWriter writer = new PrintWriter(httpsCon.getOutputStream()); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(httpsCon.getOutputStream(), StandardCharsets.UTF_8)); writer.write(databaseJSON); writer.flush(); writer.close(); @@ -614,6 +616,24 @@ public class ServerConnection else { throw new ServerConnectionException(String.valueOf(httpsCon.getResponseCode())); - } + } + } + + public void shutdownServer() throws Exception + { + URL url = new URL(settings.getUrl() + "/shutdown?secret=" + Helpers.getURLEncodedString(settings.getSecret())); + HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection(); + httpsCon.setRequestMethod("GET"); + httpsCon.setDoInput(true); + if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK) + { + InputStream stream = httpsCon.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + reader.close(); + } + else + { + throw new ServerConnectionException(String.valueOf(httpsCon.getResponseCode())); + } } } \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java new file mode 100644 index 0000000000000000000000000000000000000000..12638c224f8de8328e058b3024f7849c46b726c9 --- /dev/null +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java @@ -0,0 +1,67 @@ +package de.deadlocker8.budgetmaster.logic.tag; + +import java.util.ArrayList; +import java.util.HashMap; + +import de.deadlocker8.budgetmaster.logic.payment.Payment; +import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; + +public class TagCache +{ + private HashMap<Integer, ArrayList<Tag>> normalPaymentTagCache; + private HashMap<Integer, ArrayList<Tag>> repeatingPaymentTagCache; + + public TagCache() + { + clear(); + } + + public void clear() + { + normalPaymentTagCache = new HashMap<>(); + repeatingPaymentTagCache = new HashMap<>(); + } + + public void addTags(Payment payment, ArrayList<Tag> tags) + { + if(payment instanceof RepeatingPaymentEntry) + { + repeatingPaymentTagCache.put(((RepeatingPaymentEntry)payment).getRepeatingPaymentID(), tags); + } + else + { + normalPaymentTagCache.put(payment.getID(), tags); + } + } + + public ArrayList<Tag> getTags(Payment payment) + { + if(payment instanceof RepeatingPaymentEntry) + { + RepeatingPaymentEntry repeatingPayment = (RepeatingPaymentEntry)payment; + if(repeatingPaymentTagCache.containsKey(repeatingPayment.getRepeatingPaymentID())) + { + return repeatingPaymentTagCache.get(repeatingPayment.getRepeatingPaymentID()); + } + } + else + { + if(normalPaymentTagCache.containsKey(payment.getID())) + { + return normalPaymentTagCache.get(payment.getID()); + } + } + + return null; + } + + public HashMap<Integer, ArrayList<Tag>> getNormalPaymentTagCache() + { + return normalPaymentTagCache; + } + + public HashMap<Integer, ArrayList<Tag>> getRepeatingPaymentTagCache() + { + return repeatingPaymentTagCache; + } +} \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java index d4f0f17311eadfa9020c542847211701d7fcb40b..a6fb9dfe3b538dffc630e4a5d30fcd5fe1833686 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java @@ -11,15 +11,22 @@ import de.deadlocker8.budgetmaster.logic.serverconnection.ServerTagConnection; public class TagHandler { private Settings settings; + private TagCache tagCache; public TagHandler(Settings settings) { this.settings = settings; + this.tagCache = new TagCache(); } public ArrayList<Tag> getTags(Payment payment) throws Exception { ArrayList<Tag> tags = new ArrayList<>(); + ArrayList<Tag> cachedTags = tagCache.getTags(payment); + if(cachedTags != null) + { + return cachedTags; + } ServerTagConnection connection = new ServerTagConnection(settings); @@ -32,6 +39,8 @@ public class TagHandler tags.addAll(connection.getAllTagsForRepeatingPayment(((RepeatingPaymentEntry)payment).getRepeatingPaymentID())); } + tagCache.addTags(payment, tags); + return tags; } diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java index 7d394d24822956a1d04fd86912a643e6419d25c0..1403601fb0f381e4136bb805b2ca01509c52da98 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java @@ -11,6 +11,7 @@ public class Colors public static final Color BACKGROUND = Color.web("#F4F4F4"); public static final Color BACKGROUND_MAIN = Color.web("#DDDDDD"); public static final Color BACKGROUND_BUTTON_BLUE = Color.web("#2E79B9"); + public static final Color BACKGROUND_BUTTON_DARK_BLUE = Color.web("#246091"); public static final Color BACKGROUND_BUTTON_RED = Color.web("#FF5047"); public static final Color BACKGROUND_NOTIFICATION = Color.web("#323232"); public static final Color BACKGROUND_REPORT_TABLE_HEADER_DISABLED = Color.SALMON; diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java index e5fc1cdd230014cb5b65fb3debe0c2a26a5e3492..b6f809e40b2bb71e03a897ecad488896064ceb98 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java @@ -102,31 +102,5 @@ public class FileHelper Writer writer = Files.newBufferedWriter(Paths.get(file.getAbsolutePath()), Charset.forName("UTF-8")); writer.write(databaseJSON); writer.close(); - } - - public static Object loadObjectFromJSON(String fileName, Object objectype) - { - try - { - Gson gson = new Gson(); - Reader reader = Files.newBufferedReader(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8")); - Object preferences = gson.fromJson(reader, objectype.getClass()); - reader.close(); - return preferences; - } - catch(IOException e) - { - return null; - } - } - - public static void saveObjectToJSON(String fileName, Object objectToSave) throws IOException - { - Gson gson = new Gson(); - String jsonString = gson.toJson(objectToSave); - PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER))); - Writer writer = Files.newBufferedWriter(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8")); - writer.write(jsonString); - writer.close(); - } + } } \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java index 9f031cf910a597139a59065ca9a8956a98b938f2..6bd8a0a6c8f9cbd371ff0bf5b893c9c28fdd0e8c 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java @@ -7,8 +7,6 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import fontAwesome.FontIcon; -import fontAwesome.FontIconType; import javafx.scene.paint.Color; import tools.Localization; @@ -98,16 +96,7 @@ public class Helpers colors.add(Colors.CATEGORIES_DARK_GREEN); return colors; - } - - public static FontIcon getFontIcon(FontIconType type, int size, Color color) - { - FontIcon icon = new FontIcon(type); - icon.setSize(size); - icon.setColor(color); - - return icon; - } + } /** * Replaces line breaks and tabs with spaces diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java index ebbd78bc29c9c42ba37fcc655f86c5bb7bad19fd..f972c712be2f5f9f468811e9f1fa4a1a3bdf68c5 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java @@ -49,6 +49,11 @@ public class Strings public static final String LOAD_DATABASE_DELETE = "load.database.delete"; public static final String LOAD_UPDATE = "load.update"; public static final String LOAD_SEARCH = "load.search"; + public static final String LOAD_LOCAL_SERVER = "load.local.server"; + public static final String LOAD_DOWNLOAD_LOCAL_SERVER = "load.download.local.server"; + public static final String LOAD_LOCAL_SERVER_CONNECT = "load.local.server.connect"; + public static final String LOAD_LOCAL_SERVER_RETRY = "load.local.server.retry"; + //MISC public static final String CATEGORY_NONE = "category.none"; @@ -70,6 +75,13 @@ public class Strings public static final String UNDEFINED = "undefined"; public static final String TAGFIELD_PLACEHOLDER = "tagfield.placeholder"; public static final String SHORTCUT_DEV_CONSOLE = "shortcut.dev.console"; + public static final String LOCAL_SERVER_STATUS_OK = "local.server.status.ok"; + public static final String LOCAL_SERVER_STATUS_NOT_STARTED = "local.server.status.not.started"; + public static final String LOCAL_SERVER_ACTION_NOT_STARTED = "local.server.action.not.started"; + public static final String LOCAL_SERVER_STATUS_NOT_PRESENT = "local.server.status.not.present"; + public static final String LOCAL_SERVER_ACTION_NOT_PRESENT = "local.server.action.not.present"; + public static final String LOCAL_SERVER_STATUS_INCOMPATIBLE = "local.server.status.incompatible"; + public static final String LOCAL_SERVER_ACTION_INCOMPATIBLE = "local.server.action.incompatible"; //REPORT public static final String REPORT_POSITION = "report.position"; @@ -160,6 +172,8 @@ public class Strings public static final String INFO_HEADER_TEXT_START_AFTER_UPDATE = "info.header.text.start.after.update"; public static final String INFO_TEXT_START_AFTER_UPDATE = "info.text.start.after.update"; public static final String INFO_TAGS = "info.tags"; + public static final String INFO_TITLE_SHUTDOWN = "info.title.shutdown"; + public static final String INFO_TEXT_SHUTDOWN = "info.text.shutdown"; //WARNING public static final String WARNING_ENDDATE_BEFORE_STARTDATE = "warning.enddate.before.startdate"; @@ -177,7 +191,7 @@ public class Strings public static final String WARNING_PAYMENT_AMOUNT = "warning.payment.amount"; public static final String WARNING_EMPTY_PAYMENT_DATE = "warning.empty.payment.date"; public static final String WARNING_PAYMENT_REPEATING = "warning.payment.repeating"; - public static final String WARNING_EMPTY_SECRET_CLIENT = " warning.empty.secret.client"; + public static final String WARNING_EMPTY_SECRET_CLIENT = "warning.empty.secret.client"; public static final String WARNING_EMPTY_URL = "warning.empty.url"; public static final String WARNING_EMPTY_SECRET_SERVER = "warning.empty.secret.server"; public static final String WARNING_EMPTY_CURRENCY = "warning.empty.currency"; @@ -211,6 +225,8 @@ public class Strings 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"; public static final String ERROR_OPEN_BROWSER = "error.open.browser"; + public static final String ERROR_LOCAL_SERVER_START = "error.local.server.start"; + public static final String ERROR_LOCAL_SERVER_DOWNLOAD = "error.local.server.download"; //ABOUT public static final String ABOUT = "about"; diff --git a/BudgetMasterServer/pom.xml b/BudgetMasterServer/pom.xml index 48d780210f0be7d9ce5c6fd5e50d13203ff66f2a..b3a9bffdae599cd06b11cba02255e73b622bf952 100644 --- a/BudgetMasterServer/pom.xml +++ b/BudgetMasterServer/pom.xml @@ -3,7 +3,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>de.deadlocker8</groupId> <artifactId>BudgetMasterServer</artifactId> - <version>1.7.1</version> + <version>1.8.0</version> <name>BudgetMasterServer</name> <build> <plugins> @@ -40,7 +40,7 @@ </goals> </execution> </executions> - </plugin> + </plugin> </plugins> </build> @@ -73,7 +73,7 @@ <dependency> <groupId>de.deadlocker8</groupId> <artifactId>tools</artifactId> - <version>0.0.1-SNAPSHOT</version> + <version>1.0.0</version> </dependency> <dependency> <groupId>de.deadlocker8</groupId> @@ -86,5 +86,10 @@ <version>4.12</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.xerial</groupId> + <artifactId>sqlite-jdbc</artifactId> + <version>3.21.0</version> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java new file mode 100644 index 0000000000000000000000000000000000000000..898188ab93f524f557a02a756856f7d5007f7092 --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java @@ -0,0 +1,19 @@ +package de.deadlocker8.budgetmasterserver.logic; + +import spark.Request; +import spark.Response; +import spark.Route; + +public interface AdvancedRoute extends Route +{ + void before(); + Object handleRequest(Request req, Response res); + void after(); + default Object handle(Request request, Response response) throws Exception + { + before(); + Object value = handleRequest(request, response); + after(); + return value; + } +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java index 821531725dcb7c8f81ddbd9061dd996d052f135e..fe2227c3fe6bd06b27b41d149dd45cee50d04ffc 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java @@ -2,6 +2,7 @@ package de.deadlocker8.budgetmasterserver.logic; public class Settings { + private String databaseType; private String databaseUrl; private String databaseName; private String databaseUsername; @@ -16,6 +17,16 @@ public class Settings } + public String getDatabaseType() + { + return databaseType; + } + + public void setDatabaseType(String databaseType) + { + this.databaseType = databaseType; + } + public String getDatabaseUrl() { return databaseUrl; @@ -99,8 +110,25 @@ public class Settings @Override public String toString() { - return "Settings [databaseUrl=" + databaseUrl + ", databaseName=" + databaseName + ", databaseUsername=" + databaseUsername + ", databasePassword=" + databasePassword + ", serverPort=" + serverPort + ", serverSecret=" + serverSecret + ", keystorePath=" + keystorePath + ", keystorePassword=" - + keystorePassword + "]"; + return "Settings [databaseType=" + databaseType + ", databaseUrl=" + databaseUrl + ", databaseName=" + databaseName + ", databaseUsername=" + databaseUsername + ", databasePassword=" + databasePassword + ", serverPort=" + serverPort + ", serverSecret=" + serverSecret + ", keystorePath=" + + keystorePath + ", keystorePassword=" + keystorePassword + "]"; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((databaseName == null) ? 0 : databaseName.hashCode()); + result = prime * result + ((databasePassword == null) ? 0 : databasePassword.hashCode()); + result = prime * result + ((databaseType == null) ? 0 : databaseType.hashCode()); + result = prime * result + ((databaseUrl == null) ? 0 : databaseUrl.hashCode()); + result = prime * result + ((databaseUsername == null) ? 0 : databaseUsername.hashCode()); + result = prime * result + ((keystorePassword == null) ? 0 : keystorePassword.hashCode()); + result = prime * result + ((keystorePath == null) ? 0 : keystorePath.hashCode()); + result = prime * result + serverPort; + result = prime * result + ((serverSecret == null) ? 0 : serverSecret.hashCode()); + return result; } @Override @@ -127,6 +155,13 @@ public class Settings } else if(!databasePassword.equals(other.databasePassword)) return false; + if(databaseType == null) + { + if(other.databaseType != null) + return false; + } + else if(!databaseType.equals(other.databaseType)) + return false; if(databaseUrl == null) { if(other.databaseUrl != null) diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java index 265ab169df0cec23bb18cc16c6ebd9e87a9fa639..0a0b2adabe7520255a6644b918521784883d103d 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java @@ -1,11 +1,26 @@ package de.deadlocker8.budgetmasterserver.logic; import java.io.IOException; +import java.io.Writer; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.creator.MysqlDatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.creator.SqliteDatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.handler.MysqlDatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.handler.SqliteDatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.MysqlDatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.SqliteDatabaseTagHandler; public class Utils { @@ -13,11 +28,74 @@ public class Utils { String settingsJSON; Settings settings; - + Gson gson = new Gson(); + + settingsJSON = new String(Files.readAllBytes(Paths.get(Settings.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent().resolve("settings.json"))); + settings = gson.fromJson(settingsJSON, Settings.class); + return settings; + } + + public static void saveSettings(Settings settings) throws IOException, URISyntaxException + { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String jsonString = gson.toJson(settings); + Writer writer = Files.newBufferedWriter(Paths.get(Settings.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent().resolve("settings.json")); + writer.write(jsonString); + writer.close(); + } + + public static Connection getDatabaseConnection(Settings settings) throws SQLException, ClassNotFoundException + { + Class.forName("org.sqlite.JDBC"); + + if(settings.getDatabaseType().equals("mysql")) + { + return DriverManager.getConnection("jdbc:mysql://" + settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword()); + } + else + { + return DriverManager.getConnection("jdbc:sqlite://" + settings.getDatabaseUrl()); + } + } + + public static DatabaseCreator getDatabaseCreator(Connection connection, Settings settings) + { + if(settings.getDatabaseType().equals("mysql")) + { + return new MysqlDatabaseCreator(connection, settings); + } + else + { + return new SqliteDatabaseCreator(connection, settings); + } + } + + public static DatabaseHandler getDatabaseHandler(Settings settings) throws ClassNotFoundException + { + Class.forName("org.sqlite.JDBC"); + + if(settings.getDatabaseType().equals("mysql")) + { + return new MysqlDatabaseHandler(settings); + } + else + { + return new SqliteDatabaseHandler(settings); + } + } + + public static DatabaseTagHandler getDatabaseTagHandler(Settings settings) throws ClassNotFoundException + { + Class.forName("org.sqlite.JDBC"); - settingsJSON = new String(Files.readAllBytes(Paths.get(Settings.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent().resolve("settings.json"))); - settings = gson.fromJson(settingsJSON, Settings.class); - return settings; + if(settings.getDatabaseType().equals("mysql")) + { + return new MysqlDatabaseTagHandler(settings); + } + else + { + return new SqliteDatabaseTagHandler(settings); + } } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java index 2213d91003b903824193d41803d4afa0f96daf6e..fb0dc3277e444078ec989a9d48910f2c60273a55 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java @@ -1,7 +1,6 @@ package de.deadlocker8.budgetmasterserver.logic.database; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -15,6 +14,7 @@ import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmaster.logic.tag.TagMatch; import de.deadlocker8.budgetmasterserver.logic.Settings; +import de.deadlocker8.budgetmasterserver.logic.Utils; import logger.Logger; public class DatabaseExporter @@ -25,7 +25,7 @@ public class DatabaseExporter { try { - this.connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin", settings.getDatabaseUsername(), settings.getDatabasePassword()); + this.connection = Utils.getDatabaseConnection(settings); } catch(Exception e) { @@ -200,7 +200,6 @@ public class DatabaseExporter int tagID = rs.getInt("Tag_ID"); int paymentID = rs.getInt("Payment_ID"); int repeatingPaymentID = rs.getInt("RepeatingPayment_ID"); - results.add(new TagMatch(tagID, paymentID, repeatingPaymentID)); } } diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java index 3070bf67b655552cb6d552d0c3824ce12808b2c0..091440c113937302906d18ecb2144da6c15f8cf7 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java @@ -9,6 +9,8 @@ import de.deadlocker8.budgetmaster.logic.payment.NormalPayment; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmaster.logic.tag.TagMatch; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; public class DatabaseImporter { @@ -96,7 +98,7 @@ public class DatabaseImporter updateTagMatchesByTagID(tagID, existingTag.getID()); } } - + tagMatches.addAll(changedTagMatches); importTagMatches(tagMatches); } @@ -117,7 +119,7 @@ public class DatabaseImporter * call 2 = replace ID 3 with 4 * --> would replace category IDs in payments where category ID has already been replaced * --> would lead to wrong import - * --> remove payment from list but add to "changedPayments" in order not to loose the payment completly + * --> remove payment from list but add to "changedPayments" in order not to loose the payment completely * --> remaining payments in list and all payments from "changedPayments" will be merged after all categories are imported */ changedNormalPayments.add(currentPayment); diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..2fef700c27eb32a763cc2c21fe02a9cbb43b501e --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java @@ -0,0 +1,73 @@ +package de.deadlocker8.budgetmasterserver.logic.database.creator; + +import java.sql.Connection; +import java.util.ArrayList; + +import de.deadlocker8.budgetmasterserver.logic.Settings; +import logger.Logger; + +public abstract class DatabaseCreator +{ + Connection connection; + Settings settings; + + public DatabaseCreator(Connection connection, Settings settings) + { + this.connection = connection; + this.settings = settings; + } + + public void createTables() + { + Logger.info("Checking tables..."); + createTables(getExistingTables()); + Logger.info("Checking tables [DONE]"); + } + + public abstract ArrayList<String> getExistingTables(); + + private void createTables(ArrayList<String> existingTables) + { + if(!existingTables.contains("category")) + { + createTableCategory(); + } + + if(!existingTables.contains("payment")) + { + createTablePayment(); + } + + if(!existingTables.contains("repeating_payment")) + { + createTableRepeatingPayment(); + } + + if(!existingTables.contains("repeating_entry")) + { + createTableRepeatingEntry(); + } + + if(!existingTables.contains("tag")) + { + createTableTag(); + } + + if(!existingTables.contains("tag_match")) + { + createTableTagMatch(); + } + } + + public abstract void createTableCategory(); + + public abstract void createTablePayment(); + + public abstract void createTableRepeatingEntry(); + + public abstract void createTableRepeatingPayment(); + + public abstract void createTableTag(); + + public abstract void createTableTagMatch(); +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java similarity index 84% rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java index 81350a988fbacb3bf8bd2742fc3f5b77cb6889c9..7c73373c7df95cf01e5c68955f9d843e85ff33ae 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java @@ -1,4 +1,4 @@ -package de.deadlocker8.budgetmasterserver.logic.database; +package de.deadlocker8.budgetmasterserver.logic.database.creator; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -10,21 +10,15 @@ import java.util.ArrayList; import de.deadlocker8.budgetmasterserver.logic.Settings; import logger.Logger; -public class DatabaseCreator +public class MysqlDatabaseCreator extends DatabaseCreator { - private Connection connection; - private Settings settings; - - public DatabaseCreator(Connection connection, Settings settings) + public MysqlDatabaseCreator(Connection connection, Settings settings) { - this.connection = connection; - this.settings = settings; - Logger.info("Checking tables..."); - createTables(getExistingTables()); - Logger.info("Checking tables [DONE]"); + super(connection, settings); } - private ArrayList<String> getExistingTables() + @Override + public ArrayList<String> getExistingTables() { ArrayList<String> tables = new ArrayList<>(); try @@ -41,42 +35,10 @@ public class DatabaseCreator Logger.error(e); } return tables; - } - - private void createTables(ArrayList<String> existingTables) - { - if(!existingTables.contains("category")) - { - createTableCategory(); - } - - if(!existingTables.contains("payment")) - { - createTablePayment(); - } - - if(!existingTables.contains("repeating_payment")) - { - createTableRepeatingPayment(); - } - - if(!existingTables.contains("repeating_entry")) - { - createTableRepeatingEntry(); - } - - if(!existingTables.contains("tag")) - { - createTableTag(); - } - - if(!existingTables.contains("tag_match")) - { - createTableTagMatch(); - } - } + } - private void createTableCategory() + @Override + public void createTableCategory() { Statement stmt = null; String query = "CREATE TABLE `category` (`ID` int(11) NOT NULL COMMENT 'ID'," + @@ -115,7 +77,8 @@ public class DatabaseCreator } } - private void createTablePayment() + @Override + public void createTablePayment() { Statement stmt = null; String query = "CREATE TABLE `payment` (" + @@ -156,7 +119,8 @@ public class DatabaseCreator } } - private void createTableRepeatingEntry() + @Override + public void createTableRepeatingEntry() { Statement stmt = null; String query = "CREATE TABLE `repeating_entry` (" + @@ -196,7 +160,8 @@ public class DatabaseCreator } } - private void createTableRepeatingPayment() + @Override + public void createTableRepeatingPayment() { Statement stmt = null; String query = "CREATE TABLE `repeating_payment` (" + @@ -240,7 +205,8 @@ public class DatabaseCreator } } - private void createTableTag() + @Override + public void createTableTag() { Statement stmt = null; String query = "CREATE TABLE `tag` (`ID` int(11) NOT NULL COMMENT 'ID'," + @@ -276,7 +242,8 @@ public class DatabaseCreator } } - private void createTableTagMatch() + @Override + public void createTableTagMatch() { Statement stmt = null; String query = "CREATE TABLE `tag_match` (`Tag_ID` int(11) NOT NULL," + diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..0e869e60c48b7fe9db3663fdbaa008acb4c1de1d --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java @@ -0,0 +1,248 @@ +package de.deadlocker8.budgetmasterserver.logic.database.creator; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; + +import de.deadlocker8.budgetmasterserver.logic.Settings; +import logger.Logger; + +public class SqliteDatabaseCreator extends DatabaseCreator +{ + public SqliteDatabaseCreator(Connection connection, Settings settings) + { + super(connection, settings); + } + + @Override + public ArrayList<String> getExistingTables() + { + ArrayList<String> tables = new ArrayList<>(); + try + { + DatabaseMetaData meta = connection.getMetaData(); + ResultSet res = meta.getTables(settings.getDatabaseName(), null, "", new String[] { "TABLE" }); + while(res.next()) + { + tables.add(res.getString("TABLE_NAME")); + } + } + catch(Exception e) + { + Logger.error(e); + } + return tables; + } + + @Override + public void createTableCategory() + { + Statement stmt = null; + String query = "CREATE TABLE `category` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT DEFAULT NULL, `Color` TEXT NOT NULL);"; + String query2 = "INSERT INTO `category` (`ID`, `Name`, `Color`) VALUES(1, 'NONE', '#FFFFFF'),(2, 'Übertrag', '#FFFF00');"; + + try + { + stmt = connection.createStatement(); + stmt.execute(query); + stmt.execute(query2); + Logger.info("Successfully created table category"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + if(stmt != null) + { + try + { + stmt.close(); + } + catch(SQLException e) + { + } + } + } + } + + @Override + public void createTablePayment() + { + Statement stmt = null; + String query = "CREATE TABLE `payment` (" + + "`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + + "`Name` TEXT DEFAULT NULL," + + "`CategoryID` INTEGER DEFAULT NULL," + + "`Amount` INTEGER DEFAULT NULL," + + "`Date` TEXT DEFAULT NULL," + + "`Description` TEXT DEFAULT NULL);"; + + try + { + stmt = connection.createStatement(); + stmt.execute(query); + Logger.info("Successfully created table payment"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + if(stmt != null) + { + try + { + stmt.close(); + } + catch(SQLException e) + { + } + } + } + } + + @Override + public void createTableRepeatingEntry() + { + Statement stmt = null; + String query = "CREATE TABLE `repeating_entry` (" + + "`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + + "`RepeatingPaymentID` INTEGER NOT NULL," + + "`Date` TEXT NOT NULL," + + "FOREIGN KEY (RepeatingPaymentID) REFERENCES repeating_payment(ID) ON DELETE CASCADE ON UPDATE CASCADE);"; + + try + { + stmt = connection.createStatement(); + stmt.execute(query); + Logger.info("Successfully created table repeating_entry"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + if(stmt != null) + { + try + { + stmt.close(); + } + catch(SQLException e) + { + } + } + } + } + + @Override + public void createTableRepeatingPayment() + { + Statement stmt = null; + String query = "CREATE TABLE `repeating_payment` (\r\n" + + "`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\r\n" + + "`Name` TEXT DEFAULT NULL,\r\n" + + "`CategoryID` INTEGER DEFAULT NULL,\r\n" + + "`Amount` INTEGER DEFAULT NULL,\r\n" + + "`Date` TEXT DEFAULT NULL,\r\n" + + "`Description` TEXT DEFAULT NULL,\r\n" + + "`RepeatInterval` INTEGER DEFAULT NULL,\r\n" + + "`RepeatEndDate` TEXT DEFAULT NULL,\r\n" + + "`RepeatMonthDay` INTEGER DEFAULT NULL);"; + + try + { + stmt = connection.createStatement(); + stmt.execute(query); + Logger.info("Successfully created table repeating_payment"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + if(stmt != null) + { + try + { + stmt.close(); + } + catch(SQLException e) + { + } + } + } + } + + @Override + public void createTableTag() + { + Statement stmt = null; + String query = "CREATE TABLE `tag` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT NOT NULL);"; + + try + { + stmt = connection.createStatement(); + stmt.execute(query); + Logger.info("Successfully created table tag"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + if(stmt != null) + { + try + { + stmt.close(); + } + catch(SQLException e) + { + } + } + } + } + + @Override + public void createTableTagMatch() + { + Statement stmt = null; + String query = "CREATE TABLE `tag_match` (`Tag_ID` INTEGER NOT NULL," + + "`Payment_ID` INTEGER NOT NULL," + + "`RepeatingPayment_ID` INTEGER NOT NULL);"; + + try + { + stmt = connection.createStatement(); + stmt.execute(query); + Logger.info("Successfully created table tag_match"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + if(stmt != null) + { + try + { + stmt.close(); + } + catch(SQLException e) + { + } + } + } + } +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java similarity index 66% rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java index b9f91615a2ae2d9364fcb28da120e20a8047371a..d211841f2be15da2fe5a7391995fa01df568e8d3 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java @@ -1,7 +1,6 @@ -package de.deadlocker8.budgetmasterserver.logic.database; +package de.deadlocker8.budgetmasterserver.logic.database.handler; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -19,20 +18,28 @@ import de.deadlocker8.budgetmaster.logic.payment.Payment; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; import de.deadlocker8.budgetmasterserver.logic.Settings; +import de.deadlocker8.budgetmasterserver.logic.Utils; import logger.Logger; -public class DatabaseHandler +public abstract class DatabaseHandler { - private Connection connection; - private final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd"); + Connection connection; + Settings settings; + final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd"); public DatabaseHandler(Settings settings) throws IllegalStateException + { + this.settings = settings; + } + + public void connect() { try { - this.connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword()); - new DatabaseCreator(connection, settings); - Logger.info("Successfully initialized database (" + settings.getDatabaseUrl() + settings.getDatabaseName() + ")"); + if(connection == null || connection.isClosed()) + { + connection = Utils.getDatabaseConnection(settings); + } } catch(Exception e) { @@ -41,7 +48,19 @@ public class DatabaseHandler } } - private void closeConnection(Statement statement) + public void closeConnection() + { + try + { + connection.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + } + + void closeStatement(Statement statement) { if(statement != null) { @@ -58,32 +77,8 @@ public class DatabaseHandler /* * GET */ - public int getLastInsertID() - { - PreparedStatement stmt = null; - int lastInsertID = 0; - try - { - stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();"); - ResultSet rs = stmt.executeQuery(); - - while(rs.next()) - { - lastInsertID = rs.getInt("LAST_INSERT_ID()"); - } - } - catch(SQLException e) - { - Logger.error(e); - } - finally - { - closeConnection(stmt); - } - - return lastInsertID; - } - + public abstract int getLastInsertID(); + public DateTime getFirstNormalPaymentDate() { PreparedStatement stmt = null; @@ -105,6 +100,7 @@ public class DatabaseHandler dateTime = formatter.parseDateTime(rs.getString("min")); } } + rs.close(); } catch(SQLException e) { @@ -112,7 +108,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return dateTime; @@ -139,6 +135,7 @@ public class DatabaseHandler dateTime = formatter.parseDateTime(rs.getString("min")); } } + rs.close(); } catch(SQLException e) { @@ -146,7 +143,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return dateTime; @@ -229,6 +226,7 @@ public class DatabaseHandler results.add(new Category(id, name, color)); } + rs.close(); } catch(SQLException e) { @@ -236,7 +234,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return results; @@ -259,6 +257,7 @@ public class DatabaseHandler result = new Category(id, name, color); } + rs.close(); } catch(SQLException e) { @@ -266,7 +265,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return result; @@ -291,6 +290,7 @@ public class DatabaseHandler result = new Category(id, categoryName, categoryColor); } + rs.close(); } catch(SQLException e) { @@ -298,7 +298,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return result; @@ -320,6 +320,7 @@ public class DatabaseHandler exists = true; } } + rs.close(); } catch(SQLException e) { @@ -327,7 +328,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return exists; @@ -350,9 +351,10 @@ public class DatabaseHandler String date = rs.getString("Date"); int categoryID = rs.getInt("CategoryID"); String description = rs.getString("Description"); - + rs.close(); return new NormalPayment(resultID, amount, date, categoryID, name, description); } + rs.close(); } catch(SQLException e) { @@ -360,7 +362,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return null; @@ -388,6 +390,7 @@ public class DatabaseHandler results.add(new NormalPayment(resultID, amount, date, categoryID, name, description)); } + rs.close(); } catch(SQLException e) { @@ -395,163 +398,19 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return results; } - public ArrayList<NormalPayment> getPayments(int year, int month) - { - PreparedStatement stmt = null; - - ArrayList<NormalPayment> results = new ArrayList<>(); - try - { - stmt = connection.prepareStatement("SELECT * FROM payment WHERE YEAR(Date) = ? AND MONTH(Date) = ?;"); - stmt.setInt(1, year); - stmt.setInt(2, month); - ResultSet rs = stmt.executeQuery(); - - while(rs.next()) - { - int resultID = rs.getInt("ID"); - String name = rs.getString("Name"); - int amount = rs.getInt("amount"); - String date = rs.getString("Date"); - int categoryID = rs.getInt("CategoryID"); - String description = rs.getString("Description"); - - results.add(new NormalPayment(resultID, amount, date, categoryID, name, description)); - } - } - catch(SQLException e) - { - Logger.error(e); - } - finally - { - closeConnection(stmt); - } - - return results; - } + public abstract ArrayList<NormalPayment> getPayments(int year, int month); - public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate) - { - PreparedStatement stmt = null; - - ArrayList<NormalPayment> results = new ArrayList<>(); - try - { - stmt = connection.prepareStatement("SELECT * FROM payment WHERE DATE(Date) BETWEEN ? AND ?;"); - stmt.setString(1, startDate); - stmt.setString(2, endDate); - ResultSet rs = stmt.executeQuery(); - - while(rs.next()) - { - int resultID = rs.getInt("ID"); - String name = rs.getString("Name"); - int amount = rs.getInt("amount"); - String date = rs.getString("Date"); - int categoryID = rs.getInt("CategoryID"); - String description = rs.getString("Description"); - - results.add(new NormalPayment(resultID, amount, date, categoryID, name, description)); - } - } - catch(SQLException e) - { - Logger.error(e); - } - finally - { - closeConnection(stmt); - } - - return results; - } - - public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month) - { - PreparedStatement stmt = null; - - ArrayList<RepeatingPaymentEntry> results = new ArrayList<>(); - try - { - stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND YEAR(repeating_entry.Date) = ? AND MONTH(repeating_entry.Date) = ?;"); - stmt.setInt(1, year); - stmt.setInt(2, month); - ResultSet rs = stmt.executeQuery(); - - while(rs.next()) - { - int resultID = rs.getInt("ID"); - int repeatingPaymentID = rs.getInt("repeatingPaymentID"); - String name = rs.getString("Name"); - String description = rs.getString("Description"); - int amount = rs.getInt("amount"); - String date = rs.getString("Date"); - int categoryID = rs.getInt("CategoryID"); - int repeatInterval = rs.getInt("RepeatInterval"); - String repeatEndDate = rs.getString("RepeatEndDate"); - int repeatMonthDay = rs.getInt("RepeatMonthDay"); - - results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay)); - } - } - catch(SQLException e) - { - Logger.error(e); - } - finally - { - closeConnection(stmt); - } - - return results; - } + public abstract ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate); - public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate) - { - PreparedStatement stmt = null; - - ArrayList<RepeatingPaymentEntry> results = new ArrayList<>(); - try - { - stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND DATE(repeating_entry.Date) BETWEEN ? AND ?;"); - stmt.setString(1, startDate); - stmt.setString(2, endDate); - ResultSet rs = stmt.executeQuery(); - - while(rs.next()) - { - int resultID = rs.getInt("ID"); - int repeatingPaymentID = rs.getInt("repeatingPaymentID"); - String name = rs.getString("Name"); - String description = rs.getString("Description"); - int amount = rs.getInt("amount"); - String date = rs.getString("Date"); - int categoryID = rs.getInt("CategoryID"); - int repeatInterval = rs.getInt("RepeatInterval"); - String repeatEndDate = rs.getString("RepeatEndDate"); - int repeatMonthDay = rs.getInt("RepeatMonthDay"); - - results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay)); - } - } - catch(SQLException e) - { - Logger.error(e); - } - finally - { - closeConnection(stmt); - } - - return results; - } + public abstract ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month); + + public abstract ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate); public ArrayList<RepeatingPayment> getAllRepeatingPayments() { @@ -577,6 +436,7 @@ public class DatabaseHandler results.add(new RepeatingPayment(resultID, amount, date, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay)); } + rs.close(); } catch(SQLException e) { @@ -584,7 +444,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return results; @@ -608,6 +468,7 @@ public class DatabaseHandler results.add(new LatestRepeatingPayment(resultID, repeatingPaymentID, date)); } + rs.close(); } catch(SQLException e) { @@ -615,7 +476,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return results; @@ -644,6 +505,7 @@ public class DatabaseHandler result = new RepeatingPayment(id, amount, date, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay); } + rs.close(); } catch(SQLException e) { @@ -651,7 +513,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return result; @@ -666,8 +528,11 @@ public class DatabaseHandler ResultSet rs = stmt.executeQuery(); while(rs.next()) { - return rs.getInt("max"); + int result = rs.getInt("max"); + rs.close(); + return result; } + rs.close(); } catch(SQLException e) { @@ -675,7 +540,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return -1; @@ -690,8 +555,11 @@ public class DatabaseHandler ResultSet rs = stmt.executeQuery(); while(rs.next()) { - return rs.getInt("max"); + int result = rs.getInt("max"); + rs.close(); + return result; } + rs.close(); } catch(SQLException e) { @@ -699,7 +567,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return -1; @@ -723,7 +591,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -742,7 +610,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -761,46 +629,11 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } - public void deleteDatabase() - { - Statement stmt = null; - String tableCategory = "DROP TABLE IF EXISTS category;"; - String tablePayment = "DROP TABLE IF EXISTS payment;"; - String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;"; - String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;"; - String tableTag = "DROP TABLE IF EXISTS tag;"; - String tableTagMatch = "DROP TABLE IF EXISTS tag_match;"; - try - { - stmt = connection.createStatement(); - stmt.execute("SET FOREIGN_KEY_CHECKS = 0;"); - stmt.execute(tableCategory); - Logger.info("Deleted table: category"); - stmt.execute(tablePayment); - Logger.info("Deleted table: payment"); - stmt.execute(tableRepeatingPayment); - Logger.info("Deleted table: repeating_payment"); - stmt.execute(tableRepeatingEntry); - Logger.info("Deleted table: repeating_entry"); - stmt.execute(tableTag); - Logger.info("Deleted table: tag"); - stmt.execute(tableTagMatch); - Logger.info("Deleted table: tag_match"); - stmt.execute("SET FOREIGN_KEY_CHECKS = 1;"); - } - catch(SQLException e) - { - Logger.error(e); - } - finally - { - closeConnection(stmt); - } - } + public abstract void deleteDatabase(); /* * ADD @@ -821,7 +654,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -842,7 +675,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -863,8 +696,11 @@ public class DatabaseHandler ResultSet rs = stmt.getGeneratedKeys(); if(rs.next()) { - return rs.getInt(1); + int result = rs.getInt(1); + rs.close(); + return result; } + rs.close(); } catch(SQLException e) { @@ -872,7 +708,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return -1; @@ -904,8 +740,11 @@ public class DatabaseHandler ResultSet rs = stmt.getGeneratedKeys(); if(rs.next()) { - return rs.getInt(1); + int result = rs.getInt(1); + rs.close(); + return result; } + rs.close(); } catch(SQLException e) { @@ -913,7 +752,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return -1; @@ -936,7 +775,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -960,7 +799,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -984,7 +823,7 @@ public class DatabaseHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..b2c8e92b994416230be328b23fa86e561bd684c2 --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java @@ -0,0 +1,247 @@ +package de.deadlocker8.budgetmasterserver.logic.database.handler; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.payment.NormalPayment; +import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; +import de.deadlocker8.budgetmasterserver.logic.Settings; +import logger.Logger; + +public class MysqlDatabaseHandler extends DatabaseHandler +{ + public MysqlDatabaseHandler(Settings settings) throws IllegalStateException + { + super(settings); + connect(); + } + + @Override + public int getLastInsertID() + { + PreparedStatement stmt = null; + int lastInsertID = 0; + try + { + stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();"); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + lastInsertID = rs.getInt("LAST_INSERT_ID()"); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return lastInsertID; + } + + @Override + public ArrayList<NormalPayment> getPayments(int year, int month) + { + PreparedStatement stmt = null; + + ArrayList<NormalPayment> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT * FROM payment WHERE YEAR(Date) = ? AND MONTH(Date) = ?;"); + stmt.setInt(1, year); + stmt.setInt(2, month); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + String name = rs.getString("Name"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + String description = rs.getString("Description"); + + results.add(new NormalPayment(resultID, amount, date, categoryID, name, description)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month) + { + PreparedStatement stmt = null; + + ArrayList<RepeatingPaymentEntry> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND YEAR(repeating_entry.Date) = ? AND MONTH(repeating_entry.Date) = ?;"); + stmt.setInt(1, year); + stmt.setInt(2, month); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + int repeatingPaymentID = rs.getInt("repeatingPaymentID"); + String name = rs.getString("Name"); + String description = rs.getString("Description"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + int repeatInterval = rs.getInt("RepeatInterval"); + String repeatEndDate = rs.getString("RepeatEndDate"); + int repeatMonthDay = rs.getInt("RepeatMonthDay"); + + results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate) + { + PreparedStatement stmt = null; + + ArrayList<NormalPayment> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT * FROM payment WHERE DATE(Date) BETWEEN ? AND ?;"); + stmt.setString(1, startDate); + stmt.setString(2, endDate); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + String name = rs.getString("Name"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + String description = rs.getString("Description"); + + results.add(new NormalPayment(resultID, amount, date, categoryID, name, description)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate) + { + PreparedStatement stmt = null; + + ArrayList<RepeatingPaymentEntry> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND DATE(repeating_entry.Date) BETWEEN ? AND ?;"); + stmt.setString(1, startDate); + stmt.setString(2, endDate); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + int repeatingPaymentID = rs.getInt("repeatingPaymentID"); + String name = rs.getString("Name"); + String description = rs.getString("Description"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + int repeatInterval = rs.getInt("RepeatInterval"); + String repeatEndDate = rs.getString("RepeatEndDate"); + int repeatMonthDay = rs.getInt("RepeatMonthDay"); + + results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public void deleteDatabase() + { + Statement stmt = null; + String tableCategory = "DROP TABLE IF EXISTS category;"; + String tablePayment = "DROP TABLE IF EXISTS payment;"; + String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;"; + String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;"; + String tableTag = "DROP TABLE IF EXISTS tag;"; + String tableTagMatch = "DROP TABLE IF EXISTS tag_match;"; + try + { + stmt = connection.createStatement(); + stmt.execute("SET FOREIGN_KEY_CHECKS = 0;"); + stmt.execute(tableCategory); + Logger.info("Deleted table: category"); + stmt.execute(tablePayment); + Logger.info("Deleted table: payment"); + stmt.execute(tableRepeatingPayment); + Logger.info("Deleted table: repeating_payment"); + stmt.execute(tableRepeatingEntry); + Logger.info("Deleted table: repeating_entry"); + stmt.execute(tableTag); + Logger.info("Deleted table: tag"); + stmt.execute(tableTagMatch); + Logger.info("Deleted table: tag_match"); + stmt.execute("SET FOREIGN_KEY_CHECKS = 1;"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + } +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..139b20dff3bcc44e08da074c40301cef425c1a93 --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java @@ -0,0 +1,245 @@ +package de.deadlocker8.budgetmasterserver.logic.database.handler; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.payment.NormalPayment; +import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; +import de.deadlocker8.budgetmasterserver.logic.Settings; +import logger.Logger; + +public class SqliteDatabaseHandler extends DatabaseHandler +{ + public SqliteDatabaseHandler(Settings settings) throws IllegalStateException + { + super(settings); + connect(); + } + + @Override + public int getLastInsertID() + { + PreparedStatement stmt = null; + int lastInsertID = 0; + try + { + stmt = connection.prepareStatement("SELECT last_insert_rowid() as `ID`"); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + lastInsertID = rs.getInt("ID"); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return lastInsertID; + } + + @Override + public ArrayList<NormalPayment> getPayments(int year, int month) + { + PreparedStatement stmt = null; + + ArrayList<NormalPayment> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT * FROM payment WHERE strftime('%Y', Date) = ? AND strftime('%m', Date) = ?;"); + stmt.setString(1, String.format("%02d", year)); + stmt.setString(2, String.format("%02d", month)); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + String name = rs.getString("Name"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + String description = rs.getString("Description"); + + results.add(new NormalPayment(resultID, amount, date, categoryID, name, description)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month) + { + PreparedStatement stmt = null; + + ArrayList<RepeatingPaymentEntry> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND strftime('%Y', repeating_entry.Date) = ? AND strftime('%m', repeating_entry.Date) = ?;"); + stmt.setString(1, String.format("%02d", year)); + stmt.setString(2, String.format("%02d", month)); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + int repeatingPaymentID = rs.getInt("repeatingPaymentID"); + String name = rs.getString("Name"); + String description = rs.getString("Description"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + int repeatInterval = rs.getInt("RepeatInterval"); + String repeatEndDate = rs.getString("RepeatEndDate"); + int repeatMonthDay = rs.getInt("RepeatMonthDay"); + + results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate) + { + PreparedStatement stmt = null; + + ArrayList<NormalPayment> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT * FROM payment WHERE Date BETWEEN ? AND ?;"); + stmt.setString(1, startDate); + stmt.setString(2, endDate); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + String name = rs.getString("Name"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + String description = rs.getString("Description"); + + results.add(new NormalPayment(resultID, amount, date, categoryID, name, description)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate) + { + PreparedStatement stmt = null; + + ArrayList<RepeatingPaymentEntry> results = new ArrayList<>(); + try + { + stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND repeating_entry.Date BETWEEN ? AND ?;"); + stmt.setString(1, startDate); + stmt.setString(2, endDate); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + int resultID = rs.getInt("ID"); + int repeatingPaymentID = rs.getInt("repeatingPaymentID"); + String name = rs.getString("Name"); + String description = rs.getString("Description"); + int amount = rs.getInt("amount"); + String date = rs.getString("Date"); + int categoryID = rs.getInt("CategoryID"); + int repeatInterval = rs.getInt("RepeatInterval"); + String repeatEndDate = rs.getString("RepeatEndDate"); + int repeatMonthDay = rs.getInt("RepeatMonthDay"); + + results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay)); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return results; + } + + @Override + public void deleteDatabase() + { + Statement stmt = null; + String tableCategory = "DROP TABLE IF EXISTS category;"; + String tablePayment = "DROP TABLE IF EXISTS payment;"; + String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;"; + String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;"; + String tableTag = "DROP TABLE IF EXISTS tag;"; + String tableTagMatch = "DROP TABLE IF EXISTS tag_match;"; + try + { + stmt = connection.createStatement(); + stmt.execute(tableCategory); + Logger.info("Deleted table: category"); + stmt.execute(tablePayment); + Logger.info("Deleted table: payment"); + stmt.execute(tableRepeatingPayment); + Logger.info("Deleted table: repeating_payment"); + stmt.execute(tableRepeatingEntry); + Logger.info("Deleted table: repeating_entry"); + stmt.execute(tableTag); + Logger.info("Deleted table: tag"); + stmt.execute(tableTagMatch); + Logger.info("Deleted table: tag_match"); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + } +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java similarity index 84% rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java index 562e2b20fe13dd7e71fc4f734e65d498e587b0a9..4b65d91329fc409ebcdd4835c63209bda5bba1a0 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java @@ -1,7 +1,6 @@ -package de.deadlocker8.budgetmasterserver.logic.database; +package de.deadlocker8.budgetmasterserver.logic.database.taghandler; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -10,65 +9,63 @@ import java.util.ArrayList; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmasterserver.logic.Settings; +import de.deadlocker8.budgetmasterserver.logic.Utils; import logger.Logger; -public class DatabaseTagHandler +public abstract class DatabaseTagHandler { - private Connection connection; + Connection connection; + Settings settings; public DatabaseTagHandler(Settings settings) throws IllegalStateException { - try - { - this.connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin", settings.getDatabaseUsername(), settings.getDatabasePassword()); - } - catch(Exception e) - { - Logger.error(e); - throw new IllegalStateException("Cannot connect the database!", e); - } - } + this.settings = settings; + } - private void closeConnection(Statement statement) + public void connect() { - if(statement != null) + try { - try - { - statement.close(); - } - catch(SQLException e) - { + if(connection == null || connection.isClosed()) + { + this.connection = Utils.getDatabaseConnection(settings); } } + catch(Exception e) + { + Logger.error(e); + throw new IllegalStateException("Cannot connect the database!", e); + } } - public int getLastInsertID() + public void closeConnection() { - PreparedStatement stmt = null; - int lastInsertID = 0; try { - stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();"); - ResultSet rs = stmt.executeQuery(); - - while(rs.next()) - { - lastInsertID = rs.getInt("LAST_INSERT_ID()"); - } + connection.close(); } catch(SQLException e) { Logger.error(e); } - finally + } + + void closeStatement(Statement statement) + { + if(statement != null) { - closeConnection(stmt); + try + { + statement.close(); + } + catch(SQLException e) + { + } } - - return lastInsertID; } + public abstract int getLastInsertID(); + public ArrayList<Tag> getAllTags() { PreparedStatement stmt = null; @@ -91,7 +88,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return results; @@ -121,7 +118,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return tag; @@ -151,7 +148,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return tag; @@ -172,7 +169,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -191,7 +188,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -216,7 +213,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return false; @@ -243,7 +240,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return false; @@ -271,7 +268,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return tagIDs; @@ -299,7 +296,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return tagIDs; @@ -322,7 +319,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -343,7 +340,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -363,7 +360,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -383,7 +380,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } } @@ -407,7 +404,7 @@ public class DatabaseTagHandler } finally { - closeConnection(stmt); + closeStatement(stmt); } return false; diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..70b319a02a894763d907bfac904ce61563688c64 --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java @@ -0,0 +1,45 @@ +package de.deadlocker8.budgetmasterserver.logic.database.taghandler; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import de.deadlocker8.budgetmasterserver.logic.Settings; +import logger.Logger; + +public class MysqlDatabaseTagHandler extends DatabaseTagHandler +{ + public MysqlDatabaseTagHandler(Settings settings) throws IllegalStateException + { + super(settings); + connect(); + } + + @Override + public int getLastInsertID() + { + PreparedStatement stmt = null; + int lastInsertID = 0; + try + { + stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();"); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + lastInsertID = rs.getInt("LAST_INSERT_ID()"); + } + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return lastInsertID; + } + +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..d3e3fcba629a9d10f84e03bc75388457fe4459a8 --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java @@ -0,0 +1,46 @@ +package de.deadlocker8.budgetmasterserver.logic.database.taghandler; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import de.deadlocker8.budgetmasterserver.logic.Settings; +import logger.Logger; + +public class SqliteDatabaseTagHandler extends DatabaseTagHandler +{ + public SqliteDatabaseTagHandler(Settings settings) throws IllegalStateException + { + super(settings); + connect(); + } + + @Override + public int getLastInsertID() + { + PreparedStatement stmt = null; + int lastInsertID = 0; + try + { + stmt = connection.prepareStatement("SELECT last_insert_rowid() as `ID`"); + ResultSet rs = stmt.executeQuery(); + + while(rs.next()) + { + lastInsertID = rs.getInt("ID"); + } + rs.close(); + } + catch(SQLException e) + { + Logger.error(e); + } + finally + { + closeStatement(stmt); + } + + return lastInsertID; + } + +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java index eb3a19f902e893737a2313c3b84d29a3d87e0731..6083c46fefc9700a5de59b90022c9667cc755012 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java @@ -46,6 +46,7 @@ public class Main if(!Files.exists(settingsPath)) { + Logger.warning("No settings file found! Creating default settings file..."); try { Files.copy(SparkServer.class.getClassLoader().getResourceAsStream("de/deadlocker8/budgetmasterserver/settings.json"), settingsPath); @@ -60,6 +61,39 @@ public class Main try { settings = Utils.loadSettings(); + boolean settingsChanged = false; + if(settings.getDatabaseType() == null) + { + settings.setDatabaseType("mysql"); + settingsChanged = true; + } + + if(!settings.getDatabaseType().equals("mysql") && !settings.getDatabaseType().equals("sqlite")) + { + Logger.error(settings.getDatabaseType() + " is no valid database type! (allowed types are: mysql and sqlite)"); + return; + } + + if(settings.getDatabaseType().equals("sqlite") && (settings.getDatabaseUrl() == null || settings.getDatabaseUrl().equals(""))) + { + Logger.warning("There is no save path specified for the sqlite database file. It will be saved as \"BudgetMaster.db\" in current directory."); + settings.setDatabaseUrl(System.getProperty("user.dir").replace("\\", "/") + "/BudgetMaster.db"); + settingsChanged = true; + } + + if(settings.getDatabaseUrl().contains("jdbc")) + { + settings.setDatabaseUrl(settings.getDatabaseUrl().replace("jdbc:mysql://", "")); + settingsChanged = true; + } + + + if(settingsChanged) + { + Logger.warning("Settings file is not up to date! Updated settings to new version."); + Utils.saveSettings(settings); + } + VersionInformation versionInfo = new VersionInformation(); versionInfo.setVersionCode(Integer.parseInt(Localization.getString("version.code"))); versionInfo.setVersionName(Localization.getString("version.name")); diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java index 2e4d55abf7d2113c3ada2fe859f6d97ac484f2ae..d1c397ea7b1a79ee1e581841c16b165d43597491 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java @@ -11,6 +11,7 @@ import static spark.Spark.put; import static spark.Spark.secure; import java.io.File; +import java.sql.Connection; import org.joda.time.DateTime; @@ -20,8 +21,9 @@ 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; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.Utils; +import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import de.deadlocker8.budgetmasterserver.server.category.CategoryAdd; import de.deadlocker8.budgetmasterserver.server.category.CategoryDelete; import de.deadlocker8.budgetmasterserver.server.category.CategoryGet; @@ -47,6 +49,7 @@ import de.deadlocker8.budgetmasterserver.server.payment.repeating.RepeatingPayme import de.deadlocker8.budgetmasterserver.server.payment.search.PaymentMaxAmount; import de.deadlocker8.budgetmasterserver.server.payment.search.PaymentSearch; import de.deadlocker8.budgetmasterserver.server.rest.RestGet; +import de.deadlocker8.budgetmasterserver.server.shutdown.Shutdown; import de.deadlocker8.budgetmasterserver.server.tag.match.TagMatchAddForPayment; import de.deadlocker8.budgetmasterserver.server.tag.match.TagMatchAddForRepeatingPayment; import de.deadlocker8.budgetmasterserver.server.tag.match.TagMatchDeleteForPayment; @@ -69,8 +72,7 @@ import tools.HashUtils; public class SparkServer { private Gson gson; - private DatabaseHandler handler; - private DatabaseTagHandler tagHandler; + private boolean shutdownInProgress = false; public SparkServer(Settings settings, VersionInformation versionInfo) { @@ -87,8 +89,17 @@ public class SparkServer { throw new Exception("empty string is no valid keystorePath"); } - File keystoreFile = new File(filePath); - secure(keystoreFile.getAbsolutePath(), settings.getKeystorePassword(), null, null); + else if(settings.getKeystorePath().equals("default")) + { + Logger.info("Connections are secured with default keystore"); + Logger.warning("The Server is running with the default keystore. This is only recommended if the server is running in a local area network and is not exposed to the internet. Please check if this is intended."); + secure(SparkServer.class.getClassLoader().getResource("de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks").toString(), settings.getKeystorePassword(), null, null); + } + else + { + Logger.info("Connections are secured with custom keystore"); + secure(new File(filePath).getAbsolutePath(), settings.getKeystorePassword(), null, null); + } } catch(Exception e) { @@ -99,81 +110,108 @@ public class SparkServer RouteOverview.enableRouteOverview(); - handler = new DatabaseHandler(settings); - tagHandler = new DatabaseTagHandler(settings); - + Logger.info("Trying to connect to database (jdbc:" + settings.getDatabaseType() + "://" + settings.getDatabaseUrl() + ", databaseName: " + settings.getDatabaseName() + ")"); + + try + { + Connection connection = Utils.getDatabaseConnection(settings); + DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings); + creator.createTables(); + Logger.info("Successfully initialized database (jdbc:" + settings.getDatabaseType() + "://" + settings.getDatabaseUrl() + ", databaseName: " + settings.getDatabaseName() + ")"); + connection.close(); + } + catch(Exception e) + { + Logger.error(e); + throw new IllegalStateException("Cannot connect the database!", e); + } + before((request, response) -> { - String clientSecret = request.queryMap("secret").value(); if(clientSecret == null || !clientSecret.equals(HashUtils.hash(settings.getServerSecret(), Helpers.SALT))) { + Logger.debug("Unauthorized request from " + request.ip()); halt(401, "Unauthorized"); } - new RepeatingPaymentUpdater(handler).updateRepeatingPayments(DateTime.now()); + DatabaseHandler handler = Utils.getDatabaseHandler(settings); + RepeatingPaymentUpdater paymentUpdater = new RepeatingPaymentUpdater(handler); + paymentUpdater.updateRepeatingPayments(DateTime.now()); + handler.closeConnection(); }); - - // Category - get("/category", new CategoryGetAll(handler, gson)); - get("/category/single", new CategoryGet(handler, gson)); - post("/category", new CategoryAdd(handler)); - put("/category", new CategoryUpdate(handler)); - delete("/category", new CategoryDelete(handler)); - - // Payment - get("/payment/search", new PaymentSearch(handler, tagHandler)); - get("/payment/search/maxAmount", new PaymentMaxAmount(handler, gson)); - // Normal - get("/payment", new PaymentGet(handler, gson)); - post("/payment", new PaymentAdd(handler, gson)); - put("/payment", new PaymentUpdate(handler)); - delete("/payment", new PaymentDelete(handler, tagHandler)); - - // Repeating - get("/repeatingpayment/single", new RepeatingPaymentGet(handler, gson)); - get("/repeatingpayment", new RepeatingPaymentGetAll(handler, gson)); - post("/repeatingpayment", new RepeatingPaymentAdd(handler, gson)); - delete("/repeatingpayment", new RepeatingPaymentDelete(handler, tagHandler)); - - // CategoryBudget - get("/categorybudget", new CategoryBudgetGet(handler, gson)); - - // Rest - get("/rest", new RestGet(handler, gson)); - - // charts - get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(handler, gson)); - get("/charts/monthInOutSum", new MonthInOutSum(handler, gson)); - // tag - get("/tag/single", new TagGet(tagHandler, gson)); - get("/tag/single/byName", new TagGetByName(tagHandler, gson)); - get("/tag", new TagGetAll(tagHandler, gson)); - post("/tag", new TagAdd(tagHandler)); - delete("/tag", new TagDelete(tagHandler)); - - // tag match - get("/tag/match/all/normal", new TagMatchGetAllForPayment(tagHandler, gson)); - get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(tagHandler, gson)); - get("/tag/match/normal", new TagMatchExistingForPayment(tagHandler, gson)); - get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(tagHandler, gson)); - post("/tag/match/normal", new TagMatchAddForPayment(tagHandler)); - post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(tagHandler)); - delete("/tag/match/normal", new TagMatchDeleteForPayment(tagHandler)); - delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(tagHandler)); - - // Database - get("/database", new DatabaseExport(settings, gson)); - post("/database", new DatabaseImport(handler, tagHandler, gson)); - delete("/database", new DatabaseDelete(handler, settings)); - - get("/info", new InformationGet(gson, versionInfo, settings)); - get("/version", new VersionGet(gson, versionInfo)); - delete("/log", new LogDelete()); + try + { + // Category + get("/category", new CategoryGetAll(Utils.getDatabaseHandler(settings), gson)); + get("/category/single", new CategoryGet(Utils.getDatabaseHandler(settings), gson)); + post("/category", new CategoryAdd(Utils.getDatabaseHandler(settings))); + put("/category", new CategoryUpdate(Utils.getDatabaseHandler(settings))); + delete("/category", new CategoryDelete(Utils.getDatabaseHandler(settings))); + + // Payment + get("/payment/search", new PaymentSearch(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings))); + get("/payment/search/maxAmount", new PaymentMaxAmount(Utils.getDatabaseHandler(settings), gson)); + // Normal + get("/payment", new PaymentGet(Utils.getDatabaseHandler(settings), gson)); + post("/payment", new PaymentAdd(Utils.getDatabaseHandler(settings), gson)); + put("/payment", new PaymentUpdate(Utils.getDatabaseHandler(settings))); + delete("/payment", new PaymentDelete(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings))); + + // Repeating + get("/repeatingpayment/single", new RepeatingPaymentGet(Utils.getDatabaseHandler(settings), gson)); + get("/repeatingpayment", new RepeatingPaymentGetAll(Utils.getDatabaseHandler(settings), gson)); + post("/repeatingpayment", new RepeatingPaymentAdd(Utils.getDatabaseHandler(settings), gson)); + delete("/repeatingpayment", new RepeatingPaymentDelete(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings))); + + // CategoryBudget + get("/categorybudget", new CategoryBudgetGet(Utils.getDatabaseHandler(settings), gson)); + + // Rest + get("/rest", new RestGet(Utils.getDatabaseHandler(settings), gson)); + + // charts + get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(Utils.getDatabaseHandler(settings), gson)); + get("/charts/monthInOutSum", new MonthInOutSum(Utils.getDatabaseHandler(settings), gson)); + + // tag + get("/tag/single", new TagGet(Utils.getDatabaseTagHandler(settings), gson)); + get("/tag/single/byName", new TagGetByName(Utils.getDatabaseTagHandler(settings), gson)); + get("/tag", new TagGetAll(Utils.getDatabaseTagHandler(settings), gson)); + post("/tag", new TagAdd(Utils.getDatabaseTagHandler(settings))); + delete("/tag", new TagDelete(Utils.getDatabaseTagHandler(settings))); + + // tag match + get("/tag/match/all/normal", new TagMatchGetAllForPayment(Utils.getDatabaseTagHandler(settings), gson)); + get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(Utils.getDatabaseTagHandler(settings), gson)); + get("/tag/match/normal", new TagMatchExistingForPayment(Utils.getDatabaseTagHandler(settings), gson)); + get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(Utils.getDatabaseTagHandler(settings), gson)); + post("/tag/match/normal", new TagMatchAddForPayment(Utils.getDatabaseTagHandler(settings))); + post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(Utils.getDatabaseTagHandler(settings))); + delete("/tag/match/normal", new TagMatchDeleteForPayment(Utils.getDatabaseTagHandler(settings))); + delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(Utils.getDatabaseTagHandler(settings))); + + // Database + get("/database", new DatabaseExport(settings, gson)); + post("/database", new DatabaseImport(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings), gson)); + delete("/database", new DatabaseDelete(Utils.getDatabaseHandler(settings), settings)); + + get("/info", new InformationGet(gson, versionInfo, settings)); + get("/version", new VersionGet(gson, versionInfo)); + delete("/log", new LogDelete()); + get("/shutdown", new Shutdown(shutdownInProgress)); + } + catch(ClassNotFoundException e) + { + Logger.error(e); + } after((request, response) -> { - new RepeatingPaymentUpdater(handler).updateRepeatingPayments(DateTime.now()); + DatabaseHandler handler = Utils.getDatabaseHandler(settings); + RepeatingPaymentUpdater paymentUpdater = new RepeatingPaymentUpdater(handler); + paymentUpdater.updateRepeatingPayments(DateTime.now()); + handler.closeConnection(); }); Spark.exception(Exception.class, (exception, request, response) -> { diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java index e1c68a1fab74995e212a9f5cd6cf124aee5282ad..4a5e3fa258a2bdd2ff3c5fb1f18a7e4b439e13ab 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java @@ -2,22 +2,28 @@ package de.deadlocker8.budgetmasterserver.server.category; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class CategoryAdd implements Route +public class CategoryAdd implements AdvancedRoute { private DatabaseHandler handler; - public CategoryAdd( DatabaseHandler handler) + public CategoryAdd(DatabaseHandler handler) { this.handler = handler; } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("name") || !req.queryParams().contains("color")) { @@ -41,4 +47,10 @@ public class CategoryAdd implements Route return ""; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java index 134d68b26d999055b676952670d6983856bf54a0..e1b80572c702584a7e63b41e35754f579c273fc4 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.category; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class CategoryDelete implements Route +public class CategoryDelete implements AdvancedRoute { private DatabaseHandler handler; @@ -17,7 +17,13 @@ public class CategoryDelete implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id")) { @@ -53,4 +59,10 @@ public class CategoryDelete implements Route return ""; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java index bda73e67ae850a08732b72b94c8a556ae53c5bd1..1fd8abe32f79a99dbc0205d81961865d13898438 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java @@ -5,12 +5,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.category.Category; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class CategoryGet implements Route +public class CategoryGet implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -22,7 +22,13 @@ public class CategoryGet implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id")) { @@ -58,4 +64,10 @@ public class CategoryGet implements Route } return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java index 2cb97062a8b66480191e522c4e118f9d106f2494..1e6af5f18d3bb93134e76ca200c25dc5c22f427c 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java @@ -8,12 +8,12 @@ import java.util.Collections; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.category.Category; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class CategoryGetAll implements Route +public class CategoryGetAll implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -25,10 +25,16 @@ public class CategoryGetAll implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { try - { + { ArrayList<Category> categories = handler.getCategories(); Collections.sort(categories, (c1, c2) -> c1.getName().toLowerCase().compareTo(c2.getName().toLowerCase())); @@ -37,7 +43,13 @@ public class CategoryGetAll implements Route catch(IllegalStateException e) { halt(500, "Internal Server Error"); - } + } return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java index 0b55664fac5968338e3091e57f149186fb104d4b..8f651e484a685143788ee9a128d275771aeed184 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.category; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class CategoryUpdate implements Route +public class CategoryUpdate implements AdvancedRoute { private DatabaseHandler handler; @@ -17,7 +17,13 @@ public class CategoryUpdate implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id") ||!req.queryParams().contains("name") || !req.queryParams().contains("color")) { @@ -53,4 +59,10 @@ public class CategoryUpdate implements Route return ""; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java index 7ae44cb599ef970c44e2a2c5aeb9f33c5cc8d9ba..545365e594dbbf0bf95a647de9093e62e75acae2 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java @@ -12,12 +12,12 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.category.Category; import de.deadlocker8.budgetmaster.logic.category.CategoryBudget; import de.deadlocker8.budgetmaster.logic.payment.Payment; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class CategoryBudgetGet implements Route +public class CategoryBudgetGet implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -29,65 +29,72 @@ public class CategoryBudgetGet implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("year") || !req.queryParams().contains("month")) { halt(400, "Bad Request"); } - + int year = 0; int month = 0; - + try - { + { year = Integer.parseInt(req.queryMap("year").value()); month = Integer.parseInt(req.queryMap("month").value()); - + if(year < 0 || month < 1 || month > 12) { halt(400, "Bad Request"); } - + try - { + { ArrayList<Payment> payments = new ArrayList<>(); payments.addAll(handler.getPayments(year, month)); - payments.addAll(handler.getRepeatingPayments(year, month)); - + payments.addAll(handler.getRepeatingPayments(year, month)); + ArrayList<CategoryBudget> budgets = new ArrayList<>(); - + for(Category currentCategory : handler.getCategories()) { budgets.add(new CategoryBudget(currentCategory, 0)); CategoryBudget currentBudget = budgets.get(budgets.size() - 1); for(Payment currentPayment : payments) - { + { if(currentCategory.getID() == currentPayment.getCategoryID()) { currentBudget.setBudget(currentBudget.getBudget() + currentPayment.getAmount()); - } + } } } - - //filter empty categories + + // filter empty categories Iterator<CategoryBudget> iterator = budgets.iterator(); while(iterator.hasNext()) - { + { if(iterator.next().getBudget() == 0) { iterator.remove(); } } - - Collections.sort(budgets, new Comparator<CategoryBudget>() { - @Override - public int compare(CategoryBudget budget1, CategoryBudget budget2) - { - return Double.compare(budget1.getBudget(), budget2.getBudget()); - } - }); - + + Collections.sort(budgets, new Comparator<CategoryBudget>() + { + @Override + public int compare(CategoryBudget budget1, CategoryBudget budget2) + { + return Double.compare(budget1.getBudget(), budget2.getBudget()); + } + }); + return gson.toJson(budgets); } catch(IllegalStateException ex) @@ -99,7 +106,13 @@ public class CategoryBudgetGet implements Route { halt(400, "Bad Request"); } - + return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java index a83a7a50964ad81606f4591aa2b90512a40a9b1e..6aad5ea8afdfbdfb497b8e66247a26a3ced7a84b 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java @@ -9,12 +9,12 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.category.Category; import de.deadlocker8.budgetmaster.logic.charts.CategoryInOutSum; import de.deadlocker8.budgetmaster.logic.payment.Payment; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class CategoryInOutSumForMonth implements Route +public class CategoryInOutSumForMonth implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -26,7 +26,13 @@ public class CategoryInOutSumForMonth implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("startDate") || !req.queryParams().contains("endDate")) { @@ -71,4 +77,10 @@ public class CategoryInOutSumForMonth implements Route return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java index 8a4f43f1883fde9e47fd9c922b393e645f0273ab..292fae1f31afa02f271be7ef1406c5587de8a96a 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java @@ -11,12 +11,12 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.category.Category; import de.deadlocker8.budgetmaster.logic.charts.CategoryInOutSum; import de.deadlocker8.budgetmaster.logic.payment.Payment; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class MonthInOutSum implements Route +public class MonthInOutSum implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -28,7 +28,13 @@ public class MonthInOutSum implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("startDate") || !req.queryParams().contains("endDate")) { @@ -85,4 +91,10 @@ public class MonthInOutSum implements Route return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java index f82a3e082089ca5be357b63c757bc3a4ca69a9ae..c9a6c13791fe99da67c8f0b4a43577ff3144a7ac 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java @@ -2,13 +2,19 @@ package de.deadlocker8.budgetmasterserver.server.database; import static spark.Spark.halt; +import java.sql.Connection; +import java.sql.SQLException; + +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; import de.deadlocker8.budgetmasterserver.logic.Settings; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.Utils; +import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import logger.Logger; import spark.Request; import spark.Response; -import spark.Route; -public class DatabaseDelete implements Route +public class DatabaseDelete implements AdvancedRoute { private DatabaseHandler handler; private Settings settings; @@ -20,20 +26,35 @@ public class DatabaseDelete implements Route } @Override - public Object handle(Request req, Response res) throws Exception - { + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) + { try { handler.deleteDatabase(); - handler = new DatabaseHandler(settings); + Connection connection = Utils.getDatabaseConnection(settings); + DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings); + creator.createTables(); + Logger.info("Successfully initialized database (" + settings.getDatabaseUrl() + settings.getDatabaseName() + ")"); return ""; } - catch(IllegalStateException ex) + catch(IllegalStateException | SQLException | ClassNotFoundException ex) { halt(500, "Internal Server Error"); } return ""; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java index c9d88f6a72ec94205461d8c33146e7663192e151..a108686d4996aa3f6306fdfcbcbfe98ea3e02f2a 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java @@ -4,14 +4,14 @@ import static spark.Spark.halt; import com.google.gson.Gson; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; import de.deadlocker8.budgetmasterserver.logic.Settings; import de.deadlocker8.budgetmasterserver.logic.database.DatabaseExporter; import logger.Logger; import spark.Request; import spark.Response; -import spark.Route; -public class DatabaseExport implements Route +public class DatabaseExport implements AdvancedRoute { private Settings settings; private Gson gson; @@ -23,7 +23,12 @@ public class DatabaseExport implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + } + + @Override + public Object handleRequest(Request req, Response res) { try { @@ -38,4 +43,9 @@ public class DatabaseExport implements Route return ""; } + + @Override + public void after() + { + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java index fa3e9b13a2f7012aed495d03f5919ac58efb2e72..65800d25ddff4083fccc56b147893bb58b8f65f2 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java @@ -5,18 +5,18 @@ import static spark.Spark.halt; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.database.Database; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; import de.deadlocker8.budgetmasterserver.logic.database.DatabaseImporter; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import logger.Logger; import spark.Request; import spark.Response; -import spark.Route; -public class DatabaseImport implements Route +public class DatabaseImport implements AdvancedRoute { private DatabaseHandler handler; - private DatabaseTagHandler tagHandler; + private DatabaseTagHandler tagHandler; private Gson gson; public DatabaseImport(DatabaseHandler handler, DatabaseTagHandler tagHandler, Gson gson) @@ -27,10 +27,17 @@ public class DatabaseImport implements Route } @Override - public Object handle(Request req, Response res) throws Exception - { - String databaseJSON = req.body(); - + public void before() + { + handler.connect(); + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) + { + String databaseJSON = req.body(); + try { Database database = gson.fromJson(databaseJSON, Database.class); @@ -44,7 +51,14 @@ public class DatabaseImport implements Route Logger.error(e); halt(500, "Internal Server Error"); } - + return ""; } + + @Override + public void after() + { + handler.closeConnection(); + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java index 199b19a2a283a7bce75bb9352d6af8d62489b679..93abe986555c5fe59b2a5e45b18d93de12de9527 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java @@ -4,12 +4,12 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.serverconnection.ServerInformation; import de.deadlocker8.budgetmaster.logic.updater.VersionInformation; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; import de.deadlocker8.budgetmasterserver.logic.Settings; import spark.Request; import spark.Response; -import spark.Route; -public class InformationGet implements Route +public class InformationGet implements AdvancedRoute { private Gson gson; private VersionInformation versionInfo; @@ -23,7 +23,12 @@ public class InformationGet implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + } + + @Override + public Object handleRequest(Request req, Response res) { ServerInformation serverInfo = new ServerInformation(); serverInfo.setDatabaseUrl(settings.getDatabaseUrl()); @@ -35,4 +40,9 @@ public class InformationGet implements Route return gson.toJson(serverInfo); } + + @Override + public void after() + { + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java index eb77c8cbc3f574f2818093c2289864e174fa62bf..c2720a593ae67495768dfcff6e79985cb0716354 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java @@ -3,11 +3,11 @@ package de.deadlocker8.budgetmasterserver.server.info; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.updater.VersionInformation; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; import spark.Request; import spark.Response; -import spark.Route; -public class VersionGet implements Route +public class VersionGet implements AdvancedRoute { private Gson gson; private VersionInformation versionInfo; @@ -19,8 +19,18 @@ public class VersionGet implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + } + + @Override + public Object handleRequest(Request req, Response res) { return gson.toJson(versionInfo); } + + @Override + public void after() + { + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java index 366973c54cdcafb79a0cff444bd926da7ba45f28..daf3cd9488a9f12fc1d4ba38a9a9ddfcd80c39fb 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.log; import static spark.Spark.halt; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; import logger.Logger; import spark.Request; import spark.Response; -import spark.Route; -public class LogDelete implements Route +public class LogDelete implements AdvancedRoute { public LogDelete() { @@ -15,8 +15,13 @@ public class LogDelete implements Route } @Override - public Object handle(Request req, Response res) throws Exception - { + public void before() + { + } + + @Override + public Object handleRequest(Request req, Response res) + { try { Logger.clearLogFile(); @@ -29,4 +34,9 @@ public class LogDelete implements Route return ""; } + + @Override + public void after() + { + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java index 86a78819e0481f958bd4eaaef065f52b53519d11..b6bc9fd85da4272e16e8d2d0f8ce07673ed8a191 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java @@ -4,12 +4,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class PaymentAdd implements Route +public class PaymentAdd implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -21,45 +21,57 @@ public class PaymentAdd implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("amount") || - !req.queryParams().contains("date") || - !req.queryParams().contains("categoryID") || - !req.queryParams().contains("name") || - !req.queryParams().contains("description")) - { - halt(400, "Bad Request"); - } - - int amount = 0; - int categoryID = 0; - - try - { - amount = Integer.parseInt(req.queryMap("amount").value()); - categoryID = Integer.parseInt(req.queryMap("categoryID").value()); + !req.queryParams().contains("date") || + !req.queryParams().contains("categoryID") || + !req.queryParams().contains("name") || + !req.queryParams().contains("description")) + { + halt(400, "Bad Request"); + } + + int amount = 0; + int categoryID = 0; try - { - Integer id = handler.addNormalPayment(amount, - req.queryMap("date").value(), - categoryID, - req.queryMap("name").value(), - req.queryMap("description").value()); + { + amount = Integer.parseInt(req.queryMap("amount").value()); + categoryID = Integer.parseInt(req.queryMap("categoryID").value()); + + try + { + Integer id = handler.addNormalPayment(amount, + req.queryMap("date").value(), + categoryID, + req.queryMap("name").value(), + req.queryMap("description").value()); - return gson.toJson(id); + return gson.toJson(id); + } + catch(IllegalStateException ex) + { + halt(500, "Internal Server Error"); + } } - catch(IllegalStateException ex) - { - halt(500, "Internal Server Error"); + catch(Exception e) + { + halt(400, "Bad Request"); } - } - catch(Exception e) - { - halt(400, "Bad Request"); - } - - return ""; + + return ""; + } + + @Override + public void after() + { + handler.closeConnection(); } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java index f0a059d1cb7fb0f628006ca844a2bdbb679ebde2..fe70574aa24ff13f1d01908331426bf316588bb5 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java @@ -4,13 +4,13 @@ import static spark.Spark.halt; import java.util.ArrayList; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class PaymentDelete implements Route +public class PaymentDelete implements AdvancedRoute { private DatabaseHandler handler; private DatabaseTagHandler tagHandler; @@ -22,7 +22,13 @@ public class PaymentDelete implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id")) { @@ -63,4 +69,11 @@ public class PaymentDelete implements Route return ""; } + + @Override + public void after() + { + handler.closeConnection(); + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java index da8e0818163a5d99f5174c41543b740f4c2c66cb..d82b8842b3a37c968785968711fb2981e0867f8b 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java @@ -9,13 +9,13 @@ import org.joda.time.DateTime; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.payment.NormalPayment; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import de.deadlocker8.budgetmasterserver.server.updater.RepeatingPaymentUpdater; import spark.Request; import spark.Response; -import spark.Route; -public class PaymentGet implements Route +public class PaymentGet implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -24,10 +24,16 @@ public class PaymentGet implements Route { this.handler = handler; this.gson = gson; + } + + @Override + public void before() + { + handler.connect(); } @Override - public Object handle(Request req, Response res) throws Exception + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("year") || !req.queryParams().contains("month")) { @@ -59,7 +65,7 @@ public class PaymentGet implements Route try { ArrayList<NormalPayment> payments = new ArrayList<>(); - payments.addAll(handler.getPayments(year, month)); + payments.addAll(handler.getPayments(year, month)); return gson.toJson(payments); } @@ -75,4 +81,10 @@ public class PaymentGet implements Route return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java index 6c4215e4abb046abb0781f2458017858b2ccf57d..e0e94e52d9e2bbdb7f5a81e53188486d625759fd 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class PaymentUpdate implements Route +public class PaymentUpdate implements AdvancedRoute { private DatabaseHandler handler; @@ -17,54 +17,66 @@ public class PaymentUpdate implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id") || - !req.queryParams().contains("amount") || - !req.queryParams().contains("date") || - !req.queryParams().contains("categoryID") || - !req.queryParams().contains("name") || - !req.queryParams().contains("description")) - { - halt(400, "Bad Request"); - } - - int id = -1; - int amount = 0; - int categoryID = -1; - - try - { - id = Integer.parseInt(req.queryMap("id").value()); - amount = Integer.parseInt(req.queryMap("amount").value()); - categoryID = Integer.parseInt(req.queryMap("categoryID").value()); - - if(id < 0) + !req.queryParams().contains("amount") || + !req.queryParams().contains("date") || + !req.queryParams().contains("categoryID") || + !req.queryParams().contains("name") || + !req.queryParams().contains("description")) { halt(400, "Bad Request"); - } + } + + int id = -1; + int amount = 0; + int categoryID = -1; try { - handler.updateNormalPayment(id, - amount, - req.queryMap("date").value(), - categoryID, - req.queryMap("name").value(), - req.queryMap("description").value()); + id = Integer.parseInt(req.queryMap("id").value()); + amount = Integer.parseInt(req.queryMap("amount").value()); + categoryID = Integer.parseInt(req.queryMap("categoryID").value()); + + if(id < 0) + { + halt(400, "Bad Request"); + } + + try + { + handler.updateNormalPayment(id, + amount, + req.queryMap("date").value(), + categoryID, + req.queryMap("name").value(), + req.queryMap("description").value()); - return ""; - } - catch(IllegalStateException ex) - { - halt(500, "Internal Server Error"); + return ""; + } + catch(IllegalStateException ex) + { + halt(500, "Internal Server Error"); + } + } + catch(Exception e) + { + halt(400, "Bad Request"); } - } - catch(Exception e) - { - halt(400, "Bad Request"); - } - - return ""; + + return ""; + } + + @Override + public void after() + { + handler.closeConnection(); } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java index 72111cbffa878a2a8a1be9f6db7a03d4c8132cb8..05c1bd614d6f3b557f97cdc7f78148acda90c5fa 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java @@ -4,73 +4,78 @@ import static spark.Spark.halt; import com.google.gson.Gson; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class RepeatingPaymentAdd implements Route +public class RepeatingPaymentAdd implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; - + public RepeatingPaymentAdd(DatabaseHandler handler, Gson gson) - { + { this.handler = handler; this.gson = gson; } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { - if(!req.queryParams().contains("amount") || - !req.queryParams().contains("date") || - !req.queryParams().contains("categoryID") || - !req.queryParams().contains("name") || - !req.queryParams().contains("repeatInterval") || - !req.queryParams().contains("repeatEndDate") || - !req.queryParams().contains("repeatMonthDay") || - !req.queryParams().contains("description")) - { + if(!req.queryParams().contains("amount") + || !req.queryParams().contains("date") + || !req.queryParams().contains("categoryID") + || !req.queryParams().contains("name") + || !req.queryParams().contains("repeatInterval") + || !req.queryParams().contains("repeatEndDate") + || !req.queryParams().contains("repeatMonthDay") + || !req.queryParams().contains("description")) + { halt(400, "Bad Request"); - } - + } + int amount = 0; int categoryID = 0; int repeatInterval = 0; int repeatMonthDay = 0; - + try - { + { amount = Integer.parseInt(req.queryMap("amount").value()); categoryID = Integer.parseInt(req.queryMap("categoryID").value()); repeatInterval = Integer.parseInt(req.queryMap("repeatInterval").value()); repeatMonthDay = Integer.parseInt(req.queryMap("repeatMonthDay").value()); - + try - { - Integer id = handler.addRepeatingPayment(amount, - req.queryMap("date").value(), - categoryID, - req.queryMap("name").value(), - req.queryMap("description").value(), - repeatInterval, - req.queryMap("repeatEndDate").value(), - repeatMonthDay); + { + Integer id = handler.addRepeatingPayment(amount, req.queryMap("date").value(), categoryID, req.queryMap("name").value(), req.queryMap("description").value(), repeatInterval, req.queryMap("repeatEndDate").value(), repeatMonthDay); return gson.toJson(id); } catch(IllegalStateException ex) - { + { halt(500, "Internal Server Error"); } } catch(Exception e) - { + { e.printStackTrace(); halt(400, "Bad Request"); } - + return ""; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java index 0df80498598d4b81e4736201d11a44ba34f5481d..1ba52b1a2c90a42603eb733e8f2fcd1cc14c93f6 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java @@ -4,13 +4,13 @@ import static spark.Spark.halt; import java.util.ArrayList; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class RepeatingPaymentDelete implements Route +public class RepeatingPaymentDelete implements AdvancedRoute { private DatabaseHandler handler; private DatabaseTagHandler tagHandler; @@ -22,7 +22,14 @@ public class RepeatingPaymentDelete implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id")) { @@ -63,4 +70,11 @@ public class RepeatingPaymentDelete implements Route return ""; } + + @Override + public void after() + { + handler.closeConnection(); + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java index 5349848f24246bb03affc36ad554638fab1efbe3..f1ef2b2a38d0be9f6f710e9eb3e46f3d7089c1ab 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java @@ -5,12 +5,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class RepeatingPaymentGet implements Route +public class RepeatingPaymentGet implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -22,7 +22,13 @@ public class RepeatingPaymentGet implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id")) { @@ -58,4 +64,10 @@ public class RepeatingPaymentGet implements Route return ""; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java index ce617830abc32782ed64ca81ce56af1e03472576..88dbe39ffb5c270158febc78ceeed0a20c084985 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java @@ -9,13 +9,13 @@ import org.joda.time.DateTime; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import de.deadlocker8.budgetmasterserver.server.updater.RepeatingPaymentUpdater; import spark.Request; import spark.Response; -import spark.Route; -public class RepeatingPaymentGetAll implements Route +public class RepeatingPaymentGetAll implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -27,7 +27,13 @@ public class RepeatingPaymentGetAll implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("year") || !req.queryParams().contains("month")) { @@ -75,4 +81,10 @@ public class RepeatingPaymentGetAll implements Route return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java index a8f40253bb8fb229128ca313bc0ecb10e29156f2..e64331e253b10ebaa7d919b8fd431a4224101912 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java @@ -4,12 +4,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class PaymentMaxAmount implements Route +public class PaymentMaxAmount implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -21,7 +21,13 @@ public class PaymentMaxAmount implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { try { @@ -43,4 +49,10 @@ public class PaymentMaxAmount implements Route return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java index 9c7f3b639ded27953e5531f5d04c5823f125f87a..4c9a8987e82bdf727f7e067661d1c683cd1e2b27 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java @@ -12,13 +12,13 @@ import de.deadlocker8.budgetmaster.logic.payment.Payment; import de.deadlocker8.budgetmaster.logic.payment.PaymentJSONSerializer; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; import de.deadlocker8.budgetmaster.logic.tag.Tag; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class PaymentSearch implements Route +public class PaymentSearch implements AdvancedRoute { private DatabaseHandler handler; private DatabaseTagHandler tagHandler; @@ -29,49 +29,6 @@ public class PaymentSearch implements Route this.tagHandler = tagHandler; } - @Override - public Object handle(Request req, Response res) throws Exception - { - try - { - ArrayList<Payment> payments = new ArrayList<>(); - ArrayList<NormalPayment> normalPayments = handler.getAllNormalPayments(); - ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments(); - for(Payment currentPayment : normalPayments) - { - if(meetsCriteria(req, currentPayment)) - { - payments.add(currentPayment); - } - } - - for(Payment currentPayment : repeatingPayments) - { - if(meetsCriteria(req, currentPayment)) - { - payments.add(currentPayment); - } - } - - Collections.sort(payments, new Comparator<Payment>() - { - @Override - public int compare(Payment o1, Payment o2) - { - return o1.getDate().compareTo(o2.getDate()); - } - }); - - return PaymentJSONSerializer.serializePaymentList(payments); - } - catch(IllegalStateException ex) - { - halt(500, "Internal Server Error"); - } - - return null; - } - private boolean meetsCriteria(Request req, Payment payment) { boolean otherChecksThanAmount = false; @@ -186,4 +143,61 @@ public class PaymentSearch implements Route return true; } + + @Override + public void before() + { + handler.connect(); + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) + { + try + { + ArrayList<Payment> payments = new ArrayList<>(); + ArrayList<NormalPayment> normalPayments = handler.getAllNormalPayments(); + ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments(); + for(Payment currentPayment : normalPayments) + { + if(meetsCriteria(req, currentPayment)) + { + payments.add(currentPayment); + } + } + + for(Payment currentPayment : repeatingPayments) + { + if(meetsCriteria(req, currentPayment)) + { + payments.add(currentPayment); + } + } + + Collections.sort(payments, new Comparator<Payment>() + { + @Override + public int compare(Payment o1, Payment o2) + { + return o1.getDate().compareTo(o2.getDate()); + } + }); + + return PaymentJSONSerializer.serializePaymentList(payments); + } + catch(IllegalStateException ex) + { + halt(500, "Internal Server Error"); + } + + return null; + } + + @Override + public void after() + { + handler.closeConnection(); + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java index 1ebdf5004b4a8bb8959018692b795aed4bd9cfd4..03e26be3425bf53cf418cd7aa6956a1e635bc6b2 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java @@ -4,12 +4,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import spark.Request; import spark.Response; -import spark.Route; -public class RestGet implements Route +public class RestGet implements AdvancedRoute { private DatabaseHandler handler; private Gson gson; @@ -21,7 +21,13 @@ public class RestGet implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + handler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("year") || !req.queryParams().contains("month")) { @@ -59,4 +65,10 @@ public class RestGet implements Route return null; } + + @Override + public void after() + { + handler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/shutdown/Shutdown.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/shutdown/Shutdown.java new file mode 100644 index 0000000000000000000000000000000000000000..9befe246b7dd6b51c0da296e04479b13ba6a8efe --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/shutdown/Shutdown.java @@ -0,0 +1,57 @@ +package de.deadlocker8.budgetmasterserver.server.shutdown; + +import java.util.Timer; +import java.util.TimerTask; + +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import logger.Logger; +import spark.Request; +import spark.Response; + +public class Shutdown implements AdvancedRoute +{ + private boolean shutdownInProgress; + + public Shutdown(boolean shutdownInProgress) + { + this.shutdownInProgress = shutdownInProgress; + } + + @Override + public void before() + { + } + + @Override + public Object handleRequest(Request req, Response res) + { + Logger.info("Shutting down server due to client request"); + if(!shutdownInProgress) + { + shutdownInProgress = true; + TimerTask task = new TimerTask() + { + @Override + public void run() + { + Logger.info("Shutdown DONE"); + System.exit(0); + } + }; + + Timer timer = new Timer(); + timer.schedule(task, 2000); + return ""; + } + else + { + Logger.info("Shutdown is already scheduled"); + return ""; + } + } + + @Override + public void after() + { + } +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java index 64b71a28e54300a9fd748761310f92bbbf5cdff4..85533edccee9ded42a02bb95ca0edcd3f65dcd8f 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.match; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchAddForPayment implements Route +public class TagMatchAddForPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; @@ -17,7 +17,13 @@ public class TagMatchAddForPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("tagID") || !req.queryParams().contains("paymentID")) { @@ -49,4 +55,10 @@ public class TagMatchAddForPayment implements Route return ""; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java index 3eb1871ca76dde351b40491be4e862d1d6545eea..f82989dce43ad5d3f20d99d31d7822ef0f410fcd 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.match; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchAddForRepeatingPayment implements Route +public class TagMatchAddForRepeatingPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; @@ -17,7 +17,13 @@ public class TagMatchAddForRepeatingPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("tagID") || !req.queryParams().contains("repeatingPaymentID")) { @@ -49,4 +55,10 @@ public class TagMatchAddForRepeatingPayment implements Route return ""; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java index 9f676c0e8252312921ce688c2fb8ee95f2625dbb..b607b3fc8a475e88bd1298c850b69d6983e2bbef 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java @@ -2,13 +2,13 @@ package de.deadlocker8.budgetmasterserver.server.tag.match; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import de.deadlocker8.budgetmasterserver.server.updater.TagUpdater; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchDeleteForPayment implements Route +public class TagMatchDeleteForPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; @@ -18,7 +18,13 @@ public class TagMatchDeleteForPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("tagID") || !req.queryParams().contains("paymentID")) { @@ -53,4 +59,10 @@ public class TagMatchDeleteForPayment implements Route return ""; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java index ab0e5a1c6fbac0c1eb5e2265513f2ee62fd93baf..e8d9b4dd61a70d470c03207e57680bd3d3e4cbf3 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java @@ -2,13 +2,13 @@ package de.deadlocker8.budgetmasterserver.server.tag.match; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import de.deadlocker8.budgetmasterserver.server.updater.TagUpdater; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchDeleteForRepeatingPayment implements Route +public class TagMatchDeleteForRepeatingPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; @@ -18,7 +18,13 @@ public class TagMatchDeleteForRepeatingPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("tagID") || !req.queryParams().contains("repeatingPaymentID")) { @@ -53,4 +59,10 @@ public class TagMatchDeleteForRepeatingPayment implements Route return ""; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java index 9d1bb98528bd1324a2b01e8b2ed4f9eadf690432..c14317c7e6318de787c50ddedcf476d0880f8619 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java @@ -4,12 +4,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchExistingForPayment implements Route +public class TagMatchExistingForPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; private Gson gson; @@ -21,7 +21,13 @@ public class TagMatchExistingForPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("tagID") || !req.queryParams().contains("paymentID")) { @@ -51,4 +57,10 @@ public class TagMatchExistingForPayment implements Route return null; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java index 5b6fda13a934ea9030b1eb3cffa970db02ab232b..6bc8dd8a2d84d8eb7ce2b0767d572c9dce76597c 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java @@ -4,12 +4,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchExistingForRepeatingPayment implements Route +public class TagMatchExistingForRepeatingPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; private Gson gson; @@ -21,7 +21,13 @@ public class TagMatchExistingForRepeatingPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("tagID") || !req.queryParams().contains("repeatingPaymentID")) { @@ -51,4 +57,10 @@ public class TagMatchExistingForRepeatingPayment implements Route return null; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java index 08a93ad9b39d992c4fd7d3efce79529266e37c9a..dcea960f421f1115b3eb11f1aa6b3b71abe93b52 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java @@ -7,12 +7,12 @@ import java.util.ArrayList; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.tag.Tag; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchGetAllForPayment implements Route +public class TagMatchGetAllForPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; private Gson gson; @@ -24,7 +24,13 @@ public class TagMatchGetAllForPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("paymentID")) { @@ -64,4 +70,10 @@ public class TagMatchGetAllForPayment implements Route return null; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java index 7f8b4465060aacc42b46a88ce0054d82b1927a0b..45d3ec84f142eeb61b8d433bdf36d9a4093fccbe 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java @@ -7,12 +7,12 @@ import java.util.ArrayList; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.tag.Tag; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagMatchGetAllForRepeatingPayment implements Route +public class TagMatchGetAllForRepeatingPayment implements AdvancedRoute { private DatabaseTagHandler tagHandler; private Gson gson; @@ -24,7 +24,13 @@ public class TagMatchGetAllForRepeatingPayment implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("repeatingPaymentID")) { @@ -64,4 +70,10 @@ public class TagMatchGetAllForRepeatingPayment implements Route return null; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java index edd44ab77f1e03d4d1c19f640910a4e395ab5ab2..03dddec883199737478b354444cc5fcfbddbd250 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.tag; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagAdd implements Route +public class TagAdd implements AdvancedRoute { private DatabaseTagHandler tagHandler; @@ -17,7 +17,13 @@ public class TagAdd implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("name")) { @@ -41,4 +47,10 @@ public class TagAdd implements Route return ""; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java index 75d45f927b3601069b422cadd0ff2221d1d57069..df498f1d5260d39867692ce4f39133708e228d79 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java @@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.tag; import static spark.Spark.halt; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagDelete implements Route +public class TagDelete implements AdvancedRoute { private DatabaseTagHandler tagHandler; @@ -17,7 +17,13 @@ public class TagDelete implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id")) { @@ -53,4 +59,10 @@ public class TagDelete implements Route return ""; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java index 782df0b96bd7b4ba78fc064aa3eced912a45cf58..1a6f419b191e2c762250d394449550c18b9885b9 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java @@ -5,12 +5,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.tag.Tag; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagGet implements Route +public class TagGet implements AdvancedRoute { private DatabaseTagHandler tagHandler; private Gson gson; @@ -22,7 +22,13 @@ public class TagGet implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("id")) { @@ -57,4 +63,10 @@ public class TagGet implements Route } return null; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java index 46f52361320184f834fa7d1e9b4d76797378bcf2..3fc9d143729c636eb20a22cd58a76a4e50807e46 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java @@ -7,12 +7,12 @@ import java.util.ArrayList; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.tag.Tag; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagGetAll implements Route +public class TagGetAll implements AdvancedRoute { private DatabaseTagHandler tagHandler; private Gson gson; @@ -24,7 +24,13 @@ public class TagGetAll implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { try { @@ -39,4 +45,10 @@ public class TagGetAll implements Route return null; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java index a4e7a898978ff76953b2d73bb199d7653e3a0059..c2d834a1b04e30820f5d305eb2fd89dcb9e87e9f 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java @@ -5,12 +5,12 @@ import static spark.Spark.halt; import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.tag.Tag; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import spark.Request; import spark.Response; -import spark.Route; -public class TagGetByName implements Route +public class TagGetByName implements AdvancedRoute { private DatabaseTagHandler tagHandler; private Gson gson; @@ -22,7 +22,13 @@ public class TagGetByName implements Route } @Override - public Object handle(Request req, Response res) throws Exception + public void before() + { + tagHandler.connect(); + } + + @Override + public Object handleRequest(Request req, Response res) { if(!req.queryParams().contains("name")) { @@ -41,4 +47,10 @@ public class TagGetByName implements Route return null; } + + @Override + public void after() + { + tagHandler.closeConnection(); + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java index 0ad4e5f8836e6cbb69c6cae0cc16164e87351928..6baa1a309ee9fa16db207ec8692bec8bead0089e 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java @@ -8,7 +8,7 @@ import org.joda.time.Months; import de.deadlocker8.budgetmaster.logic.payment.LatestRepeatingPayment; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import logger.Logger; public class RepeatingPaymentUpdater @@ -24,8 +24,8 @@ public class RepeatingPaymentUpdater public void updateRepeatingPayments(DateTime now) { try - { - ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments(); + { + ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments(); ArrayList<LatestRepeatingPayment> latest = handler.getLatestRepeatingPaymentEntries(); for(RepeatingPayment currentPayment : repeatingPayments) @@ -82,8 +82,8 @@ public class RepeatingPaymentUpdater if(payment.getRepeatInterval() != 0) { int numberOfDays = Days.daysBetween(startDate, now).getDays(); - int occurrences = numberOfDays / payment.getRepeatInterval(); - for(int i = 0; i <= occurrences + 1; i++) + int occurrences = numberOfDays / payment.getRepeatInterval(); + for(int i = 0; i <= occurrences; i++) { dates.add(startDate.plusDays(i * payment.getRepeatInterval())); } diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java index 1263871aee24650744f3cf742506dbf93505bca9..1776c9be0d3ed3367181b8b5e588750c93b1b841 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java @@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.updater; import java.util.ArrayList; import de.deadlocker8.budgetmaster.logic.tag.Tag; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; public class TagUpdater { diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties index 5cb7f01cc467be6ffc386715960412e28a2df9c3..18fa55ffc20c2327236e5cd4c09f4e2676eb9dfc 100644 --- a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties +++ b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties @@ -1,7 +1,7 @@ app.name=BudgetMasterServer -version.code=11 -version.name=1.7.0 -version.date=26.10.17 +version.code=13 +version.name=1.8.0 +version.date=17.12.17 author=Robert Goldmann category.none=No Category diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_certificate.crt b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_certificate.crt new file mode 100644 index 0000000000000000000000000000000000000000..e64160ce6c2abbf275469868fcd6ecd512009fef --- /dev/null +++ b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDHjCCAgYCCQDMkgYSh6618zANBgkqhkiG9w0BAQsFADBQMQswCQYDVQQGEwJE +RTEUMBIGA1UECgwLZGVhZGxvY2tlcjgxFTATBgNVBAsMDEJ1ZGdldE1hc3RlcjEU +MBIGA1UEAwwLZGVhZGxvY2tlcjgwIBcNMTcxMTI1MTAwMzM3WhgPMjA4NTEyMTIx +MDAzMzdaMFAxCzAJBgNVBAYTAkRFMRQwEgYDVQQKDAtkZWFkbG9ja2VyODEVMBMG +A1UECwwMQnVkZ2V0TWFzdGVyMRQwEgYDVQQDDAtkZWFkbG9ja2VyODCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALzI08zIpuoK2zbgbOtAAEfwYxRZTeJr +d0+iFAYPoCgDruh2ldO6BXGpanw1QYh0dFkW/o+DhfuYnFknpwxQrBWmlG/hjFbz +QdT+5zefc1q6rX7tOJMFUY1Qj5s3l1ZFHAuD4kOUr8lgDQqoc4l4B+WTXiXPYnJh ++DcTH6oBHJVu40YXsTyGwBW+DDBn5VvkrhNkqqfedL/qQ0Nl41UTLOSG5Lg7hezP +DQiG3mEbpugGbqWV5t2CgyPr0eZMQKKo2srKPm+aIDp0kWyOIR3B7Bv9Onp70/QM +etMyLa9QWJyaGHaFkl7xwBwCl2L209iTYmJSC1GZQ252uT701VwIX70CAwEAATAN +BgkqhkiG9w0BAQsFAAOCAQEAZSH6BN4J7vLhBnZAVXrqVv/+ALEuKOpWG9pk8jfF +k1DWvH6NwIjrgrY13e6iEai/YbplGrb3U90bDF+kSH3fCu+9DueoSRlZ/pPmMDGT +1hFXU0QNNV8rjWYlttndpzaHqnxitJ4ERBcts4sFLUFq+aIQdGYR5/gpQQcXmk10 +l3suT7O8NeSM7QGFO5rMm6k6XdLOBVvzaFwzuOwxOSvxV5dFwuRFuMxYddCnBGYH +kyPom4WfRKCvcbNT6RvJWQvBX5YOjIXpOV4gmwVtBbmhxrkSQvE56zrc2mewH6MN +dDTJmV5ZYlA4hXxSELOvmNqPE1SPtK3rNjtH55BtXuqvQQ== +-----END CERTIFICATE----- diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..5850e6d1244ed95c4abe60eaed0faee3ca80f247 Binary files /dev/null and b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks differ diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json index d2281ffa1e99ec74bc91d8b444c3a43dcf93f26b..bbe6f030a7ca760d8308ba046d6068565acf28e1 100644 --- a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json +++ b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json @@ -1,10 +1,11 @@ { - "databaseUrl": "jdbc:mysql://localhost:3306/", + "databaseType": "mysql", + "databaseUrl": "localhost:3306/", "databaseName": "budgetmaster", "databaseUsername": "root", "databasePassword": "", "serverPort": 9000, - "serverSecret": "geheim", - "keystorePath": "", - "keystorePassword": "" + "serverSecret": "BudgetMaster", + "keystorePath": "default", + "keystorePassword": "BudgetMaster" } \ No newline at end of file diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java index 80f6b7c660425c26beea47feca4489dc9e2f64a2..216c65fc477c7f2bbb08dd09953a98d604225343 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java @@ -7,9 +7,13 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.net.URISyntaxException; +import java.sql.Connection; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Locale; +import org.junit.After; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -19,7 +23,8 @@ import de.deadlocker8.budgetmaster.logic.payment.NormalPayment; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; import de.deadlocker8.budgetmasterserver.logic.Settings; import de.deadlocker8.budgetmasterserver.logic.Utils; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; import tools.Localization; public class DatabaseHandlerTest @@ -34,27 +39,43 @@ public class DatabaseHandlerTest //init Settings settings = Utils.loadSettings(); System.out.println(settings); - DatabaseHandler handler = new DatabaseHandler(settings); + DatabaseHandler handler = Utils.getDatabaseHandler(settings); handler.deleteDatabase(); - handler = new DatabaseHandler(settings); - databaseHandler = handler; + handler.closeConnection(); + Connection connection = Utils.getDatabaseConnection(settings); + DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings); + creator.createTables(); + connection.close(); + databaseHandler = Utils.getDatabaseHandler(settings); Localization.init("de/deadlocker8/budgetmaster/"); Localization.loadLanguage(Locale.ENGLISH); } - catch(IOException | URISyntaxException e) + catch(IOException | URISyntaxException | SQLException | ClassNotFoundException e) { fail(e.getMessage()); } - } + } + + @Before + public void before() + { + databaseHandler.connect(); + } + + @After + public void after() + { + databaseHandler.closeConnection(); + } @Test public void testLastInsertID() - { + { Category expected = new Category("123 Tü+?est Category", "#FF0000"); databaseHandler.addCategory(expected.getName(), expected.getColor()); //3 because "NONE" and "Übertrag" has already been inserted at database creation - assertEquals(3, databaseHandler.getLastInsertID()); + assertEquals(3, databaseHandler.getLastInsertID()); } @Test @@ -252,7 +273,7 @@ public class DatabaseHandlerTest expectedPayment.getDescription()); int idPayment2 = databaseHandler.getLastInsertID(); - assertEquals(1000, databaseHandler.getRest(2017, 3)); + assertEquals(1000, databaseHandler.getRest(2017, 3)); assertEquals(200, databaseHandler.getRestForAllPreviousMonths(2017, 4)); databaseHandler.deletePayment(idPayment1); diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java index 6414890b6acbe6bf4295bfe24ca998c3112e60ab..ad8214ff31ff313e87f87c9af999b24008256c7c 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java @@ -8,9 +8,13 @@ import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Locale; +import org.junit.After; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -25,9 +29,10 @@ import de.deadlocker8.budgetmaster.logic.utils.FileHelper; import de.deadlocker8.budgetmasterserver.logic.Settings; import de.deadlocker8.budgetmasterserver.logic.Utils; import de.deadlocker8.budgetmasterserver.logic.database.DatabaseExporter; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; import de.deadlocker8.budgetmasterserver.logic.database.DatabaseImporter; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; import tools.Localization; public class DatabaseImportExportTest @@ -42,21 +47,40 @@ public class DatabaseImportExportTest try { //init - settings = Utils.loadSettings(); - DatabaseHandler handler = new DatabaseHandler(settings); + settings = Utils.loadSettings(); + System.out.println(settings); + DatabaseHandler handler = Utils.getDatabaseHandler(settings); handler.deleteDatabase(); - handler = new DatabaseHandler(settings); - databaseHandler = handler; - tagHandler = new DatabaseTagHandler(settings); + handler.closeConnection(); + Connection connection = Utils.getDatabaseConnection(settings); + DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings); + creator.createTables(); + connection.close(); + databaseHandler = Utils.getDatabaseHandler(settings); + tagHandler = Utils.getDatabaseTagHandler(settings); Localization.init("de/deadlocker8/budgetmaster/"); Localization.loadLanguage(Locale.ENGLISH); } - catch(IOException | URISyntaxException e) + catch(IOException | URISyntaxException | SQLException | ClassNotFoundException e) { fail(e.getMessage()); - } + } } + + @Before + public void before() + { + databaseHandler.connect(); + tagHandler.connect(); + } + + @After + public void after() + { + databaseHandler.closeConnection(); + tagHandler.closeConnection(); + } @Test public void testImport() @@ -111,7 +135,12 @@ public class DatabaseImportExportTest try { databaseHandler.deleteDatabase(); - databaseHandler = new DatabaseHandler(settings); + databaseHandler.closeConnection(); + Connection connection = Utils.getDatabaseConnection(settings); + DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings); + creator.createTables(); + connection.close(); + databaseHandler = Utils.getDatabaseHandler(settings);; File file = Paths.get("src/test/resources/de/deadlocker8/budgetmaster/import.json").toFile(); Database database = FileHelper.loadDatabaseJSON(file); @@ -124,7 +153,6 @@ public class DatabaseImportExportTest Gson gson = new GsonBuilder().setPrettyPrinting().create(); String databaseJSON = gson.toJson(exporter.exportDatabase()).replaceAll("\n", ""); FileHelper.saveDatabaseJSON(file, databaseJSON); - FileHelper.saveDatabaseJSON(new File("C:/Users/ROGO2/Desktop/123.json"), databaseJSON); String expectedJSON = new String(Files.readAllBytes(Paths.get("src/test/resources/de/deadlocker8/budgetmaster/import.json"))); String exportedJSON = new String(Files.readAllBytes(Paths.get("src/test/resources/de/deadlocker8/budgetmaster/export.json"))); diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java index 475c0f7f4bd1c9076dcfdccdc335ebaec7b38c88..5a6520d6adca0f95bee5b059a64608b1c3341a27 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java @@ -8,16 +8,23 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.net.URISyntaxException; +import java.sql.Connection; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.Locale; +import org.junit.After; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmasterserver.logic.Settings; import de.deadlocker8.budgetmasterserver.logic.Utils; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler; +import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator; +import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler; +import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler; +import tools.Localization; public class DatabaseTagHandlerTest { @@ -31,17 +38,36 @@ public class DatabaseTagHandlerTest //init Settings settings = Utils.loadSettings(); System.out.println(settings); - DatabaseHandler handler = new DatabaseHandler(settings); + DatabaseHandler handler = Utils.getDatabaseHandler(settings); handler.deleteDatabase(); - handler = new DatabaseHandler(settings); - tagHandler = new DatabaseTagHandler(settings); + handler.closeConnection(); + Connection connection = Utils.getDatabaseConnection(settings); + DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings); + creator.createTables(); + connection.close(); + tagHandler = Utils.getDatabaseTagHandler(settings); + + Localization.init("de/deadlocker8/budgetmaster/"); + Localization.loadLanguage(Locale.ENGLISH); } - catch(IOException | URISyntaxException e) + catch(IOException | URISyntaxException | SQLException | ClassNotFoundException e) { fail(e.getMessage()); } } + @Before + public void before() + { + tagHandler.connect(); + } + + @After + public void after() + { + tagHandler.closeConnection(); + } + @Test public void testTag() { diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java index cd660fadeff8ab2b817352d3015b707c77277490..7a9329b642561f3b5ac477d8c3b5dc73f83a538c 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java @@ -21,14 +21,15 @@ public class SettingsTest Settings settings = Utils.loadSettings(); Settings expectedSettings = new Settings(); - expectedSettings.setDatabaseName("b"); - expectedSettings.setDatabaseUrl("jdbc:mysql://localhost:3306/"); + expectedSettings.setDatabaseType("mysql"); + expectedSettings.setDatabaseName("budgetmaster"); + expectedSettings.setDatabaseUrl("localhost:3306/"); expectedSettings.setDatabaseUsername("root"); expectedSettings.setDatabasePassword(""); expectedSettings.setServerPort(9000); expectedSettings.setServerSecret("geheim"); - expectedSettings.setKeystorePath("C:/Programmierung/eclipse/workspace/BudgetMaster/certs/keystore_self_signed.jks"); - expectedSettings.setKeystorePassword("geheim"); + expectedSettings.setKeystorePath("default"); + expectedSettings.setKeystorePassword("BudgetMaster"); assertEquals(expectedSettings, settings); } diff --git a/build/BudgetMaster.exe b/build/BudgetMaster.exe index bf497806ee234597f91f0a3891f68e4c836c2285..6a6aa0f40879d9242e99776ec26ed2d4d2c1a1ff 100644 Binary files a/build/BudgetMaster.exe and b/build/BudgetMaster.exe differ diff --git a/build/BudgetMasterClient.jar b/build/BudgetMasterClient.jar index 2e38f51f849170e6c250a4b5fd10b95f0e274c84..51e41361cd4853255cc5d2bd66b309fd7cfc4b7a 100644 Binary files a/build/BudgetMasterClient.jar and b/build/BudgetMasterClient.jar differ diff --git a/build/BudgetMasterServer.jar b/build/BudgetMasterServer.jar index ec795a859b7993f3c0d6f012267de94560c6ff2b..18575b4177c1204c5aaa15a46ddce38b810aa2a3 100644 Binary files a/build/BudgetMasterServer.jar and b/build/BudgetMasterServer.jar differ diff --git a/build/screenshots/de/einstellungen.png b/build/screenshots/de/einstellungen.png deleted file mode 100644 index 8cff2ca926eb6c2b01f4434a4e243453baa9273c..0000000000000000000000000000000000000000 Binary files a/build/screenshots/de/einstellungen.png and /dev/null differ diff --git a/build/screenshots/de/einstellungen_lokal.png b/build/screenshots/de/einstellungen_lokal.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae0fe9bfc2a6490ab8e62362c4f472fee5cec8f Binary files /dev/null and b/build/screenshots/de/einstellungen_lokal.png differ diff --git a/build/screenshots/de/einstellungen_online.png b/build/screenshots/de/einstellungen_online.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4cc15d436da341724632dbba5cc8dc5c5b8e99 Binary files /dev/null and b/build/screenshots/de/einstellungen_online.png differ diff --git a/build/screenshots/en/einstellungen.png b/build/screenshots/en/einstellungen.png deleted file mode 100644 index 532309227190e95a023c423f02bc50881a93254a..0000000000000000000000000000000000000000 Binary files a/build/screenshots/en/einstellungen.png and /dev/null differ diff --git a/build/screenshots/en/einstellungen_lokal.png b/build/screenshots/en/einstellungen_lokal.png new file mode 100644 index 0000000000000000000000000000000000000000..86b742c3a4c01d676e3c96f17cf3b4313e16a2b4 Binary files /dev/null and b/build/screenshots/en/einstellungen_lokal.png differ diff --git a/build/screenshots/en/einstellungen_online.png b/build/screenshots/en/einstellungen_online.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1b014f3451356d7f173679aa4e383db208fab8 Binary files /dev/null and b/build/screenshots/en/einstellungen_online.png differ diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties index 3114aeb823a7934bbb0e852186f8f2a45ed35f6f..8f048a4c16783481359e7af4e4162ba9efd09023 100644 --- a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties +++ b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties @@ -1,4 +1,4 @@ app.name=BudgetMaster -version.code=11 -version.name=1.7.0 -version.date=26.10.17 \ No newline at end of file +version.code=13 +version.name=1.8.0 +version.date=17.12.17 \ No newline at end of file