Replaced MessageCache by Cache<T>

This class will be used to implement the offline cache for both messages
and events.
This commit is contained in:
Kai S. K. Engelbart 2020-02-06 18:35:05 +01:00
parent 1739176799
commit 6bbd6936e0
4 changed files with 65 additions and 62 deletions

View File

@ -0,0 +1,58 @@
package envoy.client.data;
import java.util.LinkedList;
import java.util.Queue;
import java.util.function.Consumer;
import java.util.logging.Logger;
import envoy.client.util.EnvoyLog;
/**
* Stores elements in a queue to process them later.<br>
* <br>
* Project: <strong>envoy-client</strong><br>
* File: <strong>Cache.java</strong><br>
* Created: <strong>6 Feb 2020</strong><br>
*
* @param <T> the type of cached elements
* @author Kai S. K. Engelbart
* @since Envoy v0.3-alpha
*/
public class Cache<T> implements Consumer<T> {
private final Queue<T> elements = new LinkedList<>();
private Consumer<T> processor;
private static final Logger logger = EnvoyLog.getLogger(Cache.class.getSimpleName());
/**
* Adds an element to the cache.
*
* @param element the element to add
* @since Envoy v0.3-alpha
*/
@Override
public void accept(T element) {
logger.info(String.format("Adding element %s to cache", element));
elements.offer(element);
}
/**
* Sets the processor to which cached elements are relayed.
*
* @param processor the processor to set
* @since Envoy v0.3-alpha
*/
public void setProcessor(Consumer<T> processor) { this.processor = processor; }
/**
* Relays all cached elements to the processor.
*
* @throws IllegalStateException if the processor is not initialized
* @since Envoy v0.3-alpha
*/
public void relay() {
if (processor == null) throw new IllegalStateException("Processor is not defined");
elements.forEach(processor::accept);
}
}

View File

@ -10,6 +10,7 @@ import java.util.logging.Logger;
import javax.naming.TimeLimitExceededException;
import envoy.client.Config;
import envoy.client.data.Cache;
import envoy.client.data.LocalDb;
import envoy.client.util.EnvoyLog;
import envoy.data.*;
@ -61,7 +62,7 @@ public class Client implements Closeable {
* failed for some other reason
* @since Envoy v0.2-alpha
*/
public MessageCache onlineInit(LoginCredentials credentials, LocalDb localDb) throws Exception {
public Cache<Message> onlineInit(LoginCredentials credentials, LocalDb localDb) throws Exception {
// Establish TCP connection
logger.info(String.format("Attempting connection to server %s:%d...", config.getServer(), config.getPort()));
socket = new Socket(config.getServer(), config.getPort());
@ -71,7 +72,7 @@ public class Client implements Closeable {
receiver = new Receiver(socket.getInputStream());
// Create cache for unread messages
final MessageCache cache = new MessageCache();
final Cache<Message> cache = new Cache<>();
// Register user creation processor, contact list processor and message cache
receiver.registerProcessor(User.class, sender -> { logger.info("Acquired user object " + sender); this.sender = sender; });

View File

@ -1,54 +0,0 @@
package envoy.client.net;
import java.util.LinkedList;
import java.util.Queue;
import java.util.function.Consumer;
import java.util.logging.Logger;
import envoy.client.util.EnvoyLog;
import envoy.data.Message;
/**
* Stores messages in a queue until the application initialization is complete.
* The messages can then be relayed to a processor.<br>
* <br>
* Project: <strong>envoy-client</strong><br>
* File: <strong>MessageCache.java</strong><br>
* Created: <strong>4 Feb 2020</strong><br>
*
* @author Kai S. K. Engelbart
* @since Envoy v0.3-alpha
*/
public class MessageCache implements Consumer<Message> {
private final Queue<Message> messages = new LinkedList<>();
private Consumer<Message> processor;
private static final Logger logger = EnvoyLog.getLogger(MessageCache.class.getSimpleName());
/**
* Adds a message to the cache.
*
* @since Envoy v0.3-alpha
*/
@Override
public void accept(Message message) {
logger.info(String.format("Adding message %s to cache", message));
messages.add(message);
}
/**
* Sets the processor to which messages are relayed.
*
* @param processor the processor to set
* @since Envoy v0.3-alpha
*/
public void setProcessor(Consumer<Message> processor) { this.processor = processor; }
/**
* Relays all cached messages to the processor.
*
* @since Envoy v0.3-alpha
*/
public void relayMessages() { messages.forEach(processor::accept); }
}

View File

@ -13,13 +13,11 @@ import javax.swing.SwingUtilities;
import envoy.client.Config;
import envoy.client.Settings;
import envoy.client.data.LocalDb;
import envoy.client.data.PersistentLocalDb;
import envoy.client.data.TransientLocalDb;
import envoy.client.data.*;
import envoy.client.net.Client;
import envoy.client.net.MessageCache;
import envoy.client.util.EnvoyLog;
import envoy.data.LoginCredentials;
import envoy.data.Message;
import envoy.data.User;
import envoy.exception.EnvoyException;
@ -108,7 +106,7 @@ public class Startup {
// Acquire the client user (with ID) either from the server or from the local
// database, which triggers offline mode
Client client = new Client();
MessageCache cache = null;
Cache<Message> cache = null;
try {
// Try entering online mode first
localDb.loadIdGenerator();
@ -178,7 +176,7 @@ public class Startup {
});
// Relay unread messages from cache
if (cache != null) cache.relayMessages();
if (cache != null) cache.relay();
// Save Settings and PersistentLocalDb on shutdown
Runtime.getRuntime().addShutdownHook(new Thread(() -> {