From 5b28f2f25b0ad3c3c72e06ab470c876ed5178572 Mon Sep 17 00:00:00 2001 From: delvh Date: Sat, 1 Feb 2020 23:37:44 +0100 Subject: [PATCH 01/11] Added UserStatusChangeProcessor additionally added UserStatus updating in the LoginCredentialProcessor yet missing: method to handle clients going offline --- pom.xml | 2 +- .../java/envoy/server/ConnectionManager.java | 2 +- src/main/java/envoy/server/Startup.java | 1 + .../server/database/PersistenceManager.java | 13 ++++ .../server/net/ObjectMessageProcessor.java | 1 - .../envoy/server/net/ObjectWriteProxy.java | 2 +- .../processors/LoginCredentialProcessor.java | 16 ++-- .../processors/UserStatusChangeProcessor.java | 78 +++++++++++++++++++ 8 files changed, 103 insertions(+), 12 deletions(-) create mode 100644 src/main/java/envoy/server/processors/UserStatusChangeProcessor.java diff --git a/pom.xml b/pom.xml index db5b8da..0b85902 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ com.github.informatik-ag-ngl envoy-common - develop-SNAPSHOT + f~user_status_change_event-SNAPSHOT com.github.informatik-ag-ngl diff --git a/src/main/java/envoy/server/ConnectionManager.java b/src/main/java/envoy/server/ConnectionManager.java index 202334f..ffc64e1 100644 --- a/src/main/java/envoy/server/ConnectionManager.java +++ b/src/main/java/envoy/server/ConnectionManager.java @@ -64,7 +64,7 @@ public class ConnectionManager implements ISocketIdListener { } /** - * @param userId the ID of the user registered at the a socket + * @param userId the ID of the user registered at a socket * @return the ID of the socket * @since Envoy Server Standalone v0.1-alpha */ diff --git a/src/main/java/envoy/server/Startup.java b/src/main/java/envoy/server/Startup.java index 097399e..82d9915 100644 --- a/src/main/java/envoy/server/Startup.java +++ b/src/main/java/envoy/server/Startup.java @@ -36,6 +36,7 @@ public class Startup { processors.add(new LoginCredentialProcessor()); processors.add(new MessageProcessor()); processors.add(new MessageStatusChangeProcessor()); + processors.add(new UserStatusChangeProcessor()); processors.add(new IdGeneratorRequestProcessor()); Server server = new Server(8080, () -> new ObjectMessageReader(), new ObjectMessageProcessor(processors)); diff --git a/src/main/java/envoy/server/database/PersistenceManager.java b/src/main/java/envoy/server/database/PersistenceManager.java index 3ec686a..614a641 100644 --- a/src/main/java/envoy/server/database/PersistenceManager.java +++ b/src/main/java/envoy/server/database/PersistenceManager.java @@ -5,6 +5,7 @@ import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Persistence; +import envoy.data.User.UserStatus; import envoy.server.data.ConfigItem; import envoy.server.data.Message; import envoy.server.data.User; @@ -164,4 +165,16 @@ public class PersistenceManager { // TODO current solution gets all users, not just contacts. Should be changed to // entityManager.createNamedQuery("getContactsOfUser").setParameter("user", // user).getResultList(); + + /** + * Updates the {@link UserStatus} in the database. + * + * @param user the {@link User} who changes his status + * @param status the new status of that user + * @since Envoy Server Standalone v0.1-alpha + */ + public void updateUserStatusInDatabase(User user, UserStatus status) { + user.setStatus(status); + persistenceManager.updateUser(user); + } } \ No newline at end of file diff --git a/src/main/java/envoy/server/net/ObjectMessageProcessor.java b/src/main/java/envoy/server/net/ObjectMessageProcessor.java index 226fb69..3bbe43e 100644 --- a/src/main/java/envoy/server/net/ObjectMessageProcessor.java +++ b/src/main/java/envoy/server/net/ObjectMessageProcessor.java @@ -33,7 +33,6 @@ public class ObjectMessageProcessor implements IMessageProcessor { */ public ObjectMessageProcessor(Set> processors) { this.processors = processors; } - @SuppressWarnings("unchecked") @Override public void process(Message message, WriteProxy writeProxy) { try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(message.sharedArray, message.offset + 4, message.length - 4))) { diff --git a/src/main/java/envoy/server/net/ObjectWriteProxy.java b/src/main/java/envoy/server/net/ObjectWriteProxy.java index 2ec9223..825daeb 100644 --- a/src/main/java/envoy/server/net/ObjectWriteProxy.java +++ b/src/main/java/envoy/server/net/ObjectWriteProxy.java @@ -22,7 +22,7 @@ public class ObjectWriteProxy { private final WriteProxy writeProxy; /** - * Creates an instance of @link{ObjectWriteProxy}. + * Creates an instance of {@link ObjectWriteProxy}. * * @param writeProxy the {@link WriteProxy} to write objects to another client * @since Envoy Server Standalone v0.1-alpha diff --git a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java index 376989a..274d6fd 100644 --- a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java +++ b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java @@ -10,6 +10,7 @@ import envoy.data.Contacts; import envoy.data.LoginCredentials; import envoy.data.Message.MessageStatus; import envoy.data.User; +import envoy.event.UserStatusChangeEvent; import envoy.server.ConnectionManager; import envoy.server.ObjectProcessor; import envoy.server.data.Message; @@ -29,7 +30,7 @@ import envoy.server.net.ObjectWriteProxy; */ public class LoginCredentialProcessor implements ObjectProcessor { - private PersistenceManager persistenceManager = PersistenceManager.getPersistenceManager(); + private PersistenceManager persistenceManager = PersistenceManager.getPersistenceManager(); @Override public Class getInputClass() { return LoginCredentials.class; } @@ -41,9 +42,10 @@ public class LoginCredentialProcessor implements ObjectProcessor + *
+ * Project: envoy-server-standalone
+ * File: UserStatusChangeProcessor.java
+ * Created: 1 Feb 2020
+ * + * @author Leon Hofmeister + * @since Envoy Server Standalone v0.1-alpha + */ +public class UserStatusChangeProcessor implements ObjectProcessor { + + @Override + public Class getInputClass() { return UserStatusChangeEvent.class; } + + @Override + public void process(UserStatusChangeEvent input, long socketId, ObjectWriteProxy writeProxy) throws IOException { + + PersistenceManager perMan = PersistenceManager.getPersistenceManager(); + // new status should not equal old status + if (input.get().equals(perMan.getUserById(input.getId()).getStatus())) { + System.out.println("Received an unnecessary UserStatusChangeEvent"); + return; + } + updateUserStatus(input, writeProxy); + + } + + /** + * Sets the {@link UserStatus} for a given user. Both offline contacts and + * currently online contacts are notified. + * + * @param evt the {@link UserStatusChangeEvent} that signals the change + * @param writeProxy the {@link ObjectWriteProxy} that is used to send objects + * back to clients + * @throws IOException if sending this update failed for any contact + * @since Envoy Server Standalone v0.1-alpha + */ + public static void updateUserStatus(UserStatusChangeEvent evt, ObjectWriteProxy writeProxy) throws IOException { + PersistenceManager perMan = PersistenceManager.getPersistenceManager(); + envoy.server.data.User user = perMan.getUserById(evt.getId()); + // handling for newly logged in clients + perMan.updateUserStatusInDatabase(user, evt.get()); + + // handling for contacts that are already online + notifyContacts(evt, user, writeProxy); + } + + /** + * notifies active contacts of this {@link User} that his {@link UserStatus} has + * changed + * + * @param evt the {@link UserStatusChangeEvent} to send to other clients + * @param user the {@link User} + * @param writeProxy the {@link ObjectWriteProxy} that is used to send objects + * back to clients + * @throws IOException if sending this update failed for any contact + * @since Envoy Server Standalone v0.1-alpha + */ + public static void notifyContacts(UserStatusChangeEvent evt, envoy.server.data.User user, ObjectWriteProxy writeProxy) throws IOException { + ConnectionManager conMan = ConnectionManager.getInstance(); + for (User contact : user.getContacts()) + if (conMan.isOnline(contact.getId())) writeProxy.write(conMan.getSocketId(contact.getId()), evt); + } + +} \ No newline at end of file From 5b482c681532a799208061285f41e318444bffa7 Mon Sep 17 00:00:00 2001 From: delvh Date: Sun, 2 Feb 2020 12:32:10 +0100 Subject: [PATCH 02/11] Improved PersistenceManager with new methods to handle incoming entities --- .../server/database/PersistenceManager.java | 61 ++++++++++++++++++- .../processors/UserStatusChangeProcessor.java | 2 +- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/main/java/envoy/server/database/PersistenceManager.java b/src/main/java/envoy/server/database/PersistenceManager.java index 614a641..e7e2a0e 100644 --- a/src/main/java/envoy/server/database/PersistenceManager.java +++ b/src/main/java/envoy/server/database/PersistenceManager.java @@ -109,6 +109,61 @@ public class PersistenceManager { entityManager.getTransaction().commit(); } + /** + * Deletes a {@link User} in the database. + * + * @param user the {@link User} to delete + * @since Envoy Server Standalone v0.1-alpha + */ + public void deleteUser(User user) { + entityManager.getTransaction().begin(); + entityManager.remove(user); + entityManager.getTransaction().commit(); + } + + /** + * Deletes a {@link Message} in the database. + * + * @param message the {@link Message} to delete + * @since Envoy Server Standalone v0.1-alpha + */ + public void deleteMessage(Message message) { + entityManager.getTransaction().begin(); + entityManager.remove(message); + entityManager.getTransaction().commit(); + } + + /** + * @param action the action that should be applied for this entity. Case does + * not matter.
+ * Currently supported values are:
+ * -"add"/"persist" to add an object to the database
+ * -"update"/"merge" to update this object in the database
+ * -"delete"/"remove" to delete this object in the database + * @param entity the object to apply the action to + * @since Envoy Server Standalone v0.1-alpha + */ + public void applyAction(String action, Object entity) { + entityManager.getTransaction().begin(); + switch (action.trim().toLowerCase()) { + case "add": + case "persist": + entityManager.persist(entity); + break; + case "update": + case "merge": + entityManager.merge(entity); + break; + case "delete": + case "remove": + entityManager.remove(entity); + break; + default: + throw new IllegalStateException("Unknown action: " + action + " was selected to be executed in the database"); + } + entityManager.getTransaction().commit(); + } + /** * Searches for a {@link User} with a specific id. * @@ -173,7 +228,11 @@ public class PersistenceManager { * @param status the new status of that user * @since Envoy Server Standalone v0.1-alpha */ - public void updateUserStatusInDatabase(User user, UserStatus status) { + public void updateUserStatus(User user, UserStatus status) { + if (user.getStatus().equals(status)) { + System.out.println("Received an UserStatus for User" + user.getId() + "to update that this user already has"); + return; + } user.setStatus(status); persistenceManager.updateUser(user); } diff --git a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java index 35de77e..8a43556 100644 --- a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java +++ b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java @@ -52,7 +52,7 @@ public class UserStatusChangeProcessor implements ObjectProcessor Date: Sun, 2 Feb 2020 13:34:28 +0100 Subject: [PATCH 03/11] Added status update for when a client goes offline --- .../java/envoy/server/ConnectionManager.java | 19 ++++++++ .../processors/LoginCredentialProcessor.java | 3 +- .../processors/UserStatusChangeProcessor.java | 44 ++++++++++++------- 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/main/java/envoy/server/ConnectionManager.java b/src/main/java/envoy/server/ConnectionManager.java index ffc64e1..2d7aac5 100644 --- a/src/main/java/envoy/server/ConnectionManager.java +++ b/src/main/java/envoy/server/ConnectionManager.java @@ -7,6 +7,11 @@ import java.util.Set; import com.jenkov.nioserver.ISocketIdListener; +import envoy.data.User; +import envoy.event.UserStatusChangeEvent; +import envoy.server.database.PersistenceManager; +import envoy.server.processors.UserStatusChangeProcessor; + /** * Project: envoy-server-standalone
* File: ConnectionManager.java
@@ -44,6 +49,11 @@ public class ConnectionManager implements ISocketIdListener { @Override public void socketCancelled(long socketId) { + // notifying contacts of this users offline-going + long clientId = getUserIdBySocketId(socketId); + User user = new User(clientId, PersistenceManager.getPersistenceManager().getUserById(clientId).getName()); + UserStatusChangeProcessor.updateUserStatus(new UserStatusChangeEvent(user)); + // removing the socket if (!pendingSockets.remove(socketId)) sockets.entrySet().stream().filter(e -> e.getValue() == socketId).forEach(e -> sockets.remove(e.getValue())); } @@ -70,6 +80,15 @@ public class ConnectionManager implements ISocketIdListener { */ public long getSocketId(long userId) { return sockets.get(userId); } + /** + * @param socketId the id of the socket whose User is needed + * @return the userId associated with this socketId + * @since Envoy Server Standalone v0.1-alpha + */ + public long getUserIdBySocketId(long socketId) { + return sockets.entrySet().stream().filter((entry) -> entry.getValue().equals(socketId)).findFirst().get().getKey(); + } + /** * @param userId the ID of the user to check for * @return {@code true} if the user is online diff --git a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java index 274d6fd..f0373f3 100644 --- a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java +++ b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java @@ -37,6 +37,7 @@ public class LoginCredentialProcessor implements ObjectProcessor { + private static ObjectWriteProxy writeProxy; + @Override public Class getInputClass() { return UserStatusChangeEvent.class; } @Override public void process(UserStatusChangeEvent input, long socketId, ObjectWriteProxy writeProxy) throws IOException { - PersistenceManager perMan = PersistenceManager.getPersistenceManager(); // new status should not equal old status if (input.get().equals(perMan.getUserById(input.getId()).getStatus())) { System.out.println("Received an unnecessary UserStatusChangeEvent"); return; } - updateUserStatus(input, writeProxy); + updateUserStatus(input); } @@ -42,37 +43,48 @@ public class UserStatusChangeProcessor implements ObjectProcessor Date: Mon, 3 Feb 2020 07:06:52 +0100 Subject: [PATCH 04/11] Sending unread message as common messages instead of database messages --- .../envoy/server/processors/LoginCredentialProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java index f0373f3..cefdec2 100644 --- a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java +++ b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java @@ -66,8 +66,8 @@ public class LoginCredentialProcessor implements ObjectProcessor pendingMessages = PersistenceManager.getPersistenceManager().getUnreadMessages(user); for (Message msg : pendingMessages) { - System.out.println("Sending message " + msg.toString()); - writeProxy.write(socketId, msg); + System.out.println("Sending message " + msg.toCommonMessage().toString()); + writeProxy.write(socketId, msg.toCommonMessage()); msg.setReceivedDate(new Date()); msg.setStatus(MessageStatus.RECEIVED); PersistenceManager.getPersistenceManager().updateMessage(msg); From 5fcbf59349869178336524ef94b8c8955d49719c Mon Sep 17 00:00:00 2001 From: delvh Date: Tue, 4 Feb 2020 21:09:59 +0100 Subject: [PATCH 05/11] Fixed contacts initialisation, socket logout error additionally fixed small spelling mistakes --- src/main/java/envoy/server/ConnectionManager.java | 14 ++++++++------ .../envoy/server/database/PersistenceManager.java | 10 +++++----- .../processors/LoginCredentialProcessor.java | 13 +++++-------- .../processors/UserStatusChangeProcessor.java | 2 +- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/java/envoy/server/ConnectionManager.java b/src/main/java/envoy/server/ConnectionManager.java index 2d7aac5..a1b9945 100644 --- a/src/main/java/envoy/server/ConnectionManager.java +++ b/src/main/java/envoy/server/ConnectionManager.java @@ -49,13 +49,15 @@ public class ConnectionManager implements ISocketIdListener { @Override public void socketCancelled(long socketId) { - // notifying contacts of this users offline-going - long clientId = getUserIdBySocketId(socketId); - User user = new User(clientId, PersistenceManager.getPersistenceManager().getUserById(clientId).getName()); - UserStatusChangeProcessor.updateUserStatus(new UserStatusChangeEvent(user)); - // removing the socket - if (!pendingSockets.remove(socketId)) + if (!pendingSockets.remove(socketId)) { + // notifying contacts of this users offline-going + long clientId = getUserIdBySocketId(socketId); + User user = new User(clientId, PersistenceManager.getPersistenceManager().getUserById(clientId).getName()); + UserStatusChangeProcessor.updateUserStatus(new UserStatusChangeEvent(user)); + + // removing the socket sockets.entrySet().stream().filter(e -> e.getValue() == socketId).forEach(e -> sockets.remove(e.getValue())); + } } @Override diff --git a/src/main/java/envoy/server/database/PersistenceManager.java b/src/main/java/envoy/server/database/PersistenceManager.java index e7e2a0e..7f2d715 100644 --- a/src/main/java/envoy/server/database/PersistenceManager.java +++ b/src/main/java/envoy/server/database/PersistenceManager.java @@ -229,11 +229,11 @@ public class PersistenceManager { * @since Envoy Server Standalone v0.1-alpha */ public void updateUserStatus(User user, UserStatus status) { - if (user.getStatus().equals(status)) { - System.out.println("Received an UserStatus for User" + user.getId() + "to update that this user already has"); - return; + if (user.getStatus().equals(status)) + System.out.println("Received an UserStatusChangeEvent for user " + user.getId() + " to update that this user already has"); + else { + user.setStatus(status); + persistenceManager.updateUser(user); } - user.setStatus(status); - persistenceManager.updateUser(user); } } \ No newline at end of file diff --git a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java index cefdec2..636b218 100644 --- a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java +++ b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java @@ -44,19 +44,15 @@ public class LoginCredentialProcessor implements ObjectProcessor users = PersistenceManager.getPersistenceManager() - .getContacts(user) - .stream() - .map(envoy.server.data.User::toCommonUser) - .collect(Collectors.toList()); - Contacts contacts = new Contacts(user.getId(), users); + Contacts contacts = new Contacts(user.getId(), + user.getContacts().stream().map(envoy.server.data.User::toCommonUser).collect(Collectors.toList())); // Complete handshake System.out.println("Sending user..."); @@ -83,6 +79,7 @@ public class LoginCredentialProcessor implements ObjectProcessor Date: Tue, 4 Feb 2020 21:34:53 +0100 Subject: [PATCH 06/11] Changed Envoy Common dependency back to develop, fixed BE error --- pom.xml | 2 +- .../java/envoy/server/processors/UserStatusChangeProcessor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0b85902..db5b8da 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ com.github.informatik-ag-ngl envoy-common - f~user_status_change_event-SNAPSHOT + develop-SNAPSHOT com.github.informatik-ag-ngl diff --git a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java index b682d2e..15be1a7 100644 --- a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java +++ b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java @@ -79,7 +79,7 @@ public class UserStatusChangeProcessor implements ObjectProcessor Date: Wed, 5 Feb 2020 16:15:01 +0100 Subject: [PATCH 07/11] Propagating message received update to sender --- src/main/java/envoy/server/processors/MessageProcessor.java | 2 ++ .../envoy/server/processors/MessageStatusChangeProcessor.java | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/envoy/server/processors/MessageProcessor.java b/src/main/java/envoy/server/processors/MessageProcessor.java index ad3bc54..0d9a7e6 100644 --- a/src/main/java/envoy/server/processors/MessageProcessor.java +++ b/src/main/java/envoy/server/processors/MessageProcessor.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.Date; import envoy.data.Message; +import envoy.event.MessageStatusChangeEvent; import envoy.server.ConnectionManager; import envoy.server.ObjectProcessor; import envoy.server.database.PersistenceManager; @@ -36,6 +37,7 @@ public class MessageProcessor implements ObjectProcessor { // Update the message status to RECEIVED message.setReceivedDate(new Date()); message.nextStatus(); + writeProxy.write(connectionManager.getSocketId(message.getSenderId()), new MessageStatusChangeEvent(message)); } catch (IOException e) { System.err.println("Recipient online. Failed to send message" + message.getId()); e.printStackTrace(); diff --git a/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java b/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java index 4eec2bc..1453ce3 100644 --- a/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java +++ b/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java @@ -29,8 +29,7 @@ public class MessageStatusChangeProcessor implements ObjectProcessor Date: Wed, 5 Feb 2020 17:24:31 +0100 Subject: [PATCH 08/11] Notifying the message sender about message status changes --- .../envoy/server/processors/MessageStatusChangeProcessor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java b/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java index 1453ce3..216e028 100644 --- a/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java +++ b/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java @@ -39,6 +39,7 @@ public class MessageStatusChangeProcessor implements ObjectProcessor Date: Wed, 5 Feb 2020 21:32:53 +0100 Subject: [PATCH 09/11] fixed not updating user status and implemented easier to read structure --- .../java/envoy/server/ConnectionManager.java | 11 +++--- .../server/database/PersistenceManager.java | 17 --------- .../processors/LoginCredentialProcessor.java | 5 +-- .../processors/UserStatusChangeProcessor.java | 36 +++++++++++-------- 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/src/main/java/envoy/server/ConnectionManager.java b/src/main/java/envoy/server/ConnectionManager.java index a1b9945..9dfd56b 100644 --- a/src/main/java/envoy/server/ConnectionManager.java +++ b/src/main/java/envoy/server/ConnectionManager.java @@ -1,5 +1,6 @@ package envoy.server; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -7,8 +8,7 @@ import java.util.Set; import com.jenkov.nioserver.ISocketIdListener; -import envoy.data.User; -import envoy.event.UserStatusChangeEvent; +import envoy.data.User.UserStatus; import envoy.server.database.PersistenceManager; import envoy.server.processors.UserStatusChangeProcessor; @@ -51,9 +51,10 @@ public class ConnectionManager implements ISocketIdListener { public void socketCancelled(long socketId) { if (!pendingSockets.remove(socketId)) { // notifying contacts of this users offline-going - long clientId = getUserIdBySocketId(socketId); - User user = new User(clientId, PersistenceManager.getPersistenceManager().getUserById(clientId).getName()); - UserStatusChangeProcessor.updateUserStatus(new UserStatusChangeEvent(user)); + envoy.server.data.User user = PersistenceManager.getPersistenceManager().getUserById(getUserIdBySocketId(socketId)); + user.setStatus(UserStatus.OFFLINE); + user.setLastSeen(new Date()); + UserStatusChangeProcessor.updateUserStatus(user); // removing the socket sockets.entrySet().stream().filter(e -> e.getValue() == socketId).forEach(e -> sockets.remove(e.getValue())); diff --git a/src/main/java/envoy/server/database/PersistenceManager.java b/src/main/java/envoy/server/database/PersistenceManager.java index 7f2d715..2d611ee 100644 --- a/src/main/java/envoy/server/database/PersistenceManager.java +++ b/src/main/java/envoy/server/database/PersistenceManager.java @@ -5,7 +5,6 @@ import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Persistence; -import envoy.data.User.UserStatus; import envoy.server.data.ConfigItem; import envoy.server.data.Message; import envoy.server.data.User; @@ -220,20 +219,4 @@ public class PersistenceManager { // TODO current solution gets all users, not just contacts. Should be changed to // entityManager.createNamedQuery("getContactsOfUser").setParameter("user", // user).getResultList(); - - /** - * Updates the {@link UserStatus} in the database. - * - * @param user the {@link User} who changes his status - * @param status the new status of that user - * @since Envoy Server Standalone v0.1-alpha - */ - public void updateUserStatus(User user, UserStatus status) { - if (user.getStatus().equals(status)) - System.out.println("Received an UserStatusChangeEvent for user " + user.getId() + " to update that this user already has"); - else { - user.setStatus(status); - persistenceManager.updateUser(user); - } - } } \ No newline at end of file diff --git a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java index 636b218..acd2b2e 100644 --- a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java +++ b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java @@ -10,7 +10,7 @@ import envoy.data.Contacts; import envoy.data.LoginCredentials; import envoy.data.Message.MessageStatus; import envoy.data.User; -import envoy.event.UserStatusChangeEvent; +import envoy.data.User.UserStatus; import envoy.server.ConnectionManager; import envoy.server.ObjectProcessor; import envoy.server.data.Message; @@ -48,7 +48,8 @@ public class LoginCredentialProcessor implements ObjectProcessor { - private static ObjectWriteProxy writeProxy; + private static ObjectWriteProxy writeProxy; + private static PersistenceManager persistenceManager = PersistenceManager.getPersistenceManager(); @Override public Class getInputClass() { return UserStatusChangeEvent.class; } @Override public void process(UserStatusChangeEvent input, long socketId, ObjectWriteProxy writeProxy) throws IOException { - PersistenceManager perMan = PersistenceManager.getPersistenceManager(); // new status should not equal old status - if (input.get().equals(perMan.getUserById(input.getId()).getStatus())) { + if (input.get().equals(persistenceManager.getUserById(input.getId()).getStatus())) { System.out.println("Received an unnecessary UserStatusChangeEvent"); return; } @@ -43,17 +43,24 @@ public class UserStatusChangeProcessor implements ObjectProcessor Date: Wed, 5 Feb 2020 21:53:36 +0100 Subject: [PATCH 10/11] deleted applyAction method as per @CyB3RC0nN0R s request additionally inserted necessary TODO for a method that may cause problems in the future. --- .../server/database/PersistenceManager.java | 31 ------------------- .../processors/UserStatusChangeProcessor.java | 13 ++++---- 2 files changed, 6 insertions(+), 38 deletions(-) diff --git a/src/main/java/envoy/server/database/PersistenceManager.java b/src/main/java/envoy/server/database/PersistenceManager.java index 2d611ee..803f177 100644 --- a/src/main/java/envoy/server/database/PersistenceManager.java +++ b/src/main/java/envoy/server/database/PersistenceManager.java @@ -132,37 +132,6 @@ public class PersistenceManager { entityManager.getTransaction().commit(); } - /** - * @param action the action that should be applied for this entity. Case does - * not matter.
- * Currently supported values are:
- * -"add"/"persist" to add an object to the database
- * -"update"/"merge" to update this object in the database
- * -"delete"/"remove" to delete this object in the database - * @param entity the object to apply the action to - * @since Envoy Server Standalone v0.1-alpha - */ - public void applyAction(String action, Object entity) { - entityManager.getTransaction().begin(); - switch (action.trim().toLowerCase()) { - case "add": - case "persist": - entityManager.persist(entity); - break; - case "update": - case "merge": - entityManager.merge(entity); - break; - case "delete": - case "remove": - entityManager.remove(entity); - break; - default: - throw new IllegalStateException("Unknown action: " + action + " was selected to be executed in the database"); - } - entityManager.getTransaction().commit(); - } - /** * Searches for a {@link User} with a specific id. * diff --git a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java index 0ed56bc..43e6153 100644 --- a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java +++ b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java @@ -22,8 +22,8 @@ import envoy.server.net.ObjectWriteProxy; */ public class UserStatusChangeProcessor implements ObjectProcessor { - private static ObjectWriteProxy writeProxy; - private static PersistenceManager persistenceManager = PersistenceManager.getPersistenceManager(); + private static ObjectWriteProxy writeProxy; + private static PersistenceManager persistenceManager = PersistenceManager.getPersistenceManager(); @Override public Class getInputClass() { return UserStatusChangeEvent.class; } @@ -59,9 +59,7 @@ public class UserStatusChangeProcessor implements ObjectProcessor Date: Wed, 5 Feb 2020 22:19:36 +0100 Subject: [PATCH 11/11] added a "has been"- string to an error message --- .../java/envoy/server/processors/UserStatusChangeProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java index 43e6153..63e9798 100644 --- a/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java +++ b/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java @@ -78,7 +78,7 @@ public class UserStatusChangeProcessor implements ObjectProcessor