From c1de5665942b15325825c31e5c39b5b12ab0ab76 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 6 Dec 2017 17:35:30 +0100
Subject: [PATCH] #235 - added modals for download and starting

---
 .../ui/controller/Controller.java             | 24 ++++---
 .../LocalServerSettingsController.java        | 66 ++++++++++++++-----
 .../ui/controller/ModalController.java        |  5 ++
 .../OnlineServerSettingsController.java       |  2 +
 .../utils/LoadingModal.java                   | 18 +++--
 .../budgetmaster/languages/_de.properties     |  3 +
 .../budgetmaster/languages/_en.properties     |  3 +
 .../ui/fxml/SettingsTabLocalServer.fxml       |  3 +
 .../budgetmaster/logic/utils/Strings.java     |  4 ++
 9 files changed, 93 insertions(+), 35 deletions(-)

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 10642b8d4..1d3bef002 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
@@ -134,17 +134,19 @@ public class Controller extends BaseController
 	
 	public void shutdown()
 	{
-		Logger.debug("Stopping local BudgetMasterServer...");
-		try
+		if(settings.getServerType().equals(ServerType.LOCAL))
 		{
-			ServerConnection connection = new ServerConnection(settings);
-			connection.shutdownServer();
-		}
-		catch(Exception e)
-		{
-			Logger.error(e);
+			Logger.debug("Stopping local BudgetMasterServer...");
+			try
+			{
+				ServerConnection connection = new ServerConnection(settings);
+				connection.shutdownServer();
+			}
+			catch(Exception e)
+			{
+				Logger.error(e);
+			}
 		}
-			
 		Worker.shutdown();		
 		System.exit(0);
 	}
@@ -293,10 +295,6 @@ public class Controller extends BaseController
 				AlertGenerator.showAlert(AlertType.INFORMATION, Localization.getString(Strings.TITLE_INFO), "", Localization.getString(Strings.INFO_FIRST_START), icon, getStage(), null, false);
 			});
 		}
-		else
-		{
-			refresh(filterSettings);			
-		}
 	}
 	
 	public void loadSettingsTab()
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java
index 7494734c7..e6cfa96db 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java
@@ -65,6 +65,9 @@ public class LocalServerSettingsController extends SettingsController
 	@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)
@@ -139,10 +142,7 @@ public class LocalServerSettingsController extends SettingsController
 		{
 			case ACTIVE:
 				labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_OK));
-				buttonLocalServerAction.setVisible(false);
-
-				RestartHandler restartHandler = new RestartHandler(controller);
-				restartHandler.handleRestart(controller.getSettings().getLanguage());
+				buttonLocalServerAction.setVisible(false);				
 				refreshLabelsUpdate();
 				save();
 				break;
@@ -156,21 +156,38 @@ public class LocalServerSettingsController extends SettingsController
 						Logger.debug("Starting local Server...");
 						serverHandler.createServerSettingsIfNotExists();
 						serverHandler.startServer();
-						try
-						{
-							//DEBUG magic number
-							//TODO retry reconnecting
-							System.out.println("Start sleep");
-							Thread.sleep(2000);
-							System.out.println("End sleep");
-						}
-						catch(InterruptedException e)
-						{
-						}
 						
-						if(!serverHandler.getServerStatus().equals(LocalServerStatus.ACTIVE))
+						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)
 						{
-							throw new LocalServerException("");
+							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)
@@ -180,7 +197,9 @@ public class LocalServerSettingsController extends SettingsController
 						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.refresh(controller.getFilterSettings());
 						});
+						return;
 					}
 					catch(LocalServerException ex)
 					{
@@ -188,8 +207,19 @@ public class LocalServerSettingsController extends SettingsController
 						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();
@@ -204,7 +234,7 @@ public class LocalServerSettingsController extends SettingsController
 
 				buttonLocalServerAction.setOnAction((event) -> {
 					buttonLocalServerAction.setDisable(true);
-					LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon());
+					LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon());
 
 					Worker.runLater(() -> {
 						try
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 b173d805b..1497da495 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
@@ -15,4 +15,9 @@ public class ModalController
 			e.consume();
 		});
 	}
+	
+	public void setMessage(String message)
+	{
+		labelMessage.setText(message);
+	}
 }
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java
index 365a45b53..022835cc1 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java
@@ -103,6 +103,8 @@ public class OnlineServerSettingsController extends SettingsController
 		hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25));
 		
 		refreshLabelsUpdate();
+		
+		controller.refresh(controller.getFilterSettings());
 	}
 	
 	@Override
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java
index 42a6edf03..9c413bbe8 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java
@@ -16,20 +16,29 @@ import tools.Localization;
 public class LoadingModal
 {
 	private static Stage modalStage;
+	private static ModalController modalController;
 	
 	public static void showModal(String title, String message, Stage owner, Image icon)
 	{
 		closeModal();
 		modalStage = createModal(title, message, owner, icon);
-	}	
+	}
+	
+	public static void setMessage(String message)
+	{
+		if(modalController != null)
+		{
+			modalController.setMessage(message);
+		}
+	}
 	
 	public static void closeModal()
 	{
-		System.out.println(Thread.currentThread().getStackTrace()[2]);
 		if(modalStage != null)
 		{
 			modalStage.close();
 			modalStage = null;
+			modalController = null;
 		}
 	}
 	
@@ -52,8 +61,9 @@ public class LoadingModal
 			newStage.setScene(new Scene(root));
 			newStage.getIcons().add(icon);
 			newStage.setResizable(false);
-			ModalController newController = fxmlLoader.getController();
-			newController.init(newStage, message);
+			newStage.setAlwaysOnTop(true);
+			modalController = fxmlLoader.getController();
+			modalController.init(newStage, message);
 			newStage.show();
 
 			return newStage;
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 cb57ced7a..11f0afcdd 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
@@ -49,6 +49,8 @@ load.update=Update wird heruntergeladen, bitte warten...
 load.search=Buchungen werden gesucht, bitte warten...
 load.local.server=Der lokale Server wird gestartet, bitte warten...
 load.download.local.server=Der lokale Server wird heruntergeladen, 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
@@ -71,6 +73,7 @@ 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
 
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 a17ec01f1..188ddef05 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
@@ -49,6 +49,8 @@ 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
@@ -71,6 +73,7 @@ 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
 
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
index b696f8b9d..3763df344 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml
@@ -90,6 +90,9 @@
                                  <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>
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 950b24b67..706a31d75 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
@@ -51,6 +51,9 @@ public class Strings
     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";
@@ -74,6 +77,7 @@ public class Strings
     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";
     
-- 
GitLab