in FixAntenna/NetCore/Validation/Validators/GroupValidator.cs [156:350]
private void ValidateGroup(IList<ValidationFixGroup> validationFixGroups, ValidationFixMessage fixMessage,
string msgType, FixErrorContainer errors)
{
// // gets all tags of group
// final Map<Integer, Field> groupTags = util.getGroupTagsWithInternalGroups(msgType, tag, fixMessage);
foreach (var validationFixGroup in validationFixGroups)
{
// gets internal groups for the parent group
var internalFixGroups = validationFixGroup.ValidationFixGroups;
// check to the parent group Contains the child groups.
if (internalFixGroups != null && internalFixGroups.Count > 0)
{
ValidateGroup(internalFixGroups, fixMessage, msgType, errors);
}
var noField = validationFixGroup.GetNoField();
FixGroupContainer container;
try
{
container = FixGroupContainer.CreateFixGroupContainer(fixMessage, Util)
.CreateSeparateList(fixMessage, validationFixGroup.FixMessage, noField);
}
catch (FormatException e)
{
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.Other, (TagValue)null,
"The message: " + fixMessage.GetMsgType() +
" is not valid because : throw NumberFormatException " + e.Message));
return;
}
catch (ArgumentException e)
{
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.Other, (TagValue)null,
"The message: " + fixMessage.GetMsgType() +
" is not valid because : throw IllegalArgumentException " + e.Message));
return;
}
// isRequired group.
var messages = container.GetFixMessages();
var startField = Util.GetStartTagForGroup(msgType, noField);
if (messages.Count != container.GetGroupsCount())
{
errors.Add(FixErrorBuilder.BuildError(
FixErrorCode.IncorrectNumingroupCountForRepeatingGroup, fixMessage.GetTag(startField),
fixMessage.GetMsgSeqNumber(), msgType, startField));
}
foreach (var contentOfGroup in messages)
{
// check start field of group.
var fieldsCount = contentOfGroup.Length;
for (var fieldIndex = 0; fieldIndex < fieldsCount; fieldIndex++)
{
var field = contentOfGroup[fieldIndex];
if (field.TagId == noField)
{
var nextFieldIndex = fieldIndex + 1;
if (nextFieldIndex < fieldsCount)
{
if (contentOfGroup[nextFieldIndex].TagId != startField)
{
errors.Add(FixErrorBuilder.BuildError(
FixErrorCode.RepeatingGroupFieldsOutOfOrder, fixMessage.GetTag(startField),
fixMessage.GetMsgSeqNumber(), msgType, startField));
}
}
break;
}
}
// checks order of groups tag.
CheckOrderOfGroupsTag(validationFixGroup.FixMessage, fixMessage.FullFixMessage,
noField, errors, msgType, startField);
var countOfRepeatingGroups = 0;
try
{
// gets max of frequency of tags
countOfRepeatingGroups = (int)contentOfGroup.GetTagValueAsLong(noField);
}
catch (FormatException e)
{
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.Other, (TagValue)null,
"The message: " + fixMessage.GetMsgType() +
" is not valid because : throw NumberFormatException " + e.Message));
return;
}
catch (ArgumentException e)
{
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.Other, (TagValue)null,
"The message: " + fixMessage.GetMsgType() +
" is not valid because : throw IllegalArgumentException " + e.Message));
return;
}
catch (FieldNotFoundException e)
{
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.Other, (TagValue)null,
"The message: " + fixMessage.GetMsgType() +
" is not valid because : throw FieldNotFoundException " + e.Message));
return;
}
IList<Field> requiredFieldsOfGroup = new List<Field>();
if (fieldsCount > 0)
{
requiredFieldsOfGroup =
GetRequiredFields(Util.GetGroupsTags(msgType, noField, contentOfGroup, false));
}
var groupTags =
Util.GetGroupTagsWithInternalGroups(msgType, noField, fixMessage.FullFixMessage);
for (var index = 0; index < fieldsCount; index++)
{
var fixField = contentOfGroup[index];
groupTags.TryGetValue(fixField.TagId, out var groupTag);
if (groupTag != null)
{
requiredFieldsOfGroup.Remove(groupTag);
var groupTagValue = groupTag.Tag;
var frequency = CountFrequency(contentOfGroup, groupTagValue);
if (frequency == 0)
{
continue;
}
// checks first tag of group this tag must be always
if (index == 0)
{
if ("Y".Equals(groupTag.Req))
{
if (contentOfGroup[1].TagId != groupTag.Tag)
{
errors.Add(FixErrorBuilder.BuildError(
FixErrorCode.RepeatingGroupFieldsOutOfOrder,
fixMessage.GetTag(groupTagValue), fixMessage.GetMsgSeqNumber(), msgType,
groupTagValue));
}
}
else
{
if (IsConditionalValidareFailed(errors, groupTag.Condreq))
{
errors.Add(FixErrorBuilder.BuildError(
FixErrorCode.RepeatingGroupFieldsOutOfOrder,
fixMessage.GetTag(groupTagValue), fixMessage.GetMsgSeqNumber(), msgType,
groupTagValue));
}
}
frequency = CountFrequency(validationFixGroup.FixMessage, groupTagValue);
// checks first required tag
CheckTag(msgType, errors, countOfRepeatingGroups, frequency,
fixMessage.GetMsgSeqNumber(), fixMessage.GetTag(groupTagValue));
}
else
{
// checks required tag
if ("Y".Equals(groupTag.Req))
{
frequency = CountFrequency(validationFixGroup.FixMessage, groupTagValue);
CheckTag(msgType, errors, countOfRepeatingGroups, frequency,
fixMessage.GetMsgSeqNumber(), fixMessage.GetTag(groupTagValue));
}
// check other tags of group
else
{
// check if tag is present in group and counts of present(check only more than size of
// repeating gorup because these not required tags. )
frequency = CountFrequency(contentOfGroup, groupTagValue);
if (frequency > 1)
{
errors.Add(FixErrorBuilder.BuildError(
FixErrorCode.IncorrectNumingroupCountForRepeatingGroup,
fixMessage.GetTag(groupTagValue), fixMessage.GetMsgSeqNumber(), msgType,
groupTagValue));
}
}
}
}
}
if (requiredFieldsOfGroup.Count > 0)
{
foreach (var field in requiredFieldsOfGroup)
{
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.RequiredTagMissing,
new TagValue(field.Tag, ""), fixMessage.GetMsgSeqNumber(), msgType,
field.Tag));
}
}
}
}
}