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:
*