Filter out subclasses in ObjectMessageProcessor
This commit is contained in:
		| @@ -4,6 +4,7 @@ import java.io.ByteArrayInputStream; | |||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.ObjectInputStream; | import java.io.ObjectInputStream; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  | import java.util.logging.Level; | ||||||
| import java.util.logging.Logger; | import java.util.logging.Logger; | ||||||
|  |  | ||||||
| import com.jenkov.nioserver.IMessageProcessor; | import com.jenkov.nioserver.IMessageProcessor; | ||||||
| @@ -50,11 +51,11 @@ public class ObjectMessageProcessor implements IMessageProcessor { | |||||||
| 			logger.fine("Received " + obj); | 			logger.fine("Received " + obj); | ||||||
|  |  | ||||||
| 			// Process object | 			// Process object | ||||||
| 			processors.stream().filter(p -> p.getInputClass().isInstance(obj)).forEach((@SuppressWarnings("rawtypes") ObjectProcessor p) -> { | 			processors.stream().filter(p -> p.getInputClass().equals(obj.getClass())).forEach((@SuppressWarnings("rawtypes") ObjectProcessor p) -> { | ||||||
| 				try { | 				try { | ||||||
| 					p.process(p.getInputClass().cast(obj), message.socketId, new ObjectWriteProxy(writeProxy)); | 					p.process(p.getInputClass().cast(obj), message.socketId, new ObjectWriteProxy(writeProxy)); | ||||||
| 				} catch (IOException e) { | 				} catch (IOException e) { | ||||||
| 					e.printStackTrace(); | 					logger.log(Level.SEVERE, "Exception during processor execution: ", e); | ||||||
| 				} | 				} | ||||||
| 			}); | 			}); | ||||||
| 		} catch (IOException | ClassNotFoundException e) { | 		} catch (IOException | ClassNotFoundException e) { | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package envoy.server.processors; | package envoy.server.processors; | ||||||
|  |  | ||||||
|  | import static envoy.data.Message.MessageStatus.*; | ||||||
| import static envoy.data.User.UserStatus.ONLINE; | import static envoy.data.User.UserStatus.ONLINE; | ||||||
| import static envoy.event.HandshakeRejection.*; | import static envoy.event.HandshakeRejection.*; | ||||||
|  |  | ||||||
| @@ -10,7 +11,6 @@ import java.util.logging.Logger; | |||||||
| import javax.persistence.NoResultException; | import javax.persistence.NoResultException; | ||||||
|  |  | ||||||
| import envoy.data.LoginCredentials; | import envoy.data.LoginCredentials; | ||||||
| import envoy.data.Message.MessageStatus; |  | ||||||
| import envoy.event.GroupMessageStatusChange; | import envoy.event.GroupMessageStatusChange; | ||||||
| import envoy.event.HandshakeRejection; | import envoy.event.HandshakeRejection; | ||||||
| import envoy.event.MessageStatusChange; | import envoy.event.MessageStatusChange; | ||||||
| @@ -120,7 +120,7 @@ public final class LoginCredentialProcessor implements ObjectProcessor<LoginCred | |||||||
|  |  | ||||||
| 		for (var msg : pendingMessages) { | 		for (var msg : pendingMessages) { | ||||||
| 			final var msgCommon = msg.toCommon(); | 			final var msgCommon = msg.toCommon(); | ||||||
| 			if (msg.getStatus() == MessageStatus.SENT) { | 			if (msg.getStatus() == SENT) { | ||||||
|  |  | ||||||
| 				// Send the message | 				// Send the message | ||||||
| 				writeProxy.write(socketID, msgCommon); | 				writeProxy.write(socketID, msgCommon); | ||||||
| @@ -142,16 +142,17 @@ public final class LoginCredentialProcessor implements ObjectProcessor<LoginCred | |||||||
| 			final var gmsgCommon = gmsg.toCommon(); | 			final var gmsgCommon = gmsg.toCommon(); | ||||||
|  |  | ||||||
| 			// Deliver the message to the user if he hasn't received it yet | 			// Deliver the message to the user if he hasn't received it yet | ||||||
| 			if (gmsg.getMemberMessageStatus().get(user.getID()) == MessageStatus.SENT) { | 			if (gmsg.getMemberMessageStatus().get(user.getID()) == SENT) { | ||||||
| 				gmsg.getMemberMessageStatus().replace(user.getID(), MessageStatus.RECEIVED); | 				gmsg.getMemberMessageStatus().replace(user.getID(), RECEIVED); | ||||||
| 				writeProxy.write(socketID, gmsgCommon); | 				writeProxy.write(socketID, gmsgCommon); | ||||||
|  |  | ||||||
| 				// Notify all online group members about the status change | 				// Notify all online group members about the status change | ||||||
| 				writeProxy.writeToOnlineContacts(gmsg.getRecipient().getContacts(), | 				writeProxy.writeToOnlineContacts(gmsg.getRecipient().getContacts(), | ||||||
| 						new GroupMessageStatusChange(gmsg.getID(), MessageStatus.RECEIVED, LocalDateTime.now(), | 						new GroupMessageStatusChange(gmsg.getID(), RECEIVED, LocalDateTime | ||||||
|  | 							.now(), | ||||||
| 								connectionManager.getUserIDBySocketID(socketID))); | 								connectionManager.getUserIDBySocketID(socketID))); | ||||||
|  |  | ||||||
| 				if (Collections.min(gmsg.getMemberMessageStatus().values()) == MessageStatus.RECEIVED) { | 				if (Collections.min(gmsg.getMemberMessageStatus().values()) == RECEIVED) { | ||||||
| 					gmsg.received(); | 					gmsg.received(); | ||||||
|  |  | ||||||
| 					// Notify online members about the status change | 					// Notify online members about the status change | ||||||
|   | |||||||
| @@ -31,10 +31,6 @@ public class MessageProcessor implements ObjectProcessor<Message> { | |||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| 	public void process(Message message, long socketID, ObjectWriteProxy writeProxy) { | 	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 instanceof envoy.data.GroupMessage) return; |  | ||||||
|  |  | ||||||
| 		message.nextStatus(); | 		message.nextStatus(); | ||||||
|  |  | ||||||
| 		// Convert to server message | 		// Convert to server message | ||||||
|   | |||||||
| @@ -5,7 +5,6 @@ import java.util.logging.Level; | |||||||
| import java.util.logging.Logger; | import java.util.logging.Logger; | ||||||
|  |  | ||||||
| import envoy.data.Message.MessageStatus; | import envoy.data.Message.MessageStatus; | ||||||
| import envoy.event.GroupMessageStatusChange; |  | ||||||
| import envoy.event.MessageStatusChange; | import envoy.event.MessageStatusChange; | ||||||
| import envoy.server.data.PersistenceManager; | import envoy.server.data.PersistenceManager; | ||||||
| import envoy.server.net.ConnectionManager; | import envoy.server.net.ConnectionManager; | ||||||
| @@ -28,8 +27,6 @@ public class MessageStatusChangeProcessor implements ObjectProcessor<MessageStat | |||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| 	public void process(MessageStatusChange statusChange, long socketID, ObjectWriteProxy writeProxy) throws IOException { | 	public void process(MessageStatusChange statusChange, long socketID, ObjectWriteProxy writeProxy) throws IOException { | ||||||
| 		// Filtering out subclass objects, which should not be processed here. |  | ||||||
| 		if (statusChange instanceof GroupMessageStatusChange) return; |  | ||||||
|  |  | ||||||
| 		// Any other status than READ is not supposed to be sent to the server | 		// Any other status than READ is not supposed to be sent to the server | ||||||
| 		if (statusChange.get() != MessageStatus.READ) { | 		if (statusChange.get() != MessageStatus.READ) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user