package envoy.data; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; /** * Represents a unique message with a unique, numeric ID. Further metadata * includes the sender and recipient {@link User}s, as well as the creation * date and the current {@link MessageStatus}.
*
* Project: envoy-common
* File: Message.java
* Created: 28.12.2019
* * @author Kai S. K. Engelbart * @author Leon Hofmeister * @since Envoy Common v0.2-alpha */ public class Message implements Serializable { /** * This enumeration defines all possible statuses a {link Message} can have. * * @since Envoy Common v0.2-alpha */ public static enum MessageStatus { /** * is selected, if a message was sent but not received by the server yet. */ WAITING, /** * is selected, if a sent message was received by the server. */ SENT, /** * is selected, if a message was delivered from the server to the recipient, but * has not been read yet. */ RECEIVED, /** * is selected, if a recipient opened the corresponding chat of said message. */ READ } private final long id, senderId, recipientId; private final Date creationDate; private final String text; private final MessageAttachment attachment; private Date receivedDate, readDate; private MessageStatus status; private static final long serialVersionUID = -4393477412979594435L; /** * Initializes a {@link Message} with values for all of its properties. The use * of this constructor is only intended for the {@link MessageBuilder} class, as * this class provides {@code null} checks and default values for all * properties. * * @param id unique ID * @param senderId the ID of the user who sends the message * @param recipientId the ID of the user who receives the message * @param date the creation date of the message * @param text the text content of the message * @param attachment the attachment of the message, if present * @param status the current {@link MessageStatus} of the message * @since Envoy Common v0.2-alpha */ Message(long id, long senderId, long recipientId, Date date, String text, MessageAttachment attachment, MessageStatus status) { this.id = id; this.senderId = senderId; this.recipientId = recipientId; this.creationDate = date; this.text = text; this.attachment = attachment; this.status = status; } /** * Changes the current {@link MessageStatus} to the next logical status.
*
* The underlying order is as follows: *
    *
  1. {@link MessageStatus#WAITING} *
  2. {@link MessageStatus#SENT} *
  3. {@link MessageStatus#RECEIVED} *
  4. {@link MessageStatus#READ} *
* * @since Envoy Common v0.2-alpha */ public void nextStatus() { if (status == MessageStatus.READ) throw new IllegalStateException("Message status READ is already reached"); status = MessageStatus.values()[status.ordinal() + 1]; } @Override public String toString() { return String.format("TextMessage[id=%d,sender=%s,recipient=%s,date=%s,status=%s,text=%s,hasAttachment=%b]", id, senderId, recipientId, new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(creationDate), status, text, attachment != null); } /** * @return the ID of this message * @since Envoy Common v0.2-alpha */ public long getId() { return id; } /** * @return the sender ID of this message * @since Envoy Common v0.2-alpha */ public long getSenderId() { return senderId; } /** * @return the recipient ID of this message * @since Envoy Common v0.2-alpha */ public long getRecipientId() { return recipientId; } /** * @return the date at which this message was created * @since Envoy Common v0.2-alpha */ public Date getCreationDate() { return creationDate; } /** * @return the date at which the message has been received by the sender * @since Envoy Common v0.2-alpha */ public Date getReceivedDate() { return receivedDate; } /** * @param receivedDate the date at which the message has been received by the * sender * @since Envoy Common v0.2-alpha */ public void setReceivedDate(Date receivedDate) { this.receivedDate = receivedDate; } /** * @return the date at which the message has been read by the sender * @since Envoy Common v0.2-alpha */ public Date getReadDate() { return readDate; } /** * @param readDate at which the message has been read by the sender * @since Envoy Common v0.2-alpha */ public void setReadDate(Date readDate) { this.readDate = readDate; } /** * @return the text content of this message * @since Envoy Common v0.2-alpha */ public String getText() { return text; } /** * @return the messageAttachment * @since Envoy Common v0.2-alpha */ public MessageAttachment getAttachment() { return attachment; } /** * @return the current status of this message * @since Envoy Common v0.2-alpha */ public MessageStatus getStatus() { return status; } /** * @param status the new {@link MessageStatus}, if permitted * @since Envoy Common v0.2-alpha */ public void setStatus(MessageStatus status) { if (status.ordinal() < this.status.ordinal()) throw new IllegalStateException("This message is moving backwards in time"); else this.status = status; } }