Split Client#onlineInit method up into performHandshake and initReceiver
This commit is contained in:
		@@ -42,6 +42,7 @@ public class Client implements Closeable {
 | 
			
		||||
	// Asynchronously initialized during handshake
 | 
			
		||||
	private volatile User		sender;
 | 
			
		||||
	private volatile Contacts	contacts;
 | 
			
		||||
	private volatile boolean	rejected;
 | 
			
		||||
 | 
			
		||||
	// Configuration and logging
 | 
			
		||||
	private static final Config	config	= Config.getInstance();
 | 
			
		||||
@@ -54,16 +55,19 @@ public class Client implements Closeable {
 | 
			
		||||
	 * an exception is thrown.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param credentials          the login credentials of the user
 | 
			
		||||
	 * @param localDb              the local database used to persist the current
 | 
			
		||||
	 *                             {@link IdGenerator}
 | 
			
		||||
	 * @param receivedMessageCache a message cache containing all unread messages
 | 
			
		||||
	 *                             from the server that can be relayed after
 | 
			
		||||
	 *                             initialization
 | 
			
		||||
	 * @throws Exception if the online mode could not be entered or the request
 | 
			
		||||
	 *                   failed for some other reason
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 * @throws TimeLimitExceededException if the server could not be reached
 | 
			
		||||
	 * @throws IOException                if the login credentials could not be
 | 
			
		||||
	 *                                    written
 | 
			
		||||
	 * @throws InterruptedException       if the current thread is interrupted while
 | 
			
		||||
	 *                                    waiting for the handshake response
 | 
			
		||||
	 */
 | 
			
		||||
	public void onlineInit(LoginCredentials credentials, LocalDb localDb, Cache<Message> receivedMessageCache) throws Exception {
 | 
			
		||||
	public void performHandshake(LoginCredentials credentials, Cache<Message> receivedMessageCache)
 | 
			
		||||
			throws TimeLimitExceededException, IOException, InterruptedException {
 | 
			
		||||
		if (online) throw new IllegalStateException("Handshake has already been performed successfully");
 | 
			
		||||
 | 
			
		||||
		// Establish TCP connection
 | 
			
		||||
		logger.info(String.format("Attempting connection to server %s:%d...", config.getServer(), config.getPort()));
 | 
			
		||||
		socket = new Socket(config.getServer(), config.getPort());
 | 
			
		||||
@@ -76,7 +80,9 @@ public class Client implements Closeable {
 | 
			
		||||
		receiver.registerProcessor(User.class, sender -> { logger.info("Acquired user object " + sender); this.sender = sender; });
 | 
			
		||||
		receiver.registerProcessor(Contacts.class, contacts -> { logger.info("Acquired contacts object " + contacts); this.contacts = contacts; });
 | 
			
		||||
		receiver.registerProcessor(Message.class, receivedMessageCache);
 | 
			
		||||
		receiver.registerProcessor(HandshakeRejectionEvent.class, EventBus.getInstance()::dispatch);
 | 
			
		||||
		receiver.registerProcessor(HandshakeRejectionEvent.class, evt -> { rejected = true; EventBus.getInstance().dispatch(evt); });
 | 
			
		||||
 | 
			
		||||
		rejected = false;
 | 
			
		||||
 | 
			
		||||
		// Start receiver
 | 
			
		||||
		new Thread(receiver).start();
 | 
			
		||||
@@ -88,6 +94,15 @@ public class Client implements Closeable {
 | 
			
		||||
		// Wait for a maximum of five seconds to acquire the sender object
 | 
			
		||||
		long start = System.currentTimeMillis();
 | 
			
		||||
		while (sender == null || contacts == null) {
 | 
			
		||||
 | 
			
		||||
			// Quit immediately after handshake rejection
 | 
			
		||||
			// This method can then be called again
 | 
			
		||||
			if (rejected) {
 | 
			
		||||
				socket.close();
 | 
			
		||||
				receiver.removeAllProcessors();
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (System.currentTimeMillis() - start > 5000) throw new TimeLimitExceededException("Did not log in after 5 seconds");
 | 
			
		||||
			Thread.sleep(500);
 | 
			
		||||
		}
 | 
			
		||||
@@ -97,8 +112,23 @@ public class Client implements Closeable {
 | 
			
		||||
 | 
			
		||||
		// Remove user creation processor
 | 
			
		||||
		receiver.removeAllProcessors();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		// Register processors for message and status handling
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes the {@link Receiver} used to process data sent from the server to
 | 
			
		||||
	 * this client.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param localDb              the local database used to persist the current
 | 
			
		||||
	 *                             {@link IdGenerator}
 | 
			
		||||
	 * @param receivedMessageCache a message cache containing all unread messages
 | 
			
		||||
	 *                             from the server that can be relayed after
 | 
			
		||||
	 *                             initialization
 | 
			
		||||
	 * @throws IOException if no {@link IdGenerator} is present and none could be
 | 
			
		||||
	 *                     requested from the server
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void initReceiver(LocalDb localDb, Cache<Message> receivedMessageCache) throws IOException {
 | 
			
		||||
		checkOnline();
 | 
			
		||||
 | 
			
		||||
		// Process incoming messages
 | 
			
		||||
		final ReceivedMessageProcessor receivedMessageProcessor = new ReceivedMessageProcessor();
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ public class Startup {
 | 
			
		||||
			if (args.length > 0) config.load(args);
 | 
			
		||||
 | 
			
		||||
			// Check if all mandatory configuration values have been initialized
 | 
			
		||||
			if (!config.isInitialized()) throw new EnvoyException("Server or port are not defined");
 | 
			
		||||
			if (!config.isInitialized()) throw new EnvoyException("Configuration is not fully initialized");
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
			JOptionPane
 | 
			
		||||
				.showMessageDialog(null, "Error loading configuration values:\n" + e.toString(), "Configuration error", JOptionPane.ERROR_MESSAGE);
 | 
			
		||||
@@ -109,7 +109,8 @@ public class Startup {
 | 
			
		||||
		try {
 | 
			
		||||
			// Try entering online mode first
 | 
			
		||||
			localDb.loadIdGenerator();
 | 
			
		||||
			client.onlineInit(credentials, localDb, cache);
 | 
			
		||||
			client.performHandshake(credentials, cache);
 | 
			
		||||
			client.initReceiver(localDb, cache);
 | 
			
		||||
		} catch (Exception e1) {
 | 
			
		||||
			logger.warning("Could not connect to server. Trying offline mode...");
 | 
			
		||||
			e1.printStackTrace();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user