Make GroupMessage extend Message, prepared GroupMessageStatus processing
This commit is contained in:
		| @@ -36,6 +36,7 @@ public class Startup { | ||||
| 		Set<ObjectProcessor<?>> processors = new HashSet<>(); | ||||
| 		processors.add(new LoginCredentialProcessor()); | ||||
| 		processors.add(new MessageProcessor()); | ||||
| 		processors.add(new GroupMessageProcessor()); | ||||
| 		processors.add(new MessageStatusChangeProcessor()); | ||||
| 		processors.add(new UserStatusChangeProcessor()); | ||||
| 		processors.add(new IDGeneratorRequestProcessor()); | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package envoy.server.data; | ||||
|  | ||||
| import java.util.Date; | ||||
| import java.util.Map; | ||||
|  | ||||
| import javax.persistence.*; | ||||
| import javax.persistence.ElementCollection; | ||||
| import javax.persistence.Entity; | ||||
| import javax.persistence.Table; | ||||
|  | ||||
| import envoy.data.MessageBuilder; | ||||
|  | ||||
| @@ -18,34 +19,11 @@ import envoy.data.MessageBuilder; | ||||
|  | ||||
| @Entity | ||||
| @Table(name = "group_messages") | ||||
| public class GroupMessage { | ||||
|  | ||||
| 	@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; | ||||
| public class GroupMessage extends Message { | ||||
|  | ||||
| 	@ElementCollection | ||||
| 	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. | ||||
| 	 * | ||||
| @@ -61,19 +39,8 @@ public class GroupMessage { | ||||
| 	 * @since Envoy Server Standalone v0.1-beta | ||||
| 	 */ | ||||
| 	public GroupMessage(envoy.data.GroupMessage groupMessage) { | ||||
| 		PersistenceManager persistenceManager = PersistenceManager.getInstance(); | ||||
| 		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(); | ||||
| 		super(groupMessage); | ||||
| 		memberMessageStatus	= groupMessage.getMemberStatuses(); | ||||
| 		// TODO: attachment = groupMessage.getAttachment().toByteArray();DOES NOT WORK | ||||
| 		// YET | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| @@ -84,91 +51,20 @@ public class GroupMessage { | ||||
| 	 *         groupMessage | ||||
| 	 * @since Envoy Server Standalone v0.1-beta | ||||
| 	 */ | ||||
| 	public envoy.data.GroupMessage toCommonGroupMessage() { | ||||
| 	@Override | ||||
| 	public envoy.data.GroupMessage toCommon() { | ||||
| 		// 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) | ||||
| 			.setStatus(status) | ||||
| 			.setText(text) | ||||
| 			// .setAttachment(attachment) TODO make this work | ||||
| 			.buildGroupMessage(group.toCommon(), memberMessageStatus); | ||||
| 			.buildGroupMessage((envoy.data.Group) recipient.toCommon(), memberMessageStatus); | ||||
| 		groupMessage.setReceivedDate(receivedDate); | ||||
| 		groupMessage.setReadDate(readDate); | ||||
| 		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 | ||||
| 	 * @since Envoy Server Standalone v0.1-beta | ||||
| @@ -182,52 +78,4 @@ public class GroupMessage { | ||||
| 	public void setMemberMessageStatus(Map<Long, envoy.data.Message.MessageStatus> 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; } | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| package envoy.server.data; | ||||
|  | ||||
| import static javax.persistence.CascadeType.ALL; | ||||
|  | ||||
| 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; | ||||
|  | ||||
| @@ -23,6 +30,7 @@ import envoy.data.MessageBuilder; | ||||
|  */ | ||||
| @Entity | ||||
| @Table(name = "messages") | ||||
| @Inheritance(strategy = InheritanceType.SINGLE_TABLE) | ||||
| @NamedQuery( | ||||
| 	name = Message.getPending, | ||||
| 	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"; | ||||
| 	 | ||||
| 	@Id | ||||
| 	private long id; | ||||
| 	protected long id; | ||||
|  | ||||
| 	@ManyToOne(cascade = ALL) | ||||
| 	@ManyToOne | ||||
| 	@JoinColumn | ||||
| 	private User sender; | ||||
| 	protected User sender; | ||||
|  | ||||
| 	@ManyToOne(cascade = ALL) | ||||
| 	@ManyToOne | ||||
| 	@JoinColumn | ||||
| 	private User recipient; | ||||
| 	protected Contact recipient; | ||||
|  | ||||
| 	@Temporal(TemporalType.TIMESTAMP) | ||||
| 	private Date creationDate; | ||||
| 	protected Date creationDate; | ||||
|  | ||||
| 	@Temporal(TemporalType.TIMESTAMP) | ||||
| 	private Date receivedDate; | ||||
| 	protected Date receivedDate; | ||||
|  | ||||
| 	@Temporal(TemporalType.TIMESTAMP) | ||||
| 	private Date readDate; | ||||
| 	protected Date readDate; | ||||
|  | ||||
| 	private String								text; | ||||
| 	private envoy.data.Message.MessageStatus	status; | ||||
| 	private byte[]								attachment; | ||||
| 	private boolean								forwarded; | ||||
| 	protected String							text; | ||||
| 	protected envoy.data.Message.MessageStatus	status; | ||||
| 	protected byte[]							attachment; | ||||
| 	protected boolean							forwarded; | ||||
|  | ||||
| 	/** | ||||
| 	 * The constructor for a database object. | ||||
| @@ -87,7 +95,7 @@ public class Message { | ||||
| 		receivedDate	= message.getReceivedDate(); | ||||
| 		readDate		= message.getReadDate(); | ||||
| 		sender			= persistenceManager.getUserByID(message.getSenderID()); | ||||
| 		recipient		= persistenceManager.getUserByID(message.getRecipientID()); | ||||
| 		recipient		= persistenceManager.getContactByID(message.getRecipientID()); | ||||
| 		forwarded		= message.isForwarded(); | ||||
| 		// TODO: attachment = message.getAttachment().toByteArray();DOES NOT WORK YET | ||||
| 	} | ||||
| @@ -99,7 +107,7 @@ public class Message { | ||||
| 	 *         message | ||||
| 	 * @since Envoy Server Standalone v0.1-alpha | ||||
| 	 */ | ||||
| 	public envoy.data.Message toCommonMessage() { | ||||
| 	public envoy.data.Message toCommon() { | ||||
| 		// TODO: Attachment | ||||
| 		envoy.data.Message message = new MessageBuilder(sender.getID(), recipient.getID(), id).setText(text) | ||||
| 			.setDate(creationDate) | ||||
| @@ -142,7 +150,7 @@ public class Message { | ||||
| 	 * @return the recipient of a {link envoy.data.Message} | ||||
| 	 * @since Envoy Server Standalone v0.1-alpha | ||||
| 	 */ | ||||
| 	public User getRecipient() { return recipient; } | ||||
| 	public Contact getRecipient() { return recipient; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @param recipient the recipient to set | ||||
|   | ||||
| @@ -2,6 +2,8 @@ package envoy.server.processors; | ||||
|  | ||||
| import java.io.IOException; | ||||
|  | ||||
| import javax.persistence.EntityExistsException; | ||||
|  | ||||
| import envoy.data.GroupMessage; | ||||
| import envoy.data.Message.MessageStatus; | ||||
| import envoy.event.MessageStatusChangeEvent; | ||||
| @@ -31,19 +33,26 @@ public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> { | ||||
| 		} | ||||
|  | ||||
| 		final var members = PersistenceManager.getInstance().getGroupByID(groupMessage.getRecipientID()).getContacts(); | ||||
| 		members.forEach(user -> { sendToMember(connectionManager, groupMessage, user.getID(), writeProxy); }); | ||||
| 		// TODO if all member message statuses are RECEIVED, send | ||||
| 		// 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 | ||||
| 		// not we need to send the messageStatusChangeEvent separately to the sender). | ||||
| 		for (long i = 0; i < groupMessage.getMemberStatuses().keySet().size(); i++) { | ||||
| 			groupMessage.getMemberStatuses().replace(i, MessageStatus.SENT); | ||||
| 		} | ||||
| 		members.forEach(user -> { setMemberStatus(connectionManager, groupMessage, user.getID()); }); | ||||
|  | ||||
| 		// 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) { | ||||
| 		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 | ||||
| 			writeProxy.write(connectionManager.getSocketId(memberID), groupMessage); | ||||
| 		} 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 | ||||
| 	public Class<GroupMessage> getInputClass() { return GroupMessage.class; } | ||||
| } | ||||
|   | ||||
| @@ -58,13 +58,13 @@ public class LoginCredentialProcessor implements ObjectProcessor<LoginCredential | ||||
| 		List<Message> pendingMessages = PersistenceManager.getInstance().getPendingMessages(user); | ||||
| 		for (Message msg : pendingMessages) | ||||
| 			if (msg.getStatus() == MessageStatus.SENT) { | ||||
| 				System.out.println("Sending message " + msg.toCommonMessage()); | ||||
| 				writeProxy.write(socketID, msg.toCommonMessage()); | ||||
| 				System.out.println("Sending message " + msg.toCommon()); | ||||
| 				writeProxy.write(socketID, msg.toCommon()); | ||||
| 				msg.setReceivedDate(new Date()); | ||||
| 				msg.setStatus(MessageStatus.RECEIVED); | ||||
| 				PersistenceManager.getInstance().updateMessage(msg); | ||||
| 			} else { | ||||
| 				var evt = new MessageStatusChangeEvent(msg.toCommonMessage()); | ||||
| 				var evt = new MessageStatusChangeEvent(msg.toCommon()); | ||||
| 				System.out.println("Sending messageStatusChangeEvent " + evt); | ||||
| 				writeProxy.write(socketID, evt); | ||||
| 			} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 DieGurke
					DieGurke