-//\r
-// XmlSchemaGroupBase.cs\r
-//\r
-// Authors:\r
-// Dwivedi, Ajay kumar Adwiv@Yahoo.com\r
-// Atsushi Enomoto atsushi@ximian.com\r
-//\r
+//
+// XmlSchemaGroupBase.cs
+//
+// Authors:
+// Dwivedi, Ajay kumar Adwiv@Yahoo.com
+// Atsushi Enomoto atsushi@ximian.com
+//
//
// Permission is hereby granted, free of charge, to any person obtaining
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-using System;\r
-using System.Xml.Serialization;\r
-\r
-namespace System.Xml.Schema\r
-{\r
- public abstract class XmlSchemaGroupBase : XmlSchemaParticle\r
- {\r
- private XmlSchemaObjectCollection compiledItems;\r
-\r
- protected XmlSchemaGroupBase ()\r
- {\r
- compiledItems = new XmlSchemaObjectCollection ();\r
- }\r
-\r
- [XmlIgnore]\r
- public abstract XmlSchemaObjectCollection Items { get; }\r
-\r
- internal XmlSchemaObjectCollection CompiledItems \r
- {\r
- get{ return compiledItems; }\r
- }\r
-\r
- internal void CopyOptimizedItems (XmlSchemaGroupBase gb)\r
- {\r
- for (int i = 0; i < Items.Count; i++) {\r
- XmlSchemaParticle p = Items [i] as XmlSchemaParticle;\r
- p = p.GetOptimizedParticle (false);\r
- if (p == XmlSchemaParticle.Empty)\r
- continue;\r
- gb.Items.Add (p);\r
- gb.CompiledItems.Add (p);\r
- }\r
- }\r
-\r
- internal override bool ParticleEquals (XmlSchemaParticle other)\r
- {\r
- XmlSchemaGroupBase gb = other as XmlSchemaGroupBase;\r
- if (gb == null)\r
- return false;\r
- if (this.GetType () != gb.GetType ())\r
- return false;\r
-\r
- if (this.ValidatedMaxOccurs != gb.ValidatedMaxOccurs ||\r
- this.ValidatedMinOccurs != gb.ValidatedMinOccurs)\r
- return false;\r
- if (this.CompiledItems.Count != gb.CompiledItems.Count)\r
- return false;\r
- for (int i = 0; i < CompiledItems.Count; i++) {\r
- XmlSchemaParticle p1 = this.CompiledItems [i] as XmlSchemaParticle;\r
- XmlSchemaParticle p2 = gb.CompiledItems [i] as XmlSchemaParticle;\r
- if (!p1.ParticleEquals (p2))\r
- return false;\r
- }\r
- return true;\r
- }\r
-\r
- internal override void CheckRecursion (int depth, ValidationEventHandler h, XmlSchema schema)\r
- {\r
- foreach (XmlSchemaParticle p in this.Items)\r
- p.CheckRecursion (depth, h, schema);\r
- }\r
-\r
- internal bool ValidateNSRecurseCheckCardinality (XmlSchemaAny any,\r
- ValidationEventHandler h, XmlSchema schema, bool raiseError)\r
- {\r
- foreach (XmlSchemaParticle p in Items)\r
- if (!p.ValidateDerivationByRestriction (any, h, schema, raiseError))\r
- return false;\r
- return ValidateOccurenceRangeOK (any, h, schema, raiseError);\r
- }\r
-\r
- internal bool ValidateRecurse (XmlSchemaGroupBase baseGroup,\r
- ValidationEventHandler h, XmlSchema schema, bool raiseError)\r
- {\r
- return ValidateSeqRecurseMapSumCommon (baseGroup, h, schema, false, false, raiseError);\r
- }\r
-\r
- internal bool ValidateSeqRecurseMapSumCommon (XmlSchemaGroupBase baseGroup,\r
- ValidationEventHandler h, XmlSchema schema, bool isLax, bool isMapAndSum, bool raiseError)\r
- {\r
- int index = 0;\r
- int baseIndex = 0;\r
- decimal baseOccured = 0;\r
- if (baseGroup.CompiledItems.Count == 0 && this.CompiledItems.Count > 0) {\r
- if (raiseError)\r
- error (h, "Invalid particle derivation by restriction was found. base particle does not contain particles.");\r
- return false;\r
- }\r
-\r
- for (int i = 0; i < CompiledItems.Count; i++) {\r
- // get non-empty derived particle\r
- XmlSchemaParticle pd = null;\r
- while (this.CompiledItems.Count > index) {\r
- pd = ((XmlSchemaParticle) this.CompiledItems [index]);//.GetOptimizedParticle (false);\r
- if (pd != XmlSchemaParticle.Empty)// && pd.ValidatedMaxOccurs > 0)\r
- break;\r
- else\r
- index++;\r
- }\r
- if (index >= CompiledItems.Count) {\r
- if (raiseError)\r
- error (h, "Invalid particle derivation by restriction was found. Cannot be mapped to base particle.");\r
- return false;\r
- }\r
-\r
- // get non-empty base particle\r
- XmlSchemaParticle pb = null;\r
- while (baseGroup.CompiledItems.Count > baseIndex) {\r
- pb = ((XmlSchemaParticle) baseGroup.CompiledItems [baseIndex]);//.GetOptimizedParticle (false);\r
- if (pb == XmlSchemaParticle.Empty && pb.ValidatedMaxOccurs > 0)\r
- continue;\r
- if (!pd.ValidateDerivationByRestriction (pb, h, schema, false)) {\r
- if (!isLax && !isMapAndSum && pb.MinOccurs > baseOccured && !pb.ValidateIsEmptiable ()) {\r
- if (raiseError)\r
- error (h, "Invalid particle derivation by restriction was found. Invalid sub-particle derivation was found.");\r
- return false;\r
- }\r
- else {\r
- baseOccured = 0;\r
- baseIndex++;\r
- }\r
- } else {\r
- baseOccured += pb.ValidatedMinOccurs;\r
- if (baseOccured >= baseGroup.ValidatedMaxOccurs) {\r
- baseOccured = 0;\r
- baseIndex++;\r
- }\r
- index++;\r
- break;\r
- }\r
- }\r
- }\r
- if (this.CompiledItems.Count > 0 && index != this.CompiledItems.Count) {\r
- if (raiseError)\r
- error (h, "Invalid particle derivation by restriction was found. Extraneous derived particle was found.");\r
- return false;\r
- }\r
- if (!isLax && !isMapAndSum) {\r
- if (baseOccured > 0)\r
- baseIndex++;\r
- for (int i = baseIndex; i < baseGroup.CompiledItems.Count; i++) {\r
- XmlSchemaParticle p = baseGroup.CompiledItems [i] as XmlSchemaParticle;\r
- if (!p.ValidateIsEmptiable ()) {\r
- if (raiseError)\r
- error (h, "Invalid particle derivation by restriction was found. There is a base particle which does not have mapped derived particle and is not emptiable.");\r
- return false;\r
- }\r
- }\r
- }\r
- return true;\r
- }\r
- }\r
-}\r
+using System;
+using System.Xml.Serialization;
+
+namespace System.Xml.Schema
+{
+ public abstract class XmlSchemaGroupBase : XmlSchemaParticle
+ {
+ private XmlSchemaObjectCollection compiledItems;
+
+ protected XmlSchemaGroupBase ()
+ {
+ compiledItems = new XmlSchemaObjectCollection ();
+ }
+
+ [XmlIgnore]
+ public abstract XmlSchemaObjectCollection Items { get; }
+
+ internal XmlSchemaObjectCollection CompiledItems
+ {
+ get{ return compiledItems; }
+ }
+
+ internal void CopyOptimizedItems (XmlSchemaGroupBase gb)
+ {
+ for (int i = 0; i < Items.Count; i++) {
+ XmlSchemaParticle p = Items [i] as XmlSchemaParticle;
+ p = p.GetOptimizedParticle (false);
+ if (p == XmlSchemaParticle.Empty)
+ continue;
+ gb.Items.Add (p);
+ gb.CompiledItems.Add (p);
+ }
+ }
+
+ internal override bool ParticleEquals (XmlSchemaParticle other)
+ {
+ XmlSchemaGroupBase gb = other as XmlSchemaGroupBase;
+ if (gb == null)
+ return false;
+ if (this.GetType () != gb.GetType ())
+ return false;
+
+ if (this.ValidatedMaxOccurs != gb.ValidatedMaxOccurs ||
+ this.ValidatedMinOccurs != gb.ValidatedMinOccurs)
+ return false;
+ if (this.CompiledItems.Count != gb.CompiledItems.Count)
+ return false;
+ for (int i = 0; i < CompiledItems.Count; i++) {
+ XmlSchemaParticle p1 = this.CompiledItems [i] as XmlSchemaParticle;
+ XmlSchemaParticle p2 = gb.CompiledItems [i] as XmlSchemaParticle;
+ if (!p1.ParticleEquals (p2))
+ return false;
+ }
+ return true;
+ }
+
+ internal override void CheckRecursion (int depth, ValidationEventHandler h, XmlSchema schema)
+ {
+ foreach (XmlSchemaParticle p in this.Items)
+ p.CheckRecursion (depth, h, schema);
+ }
+
+ internal bool ValidateNSRecurseCheckCardinality (XmlSchemaAny any,
+ ValidationEventHandler h, XmlSchema schema, bool raiseError)
+ {
+ foreach (XmlSchemaParticle p in Items)
+ if (!p.ValidateDerivationByRestriction (any, h, schema, raiseError))
+ return false;
+ return ValidateOccurenceRangeOK (any, h, schema, raiseError);
+ }
+
+ internal bool ValidateRecurse (XmlSchemaGroupBase baseGroup,
+ ValidationEventHandler h, XmlSchema schema, bool raiseError)
+ {
+ return ValidateSeqRecurseMapSumCommon (baseGroup, h, schema, false, false, raiseError);
+ }
+
+ internal bool ValidateSeqRecurseMapSumCommon (XmlSchemaGroupBase baseGroup,
+ ValidationEventHandler h, XmlSchema schema, bool isLax, bool isMapAndSum, bool raiseError)
+ {
+ int index = 0;
+ int baseIndex = 0;
+ decimal baseOccured = 0;
+ if (baseGroup.CompiledItems.Count == 0 && this.CompiledItems.Count > 0) {
+ if (raiseError)
+ error (h, "Invalid particle derivation by restriction was found. base particle does not contain particles.");
+ return false;
+ }
+
+ for (int i = 0; i < CompiledItems.Count; i++) {
+ // get non-empty derived particle
+ XmlSchemaParticle pd = null;
+ while (this.CompiledItems.Count > index) {
+ pd = ((XmlSchemaParticle) this.CompiledItems [index]);//.GetOptimizedParticle (false);
+ if (pd != XmlSchemaParticle.Empty)// && pd.ValidatedMaxOccurs > 0)
+ break;
+ else
+ index++;
+ }
+ if (index >= CompiledItems.Count) {
+ if (raiseError)
+ error (h, "Invalid particle derivation by restriction was found. Cannot be mapped to base particle.");
+ return false;
+ }
+
+ // get non-empty base particle
+ XmlSchemaParticle pb = null;
+ while (baseGroup.CompiledItems.Count > baseIndex) {
+ pb = ((XmlSchemaParticle) baseGroup.CompiledItems [baseIndex]);//.GetOptimizedParticle (false);
+ if (pb == XmlSchemaParticle.Empty && pb.ValidatedMaxOccurs > 0)
+ continue;
+ if (!pd.ValidateDerivationByRestriction (pb, h, schema, false)) {
+ if (!isLax && !isMapAndSum && pb.MinOccurs > baseOccured && !pb.ValidateIsEmptiable ()) {
+ if (raiseError)
+ error (h, "Invalid particle derivation by restriction was found. Invalid sub-particle derivation was found.");
+ return false;
+ }
+ else {
+ baseOccured = 0;
+ baseIndex++;
+ }
+ } else {
+ baseOccured += pb.ValidatedMinOccurs;
+ if (baseOccured >= baseGroup.ValidatedMaxOccurs) {
+ baseOccured = 0;
+ baseIndex++;
+ }
+ index++;
+ break;
+ }
+ }
+ }
+ if (this.CompiledItems.Count > 0 && index != this.CompiledItems.Count) {
+ if (raiseError)
+ error (h, "Invalid particle derivation by restriction was found. Extraneous derived particle was found.");
+ return false;
+ }
+ if (!isLax && !isMapAndSum) {
+ if (baseOccured > 0)
+ baseIndex++;
+ for (int i = baseIndex; i < baseGroup.CompiledItems.Count; i++) {
+ XmlSchemaParticle p = baseGroup.CompiledItems [i] as XmlSchemaParticle;
+ if (!p.ValidateIsEmptiable ()) {
+ if (raiseError)
+ error (h, "Invalid particle derivation by restriction was found. There is a base particle which does not have mapped derived particle and is not emptiable.");
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ }
+}