private void ValidatePresentRgTagIdAndRgStartTagId()

in FixAntenna/NetCore/Validation/Validators/GroupValidator.cs [58:154]


		private void ValidatePresentRgTagIdAndRgStartTagId(string msgType, ValidationFixMessage fixMessage,
			FixErrorContainer errors)
		{
			var message = fixMessage.FullFixMessage;
			var gc = Util.GetGroupsCache(msgType);
			// set of RG ID. If message contain at least one tag of RG we make a check if in message present RG Id and lead tag.
			var unCheckRg = new HashSet<int>(gc.GetGroupsCaches().Keys);
			var missRgIDs = new List<int>();
			int? rgIdFoundIn = null;

			var missStartRgIDs = new List<int>();
			int? startRgIdFoundIn = null;

			for (var i = 0; i < message.Length; i++)
			{
				if (unCheckRg.Count == 0)
				{
					break;
				}

				var tag = message.GetTagIdAtIndex(i);
				rgIdFoundIn = null;
				startRgIdFoundIn = null;
				missRgIDs.Clear();
				missStartRgIDs.Clear();

				foreach (var rgId in unCheckRg)
				{
					if (gc.GetGroupsTagIDsWithBlocksTags(rgId).Contains(tag))
					{
						// check
						var rg = gc.GetGroupCache(rgId);
						if (message.IsTagExists(rg.GetGroupId()))
						{
							rgIdFoundIn = rgId;
						}
						else
						{
							missRgIDs.Add(rgId);
						}

						if (message.IsTagExists(rg.GetStartTagId()))
						{
							startRgIdFoundIn = rgId;
						}
						else
						{
							missStartRgIDs.Add(rgId);
						}

						if (rgIdFoundIn != null && startRgIdFoundIn != null)
						{
							break;
						}
					}
				}

				if (rgIdFoundIn == null)
				{
					// notFound
					if (missRgIDs.Count > 0)
					{
						unCheckRg.RemoveAll(missRgIDs);
						foreach (var rgId in missRgIDs)
						{
							var rg = gc.GetGroupCache(rgId);
							var tagValue = message.GetTag(tag);
							errors.Add(FixErrorBuilder.BuildError(FixErrorCode.RequiredTagMissing, tagValue,
								fixMessage.GetMsgSeqNumber(), msgType, rg.GetGroupId()));
						}
					}
				}
				else
				{
					unCheckRg.Remove(rgIdFoundIn.Value);
				}

				if (startRgIdFoundIn == null)
				{
					if (missStartRgIDs.Count > 0)
					{
						unCheckRg.RemoveAll(missStartRgIDs);
						foreach (var rgId in missStartRgIDs)
						{
							var rg = gc.GetGroupCache(rgId);
							var tagValue = message.GetTag(tag);
							errors.Add(FixErrorBuilder.BuildError(FixErrorCode.RequiredTagMissing, tagValue,
								fixMessage.GetMsgSeqNumber(), msgType, rg.GetStartTagId()));
						}
					}
				}
				else
				{
					unCheckRg.Remove(startRgIdFoundIn.Value);
				}
			}
		}