2004-01-09 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaComplexType.cs
index e38bc25cfe9547d2e27ec2ac5bd59740bd704fa3..dc63bb1bc4d819dd634463dd999141f758edad61 100755 (executable)
@@ -1,6 +1,12 @@
-// Author: Dwivedi, Ajay kumar\r
-//            Adwiv@Yahoo.com\r
+//\r
+// System.Xml.Schema.XmlSchemaComplexType.cs\r
+//\r
+// Authors:\r
+//     Dwivedi, Ajay kumar  Adwiv@Yahoo.com\r
+//     Enomoto, Atsushi     ginga@kit.hi-ho.ne.jp\r
+//\r
 using System;\r
+using System.Collections;\r
 using System.Xml;\r
 using System.ComponentModel;\r
 using System.Xml.Serialization;\r
@@ -19,27 +25,121 @@ namespace System.Xml.Schema
                private XmlSchemaDerivationMethod block;\r
                private XmlSchemaDerivationMethod blockResolved;\r
                private XmlSchemaContentModel contentModel;\r
-               private XmlSchemaContentType contentType;\r
                private XmlSchemaParticle contentTypeParticle;\r
                private bool isAbstract;\r
                private bool isMixed;\r
                private XmlSchemaParticle particle;\r
+               private XmlSchemaContentType resolvedContentType;\r
 \r
-               public XmlSchemaComplexType()\r
+               internal bool ValidatedIsAbstract;\r
+               internal bool ParentIsSchema = false;\r
+\r
+               private static string xmlname = "complexType";\r
+\r
+               private static XmlSchemaComplexType anyType;\r
+\r
+               internal static XmlSchemaComplexType AnyType {\r
+                       get {\r
+                               if (anyType == null) {\r
+                                       anyType = new XmlSchemaComplexType ();\r
+                                       anyType.Name = "";      // In MS.NET, it is not "anyType"\r
+                                       anyType.QNameInternal = XmlQualifiedName.Empty; // Not xs:anyType as well.\r
+                                       anyType.contentTypeParticle = XmlSchemaAny.AnyTypeContent;\r
+//                                     anyType.baseSchemaTypeInternal = anyType;\r
+                                       anyType.datatypeInternal = XmlSchemaSimpleType.AnySimpleType;\r
+                                       anyType.isMixed = true;\r
+                               }\r
+                               return anyType;\r
+                       }\r
+               }\r
+\r
+               internal static readonly XmlQualifiedName AnyTypeName = new XmlQualifiedName ("anyType", XmlSchema.Namespace);\r
+\r
+               public XmlSchemaComplexType ()\r
                {\r
+                       attributes = new XmlSchemaObjectCollection();\r
                        block = XmlSchemaDerivationMethod.None;\r
+                       attributeUses = new XmlSchemaObjectTable();\r
+                       contentTypeParticle = XmlSchemaParticle.Empty;\r
+               }\r
+\r
+               #region Attributes\r
+\r
+               [DefaultValue(false)]\r
+               [System.Xml.Serialization.XmlAttribute("abstract")]\r
+               public bool IsAbstract \r
+               {\r
+                       get{ return  isAbstract; }\r
+                       set{ isAbstract = value; }\r
+               }\r
+               [DefaultValue(XmlSchemaDerivationMethod.None)]\r
+               [System.Xml.Serialization.XmlAttribute("block")]\r
+               public XmlSchemaDerivationMethod Block\r
+               {\r
+                       get{ return  block; }\r
+                       set{ block = value; }\r
+               }\r
+               [DefaultValue(false)]\r
+               [System.Xml.Serialization.XmlAttribute("mixed")]\r
+               public override bool IsMixed\r
+               {\r
+                       get{ return  isMixed; }\r
+                       set{ isMixed = value; }\r
+               }\r
+               \r
+               #endregion\r
+               \r
+               #region Elements\r
+                               \r
+               [XmlElement("simpleContent",typeof(XmlSchemaSimpleContent),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               [XmlElement("complexContent",typeof(XmlSchemaComplexContent),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               public XmlSchemaContentModel ContentModel \r
+               {\r
+                       get{ return  contentModel; } \r
+                       set{ contentModel = value; }\r
+               }\r
+\r
+               //LAMESPEC: The default value for particle in Schema is of Type EmptyParticle (internal?)\r
+               [XmlElement("group",typeof(XmlSchemaGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               [XmlElement("all",typeof(XmlSchemaAll),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               [XmlElement("choice",typeof(XmlSchemaChoice),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               [XmlElement("sequence",typeof(XmlSchemaSequence),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               public XmlSchemaParticle Particle \r
+               {\r
+                       get{ return  particle; } \r
+                       set{ particle = value; }\r
+               }\r
+\r
+               [XmlElement("attribute",typeof(XmlSchemaAttribute),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               [XmlElement("attributeGroup",typeof(XmlSchemaAttributeGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")]\r
+               public XmlSchemaObjectCollection Attributes \r
+               {\r
+                       get{ return attributes; }\r
                }\r
 \r
-               [XmlElement]\r
+               [XmlElement("anyAttribute",Namespace="http://www.w3.org/2001/XMLSchema")]\r
                public XmlSchemaAnyAttribute AnyAttribute \r
                {\r
                        get{ return  anyAttribute; }\r
                        set{ anyAttribute = value; }\r
                }\r
-               [XmlElement]\r
-               public XmlSchemaObjectCollection Attributes \r
+               #endregion\r
+\r
+               #region XmlIgnore\r
+               [XmlIgnore]\r
+               public XmlSchemaContentType ContentType \r
                {\r
-                       get{ return attributes; }\r
+                       get{ return resolvedContentType; }\r
+               }\r
+               [XmlIgnore]\r
+               public XmlSchemaParticle ContentTypeParticle \r
+               {\r
+                       get{ return contentTypeParticle; }\r
+               }\r
+               [XmlIgnore]\r
+               public XmlSchemaDerivationMethod BlockResolved \r
+               {\r
+                       get{ return blockResolved; }\r
                }\r
                [XmlIgnore]\r
                public XmlSchemaObjectTable AttributeUses \r
@@ -51,53 +151,958 @@ namespace System.Xml.Schema
                {\r
                        get{ return attributeWildcard; }\r
                }\r
-               [DefaultValue(XmlSchemaDerivationMethod.None)]\r
-               [XmlAttribute]\r
-               public XmlSchemaDerivationMethod Block \r
+               #endregion\r
+\r
+               /// <remarks>\r
+               /// 1. If ContentModel is present, neither particle nor Attributes nor AnyAttribute can be present.\r
+               /// 2. If particle is present, \r
+               /// a. For a topLevelComplexType\r
+               ///             1. name must be present and type NCName\r
+               ///             2. if block is #all, blockdefault is #all, else List of (extension | restriction)\r
+               ///             3. if final is #all, finaldefault is #all, else List of (extension | restriction)\r
+               ///     b. For a local Complex type \r
+               ///             1. abstract must be false\r
+               ///             2. Name must be absent\r
+               ///             3. final must be absent\r
+               ///             4. block must be absent\r
+               ///             \r
+               /// </remarks>\r
+               internal override int Compile(ValidationEventHandler h, XmlSchema schema)\r
                {\r
-                       get{ return  block; }\r
-                       set{ block = value; }\r
+                       // If this is already compiled this time, simply skip.\r
+                       if (this.IsComplied (schema.CompilationId))\r
+                               return errorCount;\r
+\r
+                       ValidatedIsAbstract = isAbstract;\r
+\r
+                       if (isRedefinedComponent) {\r
+                               if (Annotation != null)\r
+                                       Annotation.isRedefinedComponent = true;\r
+                               if (AnyAttribute != null)\r
+                                       AnyAttribute.isRedefinedComponent = true;\r
+                               foreach (XmlSchemaObject obj in Attributes)\r
+                                       obj.isRedefinedComponent = true;\r
+                               if (ContentModel != null)\r
+                                       ContentModel.isRedefinedComponent = true;\r
+                               if (Particle != null)\r
+                                       Particle.isRedefinedComponent = true;\r
+                       }\r
+\r
+                       // block/final resolution\r
+                       if(ParentIsSchema || isRedefineChild)\r
+                       {\r
+                               if(this.Name == null || this.Name == string.Empty)\r
+                                       error(h,"name must be present in a top level complex type");\r
+                               else if(!XmlSchemaUtil.CheckNCName(Name))\r
+                                       error(h,"name must be a NCName");\r
+                               else\r
+                                       this.QNameInternal = new XmlQualifiedName(Name, schema.TargetNamespace);\r
+                               \r
+                               if(Block != XmlSchemaDerivationMethod.None)\r
+                               {\r
+                                       if(Block == XmlSchemaDerivationMethod.All)\r
+                                       {\r
+                                               blockResolved = XmlSchemaDerivationMethod.All;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               //TODO: Check what all is not allowed\r
+                                               if ((Block & XmlSchemaUtil.ComplexTypeBlockAllowed) != Block)\r
+                                                       error (h, "Invalid block specification.");\r
+                                               blockResolved = Block & XmlSchemaUtil.ComplexTypeBlockAllowed;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       switch (schema.BlockDefault) {\r
+                                       case XmlSchemaDerivationMethod.All:\r
+                                               blockResolved = XmlSchemaDerivationMethod.All;\r
+                                               break;\r
+                                       case XmlSchemaDerivationMethod.None:\r
+                                               blockResolved = XmlSchemaDerivationMethod.Empty;\r
+                                               break;\r
+                                       default:\r
+                                               blockResolved = schema.BlockDefault & XmlSchemaUtil.ComplexTypeBlockAllowed;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               if(Final != XmlSchemaDerivationMethod.None)\r
+                               {\r
+                                       if(Final == XmlSchemaDerivationMethod.All)\r
+                                               finalResolved = XmlSchemaDerivationMethod.All;\r
+                                       else if ((Final & XmlSchemaUtil.FinalAllowed) != Final)\r
+                                               error (h, "Invalid final specification.");\r
+                                       else\r
+                                               finalResolved = Final;\r
+                               }\r
+                               else\r
+                               {\r
+                                       switch (schema.FinalDefault) {\r
+                                       case XmlSchemaDerivationMethod.All:\r
+                                               finalResolved = XmlSchemaDerivationMethod.All;\r
+                                               break;\r
+                                       case XmlSchemaDerivationMethod.None:\r
+                                               finalResolved = XmlSchemaDerivationMethod.Empty;\r
+                                               break;\r
+                                       default:\r
+                                               finalResolved = schema.FinalDefault & XmlSchemaUtil.FinalAllowed;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else // Not Top Level\r
+                       {\r
+                               if(isAbstract)\r
+                                       error(h,"abstract must be false in a local complex type");\r
+                               if(Name != null)\r
+                                       error(h,"name must be absent in a local complex type");\r
+                               if(Final != XmlSchemaDerivationMethod.None)\r
+                                       error(h,"final must be absent in a local complex type");\r
+                               if(block != XmlSchemaDerivationMethod.None)\r
+                                       error(h,"block must be absent in a local complex type");\r
+                       }\r
+\r
+                       // Process contents and BaseSchemaType\r
+                       if(contentModel != null)\r
+                       {\r
+                               if(anyAttribute != null || Attributes.Count != 0 || Particle != null)\r
+                                       error(h,"attributes, particles or anyattribute is not allowed if ContentModel is present");\r
+                               errorCount += contentModel.Compile (h, schema);\r
+\r
+                               XmlQualifiedName baseTypeName = null;\r
+                               XmlSchemaSimpleContent smodel = ContentModel as XmlSchemaSimpleContent;\r
+                               if(smodel != null)\r
+                               {\r
+                                       XmlSchemaSimpleContentExtension sscx = smodel.Content as XmlSchemaSimpleContentExtension;\r
+                                       if (sscx != null)\r
+                                               baseTypeName = sscx.BaseTypeName;\r
+                                       else {\r
+                                               XmlSchemaSimpleContentRestriction sscr = smodel.Content as XmlSchemaSimpleContentRestriction;\r
+                                               if (sscr != null) {\r
+                                                       baseTypeName = sscr.BaseTypeName;\r
+                                                       if (sscr.BaseType != null) {\r
+                                                               sscr.BaseType.Compile (h, schema);\r
+                                                               baseSchemaTypeInternal = sscr.BaseType;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       contentTypeParticle = XmlSchemaParticle.Empty;\r
+                               }\r
+                               else\r
+                               {\r
+                                       XmlSchemaComplexContent cmodel = (XmlSchemaComplexContent) ContentModel;\r
+                                       XmlSchemaComplexContentExtension sccx = cmodel.Content as XmlSchemaComplexContentExtension;\r
+                                       if (sccx != null) {\r
+                                               contentTypeParticle = sccx.Particle;\r
+                                               baseTypeName = sccx.BaseTypeName;\r
+                                       }\r
+                                       else {\r
+                                               XmlSchemaComplexContentRestriction sccr = (XmlSchemaComplexContentRestriction) cmodel.Content;\r
+                                               if (sccr != null) {\r
+                                                       contentTypeParticle = sccr.Particle;\r
+                                                       baseTypeName = sccr.BaseTypeName;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(Particle is XmlSchemaGroupRef)\r
+                               {\r
+                                       XmlSchemaGroupRef xsgr = (XmlSchemaGroupRef)Particle;\r
+                                       errorCount += xsgr.Compile(h,schema);\r
+                               }\r
+                               else if(Particle is XmlSchemaAll)\r
+                               {\r
+                                       XmlSchemaAll xsa = (XmlSchemaAll)Particle;\r
+                                       errorCount += xsa.Compile(h,schema);\r
+                               }\r
+                               else if(Particle is XmlSchemaChoice)\r
+                               {\r
+                                       XmlSchemaChoice xsc = (XmlSchemaChoice)Particle;\r
+                                       errorCount += xsc.Compile(h,schema);\r
+                               }\r
+                               else if(Particle is XmlSchemaSequence)\r
+                               {\r
+                                       XmlSchemaSequence xss = (XmlSchemaSequence)Particle;\r
+                                       errorCount += xss.Compile(h,schema);\r
+                               }\r
+                               this.contentTypeParticle = Particle;\r
+\r
+                               if(this.anyAttribute != null)\r
+                               {\r
+                                       AnyAttribute.Compile(h,schema);\r
+                               }\r
+                               foreach(XmlSchemaObject obj in Attributes)\r
+                               {\r
+                                       if(obj is XmlSchemaAttribute)\r
+                                       {\r
+                                               XmlSchemaAttribute attr = (XmlSchemaAttribute) obj;\r
+                                               errorCount += attr.Compile(h,schema);\r
+                                       }\r
+                                       else if(obj is XmlSchemaAttributeGroupRef)\r
+                                       {\r
+                                               XmlSchemaAttributeGroupRef atgrp = (XmlSchemaAttributeGroupRef) obj;\r
+                                               errorCount += atgrp.Compile(h,schema);\r
+                                       }\r
+                                       else\r
+                                               error(h,obj.GetType() +" is not valid in this place::ComplexType");\r
+                               }\r
+                       }\r
+\r
+                       XmlSchemaUtil.CompileID(Id, this, schema.IDCollection, h);\r
+                       this.CompilationId = schema.CompilationId;\r
+                       return errorCount;\r
                }\r
-               [XmlIgnore]\r
-               public XmlSchemaDerivationMethod BlockResolved \r
+\r
+               //\r
+               // We have to validate:\r
+               //\r
+               //      - Type Definition Properties Correct\r
+               //\r
+               // and it subsequently delegates:\r
+               //\r
+               //      - Derivation Valid (Extension)\r
+               //      - Derivation Valid (Restriction, Complex)\r
+               //      - Type Derivation OK (Complex)\r
+               //\r
+               // There are many schema errata:\r
+               // http://www.w3.org/2001/05/xmlschema-errata#Errata1\r
+               //\r
+               // E1-43 Derivation Valid (Restriction, Complex) 5.\r
+               // E1-21 Derivation Valid (Restriction, Complex) 4.3.\r
+               // E1-17 Type Derivation OK (Complex) 2.1.\r
+               //\r
+               // And E1-38, E1-37, E1-30 and E1-27\r
+               //\r
+               internal override int Validate(ValidationEventHandler h, XmlSchema schema)\r
                {\r
-                       get{ return blockResolved; }\r
+                       if (IsValidated (schema.ValidationId))\r
+                               return errorCount;\r
+                       // FIXME: omitting it causes StackOverflowException\r
+                       // among the compilation of element and types, but\r
+                       // it may result in insufficient results.\r
+                       ValidationId = schema.ValidationId;\r
+\r
+                       // 3.4.6: Properties Correct\r
+                       // Term. 1 => 3.4.1\r
+                       // Term. 2, 3 and 4 goes ValidateContentModel().\r
+                       // Term. 5 follows in this method.\r
+                       //\r
+                       // 3.4.1:  Complex Type Definitions Properties Correct\r
+                       // Schema component to CLR type property mapping:\r
+                       // {derivation method} => resolvedDerivedBy\r
+                       // {annotations} are as is.\r
+                       // {name}, {namespace} => QualifiedName\r
+                       // {final} and {prohibited substitutions} are Compile()d.\r
+                       // {abstract} => ValidatedIsAbstract\r
+\r
+                       // Below are different properties depending on simpleContent | complexContent.\r
+                       // {base type definition} => BaseSchemaType (later)\r
+                       // {attribute uses} => AttributeUses (later)\r
+                       // {content type} => ContentType and ContentTypeParticle (later)\r
+                       if (contentModel != null)\r
+                               ValidateContentModel (h, schema);\r
+                       else {\r
+                               if (particle != null)\r
+                                       ValidateImmediateParticle (h, schema);\r
+                               // contentModel never has them.\r
+                               ValidateImmediateAttributes (h, schema);\r
+                       }\r
+                       // Additional support for 3.8.6 All Group Limited\r
+                       if (contentTypeParticle != null) {\r
+                               XmlSchemaAll termAll = contentTypeParticle.ActualParticle as XmlSchemaAll;\r
+                               if (termAll != null && contentTypeParticle.ValidatedMaxOccurs != 1)\r
+                                       error (h, "Particle whose term is -all- and consists of complex type content particle must have maxOccurs = 1.");\r
+                       }\r
+\r
+                       // {content type} is going to be finished.\r
+                       if (contentTypeParticle == null)\r
+                               contentTypeParticle = XmlSchemaParticle.Empty;\r
+                       contentTypeParticle.ValidateUniqueParticleAttribution (new XmlSchemaObjectTable (),\r
+                               new ArrayList (), h, schema);\r
+                       contentTypeParticle.ValidateUniqueTypeAttribution (\r
+                               new XmlSchemaObjectTable (), h, schema);\r
+                       resolvedContentType = GetContentType ();\r
+\r
+                       // 3.4.6 Properties Correct :: 5 (Two distinct ID attributes)\r
+                       XmlSchemaAttribute idAttr = null;\r
+                       foreach (DictionaryEntry entry in attributeUses) {\r
+                               XmlSchemaAttribute attr = (XmlSchemaAttribute) entry.Value;\r
+                               XmlSchemaDatatype dt = attr.AttributeType as XmlSchemaDatatype;\r
+                               if (dt != null && dt.TokenizedType != XmlTokenizedType.ID)\r
+                                       continue;\r
+                               if (dt == null)\r
+                                       dt = ((XmlSchemaSimpleType) attr.AttributeType).Datatype;\r
+                               if (dt != null && dt.TokenizedType == XmlTokenizedType.ID) {\r
+                                       if (idAttr != null)\r
+                                               error (h, "Two or more ID typed attribute declarations in a complex type are found.");\r
+                                       else\r
+                                               idAttr = attr;\r
+                               }\r
+                       }\r
+\r
+                       ValidationId = schema.ValidationId;\r
+                       return errorCount;\r
                }\r
-               [XmlElement]\r
-               public XmlSchemaContentModel ContentModel \r
+\r
+               private void ValidateImmediateParticle (ValidationEventHandler h, XmlSchema schema)\r
                {\r
-                       get{ return  contentModel; } \r
-                       set{ contentModel = value; }\r
+                       // {content type} as a particle.\r
+                       errorCount += particle.Validate (h, schema);\r
+                       contentTypeParticle = Particle;\r
+                       XmlSchemaGroupRef pgrp = Particle as XmlSchemaGroupRef;\r
+                       if (pgrp != null) {\r
+                               if (pgrp.TargetGroup != null)\r
+                                       errorCount += pgrp.TargetGroup.Validate (h,schema);\r
+                               // otherwise, it might be missing sub components.\r
+                               else if (!schema.IsNamespaceAbsent (pgrp.RefName.Namespace))\r
+                                       error (h, "Referenced group " + pgrp.RefName + " was not found in the corresponding schema.");\r
+                       }\r
                }\r
-               [XmlIgnore]\r
-               public XmlSchemaContentType ContentType \r
+\r
+               private void ValidateImmediateAttributes (ValidationEventHandler h, XmlSchema schema)\r
                {\r
-                       get{ return contentType; }\r
+                       // {attribute uses}\r
+                       // also checks 3.4.6 Properties Correct :: 4 (Distinct attributes)\r
+                       attributeUses = new XmlSchemaObjectTable ();\r
+                       XmlSchemaUtil.ValidateAttributesResolved (attributeUses,\r
+                               h, schema, attributes, anyAttribute, ref attributeWildcard, null);\r
                }\r
-               [XmlIgnore]\r
-               public XmlSchemaParticle ContentTypeParticle \r
+\r
+               private void ValidateContentModel (ValidationEventHandler h, XmlSchema schema)\r
                {\r
-                       get{ return contentTypeParticle; }\r
+                       // Here we check 3.4.6 Properties Correct :: 2. and 3.\r
+                       errorCount += contentModel.Validate (h, schema);\r
+                       XmlSchemaComplexContentExtension cce = contentModel.Content as XmlSchemaComplexContentExtension;\r
+                       XmlSchemaComplexContentRestriction ccr = contentModel.Content as XmlSchemaComplexContentRestriction;\r
+                       XmlSchemaSimpleContentExtension sce = contentModel.Content as XmlSchemaSimpleContentExtension;\r
+                       XmlSchemaSimpleContentRestriction scr = contentModel.Content as XmlSchemaSimpleContentRestriction;\r
+\r
+                       XmlSchemaAnyAttribute localAnyAttribute = null;\r
+                       XmlSchemaAnyAttribute baseAnyAttribute = null;\r
+\r
+                       XmlQualifiedName baseTypeName = null;\r
+                       if (cce != null)\r
+                               baseTypeName = cce.BaseTypeName;\r
+                       else if (ccr != null)\r
+                               baseTypeName = ccr.BaseTypeName;\r
+                       else if (sce != null)\r
+                               baseTypeName = sce.BaseTypeName;\r
+                       else\r
+                               baseTypeName = scr.BaseTypeName;\r
+\r
+                       XmlSchemaType baseType = schema.SchemaTypes [baseTypeName] as XmlSchemaType;\r
+                       // Resolve redefine.\r
+                       if (this.isRedefineChild && baseType != null && this.QualifiedName == baseTypeName) {\r
+                               baseType = (XmlSchemaType) redefinedObject;\r
+                               if (baseType == null)\r
+                                       error (h, "Redefinition base type was not found.");\r
+                               else\r
+                                       baseType.Validate (h, schema);\r
+                       }\r
+                       // 3.4.6 Properties Correct :: 3. Circular definition prohibited.\r
+                       if (ValidateRecursionCheck ())\r
+                               error (h, "Circular definition of schema types was found.");\r
+                       if (baseType != null) {\r
+                               baseType.Validate (h, schema);\r
+                               // Fill "Datatype" property.\r
+                               this.datatypeInternal = baseType.Datatype;\r
+                       } else if (baseTypeName == XmlSchemaComplexType.AnyTypeName)\r
+                               datatypeInternal = XmlSchemaSimpleType.AnySimpleType;
+                       else if (baseTypeName.Namespace == XmlSchema.Namespace) {\r
+                               datatypeInternal = XmlSchemaDatatype.FromName (baseTypeName);\r
+                       }\r
+\r
+                       // {derivation method}\r
+                       XmlSchemaComplexType baseComplexType = baseType as XmlSchemaComplexType;\r
+                       XmlSchemaSimpleType baseSimpleType = baseType as XmlSchemaSimpleType;\r
+                       if (cce != null || sce != null)\r
+                               resolvedDerivedBy = XmlSchemaDerivationMethod.Extension;\r
+                       else\r
+                               resolvedDerivedBy = XmlSchemaDerivationMethod.Restriction;\r
+\r
+                       // 3.4.6 Derivation Valid (common to Extension and Restriction, Complex) :: 1.\r
+                       if (baseType != null && (baseType.FinalResolved & resolvedDerivedBy) != 0)\r
+                                       error (h, "Specified derivation is specified as final by derived schema type.");\r
+\r
+                       // 3.4.6 Properties Correct :: 2.\r
+                       // Simple {base type definition} and restriction {derivation method} not allowed.\r
+                       if (baseSimpleType != null && resolvedDerivedBy == XmlSchemaDerivationMethod.Restriction)\r
+                               error (h, "If the base schema type is a simple type, then this type must be extension.");\r
+\r
+                       // Common to complexContent\r
+                       if (cce != null || ccr != null) {\r
+                               // 3.4.3 Complex Type Definition Representation OK :: 1.\r
+                               // base\r
+                               if (baseTypeName == XmlSchemaComplexType.AnyTypeName)\r
+                                       baseComplexType = XmlSchemaComplexType.AnyType;\r
+                               else if (baseTypeName.Namespace == XmlSchema.Namespace)\r
+                                       error (h, "Referenced base schema type is XML Schema datatype.");\r
+                               else if (baseComplexType == null && !schema.IsNamespaceAbsent (baseTypeName.Namespace))\r
+                                       error (h, "Referenced base schema type " + baseTypeName + " was not complex type or not found in the corresponding schema.");\r
+                       }\r
+                       // Common to simpleContent \r
+                       else {\r
+                               // 3.4.3 Complex Type Definition Representation OK :: 1.\r
+                               // base\r
+                               if (baseTypeName == XmlSchemaComplexType.AnyTypeName)\r
+                                       baseComplexType = XmlSchemaComplexType.AnyType;
+\r
+                               if (baseComplexType != null && baseComplexType.ContentType != XmlSchemaContentType.TextOnly) {\r
+                                       error (h, "Base schema complex type of a simple content must be simple content type. Base type is " + baseTypeName);\r
+                               } else if (sce == null && (baseSimpleType != null && baseTypeName.Namespace != XmlSchema.Namespace)) {\r
+                                       error (h, "If a simple content is not an extension, base schema type must be complex type. Base type is " + baseTypeName);\r
+                               } else if (baseTypeName.Namespace == XmlSchema.Namespace) {\r
+                                       if (XmlSchemaDatatype.FromName (baseTypeName) == null)\r
+                                               error (h, "Invalid schema data type was specified: " + baseTypeName);\r
+                                       // do nothing for particle.\r
+                               }\r
+                               // otherwise, it might be missing sub components.\r
+                               else if (baseType == null && !schema.IsNamespaceAbsent (baseTypeName.Namespace))// && schema.Schemas [baseTypeName.Namespace] != null)\r
+                                       error (h, "Referenced base schema type " + baseTypeName + " was not found in the corresponding schema.");\r
+                       }\r
+\r
+                       // complexType/complexContent/extension\r
+                       if (cce != null) {\r
+                               // ContentTypeParticle\r
+                               if (baseComplexType == null) {\r
+                                       // Basically it is an error. Considering ValidationEventHandler.\r
+                               }\r
+                               else if (baseComplexType.ContentTypeParticle == XmlSchemaParticle.Empty\r
+                                       || baseComplexType == XmlSchemaComplexType.AnyType)\r
+                                       contentTypeParticle = cce.Particle;\r
+                               else if (cce.Particle == null || cce.Particle == XmlSchemaParticle.Empty)\r
+                                       contentTypeParticle = baseComplexType.ContentTypeParticle;\r
+                               else {\r
+                                       // create a new sequences that merges both contents.\r
+                                       XmlSchemaSequence seq = new XmlSchemaSequence ();\r
+                                       seq.Items.Add (baseComplexType.ContentTypeParticle);\r
+                                       seq.Items.Add (cce.Particle);\r
+                                       seq.Compile (h, schema);\r
+                                       seq.Validate (h, schema);\r
+                                       contentTypeParticle = seq;\r
+                               }\r
+                               if (contentTypeParticle == null)\r
+                                       contentTypeParticle = XmlSchemaParticle.Empty;\r
+\r
+                               // I don't think 3.4.6 Derivation Valid (Extension) :: 1.2\r
+                               // is constraining anything here, since 3.4.2 {attribute uses}\r
+                               // defines as to include base type's attribute uses.\r
+                               localAnyAttribute = cce.AnyAttribute;\r
+                               if (baseComplexType != null) {\r
+                                       foreach (DictionaryEntry entry in baseComplexType.AttributeUses) {\r
+                                               XmlSchemaAttribute attr = (XmlSchemaAttribute) entry.Value;\r
+                                               XmlSchemaUtil.AddToTable (attributeUses, attr, attr.QualifiedName, h);\r
+                                       }\r
+                                       baseAnyAttribute = baseComplexType.AttributeWildcard;\r
+                               }\r
+                               // attributes\r
+                               errorCount += XmlSchemaUtil.ValidateAttributesResolved (\r
+                                       this.attributeUses, h, schema, cce.Attributes, \r
+                                       cce.AnyAttribute , ref attributeWildcard, null);\r
+\r
+                               // After adding them, test extension validity.\r
+                               if (baseComplexType != null)\r
+                                       this.ValidateComplexBaseDerivationValidExtension (baseComplexType, h, schema);\r
+                               else if (baseSimpleType != null)\r
+                                       this.ValidateSimpleBaseDerivationValidExtension (baseSimpleType, h, schema);\r
+                       }\r
+                       // complexType/complexContent/restriction\r
+                       if (ccr != null) {\r
+                               // For ValidationEventHandler.\r
+                               if (baseComplexType == null)\r
+                                       baseComplexType = XmlSchemaComplexType.AnyType;\r
+\r
+                               // ContentTypeParticles (It must contain base type's particle).\r
+                               if (ccr.Particle != null) {\r
+                                       ccr.Particle.Validate (h, schema);\r
+                                       contentTypeParticle = ccr.Particle;\r
+                               }\r
+                               else\r
+                                       contentTypeParticle = XmlSchemaParticle.Empty;\r
+\r
+                               localAnyAttribute = ccr.AnyAttribute;\r
+                               this.attributeWildcard = localAnyAttribute;\r
+                               if (baseComplexType != null)\r
+                                       baseAnyAttribute = baseComplexType.AttributeWildcard;\r
+                               if (baseAnyAttribute != null && localAnyAttribute != null)\r
+                                       // 1.3 attribute wildcard subset. (=> 3.10.6)\r
+                                       localAnyAttribute.ValidateWildcardSubset (baseAnyAttribute, h, schema);\r
+\r
+                               // FIXME: Check 3.4.2 Complex Type Definition with complex content Schema Component\r
+                               // and its {attribute uses} and {attribute wildcard}\r
+                               errorCount += XmlSchemaUtil.ValidateAttributesResolved (\r
+                                       this.attributeUses, h, schema, ccr.Attributes, \r
+                                       ccr.AnyAttribute, ref attributeWildcard, null);\r
+                               foreach (DictionaryEntry entry in baseComplexType.AttributeUses) {\r
+                                       XmlSchemaAttribute attr = (XmlSchemaAttribute) entry.Value;\r
+                                       if (attributeUses [attr.QualifiedName] == null)\r
+                                               XmlSchemaUtil.AddToTable (attributeUses, attr, attr.QualifiedName, h);\r
+                               }\r
+\r
+                               // Derivation Valid (Restriction, Complex) :: 5.\r
+                               // Also see E1-15 of http://www.w3.org/2001/05/xmlschema-errata#Errata1\r
+                               // 5.1 shouled be in scr (XmlSchemaSimpleContentRestriction)\r
+                               this.ValidateDerivationValidRestriction (baseComplexType, h, schema);\r
+                       }\r
+                       // complexType/simpleContent/extension\r
+                       if (sce != null) {\r
+                               errorCount += XmlSchemaUtil.ValidateAttributesResolved (\r
+                                       this.attributeUses, h, schema, sce.Attributes, \r
+                                       sce.AnyAttribute, ref attributeWildcard, null);\r
+\r
+                               // Attributes\r
+                               // I don't think 3.4.6 Derivation Valid (Extension) :: 1.2\r
+                               // is constraining anything here, since 3.4.2 {attribute uses}\r
+                               // defines as to include base type's attribute uses.\r
+                               localAnyAttribute = sce.AnyAttribute;\r
+\r
+                               if (baseComplexType != null) {\r
+                                       baseAnyAttribute = baseComplexType.AttributeWildcard;\r
+\r
+                                       foreach (DictionaryEntry entry in baseComplexType.AttributeUses) {\r
+                                               XmlSchemaAttribute attr = (XmlSchemaAttribute) entry.Value;\r
+                                               XmlSchemaUtil.AddToTable (attributeUses, attr, attr.QualifiedName, h);\r
+                                       }\r
+                               }\r
+                               if (baseAnyAttribute != null && localAnyAttribute != null)\r
+                                       // 1.3 attribute wildcard subset. (=> 3.10.6)\r
+                                       localAnyAttribute.ValidateWildcardSubset (baseAnyAttribute, h, schema);\r
+                       }\r
+                       // complexType/simpleContent/restriction\r
+                       if (scr != null) {\r
+                               if (baseComplexType == null) {\r
+                                       // 3.4.3 :: 2.\r
+                                       error (h, "Base type of a simple content restriction must be a complex type.");\r
+                               } else {\r
+                                       // Attributes\r
+                                       baseAnyAttribute = baseComplexType.AttributeWildcard;\r
+\r
+                                       localAnyAttribute = scr.AnyAttribute;\r
+                                       if (localAnyAttribute != null && baseAnyAttribute != null)\r
+                                               // 1.3 attribute wildcard subset. (=> 3.10.6)\r
+                                               localAnyAttribute.ValidateWildcardSubset (baseAnyAttribute, h, schema);\r
+                                       // TODO: 3.4.6 :: 5.1. Beware that There is an errata for 5.1!!\r
+                                       // http://www.w3.org/2001/05/xmlschema-errata#Errata1\r
+\r
+                                       // FIXME: Check 3.4.2 Complex Type Definition with simple content Schema Component\r
+                                       // and its {attribute uses} and {attribute wildcard}\r
+                                       errorCount += XmlSchemaUtil.ValidateAttributesResolved (\r
+                                               this.attributeUses, h, schema, scr.Attributes, \r
+                                               scr.AnyAttribute, ref attributeWildcard, null);\r
+                               }\r
+                       }\r
+\r
+                       // Common process of AttributeWildcard.\r
+                       // TODO: Check 3.4.2 {attribute wildcard} to fill the complete wildcard.\r
+                       if (localAnyAttribute != null) {\r
+                               this.attributeWildcard = localAnyAttribute;\r
+                       }\r
+                       else\r
+                               this.attributeWildcard = baseAnyAttribute;\r
+                       this.baseSchemaTypeInternal = baseType;\r
                }\r
-               [DefaultValue(true)]\r
-               [XmlAttribute]\r
-               public bool IsAbstract \r
+\r
+               private void AddExtensionAttributes (XmlSchemaObjectCollection attributes,\r
+                       XmlSchemaAnyAttribute anyAttribute, ValidationEventHandler h, XmlSchema schema)\r
                {\r
-                       get{ return  isAbstract; }\r
-                       set{ isAbstract = value; }\r
                }\r
-               [DefaultValue(true)]\r
-               [XmlAttribute]\r
-               public override bool IsMixed\r
+\r
+               // It was formerly placed directly in ContentType property.\r
+               // I get it out, since ContentType is _post_ compilation property value.\r
+               private XmlSchemaContentType GetContentType ()\r
                {\r
-                       get{ return  isMixed; }\r
-                       set{ isMixed = value; }\r
+                       if (this.isMixed)\r
+                               return XmlSchemaContentType.Mixed;\r
+                       XmlSchemaComplexContent xcc = \r
+                               ContentModel as XmlSchemaComplexContent;\r
+                       if (xcc != null && xcc.IsMixed)\r
+                               return XmlSchemaContentType.Mixed;\r
+\r
+                       XmlSchemaSimpleContent xsc = ContentModel as XmlSchemaSimpleContent;\r
+                       if (xsc != null)\r
+                               return XmlSchemaContentType.TextOnly;\r
+\r
+                       return contentTypeParticle != XmlSchemaParticle.Empty ?\r
+                               XmlSchemaContentType.ElementOnly :\r
+                               XmlSchemaContentType.Empty;\r
                }\r
-               [XmlElement]\r
-               public XmlSchemaParticle Particle \r
+\r
+               // 3.4.6 Type Derivation OK (Complex)\r
+               internal void ValidateTypeDerivationOK (object b, ValidationEventHandler h, XmlSchema schema)\r
                {\r
-                       get{ return  particle; } \r
-                       set{ particle = value; }\r
+                       // AnyType derives from AnyType itself.\r
+                       if (this == XmlSchemaComplexType.AnyType && BaseSchemaType == this)\r
+                               return;\r
+\r
+                       XmlSchemaType bst = b as XmlSchemaType;\r
+                       if (b == this)  // 1 and 2.1\r
+                               return;\r
+                       if (bst != null && (resolvedDerivedBy & bst.FinalResolved) != 0) // 1\r
+                               error (h, "Derivation type " + resolvedDerivedBy + " is prohibited by the base type.");\r
+                       if (BaseSchemaType == b) // 2.2\r
+                               return;\r
+                       if (BaseSchemaType == XmlSchemaComplexType.AnyType) { // 2.3.1\r
+                               error (h, "Derived type's base schema type is anyType.");\r
+                               return;\r
+                       }\r
+                       // 2.3.2.1\r
+                       XmlSchemaComplexType dbct = BaseSchemaType as XmlSchemaComplexType;\r
+                       if (dbct != null) {\r
+                               dbct.ValidateTypeDerivationOK (b, h, schema);\r
+                               return;\r
+                       }\r
+                       // 2.3.2.2\r
+                       XmlSchemaSimpleType dbst = BaseSchemaType as XmlSchemaSimpleType;\r
+                       if (dbst != null) {\r
+                               dbst.ValidateTypeDerivationOK (b, h, schema, true);\r
+                               return;\r
+                       }\r
+               }\r
+\r
+               // 3.4.6 Derivation Valid (Extension) - Term. 1 (Complex Type)\r
+               internal void ValidateComplexBaseDerivationValidExtension (XmlSchemaComplexType baseComplexType,\r
+                       ValidationEventHandler h, XmlSchema schema)\r
+               {\r
+                       // 1.1\r
+                       if ((baseComplexType.FinalResolved & XmlSchemaDerivationMethod.Extension) != 0)\r
+                               error (h, "Derivation by extension is prohibited.");\r
+                       // 1.2\r
+                       foreach (DictionaryEntry entry in baseComplexType.AttributeUses) {\r
+                               XmlSchemaAttribute ba = (XmlSchemaAttribute) entry.Value;\r
+                               XmlSchemaAttribute da = AttributeUses [ba.QualifiedName] as XmlSchemaAttribute;\r
+                               if (da == null)\r
+                                       error (h, "Invalid complex type derivation by extension was found. Missing attribute was found: " + ba.QualifiedName + " .");\r
+                               // TODO: How to evaluate "equal" type ...?\r
+                       }\r
+                       // 1.3 -> 3.10.6 Wildcard Subset.\r
+                       if (AnyAttribute != null) {\r
+                               if (baseComplexType.AnyAttribute == null)\r
+                                       error (h, "Invalid complex type derivation by extension was found. Base complex type does not have an attribute wildcard.");\r
+                               else\r
+                                       baseComplexType.AnyAttribute.ValidateWildcardSubset (AnyAttribute, h, schema);\r
+                       }\r
+\r
+                       // 1.4 => 1.4.2 (1.4.1 would be included in SimpleContentExtention).\r
+                       // 1.4.2.1\r
+//                     if (contentTypeParticle == null)\r
+//                             error (h, "Extended complex type's content type must not be empty.");\r
+                       // 1.4.2.2.1\r
+                       if (baseComplexType.ContentType != XmlSchemaContentType.Empty) {\r
+                               // 1.4.2.2.2.1\r
+                               if (this.GetContentType () != baseComplexType.GetContentType ())\r
+                                       error (h, "Base complex type has different content type " + baseComplexType.ContentType + ".");\r
+                               // 1.4.2.2.2.2 => 3.9.6 Particle Valid (Extension)\r
+                               else if (this.contentTypeParticle == null ||\r
+                                       !this.contentTypeParticle.ParticleEquals (baseComplexType.ContentTypeParticle)) {\r
+                                       XmlSchemaSequence seq = contentTypeParticle as XmlSchemaSequence;\r
+                                       if (contentTypeParticle != XmlSchemaParticle.Empty && (seq == null || contentTypeParticle.ValidatedMinOccurs != 1 || contentTypeParticle.ValidatedMaxOccurs != 1))\r
+                                               error (h, "Invalid complex content extension was found.");\r
+                                       else {\r
+                                               // Identical sequence item should be checked, but\r
+                                               // I think it is naturally achieved as coded above.\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // 3.4.6 Derivation Valid (Extension) - Term. 2 (Simple Type)\r
+               internal void ValidateSimpleBaseDerivationValidExtension (object baseType,\r
+                       ValidationEventHandler h, XmlSchema schema)\r
+               {\r
+                       XmlSchemaSimpleType st = baseType as XmlSchemaSimpleType;\r
+                       if (st != null && (st.FinalResolved & XmlSchemaDerivationMethod.Extension) != 0)\r
+                               error (h, "Extension is prohibited by the base type.");\r
+\r
+                       XmlSchemaDatatype dt = baseType as XmlSchemaDatatype;\r
+                       if (dt == null)\r
+                               dt = st.Datatype;\r
+                       if (dt != this.Datatype)\r
+                               error (h, "To extend simple type, a complex type must have the same content type as the base type.");\r
+\r
+                       /*\r
+                       switch (resolvedContentType) {\r
+                       case XmlSchemaContentType.Mixed:\r
+                       case XmlSchemaContentType.TextOnly:\r
+                               XmlSchemaSimpleType st = baseType as XmlSchemaSimpleType;\r
+                               if ((st == null && Datatype != baseType) ||\r
+                                       (st != null && st.Datatype != Datatype))\r
+                                       goto case XmlSchemaContentType.ElementOnly;\r
+                               if (st != null\r
+                                       && (st.FinalResolved & XmlSchemaDerivationMethod.Extension) != 0)\r
+                                       error (h, "Extension is prohibited by the base type.");\r
+                               break;\r
+                       case XmlSchemaContentType.ElementOnly:\r
+                       case XmlSchemaContentType.Empty:\r
+                               error (h, "To extend simple type, a complex type must have the same content type as the base type.");\r
+                               break;\r
+                       }\r
+                       */\r
+               }\r
+\r
+               internal void ValidateDerivationValidRestriction (XmlSchemaComplexType baseType,\r
+                       ValidationEventHandler h, XmlSchema schema)\r
+               {\r
+                       // 1.\r
+                       if (baseType == null) {\r
+                               error (h, "Base schema type is not a complex type.");\r
+                               return;\r
+                       }\r
+                       if ((baseType.FinalResolved & XmlSchemaDerivationMethod.Restriction) != 0) {\r
+                               error (h, "Prohibited derivation by restriction by base schema type.");\r
+                               return;\r
+                       }\r
+\r
+                       // 2.\r
+                       foreach (DictionaryEntry entry in this.AttributeUses) {\r
+                               XmlSchemaAttribute attr = (XmlSchemaAttribute) entry.Value;\r
+                               XmlSchemaAttribute baseAttr = baseType.AttributeUses [attr.QualifiedName] as XmlSchemaAttribute;\r
+                               if (baseAttr != null) {\r
+                                       // 2.1\r
+                                       // 2.1.1\r
+                                       if (baseAttr.ValidatedUse != XmlSchemaUse.Optional && attr.ValidatedUse != XmlSchemaUse.Required)\r
+                                               error (h, "Invalid attribute derivation by restriction was found for " + attr.QualifiedName + " .");\r
+                                       // 2.1.2\r
+                                       XmlSchemaSimpleType attrSimpleType = attr.AttributeType as XmlSchemaSimpleType;\r
+                                       XmlSchemaSimpleType baseAttrSimpleType = baseAttr.AttributeType as XmlSchemaSimpleType;\r
+                                       bool typeError = false;\r
+                                       if (attrSimpleType != null)\r
+                                               attrSimpleType.ValidateDerivationValid (baseAttrSimpleType, null, h, schema);\r
+                                       else if (attrSimpleType == null && baseAttrSimpleType != null)\r
+                                               typeError = true;\r
+                                       else {\r
+                                               Type t1 = attr.AttributeType.GetType ();\r
+                                               Type t2 = baseAttr.AttributeType.GetType ();\r
+                                               if (t1 != t2 && t1.IsSubclassOf (t2))\r
+                                                       typeError = true;\r
+                                       }\r
+                                       if (typeError)\r
+                                               error (h, "Invalid attribute derivation by restriction because of its type: " + attr.QualifiedName + " .");\r
+                                       // 2.1.3\r
+                                       if (baseAttr.ValidatedFixedValue != null && attr.ValidatedFixedValue != baseAttr.ValidatedFixedValue)\r
+                                               error (h, "Invalid attribute derivation by restriction because of its fixed value constraint: " + attr.QualifiedName + " .");\r
+                               } else {\r
+                                       // 2.2\r
+                                       if (baseType.AttributeWildcard != null)\r
+                                               if (!baseType.AttributeWildcard.ValidateWildcardAllowsNamespaceName (\r
+                                                       attr.QualifiedName.Namespace, schema) &&\r
+                                                       !schema.IsNamespaceAbsent (attr.QualifiedName.Namespace))\r
+                                                       error (h, "Invalid attribute derivation by restriction was found for " + attr.QualifiedName + " .");\r
+                               }\r
+                       }\r
+                       // I think 3. is considered in 2.\r
+                       // 4.\r
+                       if (this.AttributeWildcard != null) {\r
+                               if (baseType.AttributeWildcard == null)\r
+                                       error (h, "Invalid attribute derivation by restriction because of attribute wildcard.");\r
+                               else\r
+                                       AttributeWildcard.ValidateWildcardSubset (baseType.AttributeWildcard, h, schema);\r
+                       }\r
+\r
+                       // 5.\r
+                       if (contentTypeParticle == XmlSchemaParticle.Empty) {\r
+                               // TODO: 5.1\r
+                               // 5.2\r
+                               if (baseType.ContentTypeParticle != XmlSchemaParticle.Empty &&\r
+                                       !baseType.ContentTypeParticle.ValidateIsEmptiable ())\r
+                               error (h, "Invalid content type derivation.");\r
+                       } else {\r
+                               // 5.3 => 3.9.6 Particle Valid (Restriction)\r
+                               if (baseType.ContentTypeParticle != null) {\r
+                                       // 3.9.6 - 1 : same particle.\r
+                                       // 3.9.6 - 2 is covered by using ActualParticle.\r
+                                       if (!contentTypeParticle.ActualParticle.ParticleEquals (baseType.ContentTypeParticle.ActualParticle))\r
+                                               contentTypeParticle.ActualParticle.ValidateDerivationByRestriction (\r
+                                                       baseType.ContentTypeParticle.ActualParticle, h, schema);\r
+                               }\r
+                       }\r
+               }\r
+\r
+#region Read\r
+               //<complexType\r
+               //  abstract = boolean : false\r
+               //  block = (#all | List of (extension | restriction)) \r
+               //  final = (#all | List of (extension | restriction)) \r
+               //  id = ID\r
+               //  mixed = boolean : false\r
+               //  name = NCName\r
+               //  {any attributes with non-schema namespace . . .}>\r
+               //  Content: (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))))\r
+               //</complexType>\r
+               internal static XmlSchemaComplexType Read(XmlSchemaReader reader, ValidationEventHandler h)\r
+               {\r
+                       XmlSchemaComplexType ctype = new XmlSchemaComplexType();\r
+                       reader.MoveToElement();\r
+                       Exception innerex;\r
+\r
+                       if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
+                       {\r
+                               error(h,"Should not happen :1: XmlSchemaComplexType.Read, name="+reader.Name,null);\r
+                               reader.SkipToEnd();\r
+                               return null;\r
+                       }\r
+\r
+                       ctype.LineNumber = reader.LineNumber;\r
+                       ctype.LinePosition = reader.LinePosition;\r
+                       ctype.SourceUri = reader.BaseURI;\r
+\r
+                       while(reader.MoveToNextAttribute())\r
+                       {\r
+                               if(reader.Name == "abstract")\r
+                               {\r
+                                       ctype.IsAbstract = XmlSchemaUtil.ReadBoolAttribute(reader,out innerex);\r
+                                       if(innerex != null)\r
+                                               error(h,reader.Value + " is invalid value for abstract",innerex);\r
+                               }\r
+                               else if(reader.Name == "block")\r
+                               {\r
+                                       ctype.block = XmlSchemaUtil.ReadDerivationAttribute(reader,out innerex, "block",\r
+                                               XmlSchemaUtil.ComplexTypeBlockAllowed);\r
+                                       if(innerex != null)\r
+                                               warn(h,"some invalid values for block attribute were found",innerex);\r
+                               }\r
+                               else if(reader.Name == "final")\r
+                               {\r
+                                       ctype.Final = XmlSchemaUtil.ReadDerivationAttribute(reader,out innerex, "final",\r
+                                               XmlSchemaUtil.FinalAllowed);\r
+                                       if(innerex != null)\r
+                                               warn(h,"some invalid values for final attribute were found",innerex);\r
+                               }\r
+                               else if(reader.Name == "id")\r
+                               {\r
+                                       ctype.Id = reader.Value;\r
+                               }\r
+                               else if(reader.Name == "mixed")\r
+                               {\r
+                                       ctype.isMixed = XmlSchemaUtil.ReadBoolAttribute(reader,out innerex);\r
+                                       if(innerex != null)\r
+                                               error(h,reader.Value + " is invalid value for mixed",innerex);\r
+                               }\r
+                               else if(reader.Name == "name")\r
+                               {\r
+                                       ctype.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 complexType",null);\r
+                               }\r
+                               else\r
+                               {\r
+                                       XmlSchemaUtil.ReadUnhandledAttribute(reader,ctype);\r
+                               }\r
+                       }\r
+                       \r
+                       reader.MoveToElement();\r
+                       if(reader.IsEmptyElement)\r
+                               return ctype;\r
+\r
+                       //Content: 1. annotation?, \r
+                       //                 2. simpleContent | 2. complexContent | \r
+                       //                      (3.(group | all | choice | sequence)?, (4.(attribute | attributeGroup)*, 5.anyAttribute?)))\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: XmlSchemaComplexType.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
+                                               ctype.Annotation = annotation;\r
+                                       continue;\r
+                               }\r
+                               if(level <=2)\r
+                               {\r
+                                       if(reader.LocalName == "simpleContent")\r
+                                       {\r
+                                               level = 6;\r
+                                               XmlSchemaSimpleContent simple = XmlSchemaSimpleContent.Read(reader,h);\r
+                                               if(simple != null)\r
+                                                       ctype.ContentModel = simple;\r
+                                               continue;\r
+                                       }\r
+                                       if(reader.LocalName == "complexContent")\r
+                                       {\r
+                                               level = 6;\r
+                                               XmlSchemaComplexContent complex = XmlSchemaComplexContent.Read(reader,h);\r
+                                               if(complex != null)\r
+                                                       ctype.contentModel = complex;\r
+                                               continue;\r
+                                       }\r
+                               }\r
+                               if(level <= 3)\r
+                               {\r
+                                       if(reader.LocalName == "group")\r
+                                       {\r
+                                               level = 4;\r
+                                               XmlSchemaGroupRef group = XmlSchemaGroupRef.Read(reader,h);\r
+                                               if(group != null)\r
+                                                       ctype.particle = group;\r
+                                               continue;\r
+                                       }\r
+                                       if(reader.LocalName == "all")\r
+                                       {\r
+                                               level = 4;\r
+                                               XmlSchemaAll all = XmlSchemaAll.Read(reader,h);\r
+                                               if(all != null)\r
+                                                       ctype.particle = all;\r
+                                               continue;\r
+                                       }\r
+                                       if(reader.LocalName == "choice")\r
+                                       {\r
+                                               level = 4;\r
+                                               XmlSchemaChoice choice = XmlSchemaChoice.Read(reader,h);\r
+                                               if(choice != null)\r
+                                                       ctype.particle = choice;\r
+                                               continue;\r
+                                       }\r
+                                       if(reader.LocalName == "sequence")\r
+                                       {\r
+                                               level = 4;\r
+                                               XmlSchemaSequence sequence = XmlSchemaSequence.Read(reader,h);\r
+                                               if(sequence != null)\r
+                                                       ctype.particle = sequence;\r
+                                               continue;\r
+                                       }\r
+                               }\r
+                               if(level <= 4)\r
+                               {\r
+                                       if(reader.LocalName == "attribute")\r
+                                       {\r
+                                               level = 4;\r
+                                               XmlSchemaAttribute attr = XmlSchemaAttribute.Read(reader,h);\r
+                                               if(attr != null)\r
+                                                       ctype.Attributes.Add(attr);\r
+                                               continue;\r
+                                       }\r
+                                       if(reader.LocalName == "attributeGroup")\r
+                                       {\r
+                                               level = 4;\r
+                                               XmlSchemaAttributeGroupRef attr = XmlSchemaAttributeGroupRef.Read(reader,h);\r
+                                               if(attr != null)\r
+                                                       ctype.attributes.Add(attr);\r
+                                               continue;\r
+                                       }\r
+                               }\r
+                               if(level <= 5 && reader.LocalName == "anyAttribute")\r
+                               {\r
+                                       level = 6;\r
+                                       XmlSchemaAnyAttribute anyattr = XmlSchemaAnyAttribute.Read(reader,h);\r
+                                       if(anyattr != null)\r
+                                               ctype.AnyAttribute = anyattr;\r
+                                       continue;\r
+                               }\r
+                               reader.RaiseInvalidElementError();\r
+                       }\r
+                       return ctype;\r
                }\r
+#endregion\r
        }\r
 }\r