From 4afe073e79d232ef79641085f61e3085c597722b Mon Sep 17 00:00:00 2001 From: kske Date: Thu, 6 Feb 2020 21:28:02 +0100 Subject: [PATCH] Integrated WriteProxy into the sending process --- src/main/java/envoy/client/data/Chat.java | 12 +++-- src/main/java/envoy/client/ui/ChatWindow.java | 44 +++++++++---------- src/main/java/envoy/client/ui/Startup.java | 14 ++++-- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/main/java/envoy/client/data/Chat.java b/src/main/java/envoy/client/data/Chat.java index f10e816..49083a7 100644 --- a/src/main/java/envoy/client/data/Chat.java +++ b/src/main/java/envoy/client/data/Chat.java @@ -3,7 +3,7 @@ package envoy.client.data; import java.io.IOException; import java.io.Serializable; -import envoy.client.net.Client; +import envoy.client.net.WriteProxy; import envoy.client.ui.list.ComponentListModel; import envoy.data.Message; import envoy.data.Message.MessageStatus; @@ -52,22 +52,20 @@ public class Chat implements Serializable { * {@code READ} starting from the bottom and stopping once a read message is * found. * - * @param client the client instance used to notify the server about the message - * status changes + * @param writeProxy the write proxy instance used to notify the server about + * the message status changes * @throws IOException if a {@link MessageStatusChangeEvent} could not be * delivered to the server * @since Envoy v0.3-alpha */ - public void read(Client client) throws IOException { + public void read(WriteProxy writeProxy) throws IOException { for (int i = model.size() - 1; i >= 0; --i) { final Message m = model.get(i); if (m.getSenderId() == recipient.getId()) { if (m.getStatus() == MessageStatus.READ) break; else { m.setStatus(MessageStatus.READ); - - // TODO: Cache events in offline mode - client.sendEvent(new MessageStatusChangeEvent(m)); + writeProxy.writeMessageStatusChangeEvent(new MessageStatusChangeEvent(m)); } } } diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java index 3abd54a..7d537bf 100644 --- a/src/main/java/envoy/client/ui/ChatWindow.java +++ b/src/main/java/envoy/client/ui/ChatWindow.java @@ -16,6 +16,7 @@ import envoy.client.data.LocalDb; import envoy.client.event.MessageCreationEvent; import envoy.client.event.ThemeChangeEvent; import envoy.client.net.Client; +import envoy.client.net.WriteProxy; import envoy.client.ui.list.ComponentList; import envoy.client.ui.settings.SettingsScreen; import envoy.client.util.EnvoyLog; @@ -39,8 +40,9 @@ import envoy.event.MessageStatusChangeEvent; public class ChatWindow extends JFrame { // User specific objects - private Client client; - private LocalDb localDb; + private Client client; + private WriteProxy writeProxy; + private LocalDb localDb; // GUI components private JPanel contentPane = new JPanel(); @@ -211,7 +213,7 @@ public class ChatWindow extends JFrame { // Listen to received messages EventBus.getInstance().register(MessageCreationEvent.class, (evt) -> { - Message message = ((MessageCreationEvent) evt).get(); + Message message = ((MessageCreationEvent) evt).get(); Chat chat = localDb.getChats().stream().filter(c -> c.getRecipient().getId() == message.getSenderId()).findFirst().get(); chat.appendMessage(message); @@ -301,8 +303,7 @@ public class ChatWindow extends JFrame { .build(); // Send message - // TODO: Store offline messages - client.sendMessage(message); + writeProxy.writeMessage(message); // Add message to PersistentLocalDb and update UI currentChat.appendMessage(message); @@ -345,7 +346,7 @@ public class ChatWindow extends JFrame { private void readCurrentChat() { try { - currentChat.read(client); + currentChat.read(writeProxy); messageList.synchronizeModel(); } catch (IOException e) { e.printStackTrace(); @@ -354,24 +355,23 @@ public class ChatWindow extends JFrame { } /** - * Sets the {@link Client} used by this {@link ChatWindow}. + * Initializes the components responsible server communication and + * persistence.
+ *
+ * This will trigger the display of the contact list. * - * @param client the {@link Client} used to send and receive messages - * @since Envoy v0.2-alpha + * @param client the client used to send and receive messages + * @param localDb the local database used to manage stored messages + * and users + * @param writeProxy the write proxy used to send messages and status change + * events to the server or cache them inside the local + * database + * @since Envoy v0.3-alpha */ - public void setClient(Client client) { this.client = client; } - - /** - * Sets the {@link LocalDb} used by this {@link ChatWindow}. After - * invoking this - * method, users and chats will be loaded from the database into the GUI. - * - * @param localDb the {@link LocalDb} used to manage stored messages - * and users - * @since Envoy v0.2-alpha - */ - public void setLocalDB(LocalDb localDb) { - this.localDb = localDb; + public void initContent(Client client, LocalDb localDb, WriteProxy writeProxy) { + this.client = client; + this.localDb = localDb; + this.writeProxy = writeProxy; loadUsersAndChats(); } } diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java index 1a38da9..1c68e41 100644 --- a/src/main/java/envoy/client/ui/Startup.java +++ b/src/main/java/envoy/client/ui/Startup.java @@ -15,6 +15,7 @@ import envoy.client.Config; import envoy.client.Settings; import envoy.client.data.*; import envoy.client.net.Client; +import envoy.client.net.WriteProxy; import envoy.client.util.EnvoyLog; import envoy.data.LoginCredentials; import envoy.data.Message; @@ -148,14 +149,19 @@ public class Startup { JOptionPane.WARNING_MESSAGE); } - // Save all users to the local database - if (client.isOnline()) localDb.setUsers(client.getUsers()); + // Initialize write proxy + final WriteProxy writeProxy = client.createWriteProxy(localDb); + + // Save all users to the local database and flush cache + if (client.isOnline()) { + localDb.setUsers(client.getUsers()); + writeProxy.flushCache(); + } // Display ChatWindow and StatusTrayIcon EventQueue.invokeLater(() -> { try { - chatWindow.setClient(client); - chatWindow.setLocalDB(localDb); + chatWindow.initContent(client, localDb, writeProxy); try { new StatusTrayIcon(chatWindow).show();