System.XML: Partial implementation of XmlSchemaDatatype::ChangeType
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaGroup.cs
index c6a4df32022412d87edc6d0ce2319104da4c6e37..ebbfaa2d306fb5f2573b898aa328b4bb400c0b13 100644 (file)
@@ -1,10 +1,10 @@
-//\r
-// System.Xml.Schema.XmlSchemaGroup.cs\r
-//\r
-// Author:\r
-//     Dwivedi, Ajay kumar  Adwiv@Yahoo.com\r
-//     Atsushi Enomoto  ginga@kit.hi-ho.ne.jp\r
-//\r
+//
+// System.Xml.Schema.XmlSchemaGroup.cs
+//
+// Author:
+//     Dwivedi, Ajay kumar  Adwiv@Yahoo.com
+//     Atsushi Enomoto  ginga@kit.hi-ho.ne.jp
+//
 
 //
 // 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.Collections;\r
-using System.Xml.Serialization;\r
-using System.Xml;\r
-\r
-namespace System.Xml.Schema\r
-{\r
-       /// <summary>\r
-       /// refers to the named group\r
-       /// </summary>\r
-       public class XmlSchemaGroup : XmlSchemaAnnotated\r
-       {\r
-               private string name;\r
-               private XmlSchemaGroupBase particle;\r
-               private XmlQualifiedName qualifiedName;\r
-               private bool isCircularDefinition;\r
-               \r
-               const string xmlname = "group";\r
-\r
-               public XmlSchemaGroup()\r
-               {\r
-                       qualifiedName = XmlQualifiedName.Empty;\r
-               }\r
-\r
-               [System.Xml.Serialization.XmlAttribute("name")]\r
-               public string Name \r
-               {\r
-                       get{ return  name; } \r
-                       set{ name = value; }\r
-               }\r
-\r
-               [XmlElement("all",typeof(XmlSchemaAll))]\r
-               [XmlElement("choice",typeof(XmlSchemaChoice))]\r
-               [XmlElement("sequence",typeof(XmlSchemaSequence))]\r
-               public XmlSchemaGroupBase Particle\r
-               {\r
-                       get{ return  particle; }\r
-                       set{ particle = value; }\r
-               }\r
-\r
-               [XmlIgnore]\r
-#if NET_2_0\r
-               public XmlQualifiedName QualifiedName \r
-#else\r
-               internal XmlQualifiedName QualifiedName \r
-#endif\r
-               {\r
-                       get{ return qualifiedName;}\r
-               }\r
-\r
-               internal bool IsCircularDefinition\r
-               {\r
-                       get { return isCircularDefinition; }\r
-               }\r
-\r
-               // 1. name must be present\r
-               // 2. MinOccurs & MaxOccurs of the Particle must be absent\r
-               internal override int Compile(ValidationEventHandler h, XmlSchema schema)\r
-               {\r
-                       // If this is already compiled this time, simply skip.\r
-                       if (CompilationId == schema.CompilationId)\r
-                               return 0;\r
-\r
-#if NET_2_0\r
-                       if (Particle != null)\r
-                               Particle.Parent = this;\r
-#endif\r
-\r
-                       if(Name == null)\r
-                               error(h,"Required attribute name must be present");\r
-                       else if(!XmlSchemaUtil.CheckNCName(this.name)) \r
-                               error(h,"attribute name must be NCName");\r
-                       else\r
-                               qualifiedName = new XmlQualifiedName(Name,schema.TargetNamespace);\r
-\r
-                       if(Particle == null)\r
-                       {\r
-                               error(h,"Particle is required");\r
-                       }\r
-                       else \r
-                       {\r
-                               if(Particle.MaxOccursString != null)\r
-                                       Particle.error(h,"MaxOccurs must not be present when the Particle is a child of Group");\r
-                               if(Particle.MinOccursString != null)\r
-                                       Particle.error(h,"MinOccurs must not be present when the Particle is a child of Group");\r
-                       \r
-                               Particle.Compile (h, schema);\r
-                       }\r
-                       \r
-                       XmlSchemaUtil.CompileID(Id,this,schema.IDCollection,h);\r
-\r
-                       this.CompilationId = schema.CompilationId;\r
-                       return errorCount;\r
-               }\r
-               \r
-               internal override int Validate(ValidationEventHandler h, XmlSchema schema)\r
-               {\r
-                       if (this.IsValidated (schema.ValidationId))\r
-                               return errorCount;\r
-\r
-                       // 3.8.6 Model Group Correct :: 2. Circular group disallowed.\r
-                       if (Particle != null) { // in case of invalid schema.\r
-                               Particle.parentIsGroupDefinition = true;\r
-\r
-                               try {\r
-                                       Particle.CheckRecursion (0, h, schema);\r
-                               } catch (XmlSchemaException ex) {\r
-                                       error (h, ex.Message, ex);\r
-                                       this.isCircularDefinition = true;\r
-                                       return errorCount;\r
-                               }\r
-                               errorCount += Particle.Validate (h,schema);\r
-\r
-                               Particle.ValidateUniqueParticleAttribution (new XmlSchemaObjectTable (),\r
-                                       new ArrayList (), h, schema);\r
-                               Particle.ValidateUniqueTypeAttribution (\r
-                                       new XmlSchemaObjectTable (), h, schema);\r
-                       }\r
-\r
-                       this.ValidationId = schema.ValidationId;\r
-                       return errorCount;\r
-               }\r
-\r
-               //From the Errata\r
-               //<group \r
-               //  id = ID\r
-               //  name = NCName\r
-               //  {any attributes with non-schema namespace . . .}>\r
-               //  Content: (annotation?, (all | choice | sequence)?)\r
-               //</group>\r
-               internal static XmlSchemaGroup Read(XmlSchemaReader reader, ValidationEventHandler h)\r
-               {\r
-                       XmlSchemaGroup group = new XmlSchemaGroup();\r
-                       reader.MoveToElement();\r
-\r
-                       if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
-                       {\r
-                               error(h,"Should not happen :1: XmlSchemaGroup.Read, name="+reader.Name,null);\r
-                               reader.Skip();\r
-                               return null;\r
-                       }\r
-\r
-                       group.LineNumber = reader.LineNumber;\r
-                       group.LinePosition = reader.LinePosition;\r
-                       group.SourceUri = reader.BaseURI;\r
-\r
-                       while(reader.MoveToNextAttribute())\r
-                       {\r
-                               if(reader.Name == "id")\r
-                               {\r
-                                       group.Id = reader.Value;\r
-                               }\r
-                               else if(reader.Name == "name")\r
-                               {\r
-                                       group.name = reader.Value;\r
-                               }\r
-                               else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)\r
-                               {\r
-                                       error(h,reader.Name + " is not a valid attribute for group",null);\r
-                               }\r
-                               else\r
-                               {\r
-                                       XmlSchemaUtil.ReadUnhandledAttribute(reader,group);\r
-                               }\r
-                       }\r
-                       \r
-                       reader.MoveToElement();\r
-                       if(reader.IsEmptyElement)\r
-                               return group;\r
-\r
-//                      Content: (annotation?, (all | choice | sequence)?)\r
-                       int level = 1;\r
-                       while(reader.ReadNextElement())\r
-                       {\r
-                               if(reader.NodeType == XmlNodeType.EndElement)\r
-                               {\r
-                                       if(reader.LocalName != xmlname)\r
-                                               error(h,"Should not happen :2: XmlSchemaGroup.Read, name="+reader.Name,null);\r
-                                       break;\r
-                               }\r
-                               if(level <= 1 && reader.LocalName == "annotation")\r
-                               {\r
-                                       level = 2; //Only one annotation\r
-                                       XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);\r
-                                       if(annotation != null)\r
-                                               group.Annotation = annotation;\r
-                                       continue;\r
-                               }\r
-                               if(level <= 2)\r
-                               {\r
-                                       if(reader.LocalName == "all")\r
-                                       {\r
-                                               level = 3;\r
-                                               XmlSchemaAll all = XmlSchemaAll.Read(reader,h);\r
-                                               if(all != null)\r
-                                                       group.Particle = all;\r
-                                               continue;\r
-                                       }\r
-                                       if(reader.LocalName == "choice")\r
-                                       {\r
-                                               level = 3;\r
-                                               XmlSchemaChoice choice = XmlSchemaChoice.Read(reader,h);\r
-                                               if(choice != null)\r
-                                                       group.Particle = choice;\r
-                                               continue;\r
-                                       }\r
-                                       if(reader.LocalName == "sequence")\r
-                                       {\r
-                                               level = 3;\r
-                                               XmlSchemaSequence sequence = XmlSchemaSequence.Read(reader,h);\r
-                                               if(sequence != null)\r
-                                                       group.Particle = sequence;\r
-                                               continue;\r
-                                       }\r
-                               }\r
-                               reader.RaiseInvalidElementError();\r
-                       }\r
-                       return group;\r
-               }\r
-       }\r
-}\r
+using System;
+using System.Collections;
+using System.Xml.Serialization;
+using System.Xml;
+
+namespace System.Xml.Schema
+{
+       /// <summary>
+       /// refers to the named group
+       /// </summary>
+       public class XmlSchemaGroup : XmlSchemaAnnotated
+       {
+               private string name;
+               private XmlSchemaGroupBase particle;
+               private XmlQualifiedName qualifiedName;
+               private bool isCircularDefinition;
+               
+               const string xmlname = "group";
+
+               public XmlSchemaGroup()
+               {
+                       qualifiedName = XmlQualifiedName.Empty;
+               }
+
+               [System.Xml.Serialization.XmlAttribute("name")]
+               public string Name 
+               {
+                       get{ return  name; } 
+                       set{ name = value; }
+               }
+
+               [XmlElement("all",typeof(XmlSchemaAll))]
+               [XmlElement("choice",typeof(XmlSchemaChoice))]
+               [XmlElement("sequence",typeof(XmlSchemaSequence))]
+               public XmlSchemaGroupBase Particle
+               {
+                       get{ return  particle; }
+                       set{ particle = value; }
+               }
+
+               [XmlIgnore]
+#if NET_2_0
+               public XmlQualifiedName QualifiedName 
+#else
+               internal XmlQualifiedName QualifiedName 
+#endif
+               {
+                       get{ return qualifiedName;}
+               }
+
+               internal bool IsCircularDefinition
+               {
+                       get { return isCircularDefinition; }
+               }
+
+               internal override void SetParent (XmlSchemaObject parent)
+               {
+                       base.SetParent (parent);
+                       if (Particle != null)
+                               Particle.SetParent (this);
+               }
+
+               // 1. name must be present
+               // 2. MinOccurs & MaxOccurs of the Particle must be absent
+               internal override int Compile(ValidationEventHandler h, XmlSchema schema)
+               {
+                       // If this is already compiled this time, simply skip.
+                       if (CompilationId == schema.CompilationId)
+                               return 0;
+
+                       if(Name == null)
+                               error(h,"Required attribute name must be present");
+                       else if(!XmlSchemaUtil.CheckNCName(this.name)) 
+                               error(h,"attribute name must be NCName");
+                       else
+                               qualifiedName = new XmlQualifiedName(Name, AncestorSchema.TargetNamespace);
+
+                       if(Particle == null)
+                       {
+                               error(h,"Particle is required");
+                       }
+                       else 
+                       {
+                               if(Particle.MaxOccursString != null)
+                                       Particle.error(h,"MaxOccurs must not be present when the Particle is a child of Group");
+                               if(Particle.MinOccursString != null)
+                                       Particle.error(h,"MinOccurs must not be present when the Particle is a child of Group");
+                       
+                               Particle.Compile (h, schema);
+                       }
+                       
+                       XmlSchemaUtil.CompileID(Id,this,schema.IDCollection,h);
+
+                       this.CompilationId = schema.CompilationId;
+                       return errorCount;
+               }
+               
+               internal override int Validate(ValidationEventHandler h, XmlSchema schema)
+               {
+                       if (this.IsValidated (schema.ValidationId))
+                               return errorCount;
+
+                       // 3.8.6 Model Group Correct :: 2. Circular group disallowed.
+                       if (Particle != null) { // in case of invalid schema.
+                               Particle.parentIsGroupDefinition = true;
+
+                               try {
+                                       Particle.CheckRecursion (0, h, schema);
+                               } catch (XmlSchemaException ex) {
+                                       error (h, ex.Message, ex);
+                                       this.isCircularDefinition = true;
+                                       return errorCount;
+                               }
+                               errorCount += Particle.Validate (h,schema);
+
+                               Particle.ValidateUniqueParticleAttribution (new XmlSchemaObjectTable (),
+                                       new ArrayList (), h, schema);
+                               Particle.ValidateUniqueTypeAttribution (
+                                       new XmlSchemaObjectTable (), h, schema);
+                       }
+
+                       this.ValidationId = schema.ValidationId;
+                       return errorCount;
+               }
+
+               //From the Errata
+               //<group 
+               //  id = ID
+               //  name = NCName
+               //  {any attributes with non-schema namespace . . .}>
+               //  Content: (annotation?, (all | choice | sequence)?)
+               //</group>
+               internal static XmlSchemaGroup Read(XmlSchemaReader reader, ValidationEventHandler h)
+               {
+                       XmlSchemaGroup group = new XmlSchemaGroup();
+                       reader.MoveToElement();
+
+                       if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)
+                       {
+                               error(h,"Should not happen :1: XmlSchemaGroup.Read, name="+reader.Name,null);
+                               reader.Skip();
+                               return null;
+                       }
+
+                       group.LineNumber = reader.LineNumber;
+                       group.LinePosition = reader.LinePosition;
+                       group.SourceUri = reader.BaseURI;
+
+                       while(reader.MoveToNextAttribute())
+                       {
+                               if(reader.Name == "id")
+                               {
+                                       group.Id = reader.Value;
+                               }
+                               else if(reader.Name == "name")
+                               {
+                                       group.name = reader.Value;
+                               }
+                               else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)
+                               {
+                                       error(h,reader.Name + " is not a valid attribute for group",null);
+                               }
+                               else
+                               {
+                                       XmlSchemaUtil.ReadUnhandledAttribute(reader,group);
+                               }
+                       }
+                       
+                       reader.MoveToElement();
+                       if(reader.IsEmptyElement)
+                               return group;
+
+//                      Content: (annotation?, (all | choice | sequence)?)
+                       int level = 1;
+                       while(reader.ReadNextElement())
+                       {
+                               if(reader.NodeType == XmlNodeType.EndElement)
+                               {
+                                       if(reader.LocalName != xmlname)
+                                               error(h,"Should not happen :2: XmlSchemaGroup.Read, name="+reader.Name,null);
+                                       break;
+                               }
+                               if(level <= 1 && reader.LocalName == "annotation")
+                               {
+                                       level = 2; //Only one annotation
+                                       XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
+                                       if(annotation != null)
+                                               group.Annotation = annotation;
+                                       continue;
+                               }
+                               if(level <= 2)
+                               {
+                                       if(reader.LocalName == "all")
+                                       {
+                                               level = 3;
+                                               XmlSchemaAll all = XmlSchemaAll.Read(reader,h);
+                                               if(all != null)
+                                                       group.Particle = all;
+                                               continue;
+                                       }
+                                       if(reader.LocalName == "choice")
+                                       {
+                                               level = 3;
+                                               XmlSchemaChoice choice = XmlSchemaChoice.Read(reader,h);
+                                               if(choice != null)
+                                                       group.Particle = choice;
+                                               continue;
+                                       }
+                                       if(reader.LocalName == "sequence")
+                                       {
+                                               level = 3;
+                                               XmlSchemaSequence sequence = XmlSchemaSequence.Read(reader,h);
+                                               if(sequence != null)
+                                                       group.Particle = sequence;
+                                               continue;
+                                       }
+                               }
+                               reader.RaiseInvalidElementError();
+                       }
+                       return group;
+               }
+       }
+}