public void TestGetErrorMessage_Succeed()
        {
            var errorHelper  = new MessageBuilder();
            var testMessage1 = "this is a first test message";
            var testMessage2 = "this is a second test message";

            errorHelper.AppendMessage(testMessage1);
            errorHelper.AppendMessage(testMessage2);

            Assert.AreEqual($"{testMessage1}\r\n{testMessage2}\r\n", errorHelper.GetMessage());
        }
Beispiel #2
0
        public virtual void Populate()
        {
            Trace.Call();

            Name = SyncedName;

            // sync messages
            // cleanup, be sure the output is empty
            _OutputMessageTextView.Clear();

            if (!Frontend.IsLocalEngine && Frontend.UseLowBandwidthMode)
            {
                var msg = new MessageBuilder();
                msg.AppendEventPrefix();
                msg.AppendMessage(_("Low Bandwidth Mode is active: no messages synced."));
                AddMessage(msg.ToMessage());
            }
            else
            {
                if (SyncedMessages != null)
                {
                    // TODO: push messages in batches and give back control to
                    // GTK+ in between for blocking the GUI thread less
                    foreach (MessageModel msg in SyncedMessages)
                    {
                        AddMessage(msg);
                        if (msg.TimeStamp <= SyncedLastSeenMessage)
                        {
                            // let the user know at which position new messages start
                            _OutputMessageTextView.UpdateMarkerline();
                        }
                    }
                }
            }

            // as we don't track which events have already been seen it would
            // show all chats with unseen events after the frontend connect
            if (!HasHighlight)
            {
                HasEvent = false;
                // Smuxi protocol < 0.13 does not support remembering seen
                // messages thus we mark all message as seen as we can't tell
                // which ones are new
                if (Frontend.EngineProtocolVersion < new Version(0, 13))
                {
                    HasActivity = false;
                }
            }

            // reset tab icon to normal
            TabImage.Pixbuf = DefaultTabImage.Pixbuf;
            OnStatusChanged(EventArgs.Empty);

            SyncedMessages = null;
            IsSynced       = true;
        }
Beispiel #3
0
        public virtual void Populate()
        {
            Trace.Call();

            Name = SyncedName;

            // sync messages
            // cleanup, be sure the output is empty
            _OutputMessageTextView.Clear();

            if (!Frontend.IsLocalEngine && Frontend.UseLowBandwidthMode)
            {
                var msg = new MessageBuilder();
                msg.AppendEventPrefix();
                msg.AppendMessage(_("Low Bandwidth Mode is active: no messages synced."));
                AddMessage(msg.ToMessage());
            }
            else
            {
                if (SyncedMessages != null)
                {
                    // TODO: push messages in batches and give back control to
                    // GTK+ in between for blocking the GUI thread less
                    foreach (MessageModel msg in SyncedMessages)
                    {
                        AddMessage(msg);
                    }
                }
            }

            // as we don't track which messages were already seen it would
            // show all chats with message activity after the frontend connect
            if (!HasHighlight)
            {
                HasActivity = false;
                HasEvent    = false;
            }

            // let the user know at which position new messages start
            _OutputMessageTextView.UpdateMarkerline();

            // reset tab icon to normal
            TabImage.Pixbuf = DefaultTabImage.Pixbuf;
            OnStatusChanged(EventArgs.Empty);

            SyncedMessages = null;
            _IsSynced      = true;
        }
Beispiel #4
0
        public void CommandGenerateMessages(CommandModel cmd, IChatView chat)
        {
            Trace.Call(cmd, chat);

            var count = 0;

            Int32.TryParse(cmd.Parameter, out count);

            var builder = new MessageBuilder();
            var sender  = new ContactModel("msg-tester", "msg-tester", "test", "test");

            builder.AppendMessage(sender, "time for a messsage generator command so I can test speed and memory usage");
            var text = builder.CreateText(" *formatted text* ");

            text.Bold = true;
            builder.Append(text);
            builder.AppendUrl("https://www.smuxi.org/");

            var msgs = new List <MessageModel>(count);

            for (var i = 0; i < count; i++)
            {
                var msg = builder.ToMessage();
                msgs.Add(msg);
            }

            DateTime start, stop;

            start = DateTime.UtcNow;
            foreach (var msg in msgs)
            {
                chat.AddMessage(msg);
            }
            stop = DateTime.UtcNow;

            builder = new MessageBuilder();
            builder.AppendText(
                "IChatView.AddMessage(): count: {0} took: {1:0} ms avg: {2:0.00} ms",
                count,
                (stop - start).TotalMilliseconds,
                (stop - start).TotalMilliseconds / count
                );
            chat.AddMessage(builder.ToMessage());
        }
        public FileParseResult ParseFile(string content)
        {
            bool   isSucceed       = true;
            string errorMessage    = string.Empty;
            var    transactionList = new List <Transaction>();

            var csvParserOptions = new CsvParserOptions(_csvOptions.SkipHeader, _csvOptions.Delimiter[0]);
            var csvMapper        = new CsvTransactionMapping();
            var csvParser        = new CsvParser <CsvTransaction>(csvParserOptions, csvMapper);

            var tinyParserResult = csvParser.ReadFromString(new CsvReaderOptions(_csvOptions.NewLineSeparators), content).ToList();

            if (tinyParserResult.Any(row => !row.IsValid))
            {
                isSucceed = false;

                var messageBuilder = new MessageBuilder();

                foreach (var failureRow in tinyParserResult.Where(row => !row.IsValid))
                {
                    messageBuilder.AppendMessage($"Error in Row: {failureRow.Error.ColumnIndex}. " +
                                                 $"Unmapped Row: {failureRow.Error.UnmappedRow}. Error Message: {failureRow.Error.Value}.");
                }

                errorMessage = messageBuilder.GetMessage();
            }
            else
            {
                transactionList = _mapper.Map <List <CsvTransaction>, List <Transaction> >(
                    tinyParserResult.Select(row => row.Result).ToList());
            }

            return(new FileParseResult
            {
                IsSucceed = isSucceed,
                ErrorMessage = errorMessage,
                TransactionList = transactionList
            });
        }
Beispiel #6
0
        public void CommandBenchmarkMessageBuilder(CommandModel cmd)
        {
            Trace.Call(cmd);

            var count         = 1000;
            var showHelp      = false;
            var appendMessage = false;
            var appendText    = false;
            var appendEvent   = false;
            var appendFormat  = false;
            var toMessage     = false;

            try {
                var opts = new NDesk.Options.OptionSet()
                {
                    { "c|count=", v => count = Int32.Parse(v) },
                    { "m|append-message", v => appendMessage = true },
                    { "t|append-text", v => appendText = true },
                    { "e|append-event", v => appendEvent = true },
                    { "f|append-format", v => appendFormat = true },
                    { "T|to-message", v => toMessage = true },
                };
                opts.Add("h|?|help", x => {
                    showHelp   = true;
                    var writer = new StringWriter();
                    opts.WriteOptionDescriptions(writer);
                    AddMessageToFrontend(
                        cmd,
                        CreateMessageBuilder().
                        AppendHeader("{0} usage", cmd.Command).
                        AppendText("\n").
                        AppendText("Parameters:\n").
                        AppendText(writer.ToString()).
                        ToMessage()
                        );
                    return;
                });
                opts.Parse(cmd.Parameter.Split(' '));
                if (showHelp)
                {
                    return;
                }
            } catch (Exception ex) {
                AddMessageToFrontend(
                    cmd,
                    CreateMessageBuilder().
                    AppendErrorText("Invalid parameter: {0}", ex.Message).
                    ToMessage()
                    );
                return;
            }

            DateTime start, stop;

            start = DateTime.UtcNow;
            MessageBuilder builder;

            for (var i = 0; i < count; i++)
            {
                builder = new MessageBuilder();
                if (appendMessage)
                {
                    builder.AppendMessage("This is message with a link to https://www.smuxi.org/.");
                }
                if (appendText)
                {
                    builder.AppendText("This is message with just text.");
                }
                if (appendEvent)
                {
                    builder.AppendEventPrefix();
                }
                if (appendFormat)
                {
                    builder.AppendFormat("{0} [{1}] has joined {2}",
                                         "meebey3",
                                         "[email protected]",
                                         "#smuxi-devel");
                }
                if (toMessage)
                {
                    var msg = builder.ToMessage();
                }
            }
            stop = DateTime.UtcNow;

            builder = new MessageBuilder();
            builder.AppendText("MessageBuilder().");
            if (appendMessage)
            {
                builder.AppendText("AppendMessage().");
            }
            if (appendText)
            {
                builder.AppendText("AppendText().");
            }
            if (appendEvent)
            {
                builder.AppendText("AppendEventPrefix().");
            }
            if (appendFormat)
            {
                builder.AppendText("AppendFormat().");
            }
            if (toMessage)
            {
                builder.AppendText("ToMessage()");
            }
            builder.AppendText(
                " count: {1} took: {2:0} ms avg: {3:0.00} ms",
                cmd.Data,
                count,
                (stop - start).TotalMilliseconds,
                (stop - start).TotalMilliseconds / count
                );
            AddMessageToFrontend(cmd, builder.ToMessage());
        }
        /// <summary>
        /// Запаковывает изменения.
        /// Метод можно разбить на несколько кусков, чтобы можно было модифицировать при прикладном использовании.
        /// </summary>
        /// <param name=""></param>
        public void PackChanges(Packaging)
        {
            // Догрузить Packaging.
            DataService.LoadObject(Packaging);

            // Период изменений.
            // Если только dateFrom == null, то брать все изменения до dateTo.
            // Если только dateTo, то брать изменения начиная с dateFrom.
            // Если обе даты == null, то брать все изменения.
            DateTime dateFrom = PackageCollecting.DateFrom;
            DateTime dateTo   = PackageCollecting.DateTo;

            // Читаем факты изменения из БД.
            // Выбираем только факты нужных классов.
            // Сортируем по дате.
            // Порционная вычитка опущена для простоты.
            seClassLimit = In <SyncEntity>(se => se.ClassName, mappingClassNames);
            var syncEntities = DataService.LoadObjects(seClassLimit);

            foreach (var se in syncEntities)
            {
                // Проверим, было ли запаковано изменение в данной синхронизации.
                // Текущая идея - проверять существование такого ObjectChangePackage:
                packagedLimit = And(
                    Equals <ObjectChangePackage>(ocp => ocp.Package.Packaging.Synchronization, SyncID),
                    Equals <ObjectChangePackage>(ocp => ocp.syncEntity, se)
                    );
                var objectChangePackage = DataService.LoadObjects(packagedLimit).FirstOrDefault();

                // Если было, то попробовать взять готовый пакет.
                if (objectChangePackage != null)
                {
                    if (objectChangePackage.data != null)
                    {
                        MessageBuilder.AppendMessage(packaged);
                    }

                    // Если готового пакета нет, то запаковываем.
                }
                else
                {
                    // Выполняем чтение и маппинг.
                    // Если обозреваемый объект превращается в несколько целевых объектов, то маппетов будет несколько.
                    // Базовый механизм маппинга будет таким же, как в прошлом синхронизаторе.
                    var currentMappers = mappers.Where(map => map.GetObservingType() == se.type);
                    foreach (var currentMapper in currentMappers)
                    {
                        // Если еще не запаковывали, то читаем сами изменения из БД приложения.
                        // Тут должно быть по-разному: вариант для старого аудита, и вариант для нового аудита.
                        // Чтение уже реализовано в предыдущих вариантах синхронизаторов.
                        // Например, прочитаем со старым аудитом.
                        // Должны получить сам объект, тип объекта и список измененных атрибутов.
                        var change = PackageHelper.GetChangeFromAppDB(se, tAuditType.Old, map.GetObservingView());

                        // Получаем целевые объекты.
                        var destinationObject = currentMapper.Map(change);

                        // Собираем сообщение.
                        // Скорее всего, messageBuilder будет сам решать, как собирать пакеты, поэтому просто отправлем ему всю информацию об изменениях.
                        messageBuilder.CreateMessage(destinationObject, change, objectChangePackage);
                    }
                }

                // Как только пакет в messageBuilder готов, достаем его и все его сообщения.
                var package = messageBuilder.PopPackage();
                if (package != null)
                {
                    // Пакет сообщения складываем в бд.
                    DataService.UpdateObject(package);
                    package = null;
                }
            }

            // Создать пакет из оставшихся сообщений.
            var forcedPackage = messageBuilder.PopPackageForced();

            DataService.UpdateObject(forcedPackage);

            // Теперь в бд лежат пакеты и составляющие сообщения.
            // Если это будет занимать слишком много памяти,
            // то можно очищать ObjectChangePackage.data (можно и не хранить, но тогда иногда придется упаковывать по нескольку раз)
            // и Package.data (после успешной синхронизации).

            // Как часто поток будет искать в БД объект Package.
            Thread.Sleep(10000);
        }
Beispiel #8
0
        private bool TryParseXml(IEnumerable <dynamic> elementsQuery, MessageBuilder errorMessageHelper,
                                 List <XmlTransaction> transactionList)
        {
            bool isSucceed = true;
            XmlTransactionStatusEnum transactionStatus = default;
            DateTime     transactionDate   = default;
            decimal      transactionAmount = default;
            CurrencyEnum currencyCode      = default;

            for (int i = 0; i < elementsQuery.Count(); i++)
            {
                if (elementsQuery.ElementAt(i).Id == null)
                {
                    errorMessageHelper.AppendMessage($"Transaction Id of #{i} transaction is empty.");
                    isSucceed = false;
                }

                if (elementsQuery.ElementAt(i).Status == null ||
                    !Enum.TryParse(elementsQuery.ElementAt(i).Status, out transactionStatus))
                {
                    errorMessageHelper.AppendMessage($"Transaction Status of #{i} transaction is empty or has bad format.");
                    isSucceed = false;
                }

                if (elementsQuery.ElementAt(i).TransactionDate == null ||
                    !DateTime.TryParse(elementsQuery.ElementAt(i).TransactionDate, out transactionDate))
                {
                    errorMessageHelper.AppendMessage($"Transaction Date of #{i} transaction is empty or has bad format.");
                    isSucceed = false;
                }

                if (elementsQuery.ElementAt(i).PaymentDetails == null)
                {
                    errorMessageHelper.AppendMessage($"Transaction PaymentDetails of #{i} transaction is empty.");
                    isSucceed = false;
                }
                else
                {
                    if (elementsQuery.ElementAt(i).PaymentDetails.Amount == null ||
                        !decimal.TryParse(elementsQuery.ElementAt(i).PaymentDetails.Amount, out transactionAmount))
                    {
                        errorMessageHelper.AppendMessage($"Transaction Amount of #{i} transaction is empty or has bad format.");
                        isSucceed = false;
                    }

                    if (elementsQuery.ElementAt(i).PaymentDetails.CurrencyCode == null ||
                        !Enum.TryParse(elementsQuery.ElementAt(i).PaymentDetails.CurrencyCode, out currencyCode))
                    {
                        errorMessageHelper.AppendMessage($"Transaction CurrencyCode of #{i} transaction is empty or has bad format.");
                        isSucceed = false;
                    }
                }

                if (isSucceed)
                {
                    transactionList.Add(new XmlTransaction
                    {
                        Amount        = transactionAmount,
                        TransactionId = elementsQuery.ElementAt(i).Id,
                        CurrencyCode  = currencyCode,
                        Date          = transactionDate,
                        Status        = transactionStatus
                    });
                }
            }

            return(isSucceed);
        }