예제 #1
0
        /// <summary>
        /// Initialize EDIReader with a stream. Verify that stream contains EDI document (ISA segment).
        /// </summary>
        /// <param name="stream"></param>
        /// <returns>true if EDI document otherwise false</returns>
        public bool Initialize(Stream stream, IFatpipeManager fatpipeManager)
        {
            Logger.Info("EDIReader.Initialize", "Start");

            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            Stopwatch sw = new Stopwatch();

            sw.Start();

            FPManager = fatpipeManager;

            long orgStartPos = stream.Position;

            Delimiters           delimiters;
            InterchangeTokenizer tokenizer = new InterchangeTokenizer(stream);
            bool isValidEDIDocument        = tokenizer.IsX12Interchange(out delimiters);

            CurrentSegmentNumber     = 0;
            ValidTransactionSetCount = InvalidTransactionSetCount = 0;
            PrevTransactionSetType   = 0;

            DocumentReader = null;
            if (isValidEDIDocument == true)
            {
                EDIDelimiters = delimiters;
                //TODO: Review following logic
                //Read ISA field till component separator - Do not include component separator
                ISASegment = tokenizer.ISARecord.Substring(0, tokenizer.ISARecord.IndexOf((char)EDIDelimiters.ComponentSeperator) + 1);

                //TODO: Suraj: confirm this special case - last value as data element separator
                ISARecordFields = ISASegment.Split((char)EDIDelimiters.FieldSeperator);

                CurrentSegmentNumber = 1;

                this.DocumentReader = new StreamReader(stream, Encoding.UTF8);
                //TODO: Why is seek required here?
                this.DocumentReader.BaseStream.Seek(tokenizer.ISARecordLen + orgStartPos, SeekOrigin.Begin);
                FatpipeDocumentInst = new FatpipeDocument();

                SegmentDelimiter = ((char)EDIDelimiters.SegmentDelimiter).ToString();
            }
            else
            {
                ISASegment = string.Empty;
            }

            LastState = EDIState.ISA;

            sw.Stop();
            Logger.Info("EDIReader.Initialize", "Stop. Elapsed time {0} ms", sw.ElapsedMilliseconds);

            return(isValidEDIDocument);
        }
        public static IFatpipeMessage CreateBizpipeMessageFromStream(Stream stream, IFatpipeManager manager)
        {
            IFatpipeMessage message = manager.CreateNewMessage();
            IList <KeyValuePair <string, string> > headerList;

            message.Body.Body = StreamHelper.DeserializeStreamToHeadersAndBody(stream, out headerList);
            MessageHeader header = new MessageHeader(string.Empty, string.Empty);

            message.Header = header;
            IDictionary <string, string> context = header.Context;

            foreach (KeyValuePair <string, string> keyValuePair in headerList)
            {
                string key = keyValuePair.Key;

                if (string.Compare(key, MsgId, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    header.Identifier = keyValuePair.Value;
                }

                else if (string.Compare(key, TenantId, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    header.TenantIdentifier = keyValuePair.Value;
                }

                else if (string.Compare(key, CorrelationId, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    header.CorrelationId = keyValuePair.Value;
                }

                else
                {
                    context[keyValuePair.Key] = keyValuePair.Value;
                }
            }

            return(message);
        }
예제 #3
0
        /// <summary>
        /// Initialize EDIReader with a stream. Verify that stream contains EDI document (ISA segment).
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fatpipeManager"></param>
        /// <param name="documentPlug"></param>
        /// <returns>true if EDI document otherwise false</returns>
        public bool Initialize(Stream stream, IFatpipeManager fatpipeManager, IDocumentPlug documentPlug)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            Stopwatch sw = new Stopwatch();

            sw.Start();

            Errors = new InterchangeErrors();

            FPManager    = fatpipeManager;
            DocumentPlug = documentPlug;

            long orgStartPos = stream.Position;

            Delimiters           delimiters;
            InterchangeTokenizer tokenizer = new InterchangeTokenizer(stream);
            bool isValidEDIDocument        = tokenizer.IsX12Interchange(out delimiters);

            FunctionalGroupNumber    = TransactionSetNumber = SegmentNumberFromStart = SegmentNumber = 0;
            ValidTransactionSetCount = InvalidTransactionSetCount = 0;
            PrevTransactionSetType   = 0;

            DocumentReader = null;
            if (isValidEDIDocument == true)
            {
                EDIDelimiters = delimiters;
                //TODO: Review following logic
                //Read ISA field till component separator - Do not include component separator
                ISASegment = tokenizer.ISARecord.Substring(0, tokenizer.ISARecord.IndexOf((char)EDIDelimiters.ComponentSeperator) + 1);

                //TODO: Suraj: confirm this special case - last value as data element separator
                ISARecordFields = ISASegment.Split((char)EDIDelimiters.FieldSeperator);

                SegmentNumberFromStart = 1;

                stream.Position     = orgStartPos;
                this.DocumentReader = new StreamReader(stream, Encoding.UTF8);
                //TODO: Why is seek required here?
                this.CurrentSegmentStartPos = 0;
                this.CurrentSegmentEndPos   = 0;
                //this.CurrentSegmentEndPos = this.CurrentSegmentStartPos + tokenizer.ISARecordLen - 1;
                //this.DocumentReader.BaseStream.Seek(this.CurrentSegmentEndPos + basePosition, SeekOrigin.Begin);
                FatpipeDocumentInst = new FatpipeDocument();
                FatpipeDocumentInst.BeautifiedOriginalPayloadStartHeader = string.Empty;
                FatpipeDocumentInst.BeautifiedOriginalPayloadBody        = string.Empty;
                FatpipeDocumentInst.BeautifiedOriginalPayloadEndHeader   = string.Empty;

                SegmentDelimiter          = ((char)EDIDelimiters.SegmentDelimiter).ToString();
                FormattedSegmentDelimiter = SegmentDelimiter;

                bool crLFPresent = delimiters.SegmentDelimiter == Delimiters.CarriageReturn || delimiters.SegmentDelimiterSuffix1 == Delimiters.CarriageReturn;
                if (!crLFPresent)
                {
                    FormattedSegmentDelimiter = string.Format("{0}{1}", FormattedSegmentDelimiter, Environment.NewLine);
                }

                Logger.Info("EDIReader.Initialize", "EDIDelimiters: SegmentDelimiter={0}, FieldSeperator={1}, ComponentSeperator={2}", (char)EDIDelimiters.SegmentDelimiter, (char)EDIDelimiters.FieldSeperator, (char)EDIDelimiters.ComponentSeperator);
            }
            else //invalid document code path
            {
                this.CurrentSegmentStartPos = orgStartPos;
                this.CurrentSegmentEndPos   = orgStartPos + 3;
                Logger.Error("EDIReader.Initialize", EventId.EDIReaderInvalidDocument, "EDI document is not valid. Error: {0}", tokenizer.Error);

                Errors.AddGenericError("ISA", SchemaErrorCode.SchemaCode100EInvalidDocType, tokenizer.Error, SegmentNumber, this.CurrentSegmentStartPos, this.CurrentSegmentEndPos);

                StringBuilder sb         = new StringBuilder();
                int           errorIndex = 1;
                Errors.IsaIeaErrorList.WriteError(sb, ref errorIndex);

                ISASegment = string.Empty;
            }

            LastState = EDIState.ISA;

            sw.Stop();
            Logger.Debug("EDIReader.Initialize", "Elapsed time {0} ms", sw.ElapsedMilliseconds);

            return(isValidEDIDocument);
        }
예제 #4
0
 /// <summary>
 /// Initialize EDIReader with a stream. Verify that stream contains EDI document (ISA segment).
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="fatpipeManager"></param>
 /// <returns>true if EDI document otherwise false</returns>
 public bool Initialize(Stream stream, IFatpipeManager fatpipeManager)
 {
     return(Initialize(stream, fatpipeManager, null));
 }