Started moving Startup contents into the new Startup class
This commit is contained in:
parent
3a9fa365b4
commit
31b032eb08
@ -1,26 +1,14 @@
|
||||
package envoy.client;
|
||||
|
||||
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 javax.swing.JFrame;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import envoy.client.data.*;
|
||||
import envoy.client.net.Client;
|
||||
import envoy.client.net.WriteProxy;
|
||||
import envoy.client.data.Settings;
|
||||
import envoy.client.ui.StatusTrayIcon;
|
||||
import envoy.client.ui.container.ChatWindow;
|
||||
import envoy.client.ui.container.LoginDialog;
|
||||
import envoy.data.Config;
|
||||
import envoy.data.Message;
|
||||
import envoy.data.User.UserStatus;
|
||||
import envoy.exception.EnvoyException;
|
||||
import envoy.util.EnvoyLog;
|
||||
|
||||
@ -38,10 +26,9 @@ import envoy.util.EnvoyLog;
|
||||
*/
|
||||
public class Startup {
|
||||
|
||||
private static ChatWindow chatWindow;
|
||||
|
||||
private static final Logger logger = EnvoyLog.getLogger(Startup.class);
|
||||
|
||||
// TODO: Update Javadoc
|
||||
/**
|
||||
* Loads the application by first loading the configuration, then acquiring a
|
||||
* 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
|
||||
*/
|
||||
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
|
||||
EventQueue.invokeLater(() -> {
|
||||
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.Label?>
|
||||
<?import javafx.scene.control.ListView?>
|
||||
<?import javafx.scene.control.TextArea?>
|
||||
<?import javafx.scene.layout.ColumnConstraints?>
|
||||
<?import javafx.scene.layout.GridPane?>
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
@ -18,10 +19,11 @@
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<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" />
|
||||
<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" />
|
||||
<TextArea prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2" />
|
||||
</children>
|
||||
</GridPane>
|
||||
|
@ -14,7 +14,7 @@ import javafx.fxml.FXML;
|
||||
* @author Kai S. K. Engelbart
|
||||
* @since Envoy Client v0.1-beta
|
||||
*/
|
||||
public class ChatSceneController {
|
||||
public final class ChatSceneController {
|
||||
|
||||
private static final Logger logger = EnvoyLog.getLogger(ChatSceneController.class);
|
||||
|
||||
|
@ -1,5 +1,22 @@
|
||||
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.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
@ -17,19 +34,128 @@ import javafx.stage.Stage;
|
||||
*/
|
||||
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}
|
||||
*/
|
||||
@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 anchorPane = loader.<GridPane>load();
|
||||
|
||||
var chatScene = new Scene(anchorPane);
|
||||
primaryStage.setTitle("Envoy");
|
||||
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/envoy_logo.png")));
|
||||
primaryStage.setScene(chatScene);
|
||||
primaryStage.show();
|
||||
var chatScene = new Scene(anchorPane);
|
||||
stage.setTitle("Envoy");
|
||||
stage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/envoy_logo.png")));
|
||||
stage.setScene(chatScene);
|
||||
stage.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); }
|
||||
|
Reference in New Issue
Block a user