2005-06-21 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaComplexType.cs
index f2fe67ceb8243e33caa29009c5bd14a547ea9453..9baea7d906ccbd4e9cc8a79aa2df911a1b7be268 100755 (executable)
@@ -5,6 +5,27 @@
 //     Dwivedi, Ajay kumar  Adwiv@Yahoo.com\r
 //     Enomoto, Atsushi     ginga@kit.hi-ho.ne.jp\r
 //\r
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
 using System;\r
 using System.Collections;\r
 using System.Xml;\r
@@ -35,7 +56,7 @@ namespace System.Xml.Schema
                internal bool ValidatedIsAbstract;\r
                internal bool ParentIsSchema = false;\r
 \r
-               private static string xmlname = "complexType";\r
+               const string xmlname = "complexType";\r
 \r
                private static XmlSchemaComplexType anyType;\r
 \r
@@ -45,10 +66,15 @@ namespace System.Xml.Schema
                                        anyType = new XmlSchemaComplexType ();\r
                                        anyType.Name = "";      // In MS.NET, it is not "anyType"\r
                                        anyType.QNameInternal = XmlQualifiedName.Empty; // Not xs:anyType as well.\r
+#if BUGGY_MS_COMPLIANT\r
+                                       anyType.validatableParticle = XmlSchemaParticle.Empty; // This code makes validator handles these schemas incorrectly: particlesIb001, mgM013, mgH014, ctE004, ctD004\r
+#else\r
                                        anyType.validatableParticle = XmlSchemaAny.AnyTypeContent;\r
+#endif\r
                                        anyType.contentTypeParticle = anyType.validatableParticle;\r
                                        anyType.DatatypeInternal = XmlSchemaSimpleType.AnySimpleType;\r
                                        anyType.isMixed = true;\r
+                                       anyType.resolvedContentType = XmlSchemaContentType.Mixed;\r
                                }\r
                                return anyType;\r
                        }\r
@@ -153,11 +179,31 @@ namespace System.Xml.Schema
                {\r
                        get{ return attributeWildcard; }\r
                }\r
+\r
+#if NET_2_0\r
+               [XmlIgnore]\r
+               // LAMESPEC: This property is based on the premise that\r
+               // every particle has a unique name, but actually particles\r
+               // can be like:\r
+               // <sequence>\r
+               //  <element name='foo'/>\r
+               //  <element name='foo'>\r
+               //    <annotation>\r
+               //      <documentation>blah</documentation>\r
+               //    </annotation>\r
+               //  </element>\r
+               // </sequence>\r
+               //\r
+               // So with this signature this property can never be correct.\r
+               public XmlSchemaObjectTable LocalElements {\r
+                       get { throw new NotImplementedException (); }\r
+               }\r
+#endif\r
+\r
                #endregion\r
 \r
                internal XmlSchemaParticle ValidatableParticle \r
                {\r
-//                     get{ return validatableParticle; }\r
                        get{ return contentTypeParticle; }\r
                }\r
 \r
@@ -181,6 +227,17 @@ namespace System.Xml.Schema
                        if (this.IsComplied (schema.CompilationId))\r
                                return errorCount;\r
 \r
+#if NET_2_0\r
+                       if (ContentModel != null)\r
+                               ContentModel.Parent = this;\r
+                       if (Particle != null)\r
+                               Particle.Parent = this;\r
+                       if (AnyAttribute != null)\r
+                               AnyAttribute.Parent = this;\r
+                       foreach (XmlSchemaObject obj in Attributes)\r
+                               obj.Parent = this;\r
+#endif\r
+\r
                        ValidatedIsAbstract = isAbstract;\r
 \r
                        if (isRedefinedComponent) {\r
@@ -277,17 +334,13 @@ namespace System.Xml.Schema
                                        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
+                                       if (sscx == null) {\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
                                                                BaseXmlSchemaTypeInternal = sscr.BaseType;\r
@@ -295,43 +348,11 @@ namespace System.Xml.Schema
                                                }\r
                                        }\r
                                }\r
-                               else\r
-                               {\r
-                                       XmlSchemaComplexContent cmodel = (XmlSchemaComplexContent) ContentModel;\r
-                                       XmlSchemaComplexContentExtension sccx = cmodel.Content as XmlSchemaComplexContentExtension;\r
-                                       if (sccx != null) {\r
-                                               baseTypeName = sccx.BaseTypeName;\r
-                                       }\r
-                                       else {\r
-                                               XmlSchemaComplexContentRestriction sccr = (XmlSchemaComplexContentRestriction) cmodel.Content;\r
-                                               if (sccr != null) {\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
+                               if (Particle != null)\r
+                                       errorCount += Particle.Compile (h, schema);\r
 \r
                                if(this.anyAttribute != null)\r
                                {\r
@@ -424,6 +445,11 @@ namespace System.Xml.Schema
                        // leave resolvedDerivedBy as Empty\r
                        if (Particle != null)\r
                                validatableParticle = Particle;\r
+                       if (this == AnyType) {\r
+                               resolvedContentType = XmlSchemaContentType.Mixed;\r
+                               return;\r
+                       }\r
+\r
                        if (validatableParticle == XmlSchemaParticle.Empty) {\r
                                // note that this covers "Particle == null" case\r
                                if (this.IsMixed)\r
@@ -436,6 +462,8 @@ namespace System.Xml.Schema
                                else\r
                                        resolvedContentType = XmlSchemaContentType.ElementOnly;\r
                        }\r
+                       if (this != AnyType)\r
+                               BaseXmlSchemaTypeInternal = XmlSchemaComplexType.AnyType;\r
                }\r
 \r
                private void CollectContentTypeFromContentModel (ValidationEventHandler h, XmlSchema schema)\r
@@ -707,7 +735,7 @@ namespace System.Xml.Schema
                                        // do nothing for particle.\r
                                }\r
                                // otherwise, it might be missing sub components.\r
-                               else if (baseType == null && !schema.IsNamespaceAbsent (BaseSchemaTypeName.Namespace))// && schema.Schemas [baseTypeName.Namespace] != null)\r
+                               else if (baseType == null && !schema.IsNamespaceAbsent (BaseSchemaTypeName.Namespace))\r
                                        error (h, "Referenced base schema type " + BaseSchemaTypeName + " was not found in the corresponding schema.");\r
 \r
                                // 3.4.3 Complex Type Definition Representation OK :: 2.\r
@@ -804,6 +832,10 @@ namespace System.Xml.Schema
 \r
                                        foreach (DictionaryEntry entry in baseComplexType.AttributeUses) {\r
                                                XmlSchemaAttribute attr = (XmlSchemaAttribute) entry.Value;\r
+#if BUGGY_MS_COMPLIANT\r
+                                               if (attr.Use != XmlSchemaUse.Prohibited)\r
+                                                       XmlSchemaUtil.AddToTable (attributeUses, attr, attr.QualifiedName, h);\r
+#endif\r
                                                XmlSchemaUtil.AddToTable (attributeUses, attr, attr.QualifiedName, h);\r
                                        }\r
                                }\r
@@ -991,6 +1023,8 @@ namespace System.Xml.Schema
                        }\r
 \r
                        // 5.\r
+                       if (this == AnyType)\r
+                               return;\r
                        if (contentTypeParticle == XmlSchemaParticle.Empty) {\r
                                // 5.1\r
                                if (ContentType != XmlSchemaContentType.Empty) {\r