| | | 1 | | // The message is a base class for the different types of messages being sent and received among the |
| | | 2 | | // agents. It always carries a sender, a receiver, a message type, and a payload. |
| | | 3 | | |
| | | 4 | | using System; |
| | | 5 | | |
| | | 6 | | // Message type enumeration that defines the message payload. |
| | | 7 | | public enum MessageType { |
| | | 8 | | AssignTargetRequest, |
| | | 9 | | AssignTargetResponse, |
| | | 10 | | ReassignTargetRequest, |
| | | 11 | | } |
| | | 12 | | |
| | | 13 | | public abstract class Message { |
| | | 14 | | public IAgent Sender { get; } |
| | | 15 | | public IAgent Receiver { get; } |
| | | 16 | | public MessageType Type { get; } |
| | | 17 | | |
| | | 18 | | public abstract IMessagePayload Payload { get; } |
| | | 19 | | |
| | | 20 | | protected Message(IAgent sender, IAgent receiver, MessageType type) { |
| | | 21 | | Sender = sender ?? throw new ArgumentNullException(nameof(sender)); |
| | | 22 | | Receiver = receiver ?? throw new ArgumentNullException(nameof(receiver)); |
| | | 23 | | Type = type; |
| | | 24 | | } |
| | | 25 | | } |
| | | 26 | | |
| | | 27 | | // Generic message that stores a payload. The generic type refers to the payloa type. |
| | | 28 | | public abstract class Message<TPayload> : Message |
| | | 29 | | where TPayload : class, IMessagePayload { |
| | | 30 | | public TPayload PayloadData { get; } |
| | | 31 | | public sealed override IMessagePayload Payload => PayloadData; |
| | | 32 | | protected Message(IAgent sender, IAgent receiver, MessageType type, TPayload payload) |
| | | 33 | | : base(sender, receiver, type) { |
| | | 34 | | PayloadData = payload ?? throw new ArgumentNullException(nameof(payload)); |
| | | 35 | | } |
| | | 36 | | } |
| | | 37 | | |
| | | 38 | | // This message is sent upwards to a parent interceptor or IADS when a sub-interceptor has no target |
| | | 39 | | // and is requesting a new target. |
| | | 40 | | public sealed class AssignTargetRequestMessage : Message<AssignTargetRequestPayload> { |
| | | 41 | | public AssignTargetRequestMessage(IAgent sender, IAgent receiver, IInterceptor subInterceptor) |
| | 0 | 42 | | : base(sender, receiver, MessageType.AssignTargetRequest, |
| | 0 | 43 | | new AssignTargetRequestPayload(subInterceptor)) {} |
| | | 44 | | } |
| | | 45 | | |
| | | 46 | | // This message is sent downwards from the IADS or a parent interceptor to inform the |
| | | 47 | | // sub-interceptor of a new target. |
| | | 48 | | public sealed class AssignTargetResponseMessage : Message<AssignTargetResponsePayload> { |
| | | 49 | | public AssignTargetResponseMessage(IAgent sender, IAgent receiver, IHierarchical target) |
| | | 50 | | : base(sender, receiver, MessageType.AssignTargetResponse, |
| | | 51 | | new AssignTargetResponsePayload(target)) {} |
| | | 52 | | } |
| | | 53 | | |
| | | 54 | | // This message is sent upwards to a parent interceptor or IADS when a sub-interceptor can no longer |
| | | 55 | | // pursue the current target and is requesting the parent interceptor or IADS to reassign that |
| | | 56 | | // target elsewhere. |
| | | 57 | | public sealed class ReassignTargetRequestMessage : Message<ReassignTargetRequestPayload> { |
| | | 58 | | public ReassignTargetRequestMessage(IAgent sender, IAgent receiver, IHierarchical target) |
| | | 59 | | : base(sender, receiver, MessageType.ReassignTargetRequest, |
| | | 60 | | new ReassignTargetRequestPayload(target)) {} |
| | | 61 | | } |