Started moving Startup contents into the new Startup class
This commit is contained in:
		| @@ -1,26 +1,14 @@ | |||||||
| package envoy.client; | package envoy.client; | ||||||
|  |  | ||||||
| import java.awt.EventQueue; | import java.awt.EventQueue; | ||||||
| import java.io.File; |  | ||||||
| import java.io.FileNotFoundException; |  | ||||||
| import java.io.IOException; |  | ||||||
| import java.util.Properties; |  | ||||||
| import java.util.logging.Level; |  | ||||||
| import java.util.logging.Logger; | import java.util.logging.Logger; | ||||||
|  |  | ||||||
| import javax.swing.JFrame; | import javax.swing.JFrame; | ||||||
| import javax.swing.JOptionPane; |  | ||||||
| import javax.swing.SwingUtilities; |  | ||||||
|  |  | ||||||
| import envoy.client.data.*; | import envoy.client.data.Settings; | ||||||
| import envoy.client.net.Client; |  | ||||||
| import envoy.client.net.WriteProxy; |  | ||||||
| import envoy.client.ui.StatusTrayIcon; | import envoy.client.ui.StatusTrayIcon; | ||||||
| import envoy.client.ui.container.ChatWindow; | import envoy.client.ui.container.ChatWindow; | ||||||
| import envoy.client.ui.container.LoginDialog; |  | ||||||
| import envoy.data.Config; | import envoy.data.Config; | ||||||
| import envoy.data.Message; |  | ||||||
| import envoy.data.User.UserStatus; |  | ||||||
| import envoy.exception.EnvoyException; | import envoy.exception.EnvoyException; | ||||||
| import envoy.util.EnvoyLog; | import envoy.util.EnvoyLog; | ||||||
|  |  | ||||||
| @@ -38,10 +26,9 @@ import envoy.util.EnvoyLog; | |||||||
|  */ |  */ | ||||||
| public class Startup { | public class Startup { | ||||||
|  |  | ||||||
| 	private static ChatWindow chatWindow; |  | ||||||
|  |  | ||||||
| 	private static final Logger logger = EnvoyLog.getLogger(Startup.class); | 	private static final Logger logger = EnvoyLog.getLogger(Startup.class); | ||||||
|  |  | ||||||
|  | 	// TODO: Update Javadoc | ||||||
| 	/** | 	/** | ||||||
| 	 * Loads the application by first loading the configuration, then acquiring a | 	 * Loads the application by first loading the configuration, then acquiring a | ||||||
| 	 * user name and connecting to the server. If the server cannot be reached, | 	 * user name and connecting to the server. If the server cannot be reached, | ||||||
| @@ -54,86 +41,6 @@ public class Startup { | |||||||
| 	 * @since Envoy Client v0.1-alpha | 	 * @since Envoy Client v0.1-alpha | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void main(String[] args) { | 	public static void main(String[] args) { | ||||||
| 		ClientConfig config = ClientConfig.getInstance(); |  | ||||||
| 		SwingUtilities.invokeLater(() -> chatWindow = new ChatWindow()); |  | ||||||
|  |  | ||||||
| 		try { |  | ||||||
| 			// Load the configuration from client.properties first |  | ||||||
| 			Properties properties = new Properties(); |  | ||||||
| 			properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties")); |  | ||||||
| 			config.load(properties); |  | ||||||
|  |  | ||||||
| 			// Override configuration values with command line arguments |  | ||||||
| 			if (args.length > 0) config.load(args); |  | ||||||
|  |  | ||||||
| 			// Check if all mandatory configuration values have been initialized |  | ||||||
| 			if (!config.isInitialized()) throw new EnvoyException("Configuration is not fully initialized"); |  | ||||||
| 		} catch (Exception e) { |  | ||||||
| 			JOptionPane.showMessageDialog(null, "Error loading configuration values:\n" + e, "Configuration error", JOptionPane.ERROR_MESSAGE); |  | ||||||
| 			e.printStackTrace(); |  | ||||||
| 			System.exit(1); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// Setup logger for the envoy package |  | ||||||
| 		EnvoyLog.initialize(config); |  | ||||||
| 		EnvoyLog.attach("envoy"); |  | ||||||
| 		EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier()); |  | ||||||
| 		EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier()); |  | ||||||
|  |  | ||||||
| 		// Initialize the local database |  | ||||||
| 		LocalDB localDB; |  | ||||||
| 		if (config.isIgnoreLocalDB()) { |  | ||||||
| 			localDB = new TransientLocalDB(); |  | ||||||
| 			JOptionPane.showMessageDialog(null, |  | ||||||
| 					"Ignoring local database.\nMessages will not be saved!", |  | ||||||
| 					"Local database warning", |  | ||||||
| 					JOptionPane.WARNING_MESSAGE); |  | ||||||
| 		} else try { |  | ||||||
| 			localDB = new PersistentLocalDB(new File(config.getHomeDirectory(), config.getLocalDB().getPath())); |  | ||||||
| 		} catch (IOException e3) { |  | ||||||
| 			logger.log(Level.SEVERE, "Could not initialize local database", e3); |  | ||||||
| 			JOptionPane.showMessageDialog(null, "Could not initialize local database!\n" + e3, "Local database error", JOptionPane.ERROR_MESSAGE); |  | ||||||
| 			System.exit(1); |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// Initialize client and unread message cache |  | ||||||
| 		Client			client	= new Client(); |  | ||||||
| 		Cache<Message>	cache	= new Cache<>(); |  | ||||||
|  |  | ||||||
| 		// Try to connect to the server |  | ||||||
| 		new LoginDialog(client, localDB, cache); |  | ||||||
| 		SwingUtilities.invokeLater(() -> chatWindow.setVisible(true)); |  | ||||||
|  |  | ||||||
| 		// Set client user in local database |  | ||||||
| 		localDB.setUser(client.getSender()); |  | ||||||
|  |  | ||||||
| 		// Initialize chats in local database |  | ||||||
| 		try { |  | ||||||
| 			localDB.initializeUserStorage(); |  | ||||||
| 			localDB.loadUserData(); |  | ||||||
| 		} catch (FileNotFoundException e) { |  | ||||||
| 			// The local database file has not yet been created, probably first login |  | ||||||
| 		} catch (Exception e) { |  | ||||||
| 			e.printStackTrace(); |  | ||||||
| 			JOptionPane.showMessageDialog(null, |  | ||||||
| 					"Error while loading local database: " + e + "\nChats will not be stored locally.", |  | ||||||
| 					"Local DB error", |  | ||||||
| 					JOptionPane.WARNING_MESSAGE); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// Initialize write proxy |  | ||||||
| 		final WriteProxy writeProxy = client.createWriteProxy(localDB); |  | ||||||
|  |  | ||||||
| 		if (client.isOnline()) { |  | ||||||
|  |  | ||||||
| 			// Save all users to the local database and flush cache |  | ||||||
| 			localDB.setUsers(client.getUsers()); |  | ||||||
| 			writeProxy.flushCache(); |  | ||||||
| 		} else |  | ||||||
| 			// Set all contacts to offline mode |  | ||||||
| 			localDB.getUsers().values().stream().filter(u -> u != localDB.getUser()).forEach(u -> u.setStatus(UserStatus.OFFLINE)); |  | ||||||
|  |  | ||||||
| 		// Display ChatWindow and StatusTrayIcon | 		// Display ChatWindow and StatusTrayIcon | ||||||
| 		EventQueue.invokeLater(() -> { | 		EventQueue.invokeLater(() -> { | ||||||
| 			try { | 			try { | ||||||
| @@ -160,18 +67,5 @@ public class Startup { | |||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		// Save Settings and PersistentLocalDB on shutdown |  | ||||||
| 		Runtime.getRuntime().addShutdownHook(new Thread(() -> { |  | ||||||
| 			try { |  | ||||||
| 				logger.info("Closing connection..."); |  | ||||||
| 				client.close(); |  | ||||||
|  |  | ||||||
| 				logger.info("Saving local database and settings..."); |  | ||||||
| 				localDB.save(); |  | ||||||
| 				Settings.getInstance().save(); |  | ||||||
| 			} catch (Exception e) { |  | ||||||
| 				logger.log(Level.SEVERE, "Unable to save local files", e); |  | ||||||
| 			} |  | ||||||
| 		})); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| <?import javafx.scene.control.Button?> | <?import javafx.scene.control.Button?> | ||||||
| <?import javafx.scene.control.Label?> | <?import javafx.scene.control.Label?> | ||||||
| <?import javafx.scene.control.ListView?> | <?import javafx.scene.control.ListView?> | ||||||
|  | <?import javafx.scene.control.TextArea?> | ||||||
| <?import javafx.scene.layout.ColumnConstraints?> | <?import javafx.scene.layout.ColumnConstraints?> | ||||||
| <?import javafx.scene.layout.GridPane?> | <?import javafx.scene.layout.GridPane?> | ||||||
| <?import javafx.scene.layout.RowConstraints?> | <?import javafx.scene.layout.RowConstraints?> | ||||||
| @@ -18,10 +19,11 @@ | |||||||
| 		<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> | 		<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> | ||||||
| 	</rowConstraints> | 	</rowConstraints> | ||||||
| 	<children> | 	<children> | ||||||
| 		<ListView id="userList" prefHeight="211.0" prefWidth="300.0" GridPane.rowIndex="2" /> | 		<ListView id="userList" prefHeight="211.0" prefWidth="300.0" GridPane.rowIndex="1" /> | ||||||
| 		<Label text="Label" /> | 		<Label text="Label" /> | ||||||
| 		<Button id="settingsButton" mnemonicParsing="false" text="Settings" GridPane.columnIndex="1" /> | 		<Button id="settingsButton" mnemonicParsing="false" text="Settings" GridPane.columnIndex="1" /> | ||||||
| 		<ListView id="messageList" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> | 		<ListView id="messageList" prefHeight="257.0" prefWidth="300.0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> | ||||||
| 		<Button id="postButton" mnemonicParsing="false" text="Post" GridPane.columnIndex="1" GridPane.rowIndex="2" /> | 		<Button id="postButton" mnemonicParsing="false" text="Post" GridPane.columnIndex="1" GridPane.rowIndex="2" /> | ||||||
|  |       <TextArea prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2" /> | ||||||
| 	</children> | 	</children> | ||||||
| </GridPane> | </GridPane> | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ import javafx.fxml.FXML; | |||||||
|  * @author Kai S. K. Engelbart |  * @author Kai S. K. Engelbart | ||||||
|  * @since Envoy Client v0.1-beta |  * @since Envoy Client v0.1-beta | ||||||
|  */ |  */ | ||||||
| public class ChatSceneController { | public final class ChatSceneController { | ||||||
|  |  | ||||||
| 	private static final Logger logger = EnvoyLog.getLogger(ChatSceneController.class); | 	private static final Logger logger = EnvoyLog.getLogger(ChatSceneController.class); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,22 @@ | |||||||
| package envoy.client.ui; | package envoy.client.ui; | ||||||
|  |  | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileNotFoundException; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.util.Properties; | ||||||
|  | import java.util.logging.Level; | ||||||
|  | import java.util.logging.Logger; | ||||||
|  |  | ||||||
|  | import javax.swing.JOptionPane; | ||||||
|  |  | ||||||
|  | import envoy.client.data.*; | ||||||
|  | import envoy.client.net.Client; | ||||||
|  | import envoy.client.net.WriteProxy; | ||||||
|  | import envoy.client.ui.container.LoginDialog; | ||||||
|  | import envoy.data.Message; | ||||||
|  | import envoy.data.User.UserStatus; | ||||||
|  | import envoy.exception.EnvoyException; | ||||||
|  | import envoy.util.EnvoyLog; | ||||||
| import javafx.application.Application; | import javafx.application.Application; | ||||||
| import javafx.fxml.FXMLLoader; | import javafx.fxml.FXMLLoader; | ||||||
| import javafx.scene.Scene; | import javafx.scene.Scene; | ||||||
| @@ -17,19 +34,128 @@ import javafx.stage.Stage; | |||||||
|  */ |  */ | ||||||
| public final class Startup extends Application { | public final class Startup extends Application { | ||||||
|  |  | ||||||
|  | 	private LocalDB		localDB; | ||||||
|  | 	private Client		client; | ||||||
|  | 	private WriteProxy	writeProxy; | ||||||
|  |  | ||||||
|  | 	private static final ClientConfig	config	= ClientConfig.getInstance(); | ||||||
|  | 	private static final Logger			logger	= EnvoyLog.getLogger(Startup.class); | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * {@inheritDoc} | 	 * {@inheritDoc} | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public void start(Stage primaryStage) throws Exception { | 	public void init() throws Exception { | ||||||
|  | 		try { | ||||||
|  | 			// Load the configuration from client.properties first | ||||||
|  | 			Properties properties = new Properties(); | ||||||
|  | 			properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties")); | ||||||
|  | 			config.load(properties); | ||||||
|  |  | ||||||
|  | 			// Override configuration values with command line arguments | ||||||
|  | 			String[] args = (String[]) getParameters().getRaw().toArray(); | ||||||
|  | 			if (args.length > 0) config.load(args); | ||||||
|  |  | ||||||
|  | 			// Check if all mandatory configuration values have been initialized | ||||||
|  | 			if (!config.isInitialized()) throw new EnvoyException("Configuration is not fully initialized"); | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			JOptionPane.showMessageDialog(null, "Error loading configuration values:\n" + e, "Configuration error", JOptionPane.ERROR_MESSAGE); | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 			System.exit(1); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Setup logger for the envoy package | ||||||
|  | 		EnvoyLog.initialize(config); | ||||||
|  | 		EnvoyLog.attach("envoy"); | ||||||
|  | 		EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier()); | ||||||
|  | 		EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier()); | ||||||
|  |  | ||||||
|  | 		// Initialize the local database | ||||||
|  | 		if (config.isIgnoreLocalDB()) { | ||||||
|  | 			localDB = new TransientLocalDB(); | ||||||
|  | 			JOptionPane.showMessageDialog(null, | ||||||
|  | 					"Ignoring local database.\nMessages will not be saved!", | ||||||
|  | 					"Local database warning", | ||||||
|  | 					JOptionPane.WARNING_MESSAGE); | ||||||
|  | 		} else try { | ||||||
|  | 			localDB = new PersistentLocalDB(new File(config.getHomeDirectory(), config.getLocalDB().getPath())); | ||||||
|  | 		} catch (IOException e3) { | ||||||
|  | 			logger.log(Level.SEVERE, "Could not initialize local database", e3); | ||||||
|  | 			JOptionPane.showMessageDialog(null, "Could not initialize local database!\n" + e3, "Local database error", JOptionPane.ERROR_MESSAGE); | ||||||
|  | 			System.exit(1); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Initialize client and unread message cache | ||||||
|  | 		Client			client	= new Client(); | ||||||
|  | 		Cache<Message>	cache	= new Cache<>(); | ||||||
|  |  | ||||||
|  | 		// Try to connect to the server | ||||||
|  | 		new LoginDialog(client, localDB, cache); | ||||||
|  |  | ||||||
|  | 		// Set client user in local database | ||||||
|  | 		localDB.setUser(client.getSender()); | ||||||
|  |  | ||||||
|  | 		// Initialize chats in local database | ||||||
|  | 		try { | ||||||
|  | 			localDB.initializeUserStorage(); | ||||||
|  | 			localDB.loadUserData(); | ||||||
|  | 		} catch (FileNotFoundException e) { | ||||||
|  | 			// The local database file has not yet been created, probably first login | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 			JOptionPane.showMessageDialog(null, | ||||||
|  | 					"Error while loading local database: " + e + "\nChats will not be stored locally.", | ||||||
|  | 					"Local DB error", | ||||||
|  | 					JOptionPane.WARNING_MESSAGE); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Initialize write proxy | ||||||
|  | 		writeProxy = client.createWriteProxy(localDB); | ||||||
|  |  | ||||||
|  | 		if (client.isOnline()) { | ||||||
|  |  | ||||||
|  | 			// Save all users to the local database and flush cache | ||||||
|  | 			localDB.setUsers(client.getUsers()); | ||||||
|  | 			writeProxy.flushCache(); | ||||||
|  | 		} else | ||||||
|  | 			// Set all contacts to offline mode | ||||||
|  | 			localDB.getUsers().values().stream().filter(u -> u != localDB.getUser()).forEach(u -> u.setStatus(UserStatus.OFFLINE)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * {@inheritDoc} | ||||||
|  | 	 */ | ||||||
|  | 	@Override | ||||||
|  | 	public void start(Stage stage) throws Exception { | ||||||
|  |  | ||||||
|  | 		// Prepare stage and load ChatScene | ||||||
| 		var	loader		= new FXMLLoader(getClass().getResource("ChatScene.fxml")); | 		var	loader		= new FXMLLoader(getClass().getResource("ChatScene.fxml")); | ||||||
| 		var	anchorPane	= loader.<GridPane>load(); | 		var	anchorPane	= loader.<GridPane>load(); | ||||||
| 		 | 		var	chatScene	= new Scene(anchorPane); | ||||||
| 		var chatScene = new Scene(anchorPane); | 		stage.setTitle("Envoy"); | ||||||
| 		primaryStage.setTitle("Envoy"); | 		stage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/envoy_logo.png"))); | ||||||
| 		primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/envoy_logo.png"))); | 		stage.setScene(chatScene); | ||||||
| 		primaryStage.setScene(chatScene); | 		stage.show(); | ||||||
| 		primaryStage.show(); | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * {@inheritDoc} | ||||||
|  | 	 */ | ||||||
|  | 	@Override | ||||||
|  | 	public void stop() throws Exception { | ||||||
|  | 		try { | ||||||
|  |  | ||||||
|  | 			// Save Settings and PersistentLocalDB on shutdown | ||||||
|  | 			logger.info("Closing connection..."); | ||||||
|  | 			client.close(); | ||||||
|  |  | ||||||
|  | 			logger.info("Saving local database and settings..."); | ||||||
|  | 			localDB.save(); | ||||||
|  | 			Settings.getInstance().save(); | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			logger.log(Level.SEVERE, "Unable to save local files", e); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public static void main(String[] args) { launch(args); } | 	public static void main(String[] args) { launch(args); } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user