Made local database persistence optional

* Split LocalDB into abstract class LocalDb and PersistentLocalDb and
TransientLocalDb
* Moved LocalDb to database package
* Added ignoreLocalDb option to Config
This commit is contained in:
2020-02-03 21:52:48 +01:00
parent 63990f6d57
commit d43b45d36b
8 changed files with 294 additions and 207 deletions

View File

@ -9,7 +9,10 @@ import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import envoy.client.*;
import envoy.client.Chat;
import envoy.client.Client;
import envoy.client.Settings;
import envoy.client.database.LocalDb;
import envoy.client.event.MessageCreationEvent;
import envoy.client.event.ThemeChangeEvent;
import envoy.client.ui.list.ComponentList;
@ -34,7 +37,7 @@ public class ChatWindow extends JFrame {
// User specific objects
private Client client;
private LocalDB localDB;
private LocalDb localDb;
// GUI components
private JPanel contentPane = new JPanel();
@ -161,13 +164,13 @@ public class ChatWindow extends JFrame {
userList.setCellRenderer(new UserListRenderer());
userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
userList.addListSelectionListener((listSelectionEvent) -> {
if (client != null && localDB != null && !listSelectionEvent.getValueIsAdjusting()) {
if (client != null && localDb != null && !listSelectionEvent.getValueIsAdjusting()) {
@SuppressWarnings("unchecked")
final JList<User> selectedUserList = (JList<User>) listSelectionEvent.getSource();
final User user = selectedUserList.getSelectedValue();
// Select current chat
currentChat = localDB.getChats().stream().filter(chat -> chat.getRecipient().getId() == user.getId()).findFirst().get();
currentChat = localDb.getChats().stream().filter(chat -> chat.getRecipient().getId() == user.getId()).findFirst().get();
// Read current Chat
currentChat.read();
@ -206,7 +209,7 @@ public class ChatWindow extends JFrame {
// Listen to received messages
EventBus.getInstance().register(MessageCreationEvent.class, (evt) -> {
Message message = ((MessageCreationEvent) evt).get();
localDB.getChats().stream().filter(c -> c.getRecipient().getId() == message.getSenderId()).findFirst().get().appendMessage(message);
localDb.getChats().stream().filter(c -> c.getRecipient().getId() == message.getSenderId()).findFirst().get().appendMessage(message);
revalidate();
repaint();
});
@ -262,7 +265,7 @@ public class ChatWindow extends JFrame {
if (!messageEnterTextArea.getText().isEmpty()) try {
// Create message
final Message message = new MessageBuilder(localDB.getUser().getId(), currentChat.getRecipient().getId(), localDB.getIdGenerator())
final Message message = new MessageBuilder(localDb.getUser().getId(), currentChat.getRecipient().getId(), localDb.getIdGenerator())
.setText(messageEnterTextArea.getText())
.build();
@ -270,7 +273,7 @@ public class ChatWindow extends JFrame {
// TODO: Store offline messages
client.sendMessage(message);
// Add message to LocalDB and update UI
// Add message to PersistentLocalDb and update UI
currentChat.appendMessage(message);
// messageList.setModel(currentChat.getModel());
@ -281,8 +284,8 @@ public class ChatWindow extends JFrame {
revalidate();
repaint();
// Request a new id generator if all ids were used
if (!localDB.getIdGenerator().hasNext()) client.requestIdGenerator();
// Request a new id generator if all IDs were used
if (!localDb.getIdGenerator().hasNext()) client.requestIdGenerator();
} catch (Exception e) {
JOptionPane.showMessageDialog(this,
@ -302,12 +305,12 @@ public class ChatWindow extends JFrame {
private void loadUsersAndChats() {
new Thread(() -> {
DefaultListModel<User> userListModel = new DefaultListModel<>();
localDB.getUsers().values().forEach(user -> {
localDb.getUsers().values().forEach(user -> {
userListModel.addElement(user);
// Check if user exists in local DB
if (localDB.getChats().stream().filter(c -> c.getRecipient().getId() == user.getId()).count() == 0)
localDB.getChats().add(new Chat(user));
if (localDb.getChats().stream().filter(c -> c.getRecipient().getId() == user.getId()).count() == 0)
localDb.getChats().add(new Chat(user));
});
SwingUtilities.invokeLater(() -> userList.setModel(userListModel));
}).start();
@ -324,14 +327,16 @@ public class ChatWindow extends JFrame {
}
/**
* Sets the {@link LocalDB} used by this {@link ChatWindow}. After invoking this
* 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
* @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 setLocalDB(LocalDb localDb) {
this.localDb = localDb;
loadUsersAndChats();
}
}