private void ValidateConditionalGroup()

in FixAntenna/NetCore/Validation/Validators/ConditionalValidator.cs [107:186]


		private void ValidateConditionalGroup(IList<ConditionalGroup> conditionalGroups,
			ValidationFixMessage message, FixErrorContainer errors)
		{
			foreach (var group in conditionalGroups)
			{
				_currentGroup = group;
				FixGroupContainer container;
				try
				{
					container = FixGroupContainer.CreateFixGroupContainer(message, Util).CreateContainer(group);
				}
				catch (FormatException e)
				{
					errors.Add(FixErrorBuilder.BuildError(FixErrorCode.Other, (TagValue)null,
						"The message: " + message.GetMsgType() +
						" is not valid because : throw NumberFormatException " + e.Message));
					return;
				}
				catch (ArgumentException e)
				{
					errors.Add(FixErrorBuilder.BuildError(FixErrorCode.Other, (TagValue)null,
						"The message: " + message.GetMsgType() +
						" is not valid because : throw IllegalArgumentException " + e.Message));
					return;
				}

				var conditionMap = container.GetConditionMap();
				var groupsCountTag = container.GetGroupsCountTag();
				var fixMessages = container.GetFixMessages();
				var groupConditionalTags = container.GetGroupConditionalTags();
				if (fixMessages.Count < container.GetGroupsCount())
				{
					errors.Add(FixErrorBuilder.BuildError(FixErrorCode.RequiredTagMissing,
						message.GetTag(container.GetGroupStartTag()), message.GetMsgSeqNumber(),
						message.GetMsgType(), container.GetGroupStartTag()));
				}

				// Check condition rule for the root tag for the group.
				if (conditionMap.TryGetValue(groupsCountTag, out var iCondition)
					&& fixMessages.Count == 0 && iCondition != null)
				{
					foreach (var tag in iCondition.GetTags())
					{
						if (message.ContainsTagInAllFields(tag))
						{
							if (!iCondition.ValidateCondition(groupsCountTag, message.FullFixMessage,
								message.GetMsgType(), conditionMap, false))
							{
								errors.Add(FixErrorBuilder.BuildError(FixErrorCode.CondrequiredTagMissing,
									message.GetTag(groupsCountTag), message.GetMsgSeqNumber(),
									StringHelper.NewString(message.FullFixMessage.MsgType),
									groupsCountTag));
							}
						}
					}
				}

				// check other condition rule for the group.
				foreach (var fixMessage in fixMessages)
				{
					if (CheckValidateRules(message, conditionMap, groupConditionalTags, iCondition, fixMessage))
					{
						ValidateConditionalTags(conditionMap, message, fixMessage, true, errors);
						// validate internal Blocks.
						var internalBlocks = group.GetConditionalBlocks();
						if (internalBlocks != null && internalBlocks.Count > 0)
						{
							ValidateConditionalBlock(internalBlocks, message, fixMessage, true, errors);
						}
					}
				}

				// validate internal Groups.
				var internalConditionalGroups = group.GetConditionalGroups();
				if (internalConditionalGroups != null && internalConditionalGroups.Count > 0)
				{
					ValidateConditionalGroup(internalConditionalGroups, message, errors);
				}
			}
		}