Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
            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));
            }
Ejemplo n.º 3
0
            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);
            }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
        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());
            }
        }
Ejemplo n.º 6
0
        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;
            }
        }