private XmlSchemaParticle CannonicalizeGroupRef(XmlSchemaGroupRef groupRef, bool root, bool substitution) {
XmlSchemaGroup group;
if (groupRef.Redefined != null) {
group = groupRef.Redefined;
}
else {
group = (XmlSchemaGroup)this.schema.Groups[groupRef.RefName];
}
if (group == null) {
SendValidationEvent(Res.Sch_UndefGroupRef, groupRef.RefName.ToString(), groupRef);
return XmlSchemaParticle.Empty;
}
if (group.CanonicalParticle == null) {
CompileGroup(group);
}
if (group.CanonicalParticle == XmlSchemaParticle.Empty) {
return XmlSchemaParticle.Empty;
}
XmlSchemaGroupBase groupBase = (XmlSchemaGroupBase)group.CanonicalParticle;
if (groupBase is XmlSchemaAll) {
if (!root) {
SendValidationEvent(Res.Sch_AllRefNotRoot, "", groupRef);
return XmlSchemaParticle.Empty;
}
if (groupRef.MinOccurs != decimal.One || groupRef.MaxOccurs != decimal.One) {
SendValidationEvent(Res.Sch_AllRefMinMax, groupRef);
return XmlSchemaParticle.Empty;
}
}
else if (groupBase is XmlSchemaChoice && groupBase.Items.Count == 0) {
if (groupRef.MinOccurs != decimal.Zero) {
SendValidationEvent(Res.Sch_EmptyChoice, groupRef, XmlSeverityType.Warning);
}
return XmlSchemaParticle.Empty;
}
XmlSchemaGroupBase groupRefBase = (
(groupBase is XmlSchemaSequence) ? (XmlSchemaGroupBase)new XmlSchemaSequence() :
(groupBase is XmlSchemaChoice) ? (XmlSchemaGroupBase)new XmlSchemaChoice() :
(XmlSchemaGroupBase)new XmlSchemaAll()
);
groupRefBase.MinOccurs = groupRef.MinOccurs;
groupRefBase.MaxOccurs = groupRef.MaxOccurs;
foreach (XmlSchemaParticle particle in groupBase.Items) {
groupRefBase.Items.Add(particle);
}
groupRef.SetParticle(groupRefBase);
return groupRefBase;
}