Integrated WriteProxy into the sending process

This commit is contained in:
Kai S. K. Engelbart 2020-02-06 21:28:02 +01:00
parent bf38d2f19f
commit 4afe073e79
3 changed files with 37 additions and 33 deletions

View File

@ -3,7 +3,7 @@ package envoy.client.data;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import envoy.client.net.Client; import envoy.client.net.WriteProxy;
import envoy.client.ui.list.ComponentListModel; import envoy.client.ui.list.ComponentListModel;
import envoy.data.Message; import envoy.data.Message;
import envoy.data.Message.MessageStatus; 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 * {@code READ} starting from the bottom and stopping once a read message is
* found. * found.
* *
* @param client the client instance used to notify the server about the message * @param writeProxy the write proxy instance used to notify the server about
* status changes * the message status changes
* @throws IOException if a {@link MessageStatusChangeEvent} could not be * @throws IOException if a {@link MessageStatusChangeEvent} could not be
* delivered to the server * delivered to the server
* @since Envoy v0.3-alpha * @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) { for (int i = model.size() - 1; i >= 0; --i) {
final Message m = model.get(i); final Message m = model.get(i);
if (m.getSenderId() == recipient.getId()) { if (m.getSenderId() == recipient.getId()) {
if (m.getStatus() == MessageStatus.READ) break; if (m.getStatus() == MessageStatus.READ) break;
else { else {
m.setStatus(MessageStatus.READ); m.setStatus(MessageStatus.READ);
writeProxy.writeMessageStatusChangeEvent(new MessageStatusChangeEvent(m));
// TODO: Cache events in offline mode
client.sendEvent(new MessageStatusChangeEvent(m));
} }
} }
} }

View File

@ -16,6 +16,7 @@ import envoy.client.data.LocalDb;
import envoy.client.event.MessageCreationEvent; import envoy.client.event.MessageCreationEvent;
import envoy.client.event.ThemeChangeEvent; import envoy.client.event.ThemeChangeEvent;
import envoy.client.net.Client; import envoy.client.net.Client;
import envoy.client.net.WriteProxy;
import envoy.client.ui.list.ComponentList; import envoy.client.ui.list.ComponentList;
import envoy.client.ui.settings.SettingsScreen; import envoy.client.ui.settings.SettingsScreen;
import envoy.client.util.EnvoyLog; import envoy.client.util.EnvoyLog;
@ -39,8 +40,9 @@ import envoy.event.MessageStatusChangeEvent;
public class ChatWindow extends JFrame { public class ChatWindow extends JFrame {
// User specific objects // User specific objects
private Client client; private Client client;
private LocalDb localDb; private WriteProxy writeProxy;
private LocalDb localDb;
// GUI components // GUI components
private JPanel contentPane = new JPanel(); private JPanel contentPane = new JPanel();
@ -211,7 +213,7 @@ public class ChatWindow extends JFrame {
// Listen to received messages // Listen to received messages
EventBus.getInstance().register(MessageCreationEvent.class, (evt) -> { 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 chat = localDb.getChats().stream().filter(c -> c.getRecipient().getId() == message.getSenderId()).findFirst().get();
chat.appendMessage(message); chat.appendMessage(message);
@ -301,8 +303,7 @@ public class ChatWindow extends JFrame {
.build(); .build();
// Send message // Send message
// TODO: Store offline messages writeProxy.writeMessage(message);
client.sendMessage(message);
// Add message to PersistentLocalDb and update UI // Add message to PersistentLocalDb and update UI
currentChat.appendMessage(message); currentChat.appendMessage(message);
@ -345,7 +346,7 @@ public class ChatWindow extends JFrame {
private void readCurrentChat() { private void readCurrentChat() {
try { try {
currentChat.read(client); currentChat.read(writeProxy);
messageList.synchronizeModel(); messageList.synchronizeModel();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); 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.<br>
* <br>
* This will trigger the display of the contact list.
* *
* @param client the {@link Client} used to send and receive messages * @param client the client used to send and receive messages
* @since Envoy v0.2-alpha * @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; } public void initContent(Client client, LocalDb localDb, WriteProxy writeProxy) {
this.client = client;
/** this.localDb = localDb;
* Sets the {@link LocalDb} used by this {@link ChatWindow}. After this.writeProxy = writeProxy;
* 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;
loadUsersAndChats(); loadUsersAndChats();
} }
} }

View File

@ -15,6 +15,7 @@ import envoy.client.Config;
import envoy.client.Settings; import envoy.client.Settings;
import envoy.client.data.*; import envoy.client.data.*;
import envoy.client.net.Client; import envoy.client.net.Client;
import envoy.client.net.WriteProxy;
import envoy.client.util.EnvoyLog; import envoy.client.util.EnvoyLog;
import envoy.data.LoginCredentials; import envoy.data.LoginCredentials;
import envoy.data.Message; import envoy.data.Message;
@ -148,14 +149,19 @@ public class Startup {
JOptionPane.WARNING_MESSAGE); JOptionPane.WARNING_MESSAGE);
} }
// Save all users to the local database // Initialize write proxy
if (client.isOnline()) localDb.setUsers(client.getUsers()); 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 // Display ChatWindow and StatusTrayIcon
EventQueue.invokeLater(() -> { EventQueue.invokeLater(() -> {
try { try {
chatWindow.setClient(client); chatWindow.initContent(client, localDb, writeProxy);
chatWindow.setLocalDB(localDb);
try { try {
new StatusTrayIcon(chatWindow).show(); new StatusTrayIcon(chatWindow).show();