Implemented functionality regarding pending groupMessages (unfinished)
(This was implemented some weeks ago but never pushed (made some revision))
This commit is contained in:
		| @@ -3,7 +3,12 @@ package envoy.server.data; | ||||
| import java.util.Date; | ||||
| import java.util.Map; | ||||
|  | ||||
| import javax.persistence.*; | ||||
| import javax.persistence.Column; | ||||
| import javax.persistence.ElementCollection; | ||||
| import javax.persistence.Entity; | ||||
| import javax.persistence.NamedQuery; | ||||
| import javax.persistence.Temporal; | ||||
| import javax.persistence.TemporalType; | ||||
|  | ||||
| import envoy.data.MessageBuilder; | ||||
|  | ||||
| @@ -16,8 +21,14 @@ import envoy.data.MessageBuilder; | ||||
|  * @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)" | ||||
| ) | ||||
| public class GroupMessage extends Message { | ||||
|  | ||||
| 	public static final String getPendingGroupMsg = "GroupMessage.getPendingGroupMsg"; | ||||
|  | ||||
| 	@ElementCollection | ||||
| 	private Map<Long, envoy.data.Message.MessageStatus> memberMessageStatus; | ||||
|  | ||||
|   | ||||
| @@ -194,6 +194,22 @@ public class PersistenceManager { | ||||
| 			.getResultList(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns all groupMessages received while being offline or the ones that have | ||||
| 	 * changed. | ||||
| 	 * | ||||
| 	 * @param user the user who wants to receive his unread groupMessages | ||||
| 	 * @return all groupMessages that the client does not yet have (unread | ||||
| 	 *         groupMessages) | ||||
| 	 * @since Envoy Server Standalone v0.1-alpha | ||||
| 	 */ | ||||
| 	public List<GroupMessage> getPendingGroupMessages(User user) { | ||||
| 		return entityManager.createNamedQuery(GroupMessage.getPendingGroupMsg) | ||||
| 			.setParameter("userId", user.getID()) | ||||
| 			.setParameter("lastSeen", user.getLastSeen()) | ||||
| 			.getResultList(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Searches for users matching a search phrase. Contacts of the attached user | ||||
| 	 * and the attached user is ignored. | ||||
|   | ||||
| @@ -8,7 +8,6 @@ import javax.persistence.EntityExistsException; | ||||
|  | ||||
| import envoy.data.GroupMessage; | ||||
| import envoy.data.Message.MessageStatus; | ||||
| import envoy.event.MessageStatusChange; | ||||
| import envoy.server.data.PersistenceManager; | ||||
| import envoy.server.net.ConnectionManager; | ||||
| import envoy.server.net.ObjectWriteProxy; | ||||
| @@ -43,12 +42,12 @@ public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> { | ||||
| 		// sender, if he is still online. | ||||
| 		if (!groupMessage.getMemberStatuses().containsValue(MessageStatus.SENT)) { | ||||
| 			groupMessage.setStatus(MessageStatus.RECEIVED); | ||||
| 			if (connectionManager.isOnline(connectionManager.getUserIdBySocketID(socketID))) try { | ||||
| 				writeProxy.write(socketID, new MessageStatusChange(groupMessage)); | ||||
| 			} catch (IOException e) { | ||||
| 				logger.warning("Sender of the groupMessage online. Failed to send MessageStatusChange"); | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| //			if (connectionManager.isOnline(connectionManager.getUserIdBySocketID(socketID))) try { | ||||
| //				writeProxy.write(socketID, new MessageStatusChange(groupMessage)); | ||||
| //			} catch (IOException e) { | ||||
| //				logger.warning("Sender of the groupMessage online. Failed to send MessageStatusChange"); | ||||
| //				e.printStackTrace(); | ||||
| //			} | ||||
| 		} | ||||
|  | ||||
| 		members.stream() | ||||
|   | ||||
| @@ -1,12 +1,16 @@ | ||||
| package envoy.server.processors; | ||||
|  | ||||
| import static envoy.data.User.UserStatus.ONLINE; | ||||
| import static envoy.event.HandshakeRejection.*; | ||||
| import static envoy.event.HandshakeRejection.INTERNAL_ERROR; | ||||
| import static envoy.event.HandshakeRejection.USERNAME_TAKEN; | ||||
| import static envoy.event.HandshakeRejection.WRONG_PASSWORD_OR_USER; | ||||
| import static envoy.event.HandshakeRejection.WRONG_VERSION; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.Arrays; | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.logging.Logger; | ||||
|  | ||||
| import javax.persistence.NoResultException; | ||||
| @@ -16,6 +20,7 @@ import envoy.data.LoginCredentials; | ||||
| import envoy.data.Message.MessageStatus; | ||||
| import envoy.event.HandshakeRejection; | ||||
| import envoy.event.MessageStatusChange; | ||||
| import envoy.server.data.GroupMessage; | ||||
| import envoy.server.data.PersistenceManager; | ||||
| import envoy.server.data.User; | ||||
| import envoy.server.net.ConnectionManager; | ||||
| @@ -117,6 +122,9 @@ public final class LoginCredentialProcessor implements ObjectProcessor<LoginCred | ||||
| 		final var pendingMessages = PersistenceManager.getInstance().getPendingMessages(user); | ||||
| 		logger.fine("Sending " + pendingMessages.size() + " pending messages to " + user + "..."); | ||||
|  | ||||
| 		List<GroupMessage> pendingGroupMessages = PersistenceManager.getInstance().getPendingGroupMessages(user); | ||||
| 		logger.fine("Sending " + pendingGroupMessages.size() + " pending group messages to " + user + "..."); | ||||
|  | ||||
| 		for (var msg : pendingMessages) { | ||||
| 			final var msgCommon = msg.toCommon(); | ||||
| 			if (msg.getStatus() == MessageStatus.SENT) { | ||||
| @@ -133,6 +141,23 @@ public final class LoginCredentialProcessor implements ObjectProcessor<LoginCred | ||||
| 				} | ||||
| 			} else writeProxy.write(socketID, new MessageStatusChange(msgCommon)); | ||||
| 		} | ||||
|  | ||||
| 		for (GroupMessage gmsg : pendingGroupMessages) { | ||||
| 			if (gmsg.getMemberMessageStatus().get(user.getID()) == MessageStatus.SENT) { | ||||
| 				gmsg.getMemberMessageStatus().replace(user.getID(), MessageStatus.RECEIVED); | ||||
| 				logger.info("Sending groupMessage" + gmsg.toCommon()); | ||||
| 				System.out.println(gmsg.toCommon().toString()); | ||||
| 				writeProxy.write(socketID, gmsg.toCommon()); | ||||
| 				// Sending memberStatusEvent to all members (event does not exist yet I think) | ||||
| 				if (!gmsg.getMemberMessageStatus().containsValue(MessageStatus.SENT)) { | ||||
| 					gmsg.setStatus(MessageStatus.RECEIVED); | ||||
| 					// TODO: Sending MessageStatusChangeEvent to all other members | ||||
| 				} | ||||
| 				PersistenceManager.getInstance().updateMessage(gmsg); | ||||
| 			} else { | ||||
| 				// Sending memberStatusEvents and MessageStatusChange Events | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
|   | ||||
| @@ -34,8 +34,9 @@ public class MessageProcessor implements ObjectProcessor<Message> { | ||||
| 	public void process(Message message, long socketID, ObjectWriteProxy writeProxy) { | ||||
| 		// Makes sure, that there are no groupMessages processed here, because | ||||
| 		// groupMessage is a subclass of message. | ||||
| 		if (message.getClass().equals(envoy.data.GroupMessage.class)) return; | ||||
|  | ||||
| 		if (message.getClass().equals(envoy.data.GroupMessage.class)) { | ||||
| 			return; | ||||
| 		} | ||||
| 		message.nextStatus(); | ||||
|  | ||||
| 		// Convert to server message | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 DieGurke
					DieGurke