2008-12-08 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaType.cs
old mode 100755 (executable)
new mode 100644 (file)
index 34e7b38..a7d5253
@@ -1,10 +1,10 @@
-//\r
-// XmlSchemaType.cs\r
-//\r
-// Authors:\r
-//     Dwivedi, Ajay kumar  Adwiv@Yahoo.com\r
-//     Atsushi Enomoto  atsushi@ximian.com\r
-//\r
+//
+// XmlSchemaType.cs
+//
+// Authors:
+//     Dwivedi, Ajay kumar  Adwiv@Yahoo.com
+//     Atsushi Enomoto  atsushi@ximian.com
+//
 
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;\r
-using System.Xml;\r
-using System.ComponentModel;\r
-using Mono.Xml.Schema;\r
-using System.Xml.Serialization;\r
-#if NET_2_0_in_the_future\r
-using MS.Internal.Xml;\r
-#endif\r
-\r
-namespace System.Xml.Schema\r
-{\r
-       /// <summary>\r
-       /// Summary description for XmlSchemaType.\r
-       /// </summary>\r
-       public class XmlSchemaType : XmlSchemaAnnotated\r
-       {\r
-#if NET_2_0\r
-               static XmlValueConverter defaultConverter =\r
-                       new XsdStringConverter (XmlTypeCode.None);\r
-#endif\r
-\r
-               private XmlSchemaDerivationMethod final;\r
-               private bool isMixed;\r
-               private string name;\r
-               bool recursed;\r
-\r
-#if NET_2_0\r
-               private XmlValueConverter converter;\r
-#endif\r
-\r
-               internal XmlQualifiedName BaseSchemaTypeName;\r
-               internal XmlSchemaType BaseXmlSchemaTypeInternal;\r
-               internal XmlSchemaDatatype DatatypeInternal;\r
-               internal XmlSchemaDerivationMethod resolvedDerivedBy;\r
-               internal XmlSchemaDerivationMethod finalResolved;\r
-               internal XmlQualifiedName QNameInternal;\r
-\r
-               public XmlSchemaType ()\r
-               {\r
-                       final = XmlSchemaDerivationMethod.None;\r
-                       QNameInternal = XmlQualifiedName.Empty;\r
-               }\r
-\r
-               #region Attributes\r
-               [System.Xml.Serialization.XmlAttribute("name")]\r
-               public string Name {\r
-                       get{ return name; }\r
-                       set{ name = value; }\r
-               }\r
-\r
-               [DefaultValue(XmlSchemaDerivationMethod.None)]\r
-               [System.Xml.Serialization.XmlAttribute("final")]\r
-               public XmlSchemaDerivationMethod Final {\r
-                       get{ return  final; }\r
-                       set{ final = value; }\r
-               }\r
-               #endregion\r
-\r
-               #region Post Compilation Schema Information\r
-               [XmlIgnore]\r
-               public XmlQualifiedName QualifiedName {\r
-                       get{ return QNameInternal; }\r
-               }\r
-\r
-               [XmlIgnore]\r
-               public XmlSchemaDerivationMethod FinalResolved {\r
-                       get{ return finalResolved; }\r
-               }\r
-\r
-               [XmlIgnore]\r
-#if NET_2_0\r
-               [Obsolete ("This property is going away. Use BaseXmlSchemaType instead")]\r
-#endif\r
-               public object BaseSchemaType {\r
-                       get{\r
-                               if (BaseXmlSchemaType != null)\r
-                                       return BaseXmlSchemaType;\r
-                               else if (this == XmlSchemaComplexType.AnyType)\r
-                                       return null; // This property is designed so.\r
-                               else\r
-                                       return Datatype;\r
-                       }\r
-               }\r
-\r
-               [XmlIgnore]\r
-               [MonoTODO ("This property works as always returning a valid schema type.")]\r
-               // In .NET 2.0, all schema types used in schema documents must\r
-               // be XmlSchemaType, even if it is primitive type, in terms of\r
-               // non-obsolete System.Xml.Schema members.\r
-               \r
-               // To modify this property, we have to make sure that it does\r
-               // not affect to any compilation/validation logic.\r
-#if NET_2_0\r
-               public XmlSchemaType BaseXmlSchemaType {\r
-#else\r
-               internal XmlSchemaType BaseXmlSchemaType {\r
-#endif\r
-                       get { return  BaseXmlSchemaTypeInternal; }\r
-               }\r
-\r
-               [XmlIgnore]\r
-               public XmlSchemaDerivationMethod DerivedBy {\r
-                       get{ return resolvedDerivedBy; }\r
-               }\r
-\r
-               [XmlIgnore]\r
-               public XmlSchemaDatatype Datatype {\r
-                       get{ return DatatypeInternal; }\r
-               }\r
-\r
-               [XmlIgnore]\r
-               public virtual bool IsMixed {  \r
-                       get{ return  isMixed; }\r
-                       set{ isMixed = value; } \r
-               }\r
-\r
-#if NET_2_0\r
-               [MonoTODO]\r
-               // LAMESPEC: for IDREFS it returns Idref. for ENTITIES \r
-               // it returns Entity. for NMTOKENS it returns NmToken.\r
-               [XmlIgnore]\r
-               public XmlTypeCode TypeCode {\r
-                       get {\r
-                               if (this == XmlSchemaComplexType.AnyType)\r
-                                       return XmlTypeCode.Item;\r
-                               if (DatatypeInternal == XmlSchemaSimpleType.AnySimpleType)\r
-                                       return XmlTypeCode.AnyAtomicType;\r
-                               if (this == XmlSchemaSimpleType.XsIDRefs)\r
-                                       return XmlTypeCode.Idref;\r
-                               if (this == XmlSchemaSimpleType.XsEntities)\r
-                                       return XmlTypeCode.Entity;\r
-                               if (this == XmlSchemaSimpleType.XsNMTokens)\r
-                                       return XmlTypeCode.NmToken;\r
-                               if (DatatypeInternal != null)\r
-                                       return DatatypeInternal.TypeCode;\r
-                               return BaseXmlSchemaType.TypeCode;\r
-                       }\r
-               }\r
-\r
-               [MonoTODO]\r
-               [XmlIgnore]\r
-               public XmlValueConverter ValueConverter {\r
-                       get {\r
-                               return converter != null ?\r
-                                       converter :\r
-                                       BaseXmlSchemaTypeInternal != null ?\r
-                                       BaseXmlSchemaTypeInternal.ValueConverter :\r
-                                       defaultConverter;\r
-                       }\r
-                       internal set { converter = value; }\r
-               }\r
-#endif\r
-               #endregion\r
-\r
-#if NET_2_0\r
-               internal static XmlSchemaType GetBuiltInType (XmlQualifiedName qualifiedName)\r
-               {\r
-                       XmlSchemaType t = GetBuiltInSimpleType (qualifiedName);\r
-                       if (t == null)\r
-                               t = GetBuiltInComplexType (qualifiedName);\r
-                       return t;\r
-               }\r
-\r
-               internal static XmlSchemaType GetBuiltInType (XmlTypeCode typecode)\r
-               {\r
-                       if (typecode == XmlTypeCode.Item)\r
-                               return XmlSchemaComplexType.AnyType;\r
-                       return GetBuiltInSimpleType (typecode);\r
-               }\r
-\r
-               internal static XmlValueConverter BuildConverter (\r
-                       XmlTypeCode code)\r
-               {\r
-                       switch (code) {\r
-                       case XmlTypeCode.AnyAtomicType:\r
-                               return new XsdAnyTypeConverter (code);\r
-                       case XmlTypeCode.UntypedAtomic:\r
-                       case XmlTypeCode.String:\r
-                               return new XsdStringConverter (code);\r
-                       case XmlTypeCode.Float:\r
-                       case XmlTypeCode.Double:\r
-                       case XmlTypeCode.Decimal:\r
-                       case XmlTypeCode.Integer:\r
-                               return new XsdNumericConverter (code);\r
-                       case XmlTypeCode.Boolean:\r
-                               return new XsdBooleanConverter (code);\r
-                       case XmlTypeCode.QName:\r
-                       case XmlTypeCode.Notation:\r
-                       case XmlTypeCode.Duration:\r
-                       case XmlTypeCode.DayTimeDuration:\r
-                       case XmlTypeCode.YearMonthDuration:\r
-                               return new XsdNonPermissiveConverter (code);\r
-                       case XmlTypeCode.DateTime:\r
-                       case XmlTypeCode.Date:\r
-                       case XmlTypeCode.Time:\r
-                       case XmlTypeCode.GYearMonth:\r
-                       case XmlTypeCode.GYear:\r
-                       case XmlTypeCode.GMonth:\r
-                       case XmlTypeCode.GMonthDay:\r
-                       case XmlTypeCode.GDay:\r
-                               return new XsdDateTimeConverter (code);\r
-                       case XmlTypeCode.AnyUri:\r
-                       case XmlTypeCode.Base64Binary:\r
-                       case XmlTypeCode.HexBinary:\r
-                               return new XsdMiscBaseConverter (code);\r
-                       }\r
-                       return null;\r
-               }\r
-#endif\r
-\r
-#if NET_2_0\r
-               public static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
-#else\r
-               internal static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
-#endif\r
-               {\r
-                       if (qualifiedName.Name == "anyType" && qualifiedName.Namespace == XmlSchema.Namespace)\r
-                               return XmlSchemaComplexType.AnyType;\r
-\r
-                       return null;\r
-               }\r
-\r
-#if NET_2_0\r
-               public static XmlSchemaComplexType GetBuiltInComplexType (XmlTypeCode type)\r
-               {\r
-                       switch (type) {\r
-                       case XmlTypeCode.Item:\r
-                               return XmlSchemaComplexType.AnyType;\r
-                       }\r
-                       return null;\r
-               }\r
-#endif\r
-\r
-#if NET_2_0\r
-               [MonoTODO]\r
-               public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlQualifiedName qualifiedName)\r
-               {\r
-                       if (qualifiedName.Namespace == "http://www.w3.org/2003/11/xpath-datatypes") {\r
-                               switch (qualifiedName.Name) {\r
-                               case "untypedAtomic":\r
-                                       return XmlSchemaSimpleType.XdtUntypedAtomic;\r
-                               case "anyAtomicType":\r
-                                       return XmlSchemaSimpleType.XdtAnyAtomicType;\r
-                               case "yearMonthDuration":\r
-                                       return XmlSchemaSimpleType.XdtYearMonthDuration;\r
-                               case "dayTimeDuration":\r
-                                       return XmlSchemaSimpleType.XdtDayTimeDuration;\r
-                               }\r
-                               return null;\r
-                       }\r
-                       else if (qualifiedName.Namespace != XmlSchema.Namespace)\r
-                               return null;\r
-                       switch (qualifiedName.Name) {\r
-                       case "anySimpleType":\r
-                               return XmlSchemaSimpleType.XsAnySimpleType;\r
-                       case "string":\r
-                               return XmlSchemaSimpleType.XsString;\r
-                       case "boolean":\r
-                               return XmlSchemaSimpleType.XsBoolean;\r
-                       case "decimal":\r
-                               return XmlSchemaSimpleType.XsDecimal;\r
-                       case "float":\r
-                               return XmlSchemaSimpleType.XsFloat;\r
-                       case "double":\r
-                               return XmlSchemaSimpleType.XsDouble;\r
-                       case "duration":\r
-                               return XmlSchemaSimpleType.XsDuration;\r
-                       case "dateTime":\r
-                               return XmlSchemaSimpleType.XsDateTime;\r
-                       case "time":\r
-                               return XmlSchemaSimpleType.XsTime;\r
-                       case "date":\r
-                               return XmlSchemaSimpleType.XsDate;\r
-                       case "gYearMonth":\r
-                               return XmlSchemaSimpleType.XsGYearMonth;\r
-                       case "gYear":\r
-                               return XmlSchemaSimpleType.XsGYear;\r
-                       case "gMonthDay":\r
-                               return XmlSchemaSimpleType.XsGMonthDay;\r
-                       case "gDay":\r
-                               return XmlSchemaSimpleType.XsGDay;\r
-                       case "gMonth":\r
-                               return XmlSchemaSimpleType.XsGMonth;\r
-                       case "hexBinary":\r
-                               return XmlSchemaSimpleType.XsHexBinary;\r
-                       case "base64Binary":\r
-                               return XmlSchemaSimpleType.XsBase64Binary;\r
-                       case "anyURI":\r
-                               return XmlSchemaSimpleType.XsAnyUri;\r
-                       case "QName":\r
-                               return XmlSchemaSimpleType.XsQName;\r
-                       case "NOTATION":\r
-                               return XmlSchemaSimpleType.XsNotation;\r
-                       case "normalizedString":\r
-                               return XmlSchemaSimpleType.XsNormalizedString;\r
-                       case "token":\r
-                               return XmlSchemaSimpleType.XsToken;\r
-                       case "language":\r
-                               return XmlSchemaSimpleType.XsLanguage;\r
-                       case "NMTOKEN":\r
-                               return XmlSchemaSimpleType.XsNMToken;\r
-                       case "NMTOKENS":\r
-                               return XmlSchemaSimpleType.XsNMTokens;\r
-                       case "Name":\r
-                               return XmlSchemaSimpleType.XsName;\r
-                       case "NCName":\r
-                               return XmlSchemaSimpleType.XsNCName;\r
-                       case "ID":\r
-                               return XmlSchemaSimpleType.XsID;\r
-                       case "IDREF":\r
-                               return XmlSchemaSimpleType.XsIDRef;\r
-                       case "IDREFS":\r
-                               return XmlSchemaSimpleType.XsIDRefs;\r
-                       case "ENTITY":\r
-                               return XmlSchemaSimpleType.XsEntity;\r
-                       case "ENTITIES":\r
-                               return XmlSchemaSimpleType.XsEntities;\r
-                       case "integer":\r
-                               return XmlSchemaSimpleType.XsInteger;\r
-                       case "nonPositiveInteger":\r
-                               return XmlSchemaSimpleType.XsNonPositiveInteger;\r
-                       case "negativeInteger":\r
-                               return XmlSchemaSimpleType.XsNegativeInteger;\r
-                       case "long":\r
-                               return XmlSchemaSimpleType.XsLong;\r
-                       case "int":\r
-                               return XmlSchemaSimpleType.XsInt;\r
-                       case "short":\r
-                               return XmlSchemaSimpleType.XsShort;\r
-                       case "byte":\r
-                               return XmlSchemaSimpleType.XsByte;\r
-                       case "nonNegativeInteger":\r
-                               return XmlSchemaSimpleType.XsNonNegativeInteger;\r
-                       case "positiveInteger":\r
-                               return XmlSchemaSimpleType.XsPositiveInteger;\r
-                       case "unsignedLong":\r
-                               return XmlSchemaSimpleType.XsUnsignedLong;\r
-                       case "unsignedInt":\r
-                               return XmlSchemaSimpleType.XsUnsignedInt;\r
-                       case "unsignedShort":\r
-                               return XmlSchemaSimpleType.XsUnsignedShort;\r
-                       case "unsignedByte":\r
-                               return XmlSchemaSimpleType.XsUnsignedByte;\r
-                       }\r
-                       return null;\r
-               }\r
-\r
-               internal static XmlSchemaSimpleType GetBuiltInSimpleType (XmlSchemaDatatype type)\r
-               {\r
-                       if (type is XsdEntities)\r
-                               return XmlSchemaSimpleType.XsEntities;\r
-                       else if (type is XsdNMTokens)\r
-                               return XmlSchemaSimpleType.XsNMTokens;\r
-                       else if (type is XsdIDRefs)\r
-                               return XmlSchemaSimpleType.XsIDRefs;\r
-                       else\r
-                               return GetBuiltInSimpleType (type.TypeCode);\r
-               }\r
-\r
-               [MonoTODO]\r
-               // Don't use this method to cover all XML Schema datatypes.\r
-               public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlTypeCode type)\r
-               {\r
-                       switch (type) {\r
-                       case XmlTypeCode.None:\r
-                       case XmlTypeCode.Item:\r
-                       case XmlTypeCode.Node:\r
-                       case XmlTypeCode.Document: // node\r
-                       case XmlTypeCode.Element: // node\r
-                       case XmlTypeCode.Attribute: // node\r
-                       case XmlTypeCode.Namespace: // node\r
-                       case XmlTypeCode.ProcessingInstruction: // node\r
-                       case XmlTypeCode.Comment: // node\r
-                       case XmlTypeCode.Text:  // node\r
-                               return null;\r
-                       case XmlTypeCode.AnyAtomicType:\r
-                               return XmlSchemaSimpleType.XdtAnyAtomicType;\r
-                       case XmlTypeCode.UntypedAtomic:\r
-                               return XmlSchemaSimpleType.XdtUntypedAtomic;\r
-                       case XmlTypeCode.String:\r
-                               return XmlSchemaSimpleType.XsString;\r
-                       case XmlTypeCode.Boolean:\r
-                               return XmlSchemaSimpleType.XsBoolean;\r
-                       case XmlTypeCode.Decimal:\r
-                               return XmlSchemaSimpleType.XsDecimal;\r
-                       case XmlTypeCode.Float:\r
-                               return XmlSchemaSimpleType.XsFloat;\r
-                       case XmlTypeCode.Double:\r
-                               return XmlSchemaSimpleType.XsDouble;\r
-                       case XmlTypeCode.Duration:\r
-                               return XmlSchemaSimpleType.XsDuration;\r
-                       case XmlTypeCode.DateTime:\r
-                               return XmlSchemaSimpleType.XsDateTime;\r
-                       case XmlTypeCode.Time:\r
-                               return XmlSchemaSimpleType.XsTime;\r
-                       case XmlTypeCode.Date:\r
-                               return XmlSchemaSimpleType.XsDate;\r
-                       case XmlTypeCode.GYearMonth:\r
-                               return XmlSchemaSimpleType.XsGYearMonth;\r
-                       case XmlTypeCode.GYear:\r
-                               return XmlSchemaSimpleType.XsGYear;\r
-                       case XmlTypeCode.GMonthDay:\r
-                               return XmlSchemaSimpleType.XsGMonthDay;\r
-                       case XmlTypeCode.GDay:\r
-                               return XmlSchemaSimpleType.XsGDay;\r
-                       case XmlTypeCode.GMonth:\r
-                               return XmlSchemaSimpleType.XsGMonth;\r
-                       case XmlTypeCode.HexBinary:\r
-                               return XmlSchemaSimpleType.XsHexBinary;\r
-                       case XmlTypeCode.Base64Binary:\r
-                               return XmlSchemaSimpleType.XsBase64Binary;\r
-                       case XmlTypeCode.AnyUri:\r
-                               return XmlSchemaSimpleType.XsAnyUri;\r
-                       case XmlTypeCode.QName:\r
-                               return XmlSchemaSimpleType.XsQName;\r
-                       case XmlTypeCode.Notation:\r
-                               return XmlSchemaSimpleType.XsNotation;\r
-                       case XmlTypeCode.NormalizedString:\r
-                               return XmlSchemaSimpleType.XsNormalizedString;\r
-                       case XmlTypeCode.Token:\r
-                               return XmlSchemaSimpleType.XsToken;\r
-                       case XmlTypeCode.Language:\r
-                               return XmlSchemaSimpleType.XsLanguage;\r
-                       case XmlTypeCode.NmToken: // NmTokens is not primitive\r
-                               return XmlSchemaSimpleType.XsNMToken;\r
-                       case XmlTypeCode.Name:\r
-                               return XmlSchemaSimpleType.XsName;\r
-                       case XmlTypeCode.NCName:\r
-                               return XmlSchemaSimpleType.XsNCName;\r
-                       case XmlTypeCode.Id:\r
-                               return XmlSchemaSimpleType.XsID;\r
-                       case XmlTypeCode.Idref: // Idrefs is not primitive\r
-                               return XmlSchemaSimpleType.XsIDRef;\r
-                       case XmlTypeCode.Entity: // Entities is not primitive\r
-                               return XmlSchemaSimpleType.XsEntity;\r
-                       case XmlTypeCode.Integer:\r
-                               return XmlSchemaSimpleType.XsInteger;\r
-                       case XmlTypeCode.NonPositiveInteger:\r
-                               return XmlSchemaSimpleType.XsNonPositiveInteger;\r
-                       case XmlTypeCode.NegativeInteger:\r
-                               return XmlSchemaSimpleType.XsNegativeInteger;\r
-                       case XmlTypeCode.Long:\r
-                               return XmlSchemaSimpleType.XsLong;\r
-                       case XmlTypeCode.Int:\r
-                               return XmlSchemaSimpleType.XsInt;\r
-                       case XmlTypeCode.Short:\r
-                               return XmlSchemaSimpleType.XsShort;\r
-                       case XmlTypeCode.Byte:\r
-                               return XmlSchemaSimpleType.XsByte;\r
-                       case XmlTypeCode.NonNegativeInteger:\r
-                               return XmlSchemaSimpleType.XsNonNegativeInteger;\r
-                       case XmlTypeCode.UnsignedLong:\r
-                               return XmlSchemaSimpleType.XsUnsignedLong;\r
-                       case XmlTypeCode.UnsignedInt:\r
-                               return XmlSchemaSimpleType.XsUnsignedInt;\r
-                       case XmlTypeCode.UnsignedShort:\r
-                               return XmlSchemaSimpleType.XsUnsignedShort;\r
-                       case XmlTypeCode.UnsignedByte:\r
-                               return XmlSchemaSimpleType.XsUnsignedByte;\r
-                       case XmlTypeCode.PositiveInteger:\r
-                               return XmlSchemaSimpleType.XsPositiveInteger;\r
-                       case XmlTypeCode.YearMonthDuration:\r
-                               return XmlSchemaSimpleType.XdtYearMonthDuration;\r
-                       case XmlTypeCode.DayTimeDuration:\r
-                               return XmlSchemaSimpleType.XdtDayTimeDuration;\r
-                       }\r
-                       return null;\r
-               }\r
-\r
-               public static bool IsDerivedFrom (XmlSchemaType derivedType, XmlSchemaType baseType, XmlSchemaDerivationMethod except)\r
-               {\r
-                       if (derivedType.BaseXmlSchemaType == null)\r
-                               return false;\r
-                       if ((derivedType.DerivedBy & except) != 0)\r
-                               return false;\r
-                       if (derivedType.BaseXmlSchemaType == baseType)\r
-                               return true;\r
-                       return IsDerivedFrom (derivedType.BaseXmlSchemaType,\r
-                               baseType, except);\r
-               }\r
-#endif\r
-\r
-               internal bool ValidateRecursionCheck ()\r
-               {\r
-                       if (recursed)\r
-                               return (this != XmlSchemaComplexType.AnyType);\r
-                       recursed = true;\r
-                       XmlSchemaType baseType = this.BaseXmlSchemaType as XmlSchemaType;\r
-                       bool result = false;\r
-                       if (baseType != null)\r
-                               result = baseType.ValidateRecursionCheck ();\r
-                       recursed = false;\r
-                       return result;\r
-               }\r
-       }\r
-}\r
+using System;
+using System.Xml;
+using System.ComponentModel;
+using Mono.Xml.Schema;
+using System.Xml.Serialization;
+#if NET_2_0_in_the_future
+using MS.Internal.Xml;
+#endif
+
+namespace System.Xml.Schema
+{
+       /// <summary>
+       /// Summary description for XmlSchemaType.
+       /// </summary>
+       public class XmlSchemaType : XmlSchemaAnnotated
+       {
+               private XmlSchemaDerivationMethod final;
+               private bool isMixed;
+               private string name;
+               bool recursed;
+
+               internal XmlQualifiedName BaseSchemaTypeName;
+               internal XmlSchemaType BaseXmlSchemaTypeInternal;
+               internal XmlSchemaDatatype DatatypeInternal;
+               internal XmlSchemaDerivationMethod resolvedDerivedBy;
+               internal XmlSchemaDerivationMethod finalResolved;
+               internal XmlQualifiedName QNameInternal;
+
+               public XmlSchemaType ()
+               {
+                       final = XmlSchemaDerivationMethod.None;
+                       QNameInternal = XmlQualifiedName.Empty;
+               }
+
+               #region Attributes
+               [System.Xml.Serialization.XmlAttribute("name")]
+               public string Name {
+                       get{ return name; }
+                       set{ name = value; }
+               }
+
+               [DefaultValue(XmlSchemaDerivationMethod.None)]
+               [System.Xml.Serialization.XmlAttribute("final")]
+               public XmlSchemaDerivationMethod Final {
+                       get{ return  final; }
+                       set{ final = value; }
+               }
+               #endregion
+
+               #region Post Compilation Schema Information
+               [XmlIgnore]
+               public XmlQualifiedName QualifiedName {
+                       get{ return QNameInternal; }
+               }
+
+               [XmlIgnore]
+               public XmlSchemaDerivationMethod FinalResolved {
+                       get{ return finalResolved; }
+               }
+
+               [XmlIgnore]
+#if NET_2_0
+               [Obsolete ("This property is going away. Use BaseXmlSchemaType instead")]
+#endif
+               public object BaseSchemaType {
+                       get{
+                               if (BaseXmlSchemaType != null)
+                                       return BaseXmlSchemaType;
+                               else if (this == XmlSchemaComplexType.AnyType)
+                                       return null; // This property is designed so.
+                               else
+                                       return Datatype;
+                       }
+               }
+
+               [XmlIgnore]
+               // FIXME:This property works as always returning a valid schema type.
+               [MonoTODO]
+               // In .NET 2.0, all schema types used in schema documents must
+               // be XmlSchemaType, even if it is primitive type, in terms of
+               // non-obsolete System.Xml.Schema members.
+               
+               // To modify this property, we have to make sure that it does
+               // not affect to any compilation/validation logic.
+#if NET_2_0
+               public XmlSchemaType BaseXmlSchemaType {
+#else
+               internal XmlSchemaType BaseXmlSchemaType {
+#endif
+                       get { return  BaseXmlSchemaTypeInternal; }
+               }
+
+               [XmlIgnore]
+               public XmlSchemaDerivationMethod DerivedBy {
+                       get{ return resolvedDerivedBy; }
+               }
+
+               [XmlIgnore]
+               public XmlSchemaDatatype Datatype {
+                       get{ return DatatypeInternal; }
+               }
+
+               [XmlIgnore]
+               public virtual bool IsMixed {  
+                       get{ return  isMixed; }
+                       set{ isMixed = value; } 
+               }
+
+#if NET_2_0
+               // LAMESPEC: for IDREFS it returns Idref. for ENTITIES 
+               // it returns Entity. for NMTOKENS it returns NmToken.
+               [XmlIgnore]
+               public XmlTypeCode TypeCode {
+                       get {
+                               if (this == XmlSchemaComplexType.AnyType)
+                                       return XmlTypeCode.Item;
+                               if (DatatypeInternal == XmlSchemaSimpleType.AnySimpleType)
+                                       return XmlTypeCode.AnyAtomicType;
+                               if (this == XmlSchemaSimpleType.XsIDRefs)
+                                       return XmlTypeCode.Idref;
+                               if (this == XmlSchemaSimpleType.XsEntities)
+                                       return XmlTypeCode.Entity;
+                               if (this == XmlSchemaSimpleType.XsNMTokens)
+                                       return XmlTypeCode.NmToken;
+                               if (DatatypeInternal != null)
+                                       return DatatypeInternal.TypeCode;
+                               return BaseXmlSchemaType.TypeCode;
+                       }
+               }
+#endif
+               #endregion
+
+#if NET_2_0
+               internal static XmlSchemaType GetBuiltInType (XmlQualifiedName qualifiedName)
+               {
+                       XmlSchemaType t = GetBuiltInSimpleType (qualifiedName);
+                       if (t == null)
+                               t = GetBuiltInComplexType (qualifiedName);
+                       return t;
+               }
+
+               internal static XmlSchemaType GetBuiltInType (XmlTypeCode typecode)
+               {
+                       if (typecode == XmlTypeCode.Item)
+                               return XmlSchemaComplexType.AnyType;
+                       return GetBuiltInSimpleType (typecode);
+               }
+#endif
+
+#if NET_2_0
+               public static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)
+#else
+               internal static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)
+#endif
+               {
+                       if (qualifiedName.Name == "anyType" && qualifiedName.Namespace == XmlSchema.Namespace)
+                               return XmlSchemaComplexType.AnyType;
+
+                       return null;
+               }
+
+#if NET_2_0
+               public static XmlSchemaComplexType GetBuiltInComplexType (XmlTypeCode type)
+               {
+                       switch (type) {
+                       case XmlTypeCode.Item:
+                               return XmlSchemaComplexType.AnyType;
+                       }
+                       return null;
+               }
+#endif
+
+#if NET_2_0
+               [MonoTODO]
+               public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlQualifiedName qualifiedName)
+               {
+                       if (qualifiedName.Namespace == "http://www.w3.org/2003/11/xpath-datatypes") {
+                               switch (qualifiedName.Name) {
+                               case "untypedAtomic":
+                                       return XmlSchemaSimpleType.XdtUntypedAtomic;
+                               case "anyAtomicType":
+                                       return XmlSchemaSimpleType.XdtAnyAtomicType;
+                               case "yearMonthDuration":
+                                       return XmlSchemaSimpleType.XdtYearMonthDuration;
+                               case "dayTimeDuration":
+                                       return XmlSchemaSimpleType.XdtDayTimeDuration;
+                               }
+                               return null;
+                       }
+                       else if (qualifiedName.Namespace != XmlSchema.Namespace)
+                               return null;
+                       switch (qualifiedName.Name) {
+                       case "anySimpleType":
+                               return XmlSchemaSimpleType.XsAnySimpleType;
+                       case "string":
+                               return XmlSchemaSimpleType.XsString;
+                       case "boolean":
+                               return XmlSchemaSimpleType.XsBoolean;
+                       case "decimal":
+                               return XmlSchemaSimpleType.XsDecimal;
+                       case "float":
+                               return XmlSchemaSimpleType.XsFloat;
+                       case "double":
+                               return XmlSchemaSimpleType.XsDouble;
+                       case "duration":
+                               return XmlSchemaSimpleType.XsDuration;
+                       case "dateTime":
+                               return XmlSchemaSimpleType.XsDateTime;
+                       case "time":
+                               return XmlSchemaSimpleType.XsTime;
+                       case "date":
+                               return XmlSchemaSimpleType.XsDate;
+                       case "gYearMonth":
+                               return XmlSchemaSimpleType.XsGYearMonth;
+                       case "gYear":
+                               return XmlSchemaSimpleType.XsGYear;
+                       case "gMonthDay":
+                               return XmlSchemaSimpleType.XsGMonthDay;
+                       case "gDay":
+                               return XmlSchemaSimpleType.XsGDay;
+                       case "gMonth":
+                               return XmlSchemaSimpleType.XsGMonth;
+                       case "hexBinary":
+                               return XmlSchemaSimpleType.XsHexBinary;
+                       case "base64Binary":
+                               return XmlSchemaSimpleType.XsBase64Binary;
+                       case "anyURI":
+                               return XmlSchemaSimpleType.XsAnyUri;
+                       case "QName":
+                               return XmlSchemaSimpleType.XsQName;
+                       case "NOTATION":
+                               return XmlSchemaSimpleType.XsNotation;
+                       case "normalizedString":
+                               return XmlSchemaSimpleType.XsNormalizedString;
+                       case "token":
+                               return XmlSchemaSimpleType.XsToken;
+                       case "language":
+                               return XmlSchemaSimpleType.XsLanguage;
+                       case "NMTOKEN":
+                               return XmlSchemaSimpleType.XsNMToken;
+                       case "NMTOKENS":
+                               return XmlSchemaSimpleType.XsNMTokens;
+                       case "Name":
+                               return XmlSchemaSimpleType.XsName;
+                       case "NCName":
+                               return XmlSchemaSimpleType.XsNCName;
+                       case "ID":
+                               return XmlSchemaSimpleType.XsID;
+                       case "IDREF":
+                               return XmlSchemaSimpleType.XsIDRef;
+                       case "IDREFS":
+                               return XmlSchemaSimpleType.XsIDRefs;
+                       case "ENTITY":
+                               return XmlSchemaSimpleType.XsEntity;
+                       case "ENTITIES":
+                               return XmlSchemaSimpleType.XsEntities;
+                       case "integer":
+                               return XmlSchemaSimpleType.XsInteger;
+                       case "nonPositiveInteger":
+                               return XmlSchemaSimpleType.XsNonPositiveInteger;
+                       case "negativeInteger":
+                               return XmlSchemaSimpleType.XsNegativeInteger;
+                       case "long":
+                               return XmlSchemaSimpleType.XsLong;
+                       case "int":
+                               return XmlSchemaSimpleType.XsInt;
+                       case "short":
+                               return XmlSchemaSimpleType.XsShort;
+                       case "byte":
+                               return XmlSchemaSimpleType.XsByte;
+                       case "nonNegativeInteger":
+                               return XmlSchemaSimpleType.XsNonNegativeInteger;
+                       case "positiveInteger":
+                               return XmlSchemaSimpleType.XsPositiveInteger;
+                       case "unsignedLong":
+                               return XmlSchemaSimpleType.XsUnsignedLong;
+                       case "unsignedInt":
+                               return XmlSchemaSimpleType.XsUnsignedInt;
+                       case "unsignedShort":
+                               return XmlSchemaSimpleType.XsUnsignedShort;
+                       case "unsignedByte":
+                               return XmlSchemaSimpleType.XsUnsignedByte;
+                       }
+                       return null;
+               }
+
+               internal static XmlSchemaSimpleType GetBuiltInSimpleType (XmlSchemaDatatype type)
+               {
+                       if (type is XsdEntities)
+                               return XmlSchemaSimpleType.XsEntities;
+                       else if (type is XsdNMTokens)
+                               return XmlSchemaSimpleType.XsNMTokens;
+                       else if (type is XsdIDRefs)
+                               return XmlSchemaSimpleType.XsIDRefs;
+                       else
+                               return GetBuiltInSimpleType (type.TypeCode);
+               }
+
+               [MonoTODO]
+               // Don't use this method to cover all XML Schema datatypes.
+               public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlTypeCode type)
+               {
+                       switch (type) {
+                       case XmlTypeCode.None:
+                       case XmlTypeCode.Item:
+                       case XmlTypeCode.Node:
+                       case XmlTypeCode.Document: // node
+                       case XmlTypeCode.Element: // node
+                       case XmlTypeCode.Attribute: // node
+                       case XmlTypeCode.Namespace: // node
+                       case XmlTypeCode.ProcessingInstruction: // node
+                       case XmlTypeCode.Comment: // node
+                       case XmlTypeCode.Text:  // node
+                               return null;
+                       case XmlTypeCode.AnyAtomicType:
+                               return XmlSchemaSimpleType.XdtAnyAtomicType;
+                       case XmlTypeCode.UntypedAtomic:
+                               return XmlSchemaSimpleType.XdtUntypedAtomic;
+                       case XmlTypeCode.String:
+                               return XmlSchemaSimpleType.XsString;
+                       case XmlTypeCode.Boolean:
+                               return XmlSchemaSimpleType.XsBoolean;
+                       case XmlTypeCode.Decimal:
+                               return XmlSchemaSimpleType.XsDecimal;
+                       case XmlTypeCode.Float:
+                               return XmlSchemaSimpleType.XsFloat;
+                       case XmlTypeCode.Double:
+                               return XmlSchemaSimpleType.XsDouble;
+                       case XmlTypeCode.Duration:
+                               return XmlSchemaSimpleType.XsDuration;
+                       case XmlTypeCode.DateTime:
+                               return XmlSchemaSimpleType.XsDateTime;
+                       case XmlTypeCode.Time:
+                               return XmlSchemaSimpleType.XsTime;
+                       case XmlTypeCode.Date:
+                               return XmlSchemaSimpleType.XsDate;
+                       case XmlTypeCode.GYearMonth:
+                               return XmlSchemaSimpleType.XsGYearMonth;
+                       case XmlTypeCode.GYear:
+                               return XmlSchemaSimpleType.XsGYear;
+                       case XmlTypeCode.GMonthDay:
+                               return XmlSchemaSimpleType.XsGMonthDay;
+                       case XmlTypeCode.GDay:
+                               return XmlSchemaSimpleType.XsGDay;
+                       case XmlTypeCode.GMonth:
+                               return XmlSchemaSimpleType.XsGMonth;
+                       case XmlTypeCode.HexBinary:
+                               return XmlSchemaSimpleType.XsHexBinary;
+                       case XmlTypeCode.Base64Binary:
+                               return XmlSchemaSimpleType.XsBase64Binary;
+                       case XmlTypeCode.AnyUri:
+                               return XmlSchemaSimpleType.XsAnyUri;
+                       case XmlTypeCode.QName:
+                               return XmlSchemaSimpleType.XsQName;
+                       case XmlTypeCode.Notation:
+                               return XmlSchemaSimpleType.XsNotation;
+                       case XmlTypeCode.NormalizedString:
+                               return XmlSchemaSimpleType.XsNormalizedString;
+                       case XmlTypeCode.Token:
+                               return XmlSchemaSimpleType.XsToken;
+                       case XmlTypeCode.Language:
+                               return XmlSchemaSimpleType.XsLanguage;
+                       case XmlTypeCode.NmToken: // NmTokens is not primitive
+                               return XmlSchemaSimpleType.XsNMToken;
+                       case XmlTypeCode.Name:
+                               return XmlSchemaSimpleType.XsName;
+                       case XmlTypeCode.NCName:
+                               return XmlSchemaSimpleType.XsNCName;
+                       case XmlTypeCode.Id:
+                               return XmlSchemaSimpleType.XsID;
+                       case XmlTypeCode.Idref: // Idrefs is not primitive
+                               return XmlSchemaSimpleType.XsIDRef;
+                       case XmlTypeCode.Entity: // Entities is not primitive
+                               return XmlSchemaSimpleType.XsEntity;
+                       case XmlTypeCode.Integer:
+                               return XmlSchemaSimpleType.XsInteger;
+                       case XmlTypeCode.NonPositiveInteger:
+                               return XmlSchemaSimpleType.XsNonPositiveInteger;
+                       case XmlTypeCode.NegativeInteger:
+                               return XmlSchemaSimpleType.XsNegativeInteger;
+                       case XmlTypeCode.Long:
+                               return XmlSchemaSimpleType.XsLong;
+                       case XmlTypeCode.Int:
+                               return XmlSchemaSimpleType.XsInt;
+                       case XmlTypeCode.Short:
+                               return XmlSchemaSimpleType.XsShort;
+                       case XmlTypeCode.Byte:
+                               return XmlSchemaSimpleType.XsByte;
+                       case XmlTypeCode.NonNegativeInteger:
+                               return XmlSchemaSimpleType.XsNonNegativeInteger;
+                       case XmlTypeCode.UnsignedLong:
+                               return XmlSchemaSimpleType.XsUnsignedLong;
+                       case XmlTypeCode.UnsignedInt:
+                               return XmlSchemaSimpleType.XsUnsignedInt;
+                       case XmlTypeCode.UnsignedShort:
+                               return XmlSchemaSimpleType.XsUnsignedShort;
+                       case XmlTypeCode.UnsignedByte:
+                               return XmlSchemaSimpleType.XsUnsignedByte;
+                       case XmlTypeCode.PositiveInteger:
+                               return XmlSchemaSimpleType.XsPositiveInteger;
+                       case XmlTypeCode.YearMonthDuration:
+                               return XmlSchemaSimpleType.XdtYearMonthDuration;
+                       case XmlTypeCode.DayTimeDuration:
+                               return XmlSchemaSimpleType.XdtDayTimeDuration;
+                       }
+                       return null;
+               }
+
+               public static bool IsDerivedFrom (XmlSchemaType derivedType, XmlSchemaType baseType, XmlSchemaDerivationMethod except)
+               {
+                       if (derivedType.BaseXmlSchemaType == null)
+                               return false;
+                       if ((derivedType.DerivedBy & except) != 0)
+                               return false;
+                       if (derivedType.BaseXmlSchemaType == baseType)
+                               return true;
+                       return IsDerivedFrom (derivedType.BaseXmlSchemaType,
+                               baseType, except);
+               }
+#endif
+
+               internal bool ValidateRecursionCheck ()
+               {
+                       if (recursed)
+                               return (this != XmlSchemaComplexType.AnyType);
+                       recursed = true;
+                       XmlSchemaType baseType = this.BaseXmlSchemaType as XmlSchemaType;
+                       bool result = false;
+                       if (baseType != null)
+                               result = baseType.ValidateRecursionCheck ();
+                       recursed = false;
+                       return result;
+               }
+       }
+}