From b7b4e95e65cc7043f13582f92715b63550fc6a70 Mon Sep 17 00:00:00 2001 From: kske Date: Sat, 26 Oct 2019 17:49:45 +0200 Subject: [PATCH 1/2] Reduced the number of user list requests to one Fixes #16 --- src/main/java/envoy/client/ui/ChatWindow.java | 59 +++++++++---------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java index cce9e73..dd7ff5e 100644 --- a/src/main/java/envoy/client/ui/ChatWindow.java +++ b/src/main/java/envoy/client/ui/ChatWindow.java @@ -48,18 +48,13 @@ public class ChatWindow extends JFrame { private Client client; - private DefaultListModel messageListModel = new DefaultListModel<>(); - private List partnerChatList = new ArrayList(); - private Chat currentChat; + private JList userList = new JList<>(); + private List partnerChatList = new ArrayList(); + private Chat currentChat; public ChatWindow(Client client) { this.client = client; - // Initialize chat list and current chat - Users chatUsers = client.getUsersListXml(); - chatUsers.getUser().forEach(user -> partnerChatList.add(new Chat(user))); - if (partnerChatList.size() > 0) currentChat = partnerChatList.get(0); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); setTitle("Envoy"); @@ -86,6 +81,7 @@ public class ChatWindow extends JFrame { messageList.setForeground(new Color(255, 255, 255)); messageList.setBackground(new Color(51, 51, 51)); + DefaultListModel messageListModel = new DefaultListModel<>(); messageList.setModel(messageListModel); messageList.setFont(new Font("Arial", Font.PLAIN, 17)); messageList.setFixedCellHeight(60); @@ -142,10 +138,7 @@ public class ChatWindow extends JFrame { postButton.addActionListener((evt) -> { if (!client.hasRecipient()) { - JOptionPane.showMessageDialog(this, - "Please select a recipient!", - "Cannot send message", - JOptionPane.INFORMATION_MESSAGE); + JOptionPane.showMessageDialog(this, "Please select a recipient!", "Cannot send message", JOptionPane.INFORMATION_MESSAGE); return; } @@ -189,7 +182,6 @@ public class ChatWindow extends JFrame { gbc_partnerName.insets = new Insets(0, 10, 0, 10); contentPane.add(textPane, gbc_partnerName); - JList userList = new JList<>(); userList.setCellRenderer(new UserListRenderer()); userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); userList.addListSelectionListener((listSelectionEvent) -> { @@ -199,10 +191,7 @@ public class ChatWindow extends JFrame { final User user = selectedUserList.getSelectedValue(); client.setRecipient(user); - currentChat = partnerChatList.stream() - .filter(chat -> chat.getRecipient().getID() == user.getID()) - .findFirst() - .get(); + currentChat = partnerChatList.stream().filter(chat -> chat.getRecipient().getID() == user.getID()).findFirst().get(); client.setRecipient(user); @@ -229,32 +218,38 @@ public class ChatWindow extends JFrame { contentPane.add(userList, gbc_userList); contentPane.revalidate(); - loadUserList(userList); - - new Timer(5000, (evt) -> { - Messages unreadMessages = client.getUnreadMessages(client.getSender().getID()); - for (int i = 0; i < unreadMessages.getMessage().size(); i++) - for (int j = 0; j < partnerChatList.size(); j++) - if (partnerChatList.get(j) - .getRecipient() - .getID() == unreadMessages.getMessage().get(i).getMetaData().getSender()) - partnerChatList.get(j).appendMessage(unreadMessages.getMessage().get(i)); - }).start(); + loadUsersAndChats(); + startReceiverThread(5000); + contentPane.revalidate(); } /** * Initializes the elements of the user list by downloading them from the * server. - * - * @param userList The {@link JList} to put the elements in */ - private void loadUserList(JList userList) { + private void loadUsersAndChats() { new Thread(() -> { Users users = client.getUsersListXml(); DefaultListModel userListModel = new DefaultListModel<>(); - users.getUser().forEach(user -> userListModel.addElement(user)); + users.getUser().forEach(user -> { userListModel.addElement(user); partnerChatList.add(new Chat(user)); }); SwingUtilities.invokeLater(() -> userList.setModel(userListModel)); }).start(); } + + /** + * Checks for new messages and adds them to the chat list. + * + * @param timeout the amount of time that passes between two requests sent to + * the server + */ + private void startReceiverThread(int timeout) { + new Timer(timeout, (evt) -> { + Messages unreadMessages = client.getUnreadMessages(client.getSender().getID()); + for (int i = 0; i < unreadMessages.getMessage().size(); i++) + for (int j = 0; j < partnerChatList.size(); j++) + if (partnerChatList.get(j).getRecipient().getID() == unreadMessages.getMessage().get(i).getMetaData().getSender()) + partnerChatList.get(j).appendMessage(unreadMessages.getMessage().get(i)); + }).start(); + } } \ No newline at end of file From 4147df262d6638128ab7f952576e0e6d58c029de Mon Sep 17 00:00:00 2001 From: kske Date: Sat, 26 Oct 2019 18:31:49 +0200 Subject: [PATCH 2/2] Moved GET request implementations into a single method --- src/main/java/envoy/client/Client.java | 66 +++++++++++++------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/main/java/envoy/client/Client.java b/src/main/java/envoy/client/Client.java index ed8ebb1..0ebce3c 100644 --- a/src/main/java/envoy/client/Client.java +++ b/src/main/java/envoy/client/Client.java @@ -60,7 +60,7 @@ public class Client { public void sendMessage(Message message) { new Thread(() -> { // Wrap single message into messages list - Messages messages = wrapMessage(message); + Messages messages = wrapMessages(message); // Print message XML to console JAXBContext jc; @@ -109,22 +109,10 @@ public class Client { return message; } - public Messages wrapMessage(Message... messages) { - Messages wrapper = objectFactory.createMessages(); - wrapper.getMessage().addAll(Arrays.asList(messages)); - return wrapper; - } + public Users getUsersListXml() { return get(String.format("%s:%d/envoy-server/rest/user", config.getServer(), config.getPort()), Users.class); } - public Users getUsersListXml() { - javax.ws.rs.client.Client client = ClientBuilder.newClient(); - WebTarget target = client - .target(String.format("%s:%d/envoy-server/rest/user", config.getServer(), config.getPort())); - Response response = target.request("application/xml").get(); - Users users = response.readEntity(Users.class); - System.out.println("Response code: " + response.getStatus()); - response.close(); - client.close(); - return users; + public Messages getUnreadMessages(long userId) { + return get(String.format("%s:%d/envoy-server/rest/message/receive?userId=%d", config.getServer(), config.getPort(), userId), Messages.class); } /** @@ -132,35 +120,49 @@ public class Client { * * @param name - the name of the {@link User} * @return a {@link User} with the specified name - * @since Envoy 0.1 + * @since Envoy v0.1-alpha */ private User getUser(String name) { - javax.ws.rs.client.Client client = ClientBuilder.newClient(); - WebTarget target = client.target(String - .format("%s:%d/envoy-server/rest/user/sender?name=%s", config.getServer(), config.getPort(), name)); - Response response = target.request("application/xml").get(); - Users users = response.readEntity(Users.class); - System.out.println("Response code: " + response.getStatus()); - response.close(); - client.close(); - return users.getUser().get(0); + return get(String.format("%s:%d/envoy-server/rest/user/sender?name=%s", config.getServer(), config.getPort(), name), Users.class).getUser() + .get(0); } - public Messages getUnreadMessages(long userId) { + /** + * Invokes the GET method of a web service. + * + * @param the type of the object returned by the web service + * @param uri the URI of the web service + * @param responseClass the class of the object returned by the web service + * @return the object returned by the web service + * @since Envoy v0.1-alpha + */ + private T get(String uri, Class responseClass) { javax.ws.rs.client.Client client = ClientBuilder.newClient(); - WebTarget target = client.target(String - .format("%s:%d/envoy-server/rest/message/receive?userId=%d", config.getServer(), config.getPort(), userId)); + WebTarget target = client.target(uri); Response response = target.request("application/xml").get(); - Messages unreadMessages = response.readEntity(Messages.class); + T responseObject = response.readEntity(responseClass); System.out.println("Response code: " + response.getStatus()); response.close(); client.close(); - return unreadMessages; + return responseObject; + } + + /** + * Wraps one or more {@link Message} objects into a {@link Messages} object. + * + * @param messages the {@link Message} objects to wrap + * @return {@link Messages} object with all messages as its children + * @since Envoy v0.1-alpha + */ + private Messages wrapMessages(Message... messages) { + Messages wrapper = objectFactory.createMessages(); + wrapper.getMessage().addAll(Arrays.asList(messages)); + return wrapper; } /** * @return the sender object that represents this client - * @since Envoy 0.1 + * @since Envoy v0.1-alpha */ public User getSender() { return sender; }