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()); }
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; }
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; }
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 }); }
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); }
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); }