package envoy.server.processors; import static envoy.data.Message.MessageStatus.READ; import java.time.LocalDateTime; import java.util.Collections; import java.util.logging.Level; import java.util.logging.Logger; import envoy.data.Message.MessageStatus; import envoy.event.GroupMessageStatusChange; import envoy.event.MessageStatusChange; import envoy.server.data.GroupMessage; import envoy.server.data.PersistenceManager; import envoy.server.net.ConnectionManager; import envoy.server.net.ObjectWriteProxy; import envoy.util.EnvoyLog; /** * Project: envoy-server-standalone
* File: GroupMessageStatusChangeProcessor.java
* Created: 03.07.2020
* * @author Maximilian Käfer * @since Envoy Server Standalone v0.1-beta */ public class GroupMessageStatusChangeProcessor implements ObjectProcessor { private static final ConnectionManager connectionManager = ConnectionManager.getInstance(); private static final PersistenceManager persistenceManager = PersistenceManager.getInstance(); private static final Logger logger = EnvoyLog.getLogger(MessageStatusChangeProcessor.class); @Override public void process(GroupMessageStatusChange statusChange, long socketID, ObjectWriteProxy writeProxy) { GroupMessage gmsg = (GroupMessage) persistenceManager.getMessageByID(statusChange.getID()); // Any other status than READ is not supposed to be sent to the server if (statusChange.get() != MessageStatus.READ) { logger.log(Level.WARNING, "Invalid " + statusChange); return; } // Apply the status change gmsg.getMemberMessageStatus().replace(statusChange.getMemberID(), statusChange.get()); gmsg.setLastStatusChangeDate(LocalDateTime.now()); // Notifying the other members about the status change final var userID = connectionManager.getUserIDBySocketID(socketID); gmsg.getMemberMessageStatus() .keySet() .stream() .filter(k -> userID != k) .filter(connectionManager::isOnline) .forEach(k -> writeProxy.write(connectionManager.getSocketID(k), statusChange)); // Increment overall status to READ if necessary if (Collections.min(gmsg.getMemberMessageStatus().values()) == READ) { gmsg.read(); // Notify online members about the status change writeProxy.writeToOnlineContacts(gmsg.getRecipient().getContacts(), new MessageStatusChange(gmsg.getID(), gmsg.getStatus(), LocalDateTime.now())); } persistenceManager.updateMessage(gmsg); } @Override public Class getInputClass() { return GroupMessageStatusChange.class; } }