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