Esempio n. 1
0
        public void DelayedElement()
        {
            var senderId   = "A";
            var receiverId = "B";

            var senderSorter = new MessageSorter();

            var message1 = Send(senderId, receiverId, "1", senderSorter, DateTime.UtcNow);
            var message2 = Send(senderId, receiverId, "2", senderSorter, DateTime.UtcNow);
            var message3 = Send(senderId, receiverId, "3", senderSorter, DateTime.UtcNow);

            List <RequestMessage> batch;
            MessageSorter         receiverSorter;

            // delivering first message last delays all messages until getting the first one
            receiverSorter = new MessageSorter();
            batch          = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList();
            Assert.Empty(batch);
            batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList();
            Assert.Empty(batch);
            batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList();
            Assert.Collection(
                batch,
                first => first.Input.Equals("1"),
                second => second.Input.Equals("2"),
                third => third.Input.Equals("3"));

            Assert.Equal(0, receiverSorter.NumberBufferedRequests);
        }
Esempio n. 2
0
        public void NoFilteringOrSortingPastReorderWindow()
        {
            var senderId   = "A";
            var receiverId = "B";

            var senderSorter = new MessageSorter();
            var now          = DateTime.UtcNow;

            // last message is sent after an interval exceeding the reorder window
            var message1 = Send(senderId, receiverId, "1", senderSorter, now);
            var message2 = Send(senderId, receiverId, "2", senderSorter, now + TimeSpan.FromTicks(1));
            var message3 = Send(senderId, receiverId, "3", senderSorter, now + TimeSpan.FromTicks(2) + ReorderWindow);

            List <RequestMessage> batch;
            MessageSorter         receiverSorter = new MessageSorter();

            // delivering the sequence in order produces 1 message each time
            receiverSorter = new MessageSorter();
            batch          = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("1");
            batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("2");
            batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("3");

            // duplicates are not filtered or sorted, but simply passed through, because we are past the reorder window
            batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("2");
            batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("1");

            Assert.Equal(0, receiverSorter.NumberBufferedRequests);
        }
Esempio n. 3
0
        public void WackySystemClock()
        {
            var senderId   = "A";
            var receiverId = "B";

            var senderSorter = new MessageSorter();

            // simulate system clock that goes backwards - mechanism should still guarantee monotonicitty
            var message1 = Send(senderId, receiverId, "1", senderSorter, DateTime.UtcNow);
            var message2 = Send(senderId, receiverId, "2", senderSorter, DateTime.UtcNow - TimeSpan.FromSeconds(1));
            var message3 = Send(senderId, receiverId, "3", senderSorter, DateTime.UtcNow - TimeSpan.FromSeconds(2));

            List <RequestMessage> batch;
            MessageSorter         receiverSorter = new MessageSorter();

            // delivering the sequence in order produces 1 message each time
            receiverSorter = new MessageSorter();
            batch          = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("1");
            batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("2");
            batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("3");

            Assert.Equal(0, receiverSorter.NumberBufferedRequests);
        }
Esempio n. 4
0
        public void SimpleInOrder()
        {
            var senderId   = "A";
            var receiverId = "B";

            var senderSorter = new MessageSorter();

            var message1 = Send(senderId, receiverId, "1", senderSorter, DateTime.UtcNow);
            var message2 = Send(senderId, receiverId, "2", senderSorter, DateTime.UtcNow);
            var message3 = Send(senderId, receiverId, "3", senderSorter, DateTime.UtcNow);

            List <RequestMessage> batch;
            MessageSorter         receiverSorter = new MessageSorter();

            // delivering the sequence in order produces 1 message each time
            receiverSorter = new MessageSorter();
            batch          = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("1");
            batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("2");
            batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList();
            Assert.Single(batch).Input.Equals("3");

            Assert.Equal(0, receiverSorter.NumberBufferedRequests);
        }
Esempio n. 5
0
        public override void DistanceUpdatingHandler(DistanceUpdatingMessageReader request)
        {
            List <DistanceUpdatingMessage> DistanceUpdatingMessageList = new List <DistanceUpdatingMessage>();

            request.recipients.ForEach((cellId) =>
            {
                using (var cell = Global.LocalStorage.UseSSSPCell(cellId))
                {
                    if (cell.distance > request.distance + 1)
                    {
                        cell.distance = request.distance + 1;
                        cell.parent   = request.senderId;
                        Console.Write(cell.distance + " ");
                        MessageSorter sorter = new MessageSorter(cell.neighbors);

                        for (int i = 0; i < Global.ServerCount; i++)
                        {
                            DistanceUpdatingMessageWriter msg = new DistanceUpdatingMessageWriter(cell.CellID.Value,
                                                                                                  cell.distance, sorter.GetCellRecipientList(i));
                            Global.CloudStorage.DistanceUpdatingToSSSPServer(i, msg);
                        }
                    }
                }
            });
        }
Esempio n. 6
0
        private void performAction(long cellId)
        {
            using (var rootCell = Global.LocalStorage.UseSSSPCell(cellId))
            {
                //Console.WriteLine("PerformAction: " + cellId);
                //update rankValue && storedRankValue

                //rootCell.rankValue = rootCell.storedRankValue - rootCell.oldStoredRankValue;
                //rootCell.oldStoredRankValue = rootCell.storedRankValue;

                //long rankValueP = (rootCell.rankValue - rootCell.oldRankValue) / rootCell.neighbors.Count;
                double rankValueP = (rootCell.storedRankValue - rootCell.rankValue) / rootCell.neighbors.Count;

                MessageSorter sorter = new MessageSorter(rootCell.neighbors);
                for (int i = 0; i < Global.SlaveCount; i++)
                {
                    //Console.WriteLine(3);
                    RankUpdatingMessageWriter msg = new RankUpdatingMessageWriter(rootCell.CellID.Value, rankValueP, sorter.GetCellRecipientList(i));
                    //Console.WriteLine(4);
                    Global.CloudStorage.RankUpdatingToSlave(i, msg);
                    //Console.WriteLine(5);
                }

                //update
                //Console.WriteLine(6);
                //rootCell.oldRankValue = rootCell.rankValue;
                rootCell.rankValue = rootCell.storedRankValue;
            }
        }
Esempio n. 7
0
        public override void BFSUpdateHandler(BFSUpdateMessageReader request)
        {
            request.recipients.ForEach((cellId) => {
                using (var cell = Global.LocalStorage.UseBFSCell(cellId)) {
                    if (cell.level > request.level + 1)
                    {
                        cell.level  = request.level + 1;
                        cell.parent = request.senderId;

                        List <long> aliveNeighbors = new List <long>();
                        for (int i = 0; i < cell.neighbors.Count; i++)
                        {
                            if (Global.CloudStorage.Contains(cell.neighbors[i]))
                            {
                                aliveNeighbors.Add(cell.neighbors[i]);
                            }
                        }

                        //MessageSorter sorter = new MessageSorter(cell.neighbors);
                        MessageSorter sorter = new MessageSorter(aliveNeighbors);

                        for (int i = 0; i < Global.ServerCount; i++)
                        {
                            BFSUpdateMessageWriter msg = new BFSUpdateMessageWriter(cell.CellId, cell.level, sorter.GetCellRecipientList(i));
                            Global.CloudStorage.BFSUpdateToBFSServer(i, msg);
                        }
                    }
                }
            });
        }
Esempio n. 8
0
        internal void HandleMessage(Guid clientId, Container container)
        {
            if (!_connections.TryGetValue(clientId, out WsConnection connection))
            {
                return;
            }

            _connections.RefreshLifeClient(clientId);
            switch (container.Identifier)
            {
            case DispatchType.Login:
                if (((JObject)container.Payload).ToObject(typeof(LoginRequestContainer)) is LoginRequestContainer loginRequest)
                {
                    LoginResponseContainer loginResponse;
                    bool         isEnter = true;
                    DispatchType stage;

                    if (UserOnlineList.Contains(loginRequest.Content))
                    {
                        loginResponse = new LoginResponseContainer(
                            new Response(ResponseType.Failure, $"Client with name '{loginRequest.Content}' yet connect."),
                            null,
                            null,
                            null,
                            null);
                        connection.Send(loginResponse.GetContainer());
                        connection.Login = $"pseudo-{loginRequest.Content}";
                        stage            = DispatchType.Connection;
                    }
                    else
                    {
                        isEnter          = UserOfflineList.Contains(loginRequest.Content);
                        loginResponse    = new LoginResponseContainer(new Response(ResponseType.Ok, "Connected"), null, null, null, null);
                        connection.Login = loginRequest.Content;
                        stage            = DispatchType.Login;
                    }

                    var eventLogMessage = new EventLogMessage
                    {
                        IsSuccessfully = loginResponse.Content.Result == ResponseType.Ok == isEnter,
                        SenderName     = _name,
                        Text           = loginResponse.Content.Reason,
                        Time           = DateTime.Now,
                        Type           = stage
                    };

                    ConnectionStateChanged?.Invoke(this, new ConnectionStateChangedEventArgs(connection.Login, true, eventLogMessage));
                }

                break;

            case DispatchType.Message:
                MessageReceivedEventArgs message = MessageSorter.GetSortedMessage((JObject)container.Payload);
                MessageReceived?.Invoke(this, message);
                Send(MessageSorter.GetSortedMessage(message.Author, message.Message, InterfaceType.WebSocket, message.Agenda), message.Agenda);
                break;
            }
        }
Esempio n. 9
0
        private void OnMessage(object sender, MessageEventArgs eventArgs)
        {
            if (!eventArgs.IsText)
            {
                return;
            }

            var container = JsonConvert.DeserializeObject <Container>(eventArgs.Data);

            switch (container.Identifier)
            {
            case DispatchType.Login:
                if (((JObject)container.Payload).ToObject(typeof(LoginResponseContainer)) is LoginResponseContainer loginResponse)
                {
                    var eventLog = new EventLogMessage()
                    {
                        IsSuccessfully = true,
                        SenderName     = _login,
                        Text           = "Login",
                        Time           = DateTime.Now,
                        Type           = DispatchType.Login
                    };
                    if (loginResponse.Content.Result == ResponseType.Failure)
                    {
                        eventLog.IsSuccessfully = false;
                        eventLog.Text           = loginResponse.Content.Reason;
                    }

                    LoginEvent?.Invoke(
                        this,
                        new LoginEventArgs(
                            _login,
                            eventLog.IsSuccessfully,
                            eventLog,
                            loginResponse.General,
                            loginResponse.OnlineList,
                            loginResponse.OfflineList,
                            loginResponse.EventLogMessageList));
                }

                break;

            case DispatchType.Message:
                MessageReceived?.Invoke(this, MessageSorter.GetSortedMessage((JObject)container.Payload));
                break;

            case DispatchType.Channel:
                UpdateChannel?.Invoke(this, MessageSorter.GetSortedChannel((JObject)container.Payload));
                break;

            case DispatchType.EventLog:
                LogEvent?.Invoke(this, MessageSorter.GetSortedEventMessage((JObject)container.Payload));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Prepares the report body as byte array by report body details.
        /// </summary>
        /// <param name="details">The details.</param>
        /// <returns></returns>
        public byte[] PrepareDocument(IReportBodyDetails details)
        {
            var threads = MessageSorter.ProcessMessages(details.Messages);
            var report  = new StringBuilder();

            var header = PrepareHeaderPart(details);

            report.AppendLine(header).AppendLine(string.Empty);

            threads.ForEach(c => report.AppendLine(PrepareContentPart(c, details.Since, details.IsChannel)));
            return(Encoding.UTF8.GetBytes(report.ToString()));
        }
Esempio n. 11
0
        public List <MessageVO> GetChat(UserVO from, UserVO to)
        {
            List <MessageVO> m = GetMessages(to, from);

            m.AddRange(GetMessages(from, to));
            MessageSorter sorter = new MessageSorter();

            m.Sort(sorter);

            SetMessagesSeen(from, to);
            DeleteOldMessages(from, to);
            return(m);
        }
Esempio n. 12
0
        public void RandomCollection()
        {
            var senderId   = "A";
            var receiverId = "B";

            var senderSorter   = new MessageSorter();
            var receiverSorter = new MessageSorter();

            var messageCount = 100;

            var random = new Random(0);
            var now    = DateTime.UtcNow;

            // create a ordered sequence of messages
            var messages = new List <RequestMessage>();

            for (int i = 0; i < messageCount; i++)
            {
                messages.Add(Send(senderId, receiverId, i.ToString(), senderSorter, now + TimeSpan.FromSeconds(random.Next(5)), TimeSpan.FromSeconds(10)));
            }

            // shuffle the messages
            Shuffle(messages, random);

            // add a final message
            messages.Add(Send(senderId, receiverId, (messageCount + 1).ToString(), senderSorter, now + TimeSpan.FromSeconds(1000), TimeSpan.FromSeconds(10)));

            // deliver all the messages
            var deliveredMessages = new List <RequestMessage>();

            for (int i = 0; i < messageCount; i++)
            {
                foreach (var deliveredMessage in receiverSorter.ReceiveInOrder(messages[i], TimeSpan.FromSeconds(10)))
                {
                    deliveredMessages.Add(deliveredMessage);
                }

                Assert.Equal(i + 1, deliveredMessages.Count + receiverSorter.NumberBufferedRequests);
            }

            // receive the final messages
            foreach (var deliveredMessage in receiverSorter.ReceiveInOrder(messages[messageCount], TimeSpan.FromSeconds(10)))
            {
                deliveredMessages.Add(deliveredMessage);
            }

            // check that all messages were delivered
            Assert.Equal(messageCount + 1, deliveredMessages.Count());

            Assert.Equal(0, receiverSorter.NumberBufferedRequests);
        }
Esempio n. 13
0
        public void RandomShuffleAndDuplication()
        {
            var senderId   = "A";
            var receiverId = "B";

            var senderSorter   = new MessageSorter();
            var receiverSorter = new MessageSorter();

            var messageCount   = 100;
            var duplicateCount = 100;

            // create a ordered sequence of messages
            var messages = new List <RequestMessage>();

            for (int i = 0; i < messageCount; i++)
            {
                messages.Add(Send(senderId, receiverId, i.ToString(), senderSorter, DateTime.UtcNow));
            }

            // add some random duplicates
            var random = new Random(0);

            for (int i = 0; i < duplicateCount; i++)
            {
                messages.Add(messages[random.Next(messageCount)]);
            }

            // shuffle the messages
            Shuffle(messages, random);

            // deliver all the messages
            var deliveredMessages = new List <RequestMessage>();

            foreach (var msg in messages)
            {
                foreach (var deliveredMessage in receiverSorter.ReceiveInOrder(msg, ReorderWindow))
                {
                    deliveredMessages.Add(deliveredMessage);
                }
            }

            // check that the delivered messages are the original sequence
            Assert.Equal(messageCount, deliveredMessages.Count());
            for (int i = 0; i < messageCount; i++)
            {
                Assert.Equal(i.ToString(), deliveredMessages[i].Input);
            }

            Assert.Equal(0, receiverSorter.NumberBufferedRequests);
        }
Esempio n. 14
0
        private void HandlePacket(byte[] packet)
        {
            string serializedMessages = GetStringPacket(packet);
            var    container          = JsonConvert.DeserializeObject <Container>(serializedMessages);

            switch (container.Identifier)
            {
            case DispatchType.Login:
                if (((JObject)container.Payload).ToObject(typeof(LoginResponseContainer)) is LoginResponseContainer loginResponse)
                {
                    var eventLog = new EventLogMessage
                    {
                        IsSuccessfully = loginResponse.Content.Result == ResponseType.Ok,
                        SenderName     = _login,
                        Text           = loginResponse.Content.Reason,
                        Time           = DateTime.Now,
                        Type           = DispatchType.Login
                    };
                    _isLogin = eventLog.IsSuccessfully;
                    LoginEvent?.Invoke(
                        this,
                        new LoginEventArgs(
                            _login,
                            eventLog.IsSuccessfully,
                            eventLog,
                            loginResponse.General,
                            loginResponse.OnlineList,
                            loginResponse.OfflineList,
                            loginResponse.EventLogMessageList));
                }

                break;

            case DispatchType.Message:
                MessageReceived?.Invoke(this, MessageSorter.GetSortedMessage((JObject)container.Payload));
                break;

            case DispatchType.Channel:
                UpdateChannel?.Invoke(this, MessageSorter.GetSortedChannel((JObject)container.Payload));
                break;

            case DispatchType.EventLog:
                LogEvent?.Invoke(this, MessageSorter.GetSortedEventMessage((JObject)container.Payload));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 15
0
        private void initialSend(SSSPCell rootCell)
        {
            //Console.WriteLine(value);
            addCount();

            double v = 1 / rootCell.outNeighbors.Count;

            MessageSorter sorter = new MessageSorter(rootCell.outNeighbors);

            for (int i = 0; i < Global.SlaveCount; i++)
            {
                RankUpdatingMessageWriter msg =
                    new RankUpdatingMessageWriter(rootCell.CellID, v, sorter.GetCellRecipientList(i));
                Global.CloudStorage.RankUpdatingToSlave(i, msg);
            }
        }
Esempio n. 16
0
        private void HandleMessageReceived(object sender, MessageReceivedEventArgs eventArgs)
        {
            string messageServer   = $"{eventArgs.Agenda.Type}:{eventArgs.Author}:{eventArgs.Message}";
            var    eventLogMessage = new EventLogMessage
            {
                IsSuccessfully = true,
                SenderName     = eventArgs.Author,
                Text           = messageServer,
                Time           = DateTime.Now,
                Type           = DispatchType.Message
            };

            switch (eventArgs.Agenda.Type)
            {
            case ChannelType.General:
                SendCurrentServer(eventArgs.Type, MessageSorter.GetSortedMessage(eventArgs), eventArgs.Agenda);
                User user           = _dataBaseManager.UserList.Find(u => u.Name == eventArgs.Author);
                var  generalMessage = new GeneralMessage
                {
                    Message = eventArgs.Message,
                    Time    = eventArgs.Time,
                    User_Id = user.Id
                };
                _dataBaseManager.CreateGeneralMessageAsync(generalMessage);
                break;

            case ChannelType.Private:
                SendCurrentServer(eventArgs.Type, MessageSorter.GetSortedMessage(eventArgs), eventArgs.Agenda);
                var privateMessage = new PrivateMessage
                {
                    Message  = eventArgs.Message,
                    Time     = eventArgs.Time,
                    SenderId = _dataBaseManager.UserList.Find(u => u.Name == eventArgs.Author).Id,
                    TargetId = _dataBaseManager.UserList.Find(u => u.Name == ((PrivateAgenda)eventArgs.Agenda).Target).Id
                };
                _dataBaseManager.CreatePrivateMessageAsync(privateMessage);
                break;

            case ChannelType.Group:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            EventSaveAsync(new MessageEventLogContainer(eventLogMessage), eventArgs.Agenda);
        }
Esempio n. 17
0
        public override void StartSSSPHandler(StartSSSPMessageReader request)
        {
            if (Global.CloudStorage.IsLocalCell(request.root))
            {
                using (var rootCell = Global.LocalStorage.UseSSSPCell(request.root)) {
                    rootCell.distance = 0;
                    rootCell.parent   = -1;

                    MessageSorter sorter = new MessageSorter(rootCell.neighbors);
                    for (int i = 0; i < Global.ServerCount; i++)
                    {
                        DistanceUpdatingMessageWriter msg = new DistanceUpdatingMessageWriter(rootCell.CellId, 0, sorter.GetCellRecipientList(i));
                        Global.CloudStorage.DistanceUpdatingToSSSPServer(i, msg);
                    }
                }
            }
        }
Esempio n. 18
0
        public override void StartBFSHandler(StartBFSMessageReader request)
        {
            if (Global.CloudStorage.IsLocalCell(request.root))
            {
                using (var rootCell = Global.LocalStorage.UseBFSCell(request.root)) {
                    rootCell.level  = 0;
                    rootCell.parent = request.root;

                    MessageSorter sorter = new MessageSorter(rootCell.neighbors);
                    for (int i = 0; i < Global.ServerCount; i++)
                    {
                        BFSUpdateMessageWriter msg = new BFSUpdateMessageWriter(rootCell.CellId, 0, sorter.GetCellRecipientList(i));
                        Global.CloudStorage.BFSUpdateToBFSServer(i, msg);
                    }
                }
            }
        }
Esempio n. 19
0
        public void TestArgumentExceptions()
        {
            var messages = new List <MessageSummary> {
                new MessageSummary(0)
            };
            var orderBy      = new OrderBy[] { OrderBy.Arrival };
            var emptyOrderBy = new OrderBy[0];

            Assert.Throws <ArgumentNullException> (() => MessageSorter.Sort((List <MessageSummary>)null, orderBy));
            Assert.Throws <ArgumentNullException> (() => MessageSorter.Sort(messages, null));
            Assert.Throws <ArgumentException> (() => MessageSorter.Sort(messages, emptyOrderBy));
            Assert.Throws <ArgumentException> (() => MessageSorter.Sort(messages, orderBy));

            Assert.Throws <ArgumentNullException> (() => MessageSorter.Sort((IEnumerable <MessageSummary>)null, orderBy));
            Assert.Throws <ArgumentNullException> (() => MessageSorter.Sort((IEnumerable <MessageSummary>)messages, null));
            Assert.Throws <ArgumentException> (() => MessageSorter.Sort((IEnumerable <MessageSummary>)messages, emptyOrderBy));
            Assert.Throws <ArgumentException> (() => MessageSorter.Sort((IEnumerable <MessageSummary>)messages, orderBy));
        }
Esempio n. 20
0
        public List <MessageVO> GetUnseenMessages(UserVO from, UserVO to)
        {
            SqlParameter[] parameters =
            {
                MakeSqlParameter(messageFrom,   from.Id),
                MakeSqlParameter(messageTo,     to.Id),
                MakeSqlParameter(messageIsSeen, false, SqlDbType.Bit)
            };

            List <MessageVO> result = IdenticalMatch(parameters);
            MessageSorter    sorter = new MessageSorter();

            result.Sort(sorter);

            SetMessagesSeen(from, to);
            DeleteOldMessages(from, to);

            return(result);
        }
Esempio n. 21
0
        private void initialPropagate(SSSPCell cell, bool isActive)
        {
            //clear
            for (int i = 0; i < cell.inNeighborsReceivedStatus.Count; i++)
            {
                cell.inNeighborsReceivedStatus[i] = false;
            }
            //cell.receivedNeighborCount = 0;

            //send-out
            double v = 1.0 / cell.outNeighbors.Count;

            MessageSorter sorter = new MessageSorter(cell.outNeighbors);

            for (int i = 0; i < Global.SlaveCount; i++)
            {
                //Console.WriteLine(sorter.GetCellRecipientList(i).Count);
                RankUpdatingMessageWriter msg = new RankUpdatingMessageWriter(cell.CellID, isActive, v, sorter.GetCellRecipientList(i));
                Global.CloudStorage.RankUpdatingToSlave(i, msg);
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Prepares the body.
        /// </summary>
        /// <param name="details">The details.</param>
        /// <param name="doc">The document.</param>
        /// <param name="messageTemplate">The message template.</param>
        protected void PrepareBody(IReportBodyDetails details, HtmlDocument doc, string messageTemplate)
        {
            var threadsNode = doc.GetElementbyId("history");

            var threads = MessageSorter.ProcessMessages(details.Messages);

            foreach (var thread in threads)
            {
                threadsNode.SetAttributeValue("class", "threads-container");

                if (details.IsChannel)
                {
                    if (thread.IsFull)
                    {
                        threadsNode.AppendChild(PrepareMessageDetails(thread.Messages.First(), true, messageTemplate, details.IsChannel));
                    }
                    else
                    {
                        if (details.Since.HasValue)
                        {
                            threadsNode.AppendChild(CreateConversationWarning(details.Since.Value));
                        }

                        threadsNode.AppendChild(PrepareMessageDetails(thread.Messages.First(), false, messageTemplate, details.IsChannel));
                    }

                    thread.Messages.Skip(1).ToList().ForEach(c => threadsNode.AppendChild(PrepareMessageDetails(c, false, messageTemplate, details.IsChannel)));
                }
                else
                {
                    if (!thread.IsFull && details.Since.HasValue)
                    {
                        threadsNode.AppendChild(CreateConversationWarning(details.Since.Value));
                    }

                    thread.Messages.ForEach(c => threadsNode.AppendChild(PrepareMessageDetails(c, false, messageTemplate, details.IsChannel)));
                }
            }
        }
Esempio n. 23
0
        private void step_one(long node_count)
        {
            for (int k = 0; k < node_count; k++)
            {
                if (Global.CloudStorage.Contains(k) && Global.CloudStorage.IsLocalCell(k))
                {
                    using (var rootCell = Global.LocalStorage.UseSSSPCell(k))
                    {
                        if (rootCell.neighbors.Count == 0)
                        {
                            continue;
                        }

                        double        rankValueP = rootCell.rankValue / rootCell.neighbors.Count;
                        MessageSorter sorter     = new MessageSorter(rootCell.neighbors);
                        for (int i = 0; i < Global.SlaveCount; i++)
                        {
                            DistanceUpdatingMessageWriter msg = new DistanceUpdatingMessageWriter(rootCell.CellID.Value, rankValueP, sorter.GetCellRecipientList(i));
                            Global.CloudStorage.DistanceUpdatingToSlave(i, msg);
                        }
                    }
                }
            }
        }
Esempio n. 24
0
        private void performActionOne(long cellId)
        {
            using (var rootCell = Global.LocalStorage.UseSSSPCell(cellId))
            {

                double rankValueP = rootCell.rankValue / rootCell.neighbors.Count;

                MessageSorter sorter = new MessageSorter(rootCell.neighbors);
                for (int i = 0; i < Global.SlaveCount; i++)
                {
                    //Console.WriteLine(3);
                    RankUpdatingMessageWriter msg = new RankUpdatingMessageWriter(rootCell.CellID.Value, rankValueP, sorter.GetCellRecipientList(i));
                    //Console.WriteLine(4);
                    Global.CloudStorage.RankUpdatingToSlave(i, msg);
                    //Console.WriteLine(5);
                }

                //update
                //Console.WriteLine(6);
                //rootCell.oldRankValue = rootCell.rankValue;
            }
        }
        private void performAction(long cellId)
        {
            //Console.WriteLine(0);

            using (var rootCell = Global.LocalStorage.UseSSSPCell(cellId))
            {
                //activated cell should satisfy storedRankValue > rankValue
                rootCell.rankValue = rootCell.storedRankValue;

                /*
                if (rootCell.status == false) return;
                if (rootCell.neighbors.Count == 0)
                {
                    rootCell.status = false;
                    return;
                }
                */

                //Console.WriteLine(1);

                //compute current rankValueP
                long rankValueP = rootCell.rankValue / rootCell.neighbors.Count;

                //if (rootCell.oldRankValueP < rankValueP)
                //{

                //send the rank difference
                MessageSorter sorter = new MessageSorter(rootCell.neighbors);
                //Console.WriteLine(2);
                for (int i = 0; i < Global.SlaveCount; i++)
                {
                    //Console.WriteLine(3);
                    RankUpdatingMessageWriter msg = new RankUpdatingMessageWriter(rootCell.CellID.Value, rankValueP - rootCell.oldRankValueP, sorter.GetCellRecipientList(i));
                    //Console.WriteLine(4);
                    Global.CloudStorage.RankUpdatingToSlave(i, msg);
                    //Console.WriteLine(5);
                }

                //update
                //Console.WriteLine(6);
                rootCell.oldRankValueP = rankValueP;

                //}
            }
        }
Esempio n. 26
0
        /// <summary>
        /// Gets mail headers
        /// </summary>
        /// <param name="searchTerm"></param>
        /// <returns></returns>
        public static ObservableCollection <MailHeader> GetMailHeaders(string searchTerm)
        {
            ObservableCollection <MailHeader> headerList = new ObservableCollection <MailHeader>();

            if (LoggedIn)
            {
                var inbox = client.Inbox;
                inbox.Open(FolderAccess.ReadWrite);

                //Debug.WriteLine("Total messages: {0}", inbox.Count);

                var orderBy = new[] { OrderBy.ReverseArrival };

                List <IMessageSummary> msgList = null;

                //If the searchTerm isnt null or empty, search for messages matching the searchterm and sort them
                //in reverse arrival order
                if (!string.IsNullOrEmpty(searchTerm))
                {
                    //Search query
                    var query = (SearchQuery.SubjectContains(searchTerm)).Or(SearchQuery.BodyContains(searchTerm));

                    //Searches the mail folder using the query
                    var uidList = inbox.Search(query);

                    if (uidList.Count != 0)
                    {
                        //Fetches the messagesummaries of uidList
                        msgList = inbox.Fetch(uidList, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId).ToList();

                        //Sorts msgList in reverse arrival sort order
                        MessageSorter.Sort(msgList, orderBy);

                        isMailSearchSuccess = true;
                    }
                    else
                    {
                        isMailSearchSuccess = false;
                        return(null);
                    }
                }
                //If the searchTerm is null or empty, fetch all messagesummaries and sort them in
                //reverse arrival order
                else
                {
                    //Fetches all messagesummaries
                    msgList = inbox.Fetch(0, -1, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId).ToList();

                    if (msgList.Count != 0)
                    {
                        //Sorts msgList in reverse arrival sort order
                        MessageSorter.Sort(msgList, orderBy);
                    }
                    else
                    {
                        return(null);
                    }
                }

                foreach (MessageSummary summary in msgList)
                {
                    MailHeader mailHeader = ConvertMessageSummary(summary);
                    headerList.Add(mailHeader);
                }
            }
            else
            {
                if (Login())
                {
                    GetMailHeaders(searchTerm);
                }
            }
            return(headerList);
        }
Esempio n. 27
0
        private void send(long fromCellId, double value)
        {
            //Console.WriteLine(value);
            addCount();

            double v = 0;
            using (var rootCell = Global.LocalStorage.UseSSSPCell(fromCellId))
            {
                try
                {
                    v = value / rootCell.outNeighbors.Count;

                    MessageSorter sorter = new MessageSorter(rootCell.outNeighbors);
                    for (int i = 0; i < Global.SlaveCount; i++)
                    {
                        RankUpdatingMessageWriter msg = new RankUpdatingMessageWriter(rootCell.CellID.Value, v, sorter.GetCellRecipientList(i));
                        Global.CloudStorage.RankUpdatingToSlave(i, msg);
                    }
                }
                catch (Exception e)
                {
                    //Console.Error.WriteLine(e);
                    Console.WriteLine(fromCellId);
                }
            }
        }
Esempio n. 28
0
        private void step_one(long node_count)
        {
            for (int k = 0; k < node_count; k++)
            {
                if (Global.CloudStorage.Contains(k) && Global.CloudStorage.IsLocalCell(k))
                {
                    using (var rootCell = Global.LocalStorage.UseSSSPCell(k))
                    {
                        if (rootCell.neighbors.Count == 0) continue;

                        double rankValueP = rootCell.rankValue / rootCell.neighbors.Count;
                        MessageSorter sorter = new MessageSorter(rootCell.neighbors);
                        for (int i = 0; i < Global.SlaveCount; i++)
                        {
                            DistanceUpdatingMessageWriter msg = new DistanceUpdatingMessageWriter(rootCell.CellID.Value, rankValueP, sorter.GetCellRecipientList(i));
                            Global.CloudStorage.DistanceUpdatingToSlave(i, msg);
                        }
                    }
                }
            }
        }
Esempio n. 29
0
        private static RequestMessage Send(string senderId, string receiverId, string input, MessageSorter sorter, DateTime now, TimeSpan?reorderWindow = null)
        {
            var msg = new RequestMessage()
            {
                Id = Guid.NewGuid(),
                ParentInstanceId = senderId,
                Input            = input,
            };

            sorter.LabelOutgoingMessage(msg, receiverId, now, reorderWindow.HasValue ? reorderWindow.Value : ReorderWindow);
            return(msg);
        }
Esempio n. 30
0
        private void send(SSSPCell rootCell)
        {
            //Console.WriteLine(value);
            addCount();

            double v = rootCell.sum / rootCell.outNeighbors.Count;

            MessageSorter sorter = new MessageSorter(rootCell.outNeighbors);
            for (int i = 0; i < Global.SlaveCount; i++)
            {
                RankUpdatingMessageWriter msg =
                    new RankUpdatingMessageWriter(rootCell.CellID, v, sorter.GetCellRecipientList(i));
                Global.CloudStorage.RankUpdatingToSlave(i, msg);
            }
        }
Esempio n. 31
0
        public void TestSorting()
        {
            var messages = new List <MessageSummary> ();
            IList <MessageSummary> sorted;
            MessageSummary         summary;

            summary                  = new MessageSummary(0);
            summary.Envelope         = new Envelope();
            summary.Envelope.Date    = DateTimeOffset.Now;
            summary.Envelope.Subject = "aaaa";
            summary.Envelope.From    = InternetAddressList.Parse("Jeffrey Stedfast <*****@*****.**>");
            summary.Envelope.To      = InternetAddressList.Parse("Jeffrey Stedfast <*****@*****.**>");
            summary.Envelope.Cc      = new InternetAddressList();
            summary.MessageSize      = 520;
            messages.Add(summary);

            summary                  = new MessageSummary(1);
            summary.Envelope         = new Envelope();
            summary.Envelope.Date    = DateTimeOffset.Now;
            summary.Envelope.Subject = "bbbb";
            summary.Envelope.From    = InternetAddressList.Parse("Jeffrey Stedfast <*****@*****.**>");
            summary.Envelope.To      = InternetAddressList.Parse("Jeffrey Stedfast <*****@*****.**>");
            summary.Envelope.Cc      = new InternetAddressList();
            summary.MessageSize      = 265;
            messages.Add(summary);

            summary                  = new MessageSummary(2);
            summary.Envelope         = new Envelope();
            summary.Envelope.Date    = DateTimeOffset.Now;
            summary.Envelope.Subject = "cccc";
            summary.Envelope.From    = InternetAddressList.Parse("Jeffrey Stedfast <*****@*****.**>");
            summary.Envelope.To      = InternetAddressList.Parse("Jeffrey Stedfast <*****@*****.**>");
            summary.Envelope.Cc      = new InternetAddressList();
            summary.MessageSize      = 520;
            messages.Add(summary);

            sorted = MessageSorter.Sort(messages, new [] { OrderBy.Arrival });
            Assert.AreEqual(0, sorted[0].Index, "Sorting by arrival failed.");
            Assert.AreEqual(1, sorted[1].Index, "Sorting by arrival failed.");
            Assert.AreEqual(2, sorted[2].Index, "Sorting by arrival failed.");

            sorted = MessageSorter.Sort(messages, new [] { OrderBy.ReverseArrival });
            Assert.AreEqual(2, sorted[0].Index, "Sorting by reverse arrival failed.");
            Assert.AreEqual(1, sorted[1].Index, "Sorting by reverse arrival failed.");
            Assert.AreEqual(0, sorted[2].Index, "Sorting by reverse arrival failed.");

            sorted = MessageSorter.Sort(messages, new [] { OrderBy.Subject });
            Assert.AreEqual(0, sorted[0].Index, "Sorting by subject failed.");
            Assert.AreEqual(1, sorted[1].Index, "Sorting by subject failed.");
            Assert.AreEqual(2, sorted[2].Index, "Sorting by subject failed.");

            sorted = MessageSorter.Sort(messages, new [] { OrderBy.ReverseSubject });
            Assert.AreEqual(2, sorted[0].Index, "Sorting by reverse subject failed.");
            Assert.AreEqual(1, sorted[1].Index, "Sorting by reverse subject failed.");
            Assert.AreEqual(0, sorted[2].Index, "Sorting by reverse subject failed.");

            sorted = MessageSorter.Sort(messages, new [] { OrderBy.Size });
            Assert.AreEqual(1, sorted[0].Index, "Sorting by size failed.");

            sorted = MessageSorter.Sort(messages, new [] { OrderBy.Size, OrderBy.Subject });
            Assert.AreEqual(1, sorted[0].Index, "Sorting by size+subject failed.");
            Assert.AreEqual(0, sorted[1].Index, "Sorting by size+subject failed.");
            Assert.AreEqual(2, sorted[2].Index, "Sorting by size+subject failed.");

            sorted = MessageSorter.Sort(messages, new [] { OrderBy.ReverseSize, OrderBy.ReverseSubject });
            Assert.AreEqual(2, sorted[0].Index, "Sorting by size+subject failed.");
            Assert.AreEqual(0, sorted[1].Index, "Sorting by size+subject failed.");
            Assert.AreEqual(1, sorted[2].Index, "Sorting by size+subject failed.");
        }
Esempio n. 32
0
        private void propagate(SSSPCell cell, bool isActive)
        {
            //clear
            for (int i = 0; i < cell.inNeighborsReceivedStatus.Count; i++)
            {
                cell.inNeighborsReceivedStatus[i] = false;
            }
            //cell.receivedNeighborCount = 0;

            //send-out
            double v = cell.sum / cell.outNeighbors.Count;

            MessageSorter sorter = new MessageSorter(cell.outNeighbors);
            for (int i = 0; i < Global.SlaveCount; i++)
            {
                //Console.WriteLine(sorter.GetCellRecipientList(i).Count);
                RankUpdatingMessageWriter msg = new RankUpdatingMessageWriter(cell.CellID, isActive, v, sorter.GetCellRecipientList(i));
                Global.CloudStorage.RankUpdatingToSlave(i, msg);
            }
        }
Esempio n. 33
0
        internal void HandlePacket(IPEndPoint remoteEndpoint, byte[] packet)
        {
            string serializedMessages = GetStringPacket(packet);
            var    container          = JsonConvert.DeserializeObject <Container>(serializedMessages);

            if (!_connections.TryGetValue(remoteEndpoint, out TcpConnection connection))
            {
                return;
            }

            _connections.RefreshLifeClient(remoteEndpoint);
            switch (container.Identifier)
            {
            case DispatchType.Login:
                if (((JObject)container.Payload).ToObject(typeof(LoginRequestContainer)) is LoginRequestContainer loginRequest)
                {
                    LoginResponseContainer loginResponse;
                    bool         isEnter = true;
                    DispatchType stage;

                    if (UserOnlineList.Contains(loginRequest.Content))
                    {
                        loginResponse = new LoginResponseContainer(
                            new Response(ResponseType.Failure, $"Client with name '{loginRequest.Content}' yet connect."),
                            null,
                            null,
                            null,
                            null);
                        connection.Send(ConvertToBytes(loginResponse.GetContainer()));
                        connection.Login = $"pseudo-{loginRequest.Content}";
                        stage            = DispatchType.Connection;
                    }
                    else
                    {
                        isEnter          = UserOfflineList.Contains(loginRequest.Content);
                        loginResponse    = new LoginResponseContainer(new Response(ResponseType.Ok, "Connected"), null, null, null, null);
                        connection.Login = loginRequest.Content;
                        stage            = DispatchType.Login;
                    }

                    var eventLogMessage = new EventLogMessage
                    {
                        IsSuccessfully = loginResponse.Content.Result == ResponseType.Ok == isEnter,
                        SenderName     = _name,
                        Text           = loginResponse.Content.Reason,
                        Time           = DateTime.Now,
                        Type           = stage
                    };

                    ConnectionStateChanged?.Invoke(this, new ConnectionStateChangedEventArgs(connection.Login, true, eventLogMessage));
                }

                break;

            case DispatchType.Message:
                MessageReceivedEventArgs message = MessageSorter.GetSortedMessage((JObject)container.Payload);
                MessageReceived?.Invoke(this, message);
                Send(MessageSorter.GetSortedMessage(message.Author, message.Message, InterfaceType.Tcp, message.Agenda), message.Agenda);
                break;
            }
        }