package envoy.server.processors; import java.util.logging.Level; import java.util.logging.Logger; import javax.persistence.EntityExistsException; import envoy.data.Message; import envoy.event.MessageStatusChange; import envoy.server.data.PersistenceManager; import envoy.server.net.ConnectionManager; import envoy.server.net.ObjectWriteProxy; import envoy.util.EnvoyLog; /** * This {@link ObjectProcessor} handles incoming {@link Message}s. *

* Project: envoy-server-standalone
* File: MessageProcessor.java
* Created: 30.12.2019
* * @author Kai S. K. Engelbart * @author Maximilian Käfer * @since Envoy Server Standalone v0.1-alpha */ public class MessageProcessor implements ObjectProcessor { private static final PersistenceManager persistenceManager = PersistenceManager.getInstance(); private static final ConnectionManager connectionManager = ConnectionManager.getInstance(); private static final Logger logger = EnvoyLog.getLogger(MessageProcessor.class); @Override public void process(Message message, long socketID, ObjectWriteProxy writeProxy) { message.nextStatus(); // Convert to server message final var serverMessage = new envoy.server.data.Message(message); try { // Persist the message persistenceManager.addMessage(serverMessage); // Send the message to the recipient if online if (connectionManager.isOnline(message.getRecipientID())) { writeProxy.write(connectionManager.getSocketID(message.getRecipientID()), message); // Increment status message.nextStatus(); serverMessage.received(); persistenceManager.updateMessage(serverMessage); // Notify the sender about the delivery // Note that the exact time stamp might differ slightly writeProxy.write(socketID, new MessageStatusChange(message)); } } catch (EntityExistsException e) { logger.log(Level.WARNING, "Received " + message + " with an ID that already exists!"); } } @Override public Class getInputClass() { return Message.class; } }