Ejemplo n.º 1
0
        /// <summary>
        /// Flushes any remaining data before a control segment.
        /// </summary>
        /// <param name="segment">The control segment.</param>
        /// <returns>The parsed segments.</returns>
        protected EdiItem Flush(string segment)
        {
            if (!CurrentSegments.Any())
            {
                return(null);
            }

            var firstSegment = CurrentSegments.First().Value;

            if (Separators != null)
            {
                Buffer(segment + Separators.Segment);
            }
            else
            {
                Buffer(segment);
            }

            var result = ParseSegments() ?? new ReaderErrorContext(
                new Exception(string.Format("Invalid control structure beginning with {0}",
                                            firstSegment)), ReaderErrorCode.InvalidControlStructure);

            CurrentMessageContext = null;
            SegmentIndex          = 0;
            PartsIndex            = 0;

            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Reads an EDI item from the stream.
        /// </summary>
        /// <returns>Indication if an item was read.</returns>
        public override bool Read()
        {
            if (Item is ReaderErrorContext && !ContinueOnError)
            {
                return(false);
            }

            Item = null;

            try
            {
                while ((!StreamReader.EndOfStream || InternalBuffer.Any()) && Item == null)
                {
                    var segment = ReadSegment();

                    if (Separators == null)
                    {
                        throw new ReaderException("No valid separator set was found.", ReaderErrorCode.InvalidControlStructure);
                    }

                    if (string.IsNullOrEmpty(segment))
                    {
                        continue;
                    }

                    Item = Split(segment) ?? Process(segment);
                }
            }
            catch (ReaderException ex)
            {
                Item = new ReaderErrorContext(ex, ex.ErrorCode);
            }
            catch (ParserMessageException ex)
            {
                Item = new ReaderErrorContext(ex, ReaderErrorCode.InvalidSpecOrAssembly, ex.MessageErrorContext);
            }
            catch (Exception ex)
            {
                Item = new ReaderErrorContext(ex, ReaderErrorCode.Unknown);
            }

            if (StreamReader.EndOfStream && CurrentSegments.Any())
            {
                Item = new ReaderErrorContext(new Exception("Improper end of file."), ReaderErrorCode.ImproperEndOfFile);
            }

            var readerErrorContext = Item as ReaderErrorContext;

            if (readerErrorContext != null)
            {
                CurrentSegments.Clear();
                if (readerErrorContext.MessageErrorContext == null)
                {
                    Separators = null;
                }
            }

            return(Item != null);
        }
Ejemplo n.º 3
0
        private MessageContext BuildContext()
        {
            if (_currentIsa == null)
            {
                throw new Exception("Interchange header is missing.");
            }

            if (CurrentSegments.Count == 1)
            {
                var ta1 = CurrentSegments.SingleOrDefault(es => es.Name == "TA1");
                if (ta1 != null)
                {
                    return(new MessageContext("TA1", "", "", "X12", _currentIsa.InterchangeSenderID_6,
                                              _currentIsa.SenderIDQualifier_5, _currentIsa.InterchangeReceiverID_8,
                                              _currentIsa.ReceiverIDQualifier_7, RulesAssembly));
                }
            }

            if (_currentGroupHeader == null)
            {
                throw new Exception("GS was not found.");
            }

            var ediCompositeDataElementsGs = _currentGroupHeader.Value.GetDataElements(Separators);

            if (ediCompositeDataElementsGs.Count() < 8)
            {
                throw new Exception("GS is invalid. Too little data elements.");
            }

            var version = ediCompositeDataElementsGs[7];

            var st = CurrentSegments.SingleOrDefault(es => es.Name == "ST");

            if (st == null)
            {
                throw new Exception("ST was not found.");
            }

            var ediCompositeDataElementsSt = st.Value.GetDataElements(Separators);
            var tag = ediCompositeDataElementsSt[0];

            if (ediCompositeDataElementsSt.Count() == 3)
            {
                version = ediCompositeDataElementsSt[2];
            }
            if (ediCompositeDataElementsSt.Count() < 2)
            {
                throw new Exception("ST is invalid.Too little data elements.");
            }

            var controlNumber = ediCompositeDataElementsSt[1];

            return(new MessageContext(tag, controlNumber, version, "X12", _currentIsa.InterchangeSenderID_6,
                                      _currentIsa.SenderIDQualifier_5, _currentIsa.InterchangeReceiverID_8, _currentIsa.ReceiverIDQualifier_7, RulesAssembly));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Reads an item from the stream.
        /// </summary>
        /// <returns>Indication if an item was read.</returns>
        public override bool Read()
        {
            if (Item is ReaderErrorContext && !ContinueOnError)
            {
                return(false);
            }

            Item = null;

            try
            {
                while ((!StreamReader.EndOfStream || InternalBuffer.Any()) && Item == null)
                {
                    var segment = ReadSegment();

                    if (string.IsNullOrEmpty(segment))
                    {
                        continue;
                    }

                    Item = Process(segment);
                }
            }
            catch (ReaderException ex)
            {
                Item = new ReaderErrorContext(ex, ex.ErrorCode);
            }
            catch (ParserMessageException ex)
            {
                Item = new ReaderErrorContext(ex, ReaderErrorCode.InvalidSpecOrAssembly, ex.MessageErrorContext);
            }
            catch (Exception ex)
            {
                Item = new ReaderErrorContext(ex, ReaderErrorCode.Unknown);
            }

            if (StreamReader.EndOfStream && CurrentSegments.Any())
            {
                Item = Flush(null);
            }

            var readerErrorContext = Item as ReaderErrorContext;

            if (readerErrorContext != null)
            {
                CurrentSegments.Clear();
            }

            return(Item != null);
        }
Ejemplo n.º 5
0
        public IDocumentFragment SelectSegment(SegmentPath segmentPath, string value)
        {
            IDocumentFragment segmentDocumentFragment = null;

            // If SegmentPath is conditional group then replace value with conditional value
            if (string.IsNullOrWhiteSpace(segmentPath.Value) == false)
            {
                value = segmentPath.Value;
            }

            if (CurrentSegments.TryGetValue(segmentPath.Path, out segmentDocumentFragment) == false)
            {
                List <IDocumentFragment> unusedSegmentsList;
                if (UnusedSegments.TryGetValue(segmentPath.Path, out unusedSegmentsList) == false)
                {
                    PopulateUnusedSegments(segmentPath);
                }

                List <IDocumentFragment> documentFragments;
                if (UnusedSegments.TryGetValue(segmentPath.Path, out documentFragments))
                {
                    if (documentFragments.Count > 0)
                    {
                        if (string.IsNullOrWhiteSpace(value) == false && documentFragments.Count != 1)
                        {
                            foreach (IDocumentFragment documentFragment in documentFragments)
                            {
                                string segmentValue = documentFragment.GetDataSegmentValue(segmentPath.DataSegmentName);
                                if (string.Equals(segmentValue, value, StringComparison.OrdinalIgnoreCase))
                                {
                                    segmentDocumentFragment = documentFragment;
                                }
                            }
                        }
                        else
                        {
                            segmentDocumentFragment = documentFragments[0];
                        }

                        if (segmentDocumentFragment != null)
                        {
                            documentFragments.Remove(segmentDocumentFragment);
                            CurrentSegments.Add(segmentPath.Path, segmentDocumentFragment);
                        }
                    }
                }
            }

            return(segmentDocumentFragment);
        }
Ejemplo n.º 6
0
        internal MetalRouteContext MoveCapturedToParent(IMetalRoute parentRoute, IEnumerable <string> capturedSegments)
        {
            var currentCapturedSegments = CurrentSegments.TakeWhile((cseg, idx) => capturedSegments.ElementAtOrDefault(idx).EqualsIgnoreCase(cseg));

            if (currentCapturedSegments is null || !currentCapturedSegments.Any())
            {
                return(this);
            }

            return(new MetalRouteContext(
                       parentRoute,
                       ParentSegments.Concat(currentCapturedSegments),
                       CurrentSegments.Skip(currentCapturedSegments.Count())
                       ));
        }
Ejemplo n.º 7
0
        public void MoveCurrentToUsed()
        {
            List <IDocumentFragment> documentFragments;

            foreach (string path in CurrentSegments.Keys)
            {
                if (UsedSegments.TryGetValue(path, out documentFragments) == false)
                {
                    documentFragments = new List <IDocumentFragment>();
                    UsedSegments.Add(path, documentFragments);
                }
                documentFragments.Add(CurrentSegments[path]);
            }

            CurrentSegments.Clear();
        }
Ejemplo n.º 8
0
        private MessageContext BuildContext()
        {
            if (_currentUnb == null)
            {
                throw new Exception("Interchange header is missing.");
            }

            var unh = CurrentSegments.SingleOrDefault(es => es.Name == "UNH");

            if (unh == null)
            {
                throw new Exception("UNH was not found.");
            }

            var ediCompositeDataElements = unh.Value.GetDataElements(Separators);

            if (ediCompositeDataElements.Count() < 2)
            {
                throw new Exception("UNH is invalid. Too little data elements.");
            }

            var ediDataElements = ediCompositeDataElements[1].GetComponentDataElements(Separators);

            if (ediDataElements.Count() < 3)
            {
                throw new Exception("UNH is invalid. Unable to read message type or version.");
            }

            var tag           = ediDataElements[0];
            var version       = ediDataElements[1] + ediDataElements[2];
            var controlNumber = ediCompositeDataElements[0];

            if (ediDataElements.Count() >= 5 && ediDataElements[4].StartsWith("EAN"))
            {
                version = version + "EAN";
                if (version.StartsWith("D01B"))
                {
                    version = version + _currentUnb.SYNTAXIDENTIFIER_1.SyntaxVersionNumber_2;
                }
            }

            return(new MessageContext(tag, controlNumber, version, "EDIFACT",
                                      _currentUnb.INTERCHANGESENDER_2.InterchangeSenderIdentification_1,
                                      _currentUnb.INTERCHANGESENDER_2.IdentificationCodeQualifier_2,
                                      _currentUnb.INTERCHANGERECIPIENT_3.InterchangeRecipientIdentification_1,
                                      _currentUnb.INTERCHANGERECIPIENT_3.IdentificationCodeQualifier_2, RulesAssembly));
        }
Ejemplo n.º 9
0
        protected override EdiItem Process(string segment)
        {
            var segmentContext = new SegmentContext(segment.Substring(0, 3), segment, segment.Substring(3, 2), null,
                                                    false);
            var messageContext = MessageContext(segment);

            if (messageContext != null)
            {
                var result = Flush(segment + _postFix);
                if (result != null)
                {
                    return(result);
                }

                CurrentMessageContext = messageContext;
            }

            CurrentSegments.Add(segmentContext);

            return(null);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Parses the accumulated segments.
        /// </summary>
        protected EdiItem ParseSegments()
        {
            if (CurrentMessageContext == null)
            {
                CurrentSegments.Clear();
                return(null);
            }

            EdiItem result;

            try
            {
                var message      = new TransactionSet(CurrentMessageContext.MessageType);
                var errorContext = message.Analyze(CurrentSegments, CurrentMessageContext, Separators, PartsIndex,
                                                   SegmentIndex);

                var ediMessage = (EdiMessage)message.ToInstance();
                ediMessage.MessagePart   = PartsIndex;
                ediMessage.ControlNumber = CurrentMessageContext.ControlNumber;
                ediMessage.ErrorContext  = errorContext;
                result = ediMessage;
            }
            catch (Exception ex)
            {
                result = new ReaderErrorContext(ex, ReaderErrorCode.InvalidSpecOrAssembly,
                                                new MessageErrorContext(CurrentMessageContext.Name,
                                                                        CurrentMessageContext.ControlNumber, CurrentMessageContext.Version, PartsIndex, ex.Message,
                                                                        MessageErrorCode.MissingOrInvalidTransactionSet));
            }
            finally
            {
                SegmentIndex = SegmentIndex + CurrentSegments.Count;
                CurrentSegments.Clear();
            }

            return(result);
        }
Ejemplo n.º 11
0
        protected override EdiItem Process(string segment)
        {
            EdiItem result = null;

            var segmentContext = new SegmentContext(segment, Separators);

            switch (segmentContext.Name)
            {
            case "ISA":
            case "GS":
            case "ST":
            case "GE":
            case "IEA":
                result = Flush(segment);
                if (result != null)
                {
                    return(result);
                }
                break;
            }

            switch (segmentContext.Name)
            {
            case "ISA":
                var isa = ParseSegment <ISA>(segmentContext.Value, Separators);
                _currentIsa         = isa;
                result              = isa;
                _currentGroupHeader = null;
                break;

            case "TA1":
                result = ParseSegment <TA1>(segmentContext.Value, Separators);
                _currentGroupHeader = null;
                break;

            case "GS":
                result = ParseSegment <GS>(segmentContext.Value, Separators);
                _currentGroupHeader = segmentContext;
                break;

            case "ST":
                CurrentSegments.Add(segmentContext);
                CurrentMessageContext = BuildContext();
                SegmentIndex          = 0;
                PartsIndex            = 0;
                break;

            case "SE":
                CurrentSegments.Add(segmentContext);
                result = ParseSegments();
                CurrentMessageContext = null;
                SegmentIndex          = 0;
                PartsIndex            = 0;
                break;

            case "GE":
                result = ParseSegment <GE>(segmentContext.Value, Separators);
                _currentGroupHeader = null;
                break;

            case "IEA":
                result = ParseSegment <IEA>(segmentContext.Value, Separators);
                _currentGroupHeader = null;
                _currentIsa         = null;
                break;

            default:
                CurrentSegments.Add(segmentContext);
                break;
            }

            return(result);
        }
Ejemplo n.º 12
0
        protected override EdiItem Process(string segment)
        {
            EdiItem result = null;

            var segmentContext = new SegmentContext(segment, Separators);

            switch (segmentContext.Name)
            {
            case "UNA":
            case "UNB":
            case "UNG":
            case "UNH":
            case "UNE":
            case "UNZ":
                result = Flush(segment);
                if (result != null)
                {
                    return(result);
                }
                break;
            }

            switch (segmentContext.Name)
            {
            case "UNA":
                break;

            case "UNB":
                var unb = ParseSegment <UNB>(segmentContext.Value, Separators);
                _currentUnb = unb;
                result      = unb;
                break;

            case "UNG":
                result = ParseSegment <UNG>(segmentContext.Value, Separators);
                break;

            case "UNH":
                CurrentSegments.Add(segmentContext);
                CurrentMessageContext = BuildContext();
                SegmentIndex          = 0;
                PartsIndex            = 0;
                break;

            case "UNT":
                CurrentSegments.Add(segmentContext);
                result = ParseSegments();
                CurrentMessageContext = null;
                SegmentIndex          = 0;
                PartsIndex            = 0;
                break;

            case "UNE":
                result = ParseSegment <UNE>(segmentContext.Value, Separators);
                break;

            case "UNZ":
                result      = ParseSegment <UNZ>(segmentContext.Value, Separators);
                _currentUnb = null;
                break;

            default:
                CurrentSegments.Add(segmentContext);
                break;
            }

            return(result);
        }
Ejemplo n.º 13
0
 public override string ToString()
 {
     return($"ParentSegments={ParentSegments.JoinPath()}, CurrentSegments={CurrentSegments.JoinPath()}");
 }