diff --git a/src/main/java/envoy/client/data/Cache.java b/src/main/java/envoy/client/data/Cache.java new file mode 100644 index 0000000..366f703 --- /dev/null +++ b/src/main/java/envoy/client/data/Cache.java @@ -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.
+ *
+ * Project: envoy-client
+ * File: Cache.java
+ * Created: 6 Feb 2020
+ * + * @param the type of cached elements + * @author Kai S. K. Engelbart + * @since Envoy v0.3-alpha + */ +public class Cache implements Consumer { + + private final Queue elements = new LinkedList<>(); + private Consumer 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 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); + } +} diff --git a/src/main/java/envoy/client/net/Client.java b/src/main/java/envoy/client/net/Client.java index 91e9040..2e96b4a 100644 --- a/src/main/java/envoy/client/net/Client.java +++ b/src/main/java/envoy/client/net/Client.java @@ -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 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 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; }); diff --git a/src/main/java/envoy/client/net/MessageCache.java b/src/main/java/envoy/client/net/MessageCache.java deleted file mode 100644 index 1fc49c3..0000000 --- a/src/main/java/envoy/client/net/MessageCache.java +++ /dev/null @@ -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.
- *
- * Project: envoy-client
- * File: MessageCache.java
- * Created: 4 Feb 2020
- * - * @author Kai S. K. Engelbart - * @since Envoy v0.3-alpha - */ -public class MessageCache implements Consumer { - - private final Queue messages = new LinkedList<>(); - private Consumer 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 processor) { this.processor = processor; } - - /** - * Relays all cached messages to the processor. - * - * @since Envoy v0.3-alpha - */ - public void relayMessages() { messages.forEach(processor::accept); } -} diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java index 9f308dc..1a38da9 100644 --- a/src/main/java/envoy/client/ui/Startup.java +++ b/src/main/java/envoy/client/ui/Startup.java @@ -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 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(() -> {