Handle more type conversion.
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaGroupBase.cs
index 80d64157678ae08c739a26cdb8e47e008ffc3868..34213da9504aa30cb6cde6de50c6d4a8d312bfb3 100644 (file)
@@ -1,10 +1,10 @@
-//\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;
+               }
+       }
+}