Beispiel #1
0
        private void ReplaceMessageToQueue(Channel channel, Message message)
        {
            Node node;

            var isSuccess = AllConstants.RandomGenerator.NextDouble() >= channel.ErrorChance;

            if (channel.IsBusy && channel.MessageOwnerId != message.ParentId)
            {
                isSuccess = false;
            }

            if (message.LastTransferNodeId == channel.FirstNodeId && !isSuccess ||
                message.LastTransferNodeId != channel.FirstNodeId && isSuccess)
            {
                node = _network.GetNodeById(channel.FirstNodeId);
            }
            else
            {
                node = _network.GetNodeById(channel.SecondNodeId);
            }

            if (!isSuccess)
            {
                message.SendAttempts++;
            }
            else
            {
                MakeChannelFree(message);
            }

            var messageQueueHandler = node.MessageQueueHandlers
                                      .First(m => m.ChannelId == channel.Id);

            messageQueueHandler.AddMessageInStart(message);
        }
Beispiel #2
0
        public void AddInQueue(Message[] messages, uint nodeId)
        {
            foreach (var message in messages)
            {
                Network.AddInQueue(message, nodeId);
            }

            var node = Network.GetNodeById(nodeId);

            node.NetworkMatrix = MessageRouter.CountPriceMatrix(nodeId, nodeId, node.NetworkMatrix);
        }
Beispiel #3
0
        public void GetNodeByIdShouldReturnCorrectNode()
        {
            // Arrange
            _network.AddNode(_node1);

            // Act
            var result = _network.GetNodeById(_node1.Id);

            // Assert
            Assert.IsTrue(result.LinkedNodesId.All(i => _node1.LinkedNodesId.Any(i1 => i1 == i)));
            Assert.That(result.MessageQueueHandlers.Count, Is.EqualTo(_node1.MessageQueueHandlers.Count));
        }
        private void ConnectCentralMachineToOtherNodes(IEnumerable <uint> nodesIdConnectedToCentralMachine, uint centralMachineId)
        {
            foreach (var nodeId in nodesIdConnectedToCentralMachine)
            {
                var price    = ChannelParamsGenerator.GetRandomPrice();
                var capacity = ChannelParamsGenerator.GetCapactity(price) / 3;

                var channel = new Channel
                {
                    Id             = Guid.NewGuid(),
                    FirstNodeId    = centralMachineId,
                    SecondNodeId   = nodeId,
                    ConnectionType = ConnectionType.Duplex,
                    ChannelType    = ChannelType.Satellite,
                    ErrorChance    = AllConstants.RandomGenerator.NextDouble(),
                    Price          = price,
                    IsBusy         = false,
                    Capacity       = capacity
                };

                var metropolitanNode = _network.GetNodeById(nodeId);
                metropolitanNode.NodeType = NodeType.MainMetropolitanMachine;

                _network.AddChannel(channel);
            }
        }
Beispiel #5
0
        public IEnumerable <Message> GetAllMessages(uint?nodeId = null,
                                                    MessageFiltrationMode messageFiltrationMode = MessageFiltrationMode.AllMessages)
        {
            IEnumerable <Message> result = new List <Message>();

            if (nodeId != null && _network.GetNodeById(nodeId.Value) == null)
            {
                throw new NodeException("Node isn't exist");
            }

            if ((messageFiltrationMode & MessageFiltrationMode.CanceledMessagesOnly) != 0)
            {
                result = result.Union(GetCanceledMessages(nodeId));
            }

            if (nodeId == null && (messageFiltrationMode & MessageFiltrationMode.ChannelMessagesOnly) != 0)
            {
                result = result.Union(GetMessagesInChannels());
            }

            if ((messageFiltrationMode & MessageFiltrationMode.QueueMessagesOnly) != 0)
            {
                result = result.Union(GetQueueMessages(nodeId));
            }

            if ((messageFiltrationMode & MessageFiltrationMode.ReceivedMessagesOnly) != 0)
            {
                result = result.Union(GetReceivedMessages(nodeId));
            }

            return(result.ToArray());
        }
        public Channel[] GetRoute(uint senderId, uint receiverId)
        {
            if (senderId == receiverId)
            {
                return(new Channel[0]);
            }

            var sender = Network.GetNodeById(senderId);

            var networkMatrix = sender.NetworkMatrix;

            if (networkMatrix == null ||
                double.IsInfinity(networkMatrix.NodeIdWithCurrentPrice[receiverId]))
            {
                return(null);
            }

            var route = BuildRoute(networkMatrix, senderId, receiverId);

            return(route.ToArray());
        }
Beispiel #7
0
        public virtual void UpdateComponents()
        {
            var elementsToRemove = new List <Grid>();

            foreach (var createdGrid in CreatedGrids)
            {
                var nodeDto = (NodeDto)createdGrid.Tag;
                var node    = Network.GetNodeById(nodeDto.Id);

                if (node == null)
                {
                    elementsToRemove.Add(createdGrid);
                }
                else
                {
                    createdGrid.Tag = Mapper.Map <Node, NodeDto>(node);
                    nodeDto         = (NodeDto)createdGrid.Tag;

                    createdGrid.Background = GetBackground(nodeDto);
                }
            }

            RemoveRange(elementsToRemove);
        }
Beispiel #8
0
        public void HandleMessage(Message message)
        {
            var receiver = _network.GetNodeById(message.ReceiverId);

            receiver.ReceivedMessages.Add(message);
            message.IsReceived = true;

            switch (message.MessageType)
            {
            case MessageType.General:
            {
                HandleGeneralMessage(message);
                break;
            }

            case MessageType.MatrixUpdateMessage:
            {
                HandleUpdateTableMessage(message);
                break;
            }

            case MessageType.SendingRequest:
            {
                HandleSendingRequest(message);
                break;
            }

            case MessageType.PositiveSendingResponse:
            {
                HandlePositiveSendingResponse(message);
                break;
            }

            case MessageType.NegativeSendingResponse:
            {
                HandleNegativeSendingResponse(message);
                break;
            }

            case MessageType.PositiveReceiveResponse:
            {
                HandlePositiveReceiveResponce(message);
                break;
            }

            default:
            {
                throw new ArgumentOutOfRangeException();
            }
            }

            message.Route = message.Route
                            .Skip(1)
                            .ToArray();
        }
Beispiel #9
0
        private void SearchConnectedNodes(ICollection <Node> currentNetwork, Node node)
        {
            foreach (var linkedNodeId in node.LinkedNodesId)
            {
                var channel = _network.GetChannel(node.Id, linkedNodeId);

                if (currentNetwork.Any(n => n.Id == linkedNodeId) || channel.ChannelType == ChannelType.Satellite)
                {
                    continue;
                }

                var linkedNode = _network.GetNodeById(linkedNodeId);
                currentNetwork.Add(linkedNode);

                SearchConnectedNodes(currentNetwork, linkedNode);
            }
        }