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);
}
}
}