package envoy.server.data; import java.time.Instant; import java.util.*; import javax.persistence.*; import envoy.data.Group; /** * @author Maximilian Käfer * @since Envoy Server Standalone v0.1-beta */ @Entity @NamedQuery(name = GroupMessage.getPendingGroupMsg, query = "SELECT m FROM GroupMessage m JOIN m.memberMessageStatus s WHERE KEY(s) = :userId AND (m.creationDate > :lastSeen " + "OR m.status = envoy.data.Message$MessageStatus.RECEIVED AND m.receivedDate > :lastSeen " + "OR m.status = envoy.data.Message$MessageStatus.READ AND m.readDate > :lastSeen " + "OR m.lastStatusChangeDate > :lastSeen)") public final class GroupMessage extends Message { /** * Named query retrieving pending group messages sent to a group containing a specific user * (parameter {@code userId}) that were sent after a certain time stamp (parameter * {@code :lastSeen}). * * @since Envoy Server Standalone v0.1-beta */ public static final String getPendingGroupMsg = "GroupMessage.getPendingGroupMsg"; @ElementCollection private Map memberMessageStatus; @Column(name = "last_status_change_date") protected Instant lastStatusChangeDate; /** * The constructor for a database object. * * @since Envoy Server Standalone v0.1-beta */ public GroupMessage() {} /** * Constructs a database groupMessage from a common groupMessage. * * @param groupMessage the {@link envoy.data.GroupMessage} to convert into a database * {@link GroupMessage} * @param lastStatusChangeDate the time stamp to set * @since Envoy Server Standalone v0.2-beta */ public GroupMessage(envoy.data.GroupMessage groupMessage, Instant lastStatusChangeDate) { super(groupMessage); memberMessageStatus = groupMessage.getMemberStatuses(); this.lastStatusChangeDate = lastStatusChangeDate; } /** * Converts this groupMessage into an instance of {@link envoy.data.GroupMessage}. * * @return a {@link envoy.data.GroupMessage} containing the same values as this groupMessage * @since Envoy Server Standalone v0.1-beta */ @Override public envoy.data.GroupMessage toCommon() { return prepareBuilder().buildGroupMessage((Group) recipient.toCommon(), new HashMap<>(memberMessageStatus)); } /** * @return the memberMessageStatus * @since Envoy Server Standalone v0.1-beta */ public Map getMemberMessageStatus() { return memberMessageStatus; } /** * @param memberMessageStatus the memberMessageStatus to set * @since Envoy Server Standalone v0.1-beta */ public void setMemberMessageStatus( Map memberMessageStatus) { this.memberMessageStatus = memberMessageStatus; } /** * @return the date at which one of the member statuses changed last * @since Envoy Server Standalone v0.2-beta */ public Instant getLastStatusChangeDate() { return lastStatusChangeDate; } /** * @param date the date to set * @since Envoy Server Standalone v0.2-beta */ public void setLastStatusChangeDate(Instant date) { lastStatusChangeDate = date; } }