Make GroupMessage extend Message, prepared GroupMessageStatus processing

This commit is contained in:
DieGurke 2020-06-06 15:42:10 +02:00 committed by kske
parent 3ad47c4c99
commit cb01d7139a
5 changed files with 62 additions and 190 deletions

View File

@ -36,6 +36,7 @@ public class Startup {
Set<ObjectProcessor<?>> processors = new HashSet<>(); Set<ObjectProcessor<?>> processors = new HashSet<>();
processors.add(new LoginCredentialProcessor()); processors.add(new LoginCredentialProcessor());
processors.add(new MessageProcessor()); processors.add(new MessageProcessor());
processors.add(new GroupMessageProcessor());
processors.add(new MessageStatusChangeProcessor()); processors.add(new MessageStatusChangeProcessor());
processors.add(new UserStatusChangeProcessor()); processors.add(new UserStatusChangeProcessor());
processors.add(new IDGeneratorRequestProcessor()); processors.add(new IDGeneratorRequestProcessor());

View File

@ -1,9 +1,10 @@
package envoy.server.data; package envoy.server.data;
import java.util.Date;
import java.util.Map; import java.util.Map;
import javax.persistence.*; import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Table;
import envoy.data.MessageBuilder; import envoy.data.MessageBuilder;
@ -18,34 +19,11 @@ import envoy.data.MessageBuilder;
@Entity @Entity
@Table(name = "group_messages") @Table(name = "group_messages")
public class GroupMessage { public class GroupMessage extends Message {
@Id
private long id;
@ManyToOne(cascade = CascadeType.PERSIST)
private User sender;
@ManyToOne(cascade = CascadeType.PERSIST)
private Group group;
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@Temporal(TemporalType.TIMESTAMP)
private Date receivedDate;
@Temporal(TemporalType.TIMESTAMP)
private Date readDate;
@ElementCollection @ElementCollection
private Map<Long, envoy.data.Message.MessageStatus> memberMessageStatus; private Map<Long, envoy.data.Message.MessageStatus> memberMessageStatus;
private String text;
private envoy.data.Message.MessageStatus status;
private byte[] attachment;
private boolean forwarded;
/** /**
* The constructor for a database object. * The constructor for a database object.
* *
@ -61,19 +39,8 @@ public class GroupMessage {
* @since Envoy Server Standalone v0.1-beta * @since Envoy Server Standalone v0.1-beta
*/ */
public GroupMessage(envoy.data.GroupMessage groupMessage) { public GroupMessage(envoy.data.GroupMessage groupMessage) {
PersistenceManager persistenceManager = PersistenceManager.getInstance(); super(groupMessage);
id = groupMessage.getID();
status = groupMessage.getStatus();
text = groupMessage.getText();
creationDate = groupMessage.getCreationDate();
receivedDate = groupMessage.getReceivedDate();
readDate = groupMessage.getReadDate();
sender = persistenceManager.getUserByID(groupMessage.getSenderID());
group = persistenceManager.getGroupByID(groupMessage.getRecipientID());
forwarded = groupMessage.isForwarded();
memberMessageStatus = groupMessage.getMemberStatuses(); memberMessageStatus = groupMessage.getMemberStatuses();
// TODO: attachment = groupMessage.getAttachment().toByteArray();DOES NOT WORK
// YET
} }
/** /**
@ -84,91 +51,20 @@ public class GroupMessage {
* groupMessage * groupMessage
* @since Envoy Server Standalone v0.1-beta * @since Envoy Server Standalone v0.1-beta
*/ */
public envoy.data.GroupMessage toCommonGroupMessage() { @Override
public envoy.data.GroupMessage toCommon() {
// TODO: Attachment // TODO: Attachment
envoy.data.GroupMessage groupMessage = new MessageBuilder(sender.getID(), group.getID(), id).setDate(creationDate) envoy.data.GroupMessage groupMessage = new MessageBuilder(sender.getID(), recipient.getID(), id).setDate(creationDate)
.setForwarded(forwarded) .setForwarded(forwarded)
.setStatus(status) .setStatus(status)
.setText(text) .setText(text)
// .setAttachment(attachment) TODO make this work // .setAttachment(attachment) TODO make this work
.buildGroupMessage(group.toCommon(), memberMessageStatus); .buildGroupMessage((envoy.data.Group) recipient.toCommon(), memberMessageStatus);
groupMessage.setReceivedDate(receivedDate); groupMessage.setReceivedDate(receivedDate);
groupMessage.setReadDate(readDate); groupMessage.setReadDate(readDate);
return groupMessage; return groupMessage;
} }
/**
* @return the id
* @since Envoy Server Standalone v0.1-beta
*/
public long getId() { return id; }
/**
* @param id the id to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setId(long id) { this.id = id; }
/**
* @return the sender
* @since Envoy Server Standalone v0.1-beta
*/
public User getSender() { return sender; }
/**
* @param sender the sender to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setSender(User sender) { this.sender = sender; }
/**
* @return the group
* @since Envoy Server Standalone v0.1-beta
*/
public Group getGroup() { return group; }
/**
* @param group the group to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setGroup(Group group) { this.group = group; }
/**
* @return the creationDate
* @since Envoy Server Standalone v0.1-beta
*/
public Date getCreationDate() { return creationDate; }
/**
* @param creationDate the creationDate to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setCreationDate(Date creationDate) { this.creationDate = creationDate; }
/**
* @return the receivedDate
* @since Envoy Server Standalone v0.1-beta
*/
public Date getReceivedDate() { return receivedDate; }
/**
* @param receivedDate the receivedDate to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setReceivedDate(Date receivedDate) { this.receivedDate = receivedDate; }
/**
* @return the readDate
* @since Envoy Server Standalone v0.1-beta
*/
public Date getReadDate() { return readDate; }
/**
* @param readDate the readDate to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setReadDate(Date readDate) { this.readDate = readDate; }
/** /**
* @return the memberMessageStatus * @return the memberMessageStatus
* @since Envoy Server Standalone v0.1-beta * @since Envoy Server Standalone v0.1-beta
@ -182,52 +78,4 @@ public class GroupMessage {
public void setMemberMessageStatus(Map<Long, envoy.data.Message.MessageStatus> memberMessageStatus) { public void setMemberMessageStatus(Map<Long, envoy.data.Message.MessageStatus> memberMessageStatus) {
this.memberMessageStatus = memberMessageStatus; this.memberMessageStatus = memberMessageStatus;
} }
/**
* @return the text
* @since Envoy Server Standalone v0.1-beta
*/
public String getText() { return text; }
/**
* @param text the text to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setText(String text) { this.text = text; }
/**
* @return the status
* @since Envoy Server Standalone v0.1-beta
*/
public envoy.data.Message.MessageStatus getStatus() { return status; }
/**
* @param status the status to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setStatus(envoy.data.Message.MessageStatus status) { this.status = status; }
/**
* @return the attachment
* @since Envoy Server Standalone v0.1-beta
*/
public byte[] getAttachment() { return attachment; }
/**
* @param attachment the attachment to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setAttachment(byte[] attachment) { this.attachment = attachment; }
/**
* @return the forwarded
* @since Envoy Server Standalone v0.1-beta
*/
public boolean isForwarded() { return forwarded; }
/**
* @param forwarded the forwarded to set
* @since Envoy Server Standalone v0.1-beta
*/
public void setForwarded(boolean forwarded) { this.forwarded = forwarded; }
} }

View File

@ -1,10 +1,17 @@
package envoy.server.data; package envoy.server.data;
import static javax.persistence.CascadeType.ALL;
import java.util.Date; import java.util.Date;
import javax.persistence.*; import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import envoy.data.MessageBuilder; import envoy.data.MessageBuilder;
@ -23,6 +30,7 @@ import envoy.data.MessageBuilder;
*/ */
@Entity @Entity
@Table(name = "messages") @Table(name = "messages")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NamedQuery( @NamedQuery(
name = Message.getPending, name = Message.getPending,
query = "SELECT m FROM Message m WHERE (m.recipient = :user AND m.status = envoy.data.Message$MessageStatus.SENT) " query = "SELECT m FROM Message m WHERE (m.recipient = :user AND m.status = envoy.data.Message$MessageStatus.SENT) "
@ -40,29 +48,29 @@ public class Message {
public static final String getPending = "Message.getPending"; public static final String getPending = "Message.getPending";
@Id @Id
private long id; protected long id;
@ManyToOne(cascade = ALL) @ManyToOne
@JoinColumn @JoinColumn
private User sender; protected User sender;
@ManyToOne(cascade = ALL) @ManyToOne
@JoinColumn @JoinColumn
private User recipient; protected Contact recipient;
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Date creationDate; protected Date creationDate;
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Date receivedDate; protected Date receivedDate;
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Date readDate; protected Date readDate;
private String text; protected String text;
private envoy.data.Message.MessageStatus status; protected envoy.data.Message.MessageStatus status;
private byte[] attachment; protected byte[] attachment;
private boolean forwarded; protected boolean forwarded;
/** /**
* The constructor for a database object. * The constructor for a database object.
@ -87,7 +95,7 @@ public class Message {
receivedDate = message.getReceivedDate(); receivedDate = message.getReceivedDate();
readDate = message.getReadDate(); readDate = message.getReadDate();
sender = persistenceManager.getUserByID(message.getSenderID()); sender = persistenceManager.getUserByID(message.getSenderID());
recipient = persistenceManager.getUserByID(message.getRecipientID()); recipient = persistenceManager.getContactByID(message.getRecipientID());
forwarded = message.isForwarded(); forwarded = message.isForwarded();
// TODO: attachment = message.getAttachment().toByteArray();DOES NOT WORK YET // TODO: attachment = message.getAttachment().toByteArray();DOES NOT WORK YET
} }
@ -99,7 +107,7 @@ public class Message {
* message * message
* @since Envoy Server Standalone v0.1-alpha * @since Envoy Server Standalone v0.1-alpha
*/ */
public envoy.data.Message toCommonMessage() { public envoy.data.Message toCommon() {
// TODO: Attachment // TODO: Attachment
envoy.data.Message message = new MessageBuilder(sender.getID(), recipient.getID(), id).setText(text) envoy.data.Message message = new MessageBuilder(sender.getID(), recipient.getID(), id).setText(text)
.setDate(creationDate) .setDate(creationDate)
@ -142,7 +150,7 @@ public class Message {
* @return the recipient of a {link envoy.data.Message} * @return the recipient of a {link envoy.data.Message}
* @since Envoy Server Standalone v0.1-alpha * @since Envoy Server Standalone v0.1-alpha
*/ */
public User getRecipient() { return recipient; } public Contact getRecipient() { return recipient; }
/** /**
* @param recipient the recipient to set * @param recipient the recipient to set

View File

@ -2,6 +2,8 @@ package envoy.server.processors;
import java.io.IOException; import java.io.IOException;
import javax.persistence.EntityExistsException;
import envoy.data.GroupMessage; import envoy.data.GroupMessage;
import envoy.data.Message.MessageStatus; import envoy.data.Message.MessageStatus;
import envoy.event.MessageStatusChangeEvent; import envoy.event.MessageStatusChangeEvent;
@ -31,19 +33,26 @@ public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
} }
final var members = PersistenceManager.getInstance().getGroupByID(groupMessage.getRecipientID()).getContacts(); final var members = PersistenceManager.getInstance().getGroupByID(groupMessage.getRecipientID()).getContacts();
members.forEach(user -> { sendToMember(connectionManager, groupMessage, user.getID(), writeProxy); }); for (long i = 0; i < groupMessage.getMemberStatuses().keySet().size(); i++) {
// TODO if all member message statuses are RECEIVED, send groupMessage.getMemberStatuses().replace(i, MessageStatus.SENT);
// messageStatusChangeEvent to all members (we need to know if the sender is in }
// the member list as well. If so insert continue on the loop one line above. If members.forEach(user -> { setMemberStatus(connectionManager, groupMessage, user.getID()); });
// not we need to send the messageStatusChangeEvent separately to the sender).
// TODO Implement separate DB entity for groupMesages so we can persist here. // Checks if all memberMessageStatuses are RECEIVED and if so sets the
// groupMessage Status to RECEIVED.
if (!groupMessage.getMemberStatuses().containsValue(MessageStatus.SENT)) groupMessage.setStatus(MessageStatus.RECEIVED);
members.forEach(user -> { sendToMember(connectionManager, groupMessage, user.getID(), writeProxy); });
try {
PersistenceManager.getInstance().addMessage(new envoy.server.data.Message(groupMessage));
} catch (EntityExistsException e) {
System.err.println("Received a groupMessage with an id that already exists");
}
} }
private void sendToMember(ConnectionManager connectionManager, GroupMessage groupMessage, long memberID, ObjectWriteProxy writeProxy) { private void sendToMember(ConnectionManager connectionManager, GroupMessage groupMessage, long memberID, ObjectWriteProxy writeProxy) {
if (connectionManager.isOnline(memberID)) try { if (connectionManager.isOnline(memberID)) try {
// Update the message status of the member to RECEIVED
groupMessage.getMemberStatuses().replace(memberID, MessageStatus.RECEIVED);
// If recipient is online, send the groupMessage directly // If recipient is online, send the groupMessage directly
writeProxy.write(connectionManager.getSocketId(memberID), groupMessage); writeProxy.write(connectionManager.getSocketId(memberID), groupMessage);
} catch (IOException e) { } catch (IOException e) {
@ -52,6 +61,12 @@ public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
} }
} }
private void setMemberStatus(ConnectionManager connectionManager, GroupMessage groupMessage, long memberID) {
if (connectionManager.isOnline(memberID))
// Update the message status of the member to RECEIVED
groupMessage.getMemberStatuses().replace(memberID, MessageStatus.RECEIVED);
}
@Override @Override
public Class<GroupMessage> getInputClass() { return GroupMessage.class; } public Class<GroupMessage> getInputClass() { return GroupMessage.class; }
} }

View File

@ -58,13 +58,13 @@ public class LoginCredentialProcessor implements ObjectProcessor<LoginCredential
List<Message> pendingMessages = PersistenceManager.getInstance().getPendingMessages(user); List<Message> pendingMessages = PersistenceManager.getInstance().getPendingMessages(user);
for (Message msg : pendingMessages) for (Message msg : pendingMessages)
if (msg.getStatus() == MessageStatus.SENT) { if (msg.getStatus() == MessageStatus.SENT) {
System.out.println("Sending message " + msg.toCommonMessage()); System.out.println("Sending message " + msg.toCommon());
writeProxy.write(socketID, msg.toCommonMessage()); writeProxy.write(socketID, msg.toCommon());
msg.setReceivedDate(new Date()); msg.setReceivedDate(new Date());
msg.setStatus(MessageStatus.RECEIVED); msg.setStatus(MessageStatus.RECEIVED);
PersistenceManager.getInstance().updateMessage(msg); PersistenceManager.getInstance().updateMessage(msg);
} else { } else {
var evt = new MessageStatusChangeEvent(msg.toCommonMessage()); var evt = new MessageStatusChangeEvent(msg.toCommon());
System.out.println("Sending messageStatusChangeEvent " + evt); System.out.println("Sending messageStatusChangeEvent " + evt);
writeProxy.write(socketID, evt); writeProxy.write(socketID, evt);
} }