public OrderHistoryFileReturn ParseMainframeFile(TextReader reader) { OrderHistoryFileReturn retVal = new OrderHistoryFileReturn(); OrderHistoryFile currentFile = null; while (reader.Peek() != -1) { string line = reader.ReadLine(); switch (line.Substring(RECORDTYPE_STARTPOS, RECORDTYPE_LENGTH)) { case "H": SetErrorStatusAndFutureItemsOnFile(currentFile); currentFile = CreateOrderHistoryFileFromHeaderLine(line); retVal.Files.Add(currentFile); break; case "D": var orderDetail = new OrderHistoryDetail(); orderDetail.Parse(line); currentFile.Details.Add(orderDetail); break; default: break; } } // end of while SetErrorStatusAndFutureItemsOnFile(currentFile); return(retVal); }
public void OrderHistory_HasValidHeadersAndOrderDate() { // arrange IOrderHistoryLogic testunit = MakeUnitToBeTested(); // act var mockDataReader = GetMockDataReader("OT780FDF-2018206-10273884.TXT"); OrderHistoryFileReturn orderHistoryFiles = testunit.ParseMainframeFile(mockDataReader); mockDataReader.Close(); // assert orderHistoryFiles.Files.Count.Should().Be(40); orderHistoryFiles.Files.ForEach(file => CheckFile(file)); }
public void WhenMainframeFileDoesNotContainOrderHistory_HasValidHeadersAndOrderDate() { // arrange MockDependents mockDependents = new MockDependents(); IOrderHistoryLogic testunit = MakeUnitToBeTested(true, mockDependents); // act var mockDataReader = new StringReader(string.Empty); OrderHistoryFileReturn orderHistoryFiles = testunit.ParseMainframeFile(mockDataReader); mockDataReader.Close(); // assert orderHistoryFiles.Files.Count.Should().Be(0); }
/// <summary> /// Parse an array of strings as a file /// </summary> /// <param name="data"></param> /// <returns></returns> private OrderHistoryFileReturn ParseFile(string[] data) { OrderHistoryFileReturn retVal = new OrderHistoryFileReturn(); OrderHistoryFile currentFile = null; for (int i = 0; i < data.Length; i++) { string line = data[i]; if (line.Contains("END###")) { break; } switch (line.Substring(RECORDTYPE_STARTPOS, RECORDTYPE_LENGTH)) { case "H": SetErrorStatusAndFutureItemsOnFile(currentFile); currentFile = ParseNewOrderHistoryFileFromHeaderLine(line); retVal.Files.Add(currentFile); break; case "D": var orderDetail = new OrderHistoryDetail(); orderDetail.Parse(line); currentFile.Details.Add(orderDetail); break; default: break; } } // end of for loop SetErrorStatusAndFutureItemsOnFile(currentFile); return(retVal); }
public void SocketFileReceived(object sender, ReceivedFileEventArgs e) { StringBuilder logMsg = new StringBuilder(); logMsg.AppendLine("Order Update File Received. See below for more details."); logMsg.AppendLine(); logMsg.AppendLine(e.FileData); _log.WriteInformationLog(logMsg.ToString()); string[] lines = e.FileData.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); OrderHistoryFileReturn parsedFiles = ParseFile(lines); if (parsedFiles.Files.Count == 0) { var logMessage = "No instances of OrderHistoryFile were extracted."; _log.WriteWarningLog(logMessage); } foreach (OrderHistoryFile parsedFile in parsedFiles.Files) { parsedFile.SenderApplicationName = Configuration.ApplicationName; parsedFile.SenderProcessName = "Process Order History Updates From Mainframe (Socket Connection)"; var jsonValue = JsonConvert.SerializeObject(parsedFile); _queue.PublishToQueue(jsonValue, Configuration.RabbitMQConfirmationServer, Configuration.RabbitMQUserNamePublisher, Configuration.RabbitMQUserPasswordPublisher, Configuration.RabbitMQVHostConfirmation, Configuration.RabbitMQExchangeHourlyUpdates); logMsg = new StringBuilder(); logMsg.AppendLine(string.Format("Publishing order history to queue for message ({0}).", parsedFile.MessageId)); logMsg.AppendLine(); logMsg.AppendLine(jsonValue); _log.WriteInformationLog(logMsg.ToString()); } }
public void ProcessOrderUpdatesTick(object state) { if (!_orderUpdateProcessing) { _orderUpdateProcessing = true; try { // if update path does not exist, send an email then suppress messages // disallow processing here until the folder exists, but do not kill the service // to keep other threads running if (Directory.Exists(Configuration.OrderUpdateWatchPath)) { _allowOrderUpdateProcessing = true; _silenceOrderUpdateMessages = false; } else { _allowOrderUpdateProcessing = false; if (!_silenceOrderUpdateMessages) { HandleMissingOrderUpdateWatchPath(); _silenceOrderUpdateMessages = true; } } if (_allowOrderUpdateProcessing) { string[] files = Directory.GetFiles(Configuration.OrderUpdateWatchPath); _orderScope = _diContainer.BeginLifetimeScope(); IGenericQueueRepository repo = _orderScope.Resolve <IGenericQueueRepository>(); Parallel.ForEach(files, filePath => { IOrderHistoryLogic logic = _orderScope.Resolve <IOrderHistoryLogic>(); if (CanOpenFile(filePath)) { var logMessage = "Processing " + filePath + "."; _log.WriteInformationLog(logMessage); OrderHistoryFileReturn parsedFile = null; using (var reader = File.OpenText(filePath)) { parsedFile = logic.ParseMainframeFile(reader); } if (parsedFile.Files.Count == 0) { logMessage = "No instances of OrderHistoryFile were extracted from " + filePath + "."; _log.WriteWarningLog(logMessage); } var serializedFiles = new BlockingCollection <string>(); Parallel.ForEach(parsedFile.Files, file => { // do not upload an order file with an invalid header if (file.ValidHeader) { file.SenderApplicationName = Configuration.ApplicationName; file.SenderProcessName = "Process Order History Updates From Mainframe (Flat File)"; try { var serializedFile = JsonConvert.SerializeObject(file); serializedFiles.Add(serializedFile); //StringBuilder logMsg = new StringBuilder(); //logMsg.AppendLine(string.Format("Serializing order history message ({0}).", file.MessageId)); //logMsg.AppendLine(); //logMsg.AppendLine(serializedFile); //_log.WriteInformationLog(logMsg.ToString()); _silenceOrderUpdateMessages = false; } catch (Exception ex) { if (!_silenceOrderUpdateMessages) { HandleException(ex); _silenceOrderUpdateMessages = true; } } } }); if (serializedFiles.Count > 0) { logMessage = "Publishing " + serializedFiles.Count + " order history messages to queue."; _log.WriteInformationLog(logMessage); repo.BulkPublishToQueue(serializedFiles.ToList(), Configuration.RabbitMQConfirmationServer, Configuration.RabbitMQUserNamePublisher, Configuration.RabbitMQUserPasswordPublisher, Configuration.RabbitMQVHostConfirmation, Configuration.RabbitMQExchangeHourlyUpdates); } File.Delete(filePath); logMessage = "Deleted " + filePath + "."; _log.WriteInformationLog(logMessage); } // end if CanOpenFile }); _orderScope.Dispose(); } } catch (Exception ex) { HandleException(ex); } _orderUpdateProcessing = false; } }