kske
07c4ccf3c8
Common * Replace LocalDateTime with Instant everywhere Client * Display message creation date with system time zone in MessageControl * LocalDB#users now strictly contains Users * lastSync time stamp in LocalDB (saved per user) * isOnline parameter in save function (lastSync updated if true) * lastSync time stamp in LoginCredentials * No ClientConfig#getLoginCredentials because of missing information, moved to LoginScene * Pass LocalDB#lastSync to LoginCredentials in LoginScene Server * Explicit lastSync parameter for PersistenceManager#getPending(Group)Messages This sends the correct time stamp to the server, however the JPQL queries have yet to be adjusted.
137 lines
4.4 KiB
Java
137 lines
4.4 KiB
Java
package envoy.client.ui;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.Properties;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
import javafx.application.Application;
|
|
import javafx.scene.control.Alert;
|
|
import javafx.scene.control.Alert.AlertType;
|
|
import javafx.stage.Stage;
|
|
|
|
import envoy.client.data.*;
|
|
import envoy.client.net.Client;
|
|
import envoy.client.ui.SceneContext.SceneInfo;
|
|
import envoy.client.ui.controller.LoginScene;
|
|
import envoy.data.GroupMessage;
|
|
import envoy.data.Message;
|
|
import envoy.event.GroupMessageStatusChange;
|
|
import envoy.event.MessageStatusChange;
|
|
import envoy.exception.EnvoyException;
|
|
import envoy.util.EnvoyLog;
|
|
|
|
/**
|
|
* Handles application startup and shutdown.
|
|
* <p>
|
|
* Project: <strong>envoy-client</strong><br>
|
|
* File: <strong>Startup.java</strong><br>
|
|
* Created: <strong>26.03.2020</strong><br>
|
|
*
|
|
* @author Kai S. K. Engelbart
|
|
* @author Maximilian Käfer
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
public final class Startup extends Application {
|
|
|
|
/**
|
|
* The version of this client. Used to verify compatibility with the server.
|
|
*
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
public static final String VERSION = "0.1-beta";
|
|
|
|
private LocalDB localDB;
|
|
private Client client;
|
|
|
|
private static final ClientConfig config = ClientConfig.getInstance();
|
|
private static final Logger logger = EnvoyLog.getLogger(Startup.class);
|
|
|
|
/**
|
|
* Loads the configuration, initializes the client and the local database and
|
|
* delegates the rest of the startup process to {@link LoginScene}.
|
|
*
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
@Override
|
|
public void start(Stage stage) throws Exception {
|
|
try {
|
|
// Load the configuration from client.properties first
|
|
final Properties properties = new Properties();
|
|
properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties"));
|
|
config.load(properties);
|
|
|
|
// Override configuration values with command line arguments
|
|
final String[] args = getParameters().getRaw().toArray(new String[0]);
|
|
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 (final Exception e) {
|
|
new Alert(AlertType.ERROR, "Error loading configuration values:\n" + e);
|
|
logger.log(Level.SEVERE, "Error loading configuration values: ", e);
|
|
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());
|
|
|
|
logger.log(Level.INFO, "Envoy starting...");
|
|
|
|
// Initialize the local database
|
|
if (config.isIgnoreLocalDB()) {
|
|
localDB = new TransientLocalDB();
|
|
new Alert(AlertType.WARNING, "Ignoring local database.\nMessages will not be saved!").showAndWait();
|
|
} else try {
|
|
localDB = new PersistentLocalDB(new File(config.getHomeDirectory(), config.getLocalDB().getPath()));
|
|
} catch (final IOException e3) {
|
|
logger.log(Level.SEVERE, "Could not initialize local database: ", e3);
|
|
new Alert(AlertType.ERROR, "Could not initialize local database!\n" + e3).showAndWait();
|
|
System.exit(1);
|
|
return;
|
|
}
|
|
|
|
// Initialize client and unread message cache
|
|
client = new Client();
|
|
|
|
final var cacheMap = new CacheMap();
|
|
cacheMap.put(Message.class, new Cache<Message>());
|
|
cacheMap.put(GroupMessage.class, new Cache<GroupMessage>());
|
|
cacheMap.put(MessageStatusChange.class, new Cache<MessageStatusChange>());
|
|
cacheMap.put(GroupMessageStatusChange.class, new Cache<GroupMessageStatusChange>());
|
|
|
|
stage.setTitle("Envoy");
|
|
stage.getIcons().add(IconUtil.loadIcon("envoy_logo"));
|
|
|
|
final var sceneContext = new SceneContext(stage);
|
|
sceneContext.load(SceneInfo.LOGIN_SCENE);
|
|
sceneContext.<LoginScene>getController().initializeData(client, localDB, cacheMap, sceneContext);
|
|
}
|
|
|
|
/**
|
|
* Closes the client connection and saves the local database and settings.
|
|
*
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
@Override
|
|
public void stop() {
|
|
try {
|
|
logger.log(Level.INFO, "Saving local database and settings...");
|
|
localDB.save(client.isOnline());
|
|
Settings.getInstance().save();
|
|
|
|
logger.log(Level.INFO, "Closing connection...");
|
|
client.close();
|
|
|
|
logger.log(Level.INFO, "Envoy was terminated by its user");
|
|
} catch (final Exception e) {
|
|
logger.log(Level.SEVERE, "Unable to save local files: ", e);
|
|
}
|
|
}
|
|
}
|