package envoy.server.processors; import static envoy.server.Startup.config; import java.util.logging.*; import javax.persistence.EntityExistsException; import envoy.data.Message; import envoy.event.*; import envoy.util.EnvoyLog; import envoy.server.data.PersistenceManager; import envoy.server.net.*; /** * This {@link ObjectProcessor} handles incoming {@link Message}s. * * @author Kai S. K. Engelbart * @author Maximilian Käfer * @since Envoy Server Standalone v0.1-alpha */ public final 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); // Telling the server to reload the message without the attachment if (!config.isAttachmentSupportEnabled() && message.hasAttachment()) { message = serverMessage.toCommon(); writeProxy.write(socketID, new NoAttachments()); } 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 (final EntityExistsException e) { logger.log(Level.WARNING, "Received " + message + " with an ID that already exists!"); } } }