System.XML: Remove more NET_2_0 directives
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaComplexContentExtension.cs
old mode 100755 (executable)
new mode 100644 (file)
index 5e4f0b0..f2e9bcd
-// Author: Dwivedi, Ajay kumar\r
-//            Adwiv@Yahoo.com\r
-using System;\r
-using System.Xml;\r
-using System.Xml.Serialization;\r
-\r
-namespace System.Xml.Schema\r
-{\r
-       /// <summary>\r
-       /// Summary description for XmlSchemaComplexContentExtension.\r
-       /// </summary>\r
-       public class XmlSchemaComplexContentExtension : XmlSchemaContent\r
-       {\r
-               private XmlSchemaAnyAttribute any;\r
-               private XmlSchemaObjectCollection attributes;\r
-               private XmlQualifiedName baseTypeName;\r
-               private XmlSchemaParticle particle;\r
-               public XmlSchemaComplexContentExtension()\r
-               {\r
-                       attributes = new XmlSchemaObjectCollection();\r
-               }\r
-               [XmlElement]\r
-               public XmlSchemaAnyAttribute AnyAttribute \r
-               {\r
-                       get{ return any; }\r
-                       set{ any = value;}\r
-               }\r
-               [XmlElement]\r
-               public XmlSchemaObjectCollection Attributes \r
-               {\r
-                       get{ return attributes; }\r
-               }\r
-               [XmlAttribute]\r
-               public XmlQualifiedName BaseTypeName \r
-               {\r
-                       get{ return  baseTypeName; }\r
-                       set{ baseTypeName = value; }\r
-               }\r
-               [XmlElement]\r
-               public XmlSchemaParticle Particle\r
-               {\r
-                       get{ return  particle; }\r
-                       set{ particle = value; }\r
-               }\r
-       }\r
-}\r
+//
+// System.Xml.Schema.XmlSchemaComplexContentExtension.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
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// 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;
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace System.Xml.Schema
+{
+       /// <summary>
+       /// Summary description for XmlSchemaComplexContentExtension.
+       /// </summary>
+       public class XmlSchemaComplexContentExtension : XmlSchemaContent
+       {
+               private XmlSchemaAnyAttribute any;
+               private XmlSchemaObjectCollection attributes;
+               private XmlQualifiedName baseTypeName;
+               private XmlSchemaParticle particle;
+               const string xmlname = "extension";
+
+               public XmlSchemaComplexContentExtension()
+               {
+                       attributes = new XmlSchemaObjectCollection();
+                       baseTypeName = XmlQualifiedName.Empty;
+               }
+               
+               [System.Xml.Serialization.XmlAttribute("base")]
+               public XmlQualifiedName BaseTypeName 
+               {
+                       get{ return  baseTypeName; }
+                       set{ baseTypeName = value; }
+               }
+
+               [XmlElement("group",typeof(XmlSchemaGroupRef))]
+               [XmlElement("all",typeof(XmlSchemaAll))]
+               [XmlElement("choice",typeof(XmlSchemaChoice))]
+               [XmlElement("sequence",typeof(XmlSchemaSequence))]
+               public XmlSchemaParticle Particle
+               {
+                       get{ return  particle; }
+                       set{ particle = value; }
+               }
+
+               [XmlElement("attribute",typeof(XmlSchemaAttribute))]
+               [XmlElement("attributeGroup",typeof(XmlSchemaAttributeGroupRef))]
+               public XmlSchemaObjectCollection Attributes 
+               {
+                       get{ return attributes; }
+               }
+
+               [XmlElement("anyAttribute")]
+               public XmlSchemaAnyAttribute AnyAttribute 
+               {
+                       get{ return any; }
+                       set{ any = value;}
+               }
+
+               // internal properties
+               internal override bool IsExtension {
+                       get { return true; }
+               }
+
+               internal override void SetParent (XmlSchemaObject parent)
+               {
+                       base.SetParent (parent);
+                       if (Particle != null)
+                               Particle.SetParent (this);
+                       if (AnyAttribute != null)
+                               AnyAttribute.SetParent (this);
+                       foreach (XmlSchemaObject obj in Attributes)
+                               obj.SetParent (this);
+               }
+
+               /// <remarks>
+               /// </remarks>
+               internal override int Compile(ValidationEventHandler h, XmlSchema schema)
+               {
+                       // If this is already compiled this time, simply skip.
+                       if (CompilationId == schema.CompilationId)
+                               return 0;
+
+                       if (this.isRedefinedComponent) {
+                               if (Annotation != null)
+                                       Annotation.isRedefinedComponent = true;
+                               if (AnyAttribute != null)
+                                       AnyAttribute.isRedefinedComponent  = true;
+                               foreach (XmlSchemaObject obj in Attributes)
+                                       obj.isRedefinedComponent  = true;
+                               if (Particle != null)
+                                       Particle.isRedefinedComponent  = true;
+                       }
+
+                       if(BaseTypeName == null || BaseTypeName.IsEmpty)
+                       {
+                               error(h, "base must be present, as a QName");
+                       }
+                       else if(!XmlSchemaUtil.CheckQName(BaseTypeName))
+                               error(h,"BaseTypeName is not a valid XmlQualifiedName");
+                       
+                       if(this.AnyAttribute != null)
+                       {
+                               errorCount += AnyAttribute.Compile(h, schema);
+                       }
+
+                       foreach(XmlSchemaObject obj in Attributes)
+                       {
+                               if(obj is XmlSchemaAttribute)
+                               {
+                                       XmlSchemaAttribute attr = (XmlSchemaAttribute) obj;
+                                       errorCount += attr.Compile(h, schema);
+                               }
+                               else if(obj is XmlSchemaAttributeGroupRef)
+                               {
+                                       XmlSchemaAttributeGroupRef atgrp = (XmlSchemaAttributeGroupRef) obj;
+                                       errorCount += atgrp.Compile(h, schema);
+                               }
+                               else
+                                       error(h,obj.GetType() +" is not valid in this place::ComplexConetnetExtension");
+                       }
+                       
+                       if(Particle != null)
+                       {
+                               if(Particle is XmlSchemaGroupRef)
+                               {
+                                       errorCount += ((XmlSchemaGroupRef)Particle).Compile(h, schema);
+                               }
+                               else if(Particle is XmlSchemaAll)
+                               {
+                                       errorCount += ((XmlSchemaAll)Particle).Compile(h, schema);
+                               }
+                               else if(Particle is XmlSchemaChoice)
+                               {
+                                       errorCount += ((XmlSchemaChoice)Particle).Compile(h, schema);
+                               }
+                               else if(Particle is XmlSchemaSequence)
+                               {
+                                       errorCount += ((XmlSchemaSequence)Particle).Compile(h, schema);
+                               }
+                               else
+                                       error (h, "Particle of a restriction is limited only to group, sequence, choice and all.");
+                       }
+                       
+                       XmlSchemaUtil.CompileID(Id,this, schema.IDCollection,h);
+
+                       this.CompilationId = schema.CompilationId;
+                       return errorCount;
+               }
+               
+               internal override XmlQualifiedName GetBaseTypeName ()
+               {
+                       return baseTypeName;
+               }
+
+               internal override XmlSchemaParticle GetParticle ()
+               {
+                       return particle;
+               }
+
+               internal override int Validate(ValidationEventHandler h, XmlSchema schema)
+               {
+                       if (IsValidated (schema.ValidationId))
+                               return errorCount;
+
+                       if (AnyAttribute != null)
+                               errorCount += AnyAttribute.Validate (h, schema);
+                       foreach (XmlSchemaObject attrObj in Attributes)
+                               errorCount += attrObj.Validate (h, schema);
+                       if (Particle != null)
+                               errorCount += Particle.Validate (h, schema);
+
+                       ValidationId = schema.ValidationId;
+                       return errorCount;
+               }
+               //<extension
+               //  base = QName
+               //  id = ID
+               //  {any attributes with non-schema namespace . . .}>
+               //  Content: (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))
+               //</extension>
+               internal static XmlSchemaComplexContentExtension Read(XmlSchemaReader reader, ValidationEventHandler h)
+               {
+                       XmlSchemaComplexContentExtension extension = new XmlSchemaComplexContentExtension();
+                       reader.MoveToElement();
+
+                       if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)
+                       {
+                               error(h,"Should not happen :1: XmlSchemaComplexContentExtension.Read, name="+reader.Name,null);
+                               reader.Skip();
+                               return null;
+                       }
+
+                       extension.LineNumber = reader.LineNumber;
+                       extension.LinePosition = reader.LinePosition;
+                       extension.SourceUri = reader.BaseURI;
+
+                       while(reader.MoveToNextAttribute())
+                       {
+                               if(reader.Name == "base")
+                               {
+                                       Exception innerex;
+                                       extension.baseTypeName = XmlSchemaUtil.ReadQNameAttribute(reader,out innerex);
+                                       if(innerex != null)
+                                               error(h, reader.Value + " is not a valid value for base attribute",innerex);
+                               }
+                               else if(reader.Name == "id")
+                               {
+                                       extension.Id = reader.Value;
+                               }
+                               else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)
+                               {
+                                       error(h,reader.Name + " is not a valid attribute for extension",null);
+                               }
+                               else
+                               {
+                                       XmlSchemaUtil.ReadUnhandledAttribute(reader,extension);
+                               }
+                       }
+                       
+                       reader.MoveToElement();
+                       if(reader.IsEmptyElement)
+                               return extension;
+                       //Content: 1. annotation?, 
+                       //                      (2.(group | all | choice | sequence)?, (3.(attribute | attributeGroup)*, 4.anyAttribute?)))
+                       int level = 1;
+                       while(reader.ReadNextElement())
+                       {
+                               if(reader.NodeType == XmlNodeType.EndElement)
+                               {
+                                       if(reader.LocalName != xmlname)
+                                               error(h,"Should not happen :2: XmlSchemaComplexContentExtension.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)
+                                               extension.Annotation = annotation;
+                                       continue;
+                               }
+                               if(level <= 2)
+                               {
+                                       if(reader.LocalName == "group")
+                                       {
+                                               level = 3;
+                                               XmlSchemaGroupRef group = XmlSchemaGroupRef.Read(reader,h);
+                                               if(group != null)
+                                                       extension.particle = group;
+                                               continue;
+                                       }
+                                       if(reader.LocalName == "all")
+                                       {
+                                               level = 3;
+                                               XmlSchemaAll all = XmlSchemaAll.Read(reader,h);
+                                               if(all != null)
+                                                       extension.particle = all;
+                                               continue;
+                                       }
+                                       if(reader.LocalName == "choice")
+                                       {
+                                               level = 3;
+                                               XmlSchemaChoice choice = XmlSchemaChoice.Read(reader,h);
+                                               if(choice != null)
+                                                       extension.particle = choice;
+                                               continue;
+                                       }
+                                       if(reader.LocalName == "sequence")
+                                       {
+                                               level = 3;
+                                               XmlSchemaSequence sequence = XmlSchemaSequence.Read(reader,h);
+                                               if(sequence != null)
+                                                       extension.particle = sequence;
+                                               continue;
+                                       }
+                               }
+                               if(level <= 3)
+                               {
+                                       if(reader.LocalName == "attribute")
+                                       {
+                                               level = 3;
+                                               XmlSchemaAttribute attr = XmlSchemaAttribute.Read(reader,h);
+                                               if(attr != null)
+                                                       extension.Attributes.Add(attr);
+                                               continue;
+                                       }
+                                       if(reader.LocalName == "attributeGroup")
+                                       {
+                                               level = 3;
+                                               XmlSchemaAttributeGroupRef attr = XmlSchemaAttributeGroupRef.Read(reader,h);
+                                               if(attr != null)
+                                                       extension.attributes.Add(attr);
+                                               continue;
+                                       }
+                               }
+                               if(level <= 4 && reader.LocalName == "anyAttribute")
+                               {
+                                       level = 5;
+                                       XmlSchemaAnyAttribute anyattr = XmlSchemaAnyAttribute.Read(reader,h);
+                                       if(anyattr != null)
+                                               extension.AnyAttribute = anyattr;
+                                       continue;
+                               }
+                               reader.RaiseInvalidElementError();
+                       }
+                       return extension;
+               }
+       }
+}