Improved logging and code readability

This commit is contained in:
delvh 2019-12-07 10:44:25 +01:00
parent 2a120411d2
commit c79500acde
8 changed files with 497 additions and 527 deletions

View File

@ -36,14 +36,14 @@ public class Client {
this.config = config; this.config = config;
sender = getUser(username); sender = getUser(username);
logger.info("ID: " + sender.getID()); logger.info("ID: " + sender.getID());
} }
private <T, R> R post(String uri, T body, Class<R> responseBodyClass) { private <T, R> R post(String uri, T body, Class<R> responseBodyClass) {
javax.ws.rs.client.Client client = ClientBuilder.newClient(); javax.ws.rs.client.Client client = ClientBuilder.newClient();
WebTarget target = client.target(uri); WebTarget target = client.target(uri);
Response response = target.request().post(Entity.entity(body, "application/xml")); Response response = target.request().post(Entity.entity(body, "application/xml"));
R responseBody = response.readEntity(responseBodyClass); R responseBody = response.readEntity(responseBodyClass);
response.close(); response.close();
client.close(); client.close();
@ -133,7 +133,9 @@ public class Client {
* Updating UserStatus of all users in LocalDB. (Server sends all users with * Updating UserStatus of all users in LocalDB. (Server sends all users with
* their updated UserStatus to the client.) <br> * their updated UserStatus to the client.) <br>
* *
* @param userId * @param userId the id of the {@link Client} who sends the {@link Sync}
* @param sync the {@link Sync} to send
* @return a sync
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public Sync sendSync(long userId, Sync sync) { public Sync sendSync(long userId, Sync sync) {
@ -168,16 +170,16 @@ public class Client {
public User getRecipient() { return recipient; } public User getRecipient() { return recipient; }
/** /**
* Sets the recipient. * Sets the recipient.
*
* @param recipient - the recipient to set * @param recipient - the recipient to set
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public void setRecipient(User recipient) { this.recipient = recipient; } public void setRecipient(User recipient) { this.recipient = recipient; }
/** /**
* @return true, if a recipient is selected * @return true, if a recipient is selected
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public boolean hasRecipient() { return recipient != null; } public boolean hasRecipient() { return recipient != null; }
} }

View File

@ -114,7 +114,7 @@ public class Config {
* Changes the default local database. * Changes the default local database.
* Exclusively intended for development purposes. * Exclusively intended for development purposes.
* *
* @param the file containing the local database * @param localDB the file containing the local database
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
**/ **/
public void setLocalDB(File localDB) { this.localDB = localDB; } public void setLocalDB(File localDB) { this.localDB = localDB; }

View File

@ -39,7 +39,7 @@ public class LocalDB {
private DatatypeFactory datatypeFactory; private DatatypeFactory datatypeFactory;
private static final Logger logger = Logger.getLogger(LocalDB.class.getSimpleName()); private static final Logger logger = Logger.getLogger(LocalDB.class.getSimpleName());
private Sync unreadMessagesSync = objectFactory.createSync(); private Sync unreadMessagesSync = objectFactory.createSync();
private Sync sync = objectFactory.createSync(); private Sync sync = objectFactory.createSync();
private Sync readMessages = objectFactory.createSync(); private Sync readMessages = objectFactory.createSync();
@ -80,19 +80,13 @@ public class LocalDB {
* @throws IOException if something went wrong during saving * @throws IOException if something went wrong during saving
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public void saveToLocalDB() { public void saveToLocalDB() throws IOException {
try { localDB.getParentFile().mkdirs();
localDB.getParentFile().mkdirs(); localDB.createNewFile();
localDB.createNewFile();
} catch (IOException e) {
e.printStackTrace();
logger.warning("unable to save the messages");
}
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(localDB))) { try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(localDB))) {
out.writeObject(chats); out.writeObject(chats);
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); throw ex;
logger.warning("unable to save the messages");
} }
} }
@ -116,7 +110,7 @@ public class LocalDB {
* Creates a {@link Message} object serializable to XML. * Creates a {@link Message} object serializable to XML.
* *
* @param textContent The content (text) of the message * @param textContent The content (text) of the message
* @param recipient The recipient of the message * @param recipient The recipient of the message
* @return prepared {@link Message} object * @return prepared {@link Message} object
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
@ -144,7 +138,7 @@ public class LocalDB {
sync.getMessages().addAll(readMessages.getMessages()); sync.getMessages().addAll(readMessages.getMessages());
readMessages.getMessages().clear(); readMessages.getMessages().clear();
logger.info(String.format("Filled sync with %d messages.", sync.getMessages().size())); logger.finest(String.format("Filled sync with %d messages.", sync.getMessages().size()));
return sync; return sync;
} }
@ -189,28 +183,20 @@ public class LocalDB {
if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0 if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0
&& returnSync.getMessages().get(i).getMetadata().getState() == MessageState.READ) { && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.READ) {
// Update local Messages to state READ // Update local Messages to state READ
logger.info("Message with ID: " + returnSync.getMessages().get(i).getMetadata().getMessageId() logger.finest("Message with ID: " + returnSync.getMessages().get(i).getMetadata().getMessageId()
+ "was initialized to be set to READ in localDB."); + "was initialized to be set to READ in localDB.");
for (int j = 0; j < getChats().size(); j++) { for (int j = 0; j < getChats().size(); j++) {
if (getChats().get(j) if (getChats().get(j).getRecipient().getID() == returnSync.getMessages().get(i).getMetadata().getRecipient()) {
.getRecipient() logger.fine("Chat with: " + getChats().get(j).getRecipient().getID() + "was selected.");
.getID() == returnSync.getMessages().get(i).getMetadata().getRecipient()) {
logger.info("Chat with: " + getChats().get(j).getRecipient().getID() + "was selected.");
for (int k = 0; k < getChats().get(j).getModel().getSize(); k++) { for (int k = 0; k < getChats().get(j).getModel().getSize(); k++) {
if (getChats().get(j).getModel().get(k).getMetadata().getMessageId() == returnSync.getMessages() if (getChats().get(j).getModel().get(k).getMetadata().getMessageId() == returnSync.getMessages()
.get(i) .get(i)
.getMetadata() .getMetadata()
.getMessageId()) { .getMessageId()) {
logger.info("Message with ID: " logger
+ getChats().get(j).getModel().get(k).getMetadata().getMessageId() .finest("Message with ID: " + getChats().get(j).getModel().get(k).getMetadata().getMessageId() + "was selected.");
+ "was selected."); getChats().get(j).getModel().get(k).getMetadata().setState(returnSync.getMessages().get(i).getMetadata().getState());
getChats().get(j) logger.finest("Message State is now: " + getChats().get(j).getModel().get(k).getMetadata().getState().toString());
.getModel()
.get(k)
.getMetadata()
.setState(returnSync.getMessages().get(i).getMetadata().getState());
logger.info("Message State is now: "
+ getChats().get(j).getModel().get(k).getMetadata().getState().toString());
} }
} }
} }
@ -237,7 +223,6 @@ public class LocalDB {
* Adds the unread messages returned from the server in the latest sync to the * Adds the unread messages returned from the server in the latest sync to the
* right chats in the LocalDB. * right chats in the LocalDB.
* *
* @param localDB
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public void addUnreadMessagesToLocalDB() { public void addUnreadMessagesToLocalDB() {
@ -255,7 +240,7 @@ public class LocalDB {
* <br> * <br>
* Adds these messages to the {@code readMessages} {@link Sync} object. * Adds these messages to the {@code readMessages} {@link Sync} object.
* *
* @param currentChat * @param currentChat the {@link Chat} that was just opened
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public void setMessagesToRead(Chat currentChat) { public void setMessagesToRead(Chat currentChat) {

View File

@ -1,352 +1,352 @@
package envoy.client.ui; package envoy.client.ui;
import java.awt.Color; import java.awt.Color;
import java.awt.ComponentOrientation; import java.awt.ComponentOrientation;
import java.awt.Font; import java.awt.Font;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;
import java.awt.GridBagLayout; import java.awt.GridBagLayout;
import java.awt.Insets; import java.awt.Insets;
import java.awt.event.KeyAdapter; import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.util.logging.Logger; import java.io.IOException;
import java.util.logging.Level;
import javax.swing.DefaultListModel; import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame; import javax.swing.DefaultListModel;
import javax.swing.JList; import javax.swing.JButton;
import javax.swing.JOptionPane; import javax.swing.JFrame;
import javax.swing.JPanel; import javax.swing.JList;
import javax.swing.JScrollPane; import javax.swing.JOptionPane;
import javax.swing.JTextArea; import javax.swing.JPanel;
import javax.swing.JTextPane; import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel; import javax.swing.JTextArea;
import javax.swing.SwingUtilities; import javax.swing.JTextPane;
import javax.swing.Timer; import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder; import javax.swing.SwingUtilities;
import javax.swing.Timer;
import envoy.client.Chat; import javax.swing.border.EmptyBorder;
import envoy.client.Client;
import envoy.client.Config; import envoy.client.Chat;
import envoy.client.LocalDB; import envoy.client.Client;
import envoy.schema.Message; import envoy.client.Config;
import envoy.schema.Sync; import envoy.client.LocalDB;
import envoy.schema.User; import envoy.schema.Message;
import envoy.schema.Sync;
/** import envoy.schema.User;
* Project: <strong>envoy-client</strong><br>
* File: <strong>ChatWindow.java</strong><br> /**
* Created: <strong>28 Sep 2019</strong><br> * Project: <strong>envoy-client</strong><br>
* * File: <strong>ChatWindow.java</strong><br>
* @author Kai S. K. Engelbart * Created: <strong>28 Sep 2019</strong><br>
* @author Maximilian K&auml;fer *
* @author Leon Hofmeister * @author Kai S. K. Engelbart
* @since Envoy v0.1-alpha * @author Maximilian K&auml;fer
*/ * @author Leon Hofmeister
public class ChatWindow extends JFrame { * @since Envoy v0.1-alpha
*/
private static final long serialVersionUID = 6865098428255463649L; public class ChatWindow extends JFrame {
private JPanel contentPane = new JPanel(); private static final long serialVersionUID = 6865098428255463649L;
private Client client; private JPanel contentPane = new JPanel();
private LocalDB localDB;
private Client client;
private JList<User> userList = new JList<>(); private LocalDB localDB;
private Chat currentChat;
private JList<User> userList = new JList<>();
private JTextArea messageEnterTextArea; private Chat currentChat;
private static final Logger logger = Logger.getLogger(ChatWindow.class.getSimpleName()); private JTextArea messageEnterTextArea;
public ChatWindow(Client client, LocalDB localDB) { private static final Logger logger = Logger.getLogger(ChatWindow.class.getSimpleName());
this.client = client;
this.localDB = localDB; public ChatWindow(Client client, LocalDB localDB) {
this.client = client;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.localDB = localDB;
setBounds(100, 100, 600, 800);
setTitle("Envoy"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); setBounds(100, 100, 600, 800);
setTitle("Envoy");
// Save chats when window closes setLocationRelativeTo(null);
addWindowListener(new WindowAdapter() {
// Save chats when window closes
@Override addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { localDB.saveToLocalDB(); }
}); @Override
public void windowClosing(WindowEvent evt) {
contentPane.setBackground(new Color(0, 0, 0)); try {
contentPane.setForeground(Color.white); localDB.saveToLocalDB();
contentPane.setBorder(new EmptyBorder(0, 5, 0, 0)); } catch (IOException e1) {
setContentPane(contentPane); e1.printStackTrace();
GridBagLayout gbl_contentPane = new GridBagLayout(); logger.log(Level.WARNING, "Unable to save the messages", e1);
gbl_contentPane.columnWidths = new int[] { 1, 1, 1 }; }
gbl_contentPane.rowHeights = new int[] { 1, 1, 1 }; }
gbl_contentPane.columnWeights = new double[] { 0.3, 1.0, 0.1 }; });
gbl_contentPane.rowWeights = new double[] { 0.05, 1.0, 0.07 };
contentPane.setLayout(gbl_contentPane); contentPane.setBackground(new Color(0, 0, 0));
contentPane.setForeground(Color.white);
JList<Message> messageList = new JList<>(); contentPane.setBorder(new EmptyBorder(0, 5, 0, 0));
messageList.setCellRenderer(new MessageListRenderer()); setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
messageList.setFocusTraversalKeysEnabled(false); gbl_contentPane.columnWidths = new int[] { 1, 1, 1 };
messageList.setSelectionForeground(new Color(255, 255, 255)); gbl_contentPane.rowHeights = new int[] { 1, 1, 1 };
messageList.setSelectionBackground(new Color(102, 0, 153)); gbl_contentPane.columnWeights = new double[] { 0.3, 1.0, 0.1 };
messageList.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); gbl_contentPane.rowWeights = new double[] { 0.05, 1.0, 0.07 };
messageList.setForeground(new Color(255, 255, 255)); contentPane.setLayout(gbl_contentPane);
messageList.setBackground(new Color(51, 51, 51));
JList<Message> messageList = new JList<>();
DefaultListModel<Message> messageListModel = new DefaultListModel<>(); messageList.setCellRenderer(new MessageListRenderer());
messageList.setModel(messageListModel);
messageList.setFont(new Font("Arial", Font.PLAIN, 17)); messageList.setFocusTraversalKeysEnabled(false);
messageList.setFixedCellHeight(60); messageList.setSelectionForeground(new Color(255, 255, 255));
messageList.setBorder(new EmptyBorder(5, 5, 5, 5)); messageList.setSelectionBackground(new Color(102, 0, 153));
messageList.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
JScrollPane scrollPane = new JScrollPane(); messageList.setForeground(new Color(255, 255, 255));
scrollPane.setForeground(new Color(0, 0, 0)); messageList.setBackground(new Color(51, 51, 51));
scrollPane.setBackground(new Color(51, 51, 51));
scrollPane.setViewportView(messageList); DefaultListModel<Message> messageListModel = new DefaultListModel<>();
scrollPane.setBorder(null); messageList.setModel(messageListModel);
messageList.setFont(new Font("Arial", Font.PLAIN, 17));
GridBagConstraints gbc_scrollPane = new GridBagConstraints(); messageList.setFixedCellHeight(60);
gbc_scrollPane.fill = GridBagConstraints.BOTH; messageList.setBorder(new EmptyBorder(5, 5, 5, 5));
gbc_scrollPane.gridwidth = 2;
gbc_scrollPane.gridx = 1; JScrollPane scrollPane = new JScrollPane();
gbc_scrollPane.gridy = 1; scrollPane.setForeground(new Color(0, 0, 0));
scrollPane.setBackground(new Color(51, 51, 51));
gbc_scrollPane.insets = new Insets(0, 10, 10, 10); scrollPane.setViewportView(messageList);
scrollPane.setBorder(null);
contentPane.add(scrollPane, gbc_scrollPane);
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
// Message enter field gbc_scrollPane.fill = GridBagConstraints.BOTH;
messageEnterTextArea = new JTextArea(); gbc_scrollPane.gridwidth = 2;
messageEnterTextArea.addKeyListener(new KeyAdapter() { gbc_scrollPane.gridx = 1;
gbc_scrollPane.gridy = 1;
@Override
public void keyReleased(KeyEvent e) { gbc_scrollPane.insets = new Insets(0, 10, 10, 10);
if (e.getKeyCode() == KeyEvent.VK_ENTER && ((SettingsScreen.enterToSend && e.getModifiersEx() == 0) contentPane.add(scrollPane, gbc_scrollPane);
|| (e.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK))) {
// Message enter field
postMessage(messageList); messageEnterTextArea = new JTextArea();
} messageEnterTextArea.addKeyListener(new KeyAdapter() {
} @Override
}); public void keyReleased(KeyEvent e) {
// Checks for changed Message
messageEnterTextArea.setWrapStyleWord(true); if (e.getKeyCode() == KeyEvent.VK_ENTER
messageEnterTextArea.setCaretColor(new Color(255, 255, 255)); && ((SettingsScreen.enterToSend && e.getModifiersEx() == 0) || (e.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK))) {
messageEnterTextArea.setForeground(new Color(255, 255, 255));
messageEnterTextArea.setBackground(new Color(51, 51, 51)); postMessage(messageList);
messageEnterTextArea.setLineWrap(true); }
messageEnterTextArea.setBorder(null);
messageEnterTextArea.setFont(new Font("Arial", Font.PLAIN, 17)); }
messageEnterTextArea.setBorder(new EmptyBorder(5, 5, 5, 5)); });
// Checks for changed Message
GridBagConstraints gbc_messageEnterTextfield = new GridBagConstraints(); messageEnterTextArea.setWrapStyleWord(true);
gbc_messageEnterTextfield.fill = GridBagConstraints.BOTH; messageEnterTextArea.setCaretColor(new Color(255, 255, 255));
gbc_messageEnterTextfield.gridx = 1; messageEnterTextArea.setForeground(new Color(255, 255, 255));
gbc_messageEnterTextfield.gridy = 2; messageEnterTextArea.setBackground(new Color(51, 51, 51));
messageEnterTextArea.setLineWrap(true);
gbc_messageEnterTextfield.insets = new Insets(10, 10, 10, 10); messageEnterTextArea.setBorder(null);
messageEnterTextArea.setFont(new Font("Arial", Font.PLAIN, 17));
contentPane.add(messageEnterTextArea, gbc_messageEnterTextfield); messageEnterTextArea.setBorder(new EmptyBorder(5, 5, 5, 5));
// Post Button GridBagConstraints gbc_messageEnterTextfield = new GridBagConstraints();
JButton postButton = new JButton("Post"); gbc_messageEnterTextfield.fill = GridBagConstraints.BOTH;
postButton.setForeground(new Color(255, 255, 255)); gbc_messageEnterTextfield.gridx = 1;
postButton.setBackground(new Color(102, 51, 153)); gbc_messageEnterTextfield.gridy = 2;
postButton.setBorderPainted(false);
gbc_messageEnterTextfield.insets = new Insets(10, 10, 10, 10);
GridBagConstraints gbc_moveSelectionPostButton = new GridBagConstraints();
contentPane.add(messageEnterTextArea, gbc_messageEnterTextfield);
gbc_moveSelectionPostButton.fill = GridBagConstraints.BOTH;
gbc_moveSelectionPostButton.gridx = 2; // Post Button
gbc_moveSelectionPostButton.gridy = 2; JButton postButton = new JButton("Post");
postButton.setForeground(new Color(255, 255, 255));
gbc_moveSelectionPostButton.insets = new Insets(10, 10, 10, 10); postButton.setBackground(new Color(102, 51, 153));
postButton.setBorderPainted(false);
postButton.addActionListener((evt) -> { postMessage(messageList); });
contentPane.add(postButton, gbc_moveSelectionPostButton); GridBagConstraints gbc_moveSelectionPostButton = new GridBagConstraints();
// Settings Button gbc_moveSelectionPostButton.fill = GridBagConstraints.BOTH;
JButton settingsButton = new JButton("Settings"); gbc_moveSelectionPostButton.gridx = 2;
settingsButton.setForeground(new Color(255, 255, 255)); gbc_moveSelectionPostButton.gridy = 2;
settingsButton.setBackground(new Color(102, 51, 153));
settingsButton.setBorderPainted(false); gbc_moveSelectionPostButton.insets = new Insets(10, 10, 10, 10);
GridBagConstraints gbc_moveSelectionSettingsButton = new GridBagConstraints(); postButton.addActionListener((evt) -> { postMessage(messageList); });
contentPane.add(postButton, gbc_moveSelectionPostButton);
gbc_moveSelectionSettingsButton.fill = GridBagConstraints.BOTH;
gbc_moveSelectionSettingsButton.gridx = 2; // Settings Button
gbc_moveSelectionSettingsButton.gridy = 0; JButton settingsButton = new JButton("Settings");
settingsButton.setForeground(new Color(255, 255, 255));
gbc_moveSelectionSettingsButton.insets = new Insets(10, 10, 10, 10); settingsButton.setBackground(new Color(102, 51, 153));
settingsButton.setBorderPainted(false);
settingsButton.addActionListener((evt) -> {
try { GridBagConstraints gbc_moveSelectionSettingsButton = new GridBagConstraints();
SettingsScreen.open(localDB.getUser().getName());
} catch (Exception e) { gbc_moveSelectionSettingsButton.fill = GridBagConstraints.BOTH;
SettingsScreen.open(); gbc_moveSelectionSettingsButton.gridx = 2;
logger.warning("An error occured while opening the settings screen: " + e); gbc_moveSelectionSettingsButton.gridy = 0;
e.printStackTrace();
} gbc_moveSelectionSettingsButton.insets = new Insets(10, 10, 10, 10);
});
contentPane.add(settingsButton, gbc_moveSelectionSettingsButton); settingsButton.addActionListener((evt) -> {
try {
// Partner name display SettingsScreen.open(localDB.getUser().getName());
JTextPane textPane = new JTextPane(); } catch (Exception e) {
textPane.setBackground(new Color(0, 0, 0)); SettingsScreen.open();
textPane.setForeground(new Color(255, 255, 255)); logger.log(Level.WARNING, "An error occured while opening the settings screen", e);
e.printStackTrace();
textPane.setFont(new Font("Arial", Font.PLAIN, 20)); }
});
GridBagConstraints gbc_partnerName = new GridBagConstraints(); contentPane.add(settingsButton, gbc_moveSelectionSettingsButton);
gbc_partnerName.fill = GridBagConstraints.HORIZONTAL;
gbc_partnerName.gridx = 1; // Partner name display
gbc_partnerName.gridy = 0; JTextPane textPane = new JTextPane();
textPane.setBackground(new Color(0, 0, 0));
gbc_partnerName.insets = new Insets(0, 10, 0, 10); textPane.setForeground(new Color(255, 255, 255));
contentPane.add(textPane, gbc_partnerName);
textPane.setFont(new Font("Arial", Font.PLAIN, 20));
userList.setCellRenderer(new UserListRenderer());
userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); GridBagConstraints gbc_partnerName = new GridBagConstraints();
userList.addListSelectionListener((listSelectionEvent) -> { gbc_partnerName.fill = GridBagConstraints.HORIZONTAL;
if (!listSelectionEvent.getValueIsAdjusting()) { gbc_partnerName.gridx = 1;
@SuppressWarnings("unchecked") gbc_partnerName.gridy = 0;
final JList<User> selectedUserList = (JList<User>) listSelectionEvent.getSource();
final User user = selectedUserList.getSelectedValue(); gbc_partnerName.insets = new Insets(0, 10, 0, 10);
client.setRecipient(user); contentPane.add(textPane, gbc_partnerName);
currentChat = localDB.getChats() userList.setCellRenderer(new UserListRenderer());
.stream() userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
.filter(chat -> chat.getRecipient().getID() == user.getID()) userList.addListSelectionListener((listSelectionEvent) -> {
.findFirst() if (!listSelectionEvent.getValueIsAdjusting()) {
.get(); @SuppressWarnings("unchecked")
final JList<User> selectedUserList = (JList<User>) listSelectionEvent.getSource();
// Set all unread messages in the chat to read final User user = selectedUserList.getSelectedValue();
readCurrentChat(); client.setRecipient(user);
client.setRecipient(user); currentChat = localDB.getChats().stream().filter(chat -> chat.getRecipient().getID() == user.getID()).findFirst().get();
textPane.setText(currentChat.getRecipient().getName()); // Set all unread messages in the chat to read
readCurrentChat();
messageList.setModel(currentChat.getModel());
contentPane.revalidate(); client.setRecipient(user);
}
}); textPane.setText(currentChat.getRecipient().getName());
userList.setSelectionForeground(new Color(255, 255, 255)); messageList.setModel(currentChat.getModel());
userList.setSelectionBackground(new Color(102, 0, 153)); contentPane.revalidate();
userList.setForeground(new Color(255, 255, 255)); }
userList.setBackground(new Color(51, 51, 51)); });
userList.setFont(new Font("Arial", Font.PLAIN, 17));
userList.setBorder(new EmptyBorder(5, 5, 5, 5)); userList.setSelectionForeground(new Color(255, 255, 255));
userList.setSelectionBackground(new Color(102, 0, 153));
GridBagConstraints gbc_userList = new GridBagConstraints(); userList.setForeground(new Color(255, 255, 255));
gbc_userList.fill = GridBagConstraints.VERTICAL; userList.setBackground(new Color(51, 51, 51));
gbc_userList.gridx = 0; userList.setFont(new Font("Arial", Font.PLAIN, 17));
gbc_userList.gridy = 1; userList.setBorder(new EmptyBorder(5, 5, 5, 5));
gbc_userList.anchor = GridBagConstraints.PAGE_START;
gbc_userList.insets = new Insets(0, 0, 10, 0); GridBagConstraints gbc_userList = new GridBagConstraints();
gbc_userList.fill = GridBagConstraints.VERTICAL;
contentPane.add(userList, gbc_userList); gbc_userList.gridx = 0;
contentPane.revalidate(); gbc_userList.gridy = 1;
gbc_userList.anchor = GridBagConstraints.PAGE_START;
loadUsersAndChats(); gbc_userList.insets = new Insets(0, 0, 10, 0);
startSyncThread(Config.getInstance().getSyncTimeout());
contentPane.add(userList, gbc_userList);
contentPane.revalidate(); contentPane.revalidate();
}
loadUsersAndChats();
private void postMessage(JList<Message> messageList) { startSyncThread(Config.getInstance().getSyncTimeout());
if (!client.hasRecipient()) {
JOptionPane.showMessageDialog(this, contentPane.revalidate();
"Please select a recipient!", }
"Cannot send message",
JOptionPane.INFORMATION_MESSAGE); private void postMessage(JList<Message> messageList) {
} if (!client.hasRecipient()) {
JOptionPane.showMessageDialog(this, "Please select a recipient!", "Cannot send message", JOptionPane.INFORMATION_MESSAGE);
if (!messageEnterTextArea.getText().isEmpty()) try { }
// Create and send message object if (!messageEnterTextArea.getText().isEmpty()) try {
final Message message = localDB.createMessage(messageEnterTextArea.getText(), currentChat.getRecipient());
currentChat.appendMessage(message); // Create and send message object
messageList.setModel(currentChat.getModel()); final Message message = localDB.createMessage(messageEnterTextArea.getText(), currentChat.getRecipient());
currentChat.appendMessage(message);
// Clear text field messageList.setModel(currentChat.getModel());
messageEnterTextArea.setText("");
contentPane.revalidate(); // Clear text field
} catch (Exception e) { messageEnterTextArea.setText("");
JOptionPane.showMessageDialog(this, contentPane.revalidate();
"An exception occured while sending a message. See the log for more details.", } catch (Exception e) {
"Exception occured", JOptionPane.showMessageDialog(this,
JOptionPane.ERROR_MESSAGE); "An exception occured while sending a message. See the log for more details.",
e.printStackTrace(); "Exception occured",
} JOptionPane.ERROR_MESSAGE);
} e.printStackTrace();
}
/** }
* Initializes the elements of the user list by downloading them from the
* server. /**
* * Initializes the elements of the user list by downloading them from the
* @since Envoy v0.1-alpha * server.
*/ *
private void loadUsersAndChats() { * @since Envoy v0.1-alpha
new Thread(() -> { */
Sync users = client.getUsersListXml(); private void loadUsersAndChats() {
DefaultListModel<User> userListModel = new DefaultListModel<>(); new Thread(() -> {
users.getUsers().forEach(user -> { Sync users = client.getUsersListXml();
userListModel.addElement(user); DefaultListModel<User> userListModel = new DefaultListModel<>();
users.getUsers().forEach(user -> {
// Check if user exists in local DB userListModel.addElement(user);
if (localDB.getChats().stream().filter(c -> c.getRecipient().getID() == user.getID()).count() == 0)
localDB.getChats().add(new Chat(user)); // Check if user exists in local DB
}); if (localDB.getChats().stream().filter(c -> c.getRecipient().getID() == user.getID()).count() == 0)
SwingUtilities.invokeLater(() -> userList.setModel(userListModel)); localDB.getChats().add(new Chat(user));
}).start(); });
} SwingUtilities.invokeLater(() -> userList.setModel(userListModel));
}).start();
/** }
* Updates the data model and the UI repeatedly after a certain amount of
* time. /**
* * Updates the data model and the UI repeatedly after a certain amount of
* @param timeout the amount of time that passes between two requests sent to * time.
* the server *
* @since Envoy v0.1-alpha * @param timeout the amount of time that passes between two requests sent to
*/ * the server
private void startSyncThread(int timeout) { * @since Envoy v0.1-alpha
new Timer(timeout, (evt) -> { */
new Thread(() -> { private void startSyncThread(int timeout) {
new Timer(timeout, (evt) -> {
// Synchronize new Thread(() -> {
localDB.applySync(
client.sendSync(client.getSender().getID(), localDB.fillSync(client.getSender().getID()))); // Synchronize
localDB.applySync(client.sendSync(client.getSender().getID(), localDB.fillSync(client.getSender().getID())));
// Process unread messages
localDB.addUnreadMessagesToLocalDB(); // Process unread messages
localDB.clearUnreadMessagesSync(); localDB.addUnreadMessagesToLocalDB();
localDB.clearUnreadMessagesSync();
// Mark unread messages as read when they are in the current chat
readCurrentChat(); // Mark unread messages as read when they are in the current chat
readCurrentChat();
// Update UI
SwingUtilities // Update UI
.invokeLater(() -> { updateUserStates(); contentPane.revalidate(); contentPane.repaint(); }); SwingUtilities.invokeLater(() -> { updateUserStates(); contentPane.revalidate(); contentPane.repaint(); });
}).start(); }).start();
}).start(); }).start();
} }
private void updateUserStates() { private void updateUserStates() {
for (int i = 0; i < userList.getModel().getSize(); i++) for (int i = 0; i < userList.getModel().getSize(); i++)
for (int j = 0; j < localDB.getChats().size(); j++) for (int j = 0; j < localDB.getChats().size(); j++)
if (userList.getModel().getElementAt(i).getID() == localDB.getChats().get(j).getRecipient().getID()) if (userList.getModel().getElementAt(i).getID() == localDB.getChats().get(j).getRecipient().getID())
userList.getModel().getElementAt(i).setStatus(localDB.getChats().get(j).getRecipient().getStatus()); userList.getModel().getElementAt(i).setStatus(localDB.getChats().get(j).getRecipient().getStatus());
} }
/** /**
* Marks messages in the current chat as {@code READ}. * Marks messages in the current chat as {@code READ}.
*/ */
private void readCurrentChat() { if (currentChat != null) { localDB.setMessagesToRead(currentChat); } } private void readCurrentChat() { if (currentChat != null) { localDB.setMessagesToRead(currentChat); } }
} }

View File

@ -1,54 +1,49 @@
package envoy.client.ui; package envoy.client.ui;
import java.awt.Component; import java.awt.Component;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.ListCellRenderer; import javax.swing.ListCellRenderer;
import envoy.schema.Message; import envoy.schema.Message;
/** /**
* Defines how a message is displayed.<br> * Defines how a message is displayed.<br>
* <br> * <br>
* *
* Project: <strong>envoy-client</strong><br> * Project: <strong>envoy-client</strong><br>
* File: <strong>UserListRenderer.java</strong><br> * File: <strong>UserListRenderer.java</strong><br>
* Created: <strong>19 Oct 2019</strong><br> * Created: <strong>19 Oct 2019</strong><br>
* *
* @author Kai S. K. Engelbart * @author Kai S. K. Engelbart
* @author Maximilian K&auml;fer * @author Maximilian K&auml;fer
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public class MessageListRenderer extends JLabel implements ListCellRenderer<Message> { public class MessageListRenderer extends JLabel implements ListCellRenderer<Message> {
private static final long serialVersionUID = 5164417379767181198L; private static final long serialVersionUID = 5164417379767181198L;
@Override @Override
public Component getListCellRendererComponent(JList<? extends Message> list, Message value, int index, public Component getListCellRendererComponent(JList<? extends Message> list, Message value, int index, boolean isSelected, boolean cellHasFocus) {
boolean isSelected, boolean cellHasFocus) { if (isSelected) {
if (isSelected) { setBackground(list.getSelectionBackground());
setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground());
setForeground(list.getSelectionForeground()); } else {
} else { setBackground(list.getBackground());
setBackground(list.getBackground()); setForeground(list.getForeground());
setForeground(list.getForeground()); }
}
setOpaque(true);
setOpaque(true);
final String text = value.getContent().get(0).getText();
final String text = value.getContent().get(0).getText(); final String state = value.getMetadata().getState().toString();
final String state = value.getMetadata().getState().toString(); final String date = value.getMetadata().getDate() == null ? ""
final String date = value.getMetadata().getDate() == null ? "" : new SimpleDateFormat("dd.MM.yyyy HH:mm ").format(value.getMetadata().getDate().toGregorianCalendar().getTime());
: new SimpleDateFormat("dd.MM.yyyy HH:mm ")
.format(value.getMetadata().getDate().toGregorianCalendar().getTime()); setText(String
.format("<html><p style=\"color:#d2d235\"><b><small>%s</b></small><br><p style=\"color:white\">%s :%s</html>", date, text, state));
setText(String.format( return this;
"<html><p style=\"color:#d2d235\"><b><small>%s</b></small><br><p style=\"color:white\">%s :%s</html>", }
date,
text,
state));
return this;
}
} }

View File

@ -41,7 +41,6 @@ public class SettingsScreen extends JDialog {
* It personalises the screen more. * It personalises the screen more.
* *
* @param username The name of the User * @param username The name of the User
* @param Email The Email that is associated with that Account
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public static void open(String username) {// , String Email) {AUSKLAMMERN, WENN ANMELDUNG PER public static void open(String username) {// , String Email) {AUSKLAMMERN, WENN ANMELDUNG PER
@ -101,7 +100,6 @@ public class SettingsScreen extends JDialog {
* It personalises the screen more. * It personalises the screen more.
* *
* @param Username The name of the User * @param Username The name of the User
* @param Email The Email that is associated with that Account
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public SettingsScreen(String Username) {// , String Email, String hashedPwd) {AUSKLAMMERN, WENN ANMELDUNG PER EMAIL public SettingsScreen(String Username) {// , String Email, String hashedPwd) {AUSKLAMMERN, WENN ANMELDUNG PER EMAIL
@ -145,10 +143,10 @@ public class SettingsScreen extends JDialog {
public static boolean isEnterToSend() { return enterToSend; } public static boolean isEnterToSend() { return enterToSend; }
/** /**
* @param enterToSend <br> * @param enterForSend <br>
* toggles whether a message should be sent via * toggles whether a message should be sent via
* <br> * <br>
* buttonpress "enter" or "ctrl"+"enter" * buttonpress "enter" or "ctrl"+"enter"
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public static void setEnterToSend(boolean enterForSend) { enterToSend = enterForSend; } public static void setEnterToSend(boolean enterForSend) { enterToSend = enterForSend; }

View File

@ -26,11 +26,11 @@ import envoy.exception.EnvoyException;
*/ */
public class Startup { public class Startup {
private static final Logger logger = Logger.getLogger(Client.class.getSimpleName()); private static final Logger logger = Logger.getLogger(Startup.class.getSimpleName());
public static void main(String[] args) { public static void main(String[] args) {
logger.setLevel(Level.ALL); logger.setLevel(Level.ALL);
Config config = Config.getInstance(); Config config = Config.getInstance();
// Load the configuration from client.properties first // Load the configuration from client.properties first
@ -44,30 +44,29 @@ public class Startup {
} }
// Override configuration values with command line arguments // Override configuration values with command line arguments
if (args.length > 0) if (args.length > 0) config.load(args);
config.load(args);
if (!config.isInitialized()) { if (!config.isInitialized()) {
logger.warning("Server or port are not defined. Exiting..."); logger.severe("Server or port are not defined. Exiting...");
JOptionPane.showMessageDialog(null, "Error loading configuration values.", "Configuration error", JOptionPane.showMessageDialog(null, "Error loading configuration values.", "Configuration error", JOptionPane.ERROR_MESSAGE);
JOptionPane.ERROR_MESSAGE);
System.exit(1); System.exit(1);
} }
String userName = JOptionPane.showInputDialog("Please enter your username"); String userName = JOptionPane.showInputDialog("Please enter your username");
if (userName == null || userName.isEmpty()) { if (userName == null || userName.isEmpty()) {
logger.warning("User name is not set or empty. Exiting..."); logger.severe("User name is not set or empty. Exiting...");
System.exit(1); System.exit(1);
} }
Client client = new Client(config, userName); Client client = new Client(config, userName);
LocalDB localDB = new LocalDB(client.getSender()); LocalDB localDB = new LocalDB(client.getSender());
try { try {
localDB.initializeDBFile(config.getLocalDB()); localDB.initializeDBFile(config.getLocalDB());
} catch (EnvoyException e) { } catch (EnvoyException e) {
e.printStackTrace(); e.printStackTrace();
JOptionPane.showMessageDialog(null, JOptionPane.showMessageDialog(null,
"Error while loading local database: " + e.toString() + "\nChats will not be stored locally.", "Error while loading local database: " + e.toString() + "\nChats will not be stored locally.",
"Local DB error", JOptionPane.WARNING_MESSAGE); "Local DB error",
JOptionPane.WARNING_MESSAGE);
} }
EventQueue.invokeLater(() -> { EventQueue.invokeLater(() -> {

View File

@ -1,65 +1,56 @@
package envoy.client.ui; package envoy.client.ui;
import java.awt.Component; import java.awt.Component;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.ListCellRenderer; import javax.swing.ListCellRenderer;
import envoy.schema.User; import envoy.schema.User;
import envoy.schema.User.UserStatus; import envoy.schema.User.UserStatus;
/** /**
* Defines how the {@code UserList} is displayed. * Defines how the {@code UserList} is displayed.
* *
* Project: <strong>envoy-client</strong><br> * Project: <strong>envoy-client</strong><br>
* File: <strong>UserListRenderer.java</strong><br> * File: <strong>UserListRenderer.java</strong><br>
* Created: <strong>12 Oct 2019</strong><br> * Created: <strong>12 Oct 2019</strong><br>
* *
* @author Kai S. K. Engelbart * @author Kai S. K. Engelbart
* @author Maximilian K&auml;fer * @author Maximilian K&auml;fer
* @since Envoy v0.1-alpha * @since Envoy v0.1-alpha
*/ */
public class UserListRenderer extends JLabel implements ListCellRenderer<User> { public class UserListRenderer extends JLabel implements ListCellRenderer<User> {
private static final long serialVersionUID = 5164417379767181198L; private static final long serialVersionUID = 5164417379767181198L;
@Override @SuppressWarnings("incomplete-switch")
public Component getListCellRendererComponent(JList<? extends User> list, User value, int index, boolean isSelected, @Override
boolean cellHasFocus) { public Component getListCellRendererComponent(JList<? extends User> list, User value, int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) { if (isSelected) {
setBackground(list.getSelectionBackground()); setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground()); setForeground(list.getSelectionForeground());
} else { } else {
setBackground(list.getBackground()); setBackground(list.getBackground());
setForeground(list.getForeground()); setForeground(list.getForeground());
} }
// Enable background rendering // Enable background rendering
setOpaque(true); setOpaque(true);
final String name = value.getName();
final String name = value.getName(); final UserStatus status = value.getStatus();
final UserStatus status = value.getStatus();
switch (status) {
switch (status) { case ONLINE:
case ONLINE: setText(String
setText(String.format( .format("<html><p style=\"color:#03fc20\"><b><small>%s</b></small><br><p style=\"color:white\">%s</html>", status, name));
"<html><p style=\"color:#03fc20\"><b><small>%s</b></small><br><p style=\"color:white\">%s</html>", break;
status, case OFFLINE:
name)); setText(String
break; .format("<html><p style=\"color:#fc0303\"><b><small>%s</b></small><br><p style=\"color:white\">%s</html>", status, name));
break;
case OFFLINE: }
setText(String.format( return this;
"<html><p style=\"color:#fc0303\"><b><small>%s</b></small><br><p style=\"color:white\">%s</html>", }
status,
name));
break;
}
return this;
}
} }