+ Guid CollectProcessId;\r
+\r
+ private void CollectSchemaComponent (ValidationEventHandler h, XmlSchema schema)\r
+ {\r
+ if (CollectProcessId == schema.CompilationId)\r
+ return;\r
+ // Below are already contributed by Compile():\r
+ // {name}, {namespace} => QualifiedName, QNameInternal\r
+ // {abstract} => ValidatedIsAbstract\r
+ // {prohibited substitutions} => BlockResolved\r
+ // {final} => FinalResolved\r
+ // {annotations} => Annotation (XmlSchemaAnnotated)\r
+\r
+ // Below are different properties depending on simpleContent | complexContent.\r
+ // {base type definition}\r
+ // {derivation method}\r
+ // {attribute uses} => AttributeUses (later)\r
+ // {attribute wildcard} => AttributeWildcard (later)\r
+ // {content type}\r
+\r
+\r
+ // {base type definition} => baseSchemaTypeInternal (later)\r
+ if (contentModel != null) {\r
+ BaseSchemaTypeName = contentModel.Content != null ? contentModel.Content.GetBaseTypeName () : XmlQualifiedName.Empty;\r
+\r
+ BaseXmlSchemaTypeInternal = schema.SchemaTypes [BaseSchemaTypeName] as XmlSchemaType;\r
+ }\r
+ // Resolve redefine.\r
+ if (this.isRedefineChild && BaseXmlSchemaType != null && this.QualifiedName == BaseSchemaTypeName) {\r
+ XmlSchemaType redType = (XmlSchemaType) redefinedObject;\r
+ if (redType == null)\r
+ error (h, "Redefinition base type was not found.");\r
+ else\r
+ BaseXmlSchemaTypeInternal = redType;\r
+ }\r
+\r
+ // {derivation method} => resolvedDerivedBy\r
+ if (contentModel != null && contentModel.Content != null) {\r
+ resolvedDerivedBy =\r
+ contentModel.Content.IsExtension ?\r
+ XmlSchemaDerivationMethod.Extension :\r
+ XmlSchemaDerivationMethod.Restriction;\r
+ }\r
+ else\r
+ resolvedDerivedBy = XmlSchemaDerivationMethod.Empty;\r
+\r
+\r
+ // {content type} => ContentType and ContentTypeParticle (later)\r
+ if (ContentModel != null) {\r
+ CollectContentTypeFromContentModel (h, schema);\r
+ } else\r
+ CollectContentTypeFromImmediateContent ();\r
+ contentTypeParticle = validatableParticle.GetOptimizedParticle (true);\r
+ if (contentTypeParticle == XmlSchemaParticle.Empty && resolvedContentType == XmlSchemaContentType.ElementOnly)\r
+ resolvedContentType = XmlSchemaContentType.Empty;\r
+\r
+ CollectProcessId = schema.CompilationId;\r
+ }\r
+\r
+ #region {content type}\r
+ private void CollectContentTypeFromImmediateContent ()\r
+ {\r
+ // 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
+ resolvedContentType = XmlSchemaContentType.TextOnly;\r
+ else\r
+ resolvedContentType = XmlSchemaContentType.Empty;\r
+ } else {\r
+ if (this.IsMixed)\r
+ resolvedContentType = XmlSchemaContentType.Mixed;\r
+ 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
+ {\r
+ if (ContentModel.Content == null) {\r
+ // basically it is error. Recover by specifying empty content.\r
+ validatableParticle = XmlSchemaParticle.Empty;\r
+ resolvedContentType = XmlSchemaContentType.Empty;\r
+ return;\r
+ }\r
+\r
+ if (ContentModel.Content is XmlSchemaComplexContentExtension)\r
+ CollectContentTypeFromComplexExtension (h, schema);\r
+ if (ContentModel.Content is XmlSchemaComplexContentRestriction)\r
+ CollectContentTypeFromComplexRestriction ();\r
+ }\r
+\r
+ private void CollectContentTypeFromComplexExtension (ValidationEventHandler h, XmlSchema schema)\r
+ {\r
+ XmlSchemaComplexContentExtension cce = (XmlSchemaComplexContentExtension) ContentModel.Content;\r
+ XmlSchemaComplexType baseComplexType = this.BaseXmlSchemaType as XmlSchemaComplexType;\r
+ if (baseComplexType != null)\r
+ baseComplexType.CollectSchemaComponent (h ,schema);\r
+\r
+ // It must exist, but consider validation error case.\r
+ if (BaseSchemaTypeName == XmlSchemaComplexType.AnyTypeName)\r
+ baseComplexType = XmlSchemaComplexType.AnyType;\r
+\r
+ // On error case, it simple reject any contents\r
+ if (baseComplexType == null) {\r
+ validatableParticle = XmlSchemaParticle.Empty;\r
+ resolvedContentType = XmlSchemaContentType.Empty;\r
+ return;\r
+ }\r
+\r
+ // 3.4.2 complex content {content type}\r
+ if (cce.Particle == null || cce.Particle == XmlSchemaParticle.Empty) {\r
+ // - 2.1\r
+ if (baseComplexType == null) {\r
+ // Basically it is an error. Considering ValidationEventHandler.\r
+ validatableParticle = XmlSchemaParticle.Empty;\r
+ resolvedContentType = XmlSchemaContentType.Empty;\r
+ } else {\r
+ validatableParticle = baseComplexType.ValidatableParticle;\r
+ resolvedContentType = baseComplexType.resolvedContentType;\r
+ }\r
+ } else if (baseComplexType.validatableParticle == XmlSchemaParticle.Empty\r
+ || baseComplexType == XmlSchemaComplexType.AnyType) {\r
+ // - 2.2\r
+ validatableParticle = cce.Particle;\r
+ resolvedContentType = GetComplexContentType (contentModel);\r
+ } else {\r
+ // - 2.3 : create a new sequences that merges both contents.\r
+ XmlSchemaSequence seq = new XmlSchemaSequence ();\r
+ this.CopyInfo (seq);\r
+ seq.Items.Add (baseComplexType.validatableParticle);\r
+ seq.Items.Add (cce.Particle);\r
+ seq.Compile (h, schema);\r
+ seq.Validate (h, schema);\r
+ validatableParticle = seq;\r
+ resolvedContentType = GetComplexContentType (contentModel);\r
+ }\r
+ if (validatableParticle == null)\r
+ validatableParticle = XmlSchemaParticle.Empty;\r
+ }\r
+\r
+ private void CollectContentTypeFromComplexRestriction ()\r
+ {\r
+ XmlSchemaComplexContentRestriction ccr = (XmlSchemaComplexContentRestriction) ContentModel.Content;\r
+ // 3.4.2 complex content schema component {content type}\r
+ // - 1.1.1\r
+ bool isEmptyParticle = false;\r
+ if (ccr.Particle == null) \r
+ isEmptyParticle = true;\r
+ else {\r
+ XmlSchemaGroupBase gb = ccr.Particle as XmlSchemaGroupBase;\r
+ if (gb != null) {\r
+ // - 1.1.2\r
+ if (!(gb is XmlSchemaChoice) && gb.Items.Count == 0)\r
+ isEmptyParticle = true;\r
+ // - 1.1.3\r
+ else if (gb is XmlSchemaChoice && gb.Items.Count == 0 && gb.ValidatedMinOccurs == 0)\r
+ isEmptyParticle = true;\r
+ }\r
+ }\r
+ if (isEmptyParticle) {\r
+ resolvedContentType = XmlSchemaContentType.Empty;\r
+ validatableParticle = XmlSchemaParticle.Empty;\r
+ } else {\r
+ // - 1.2.1\r
+ resolvedContentType = GetComplexContentType (contentModel);\r
+ // - 1.2.2\r
+ validatableParticle = ccr.Particle;\r
+ }\r
+ }\r
+\r
+ // 3.4.2 Complex Content Schema Component {content type} 1.2.1\r
+ private XmlSchemaContentType GetComplexContentType (XmlSchemaContentModel content)\r
+ {\r
+ if (this.IsMixed || ((XmlSchemaComplexContent) content).IsMixed)\r
+ return XmlSchemaContentType.Mixed;\r
+ else\r
+ return XmlSchemaContentType.ElementOnly;\r
+ }\r
+ #endregion\r
+\r
+ //\r
+ // We have to validate:\r
+ //\r
+ // - 3.4.3 Complex Type Definition Representation OK\r
+ // - 3.4.6 Type Definition Properties Correct\r
+ // - 3.4.6 Derivation Valid (Extension)\r
+ // - 3.4.6 Derivation Valid (Restriction, 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, E1-27\r
+ //\r
+ internal override int Validate (ValidationEventHandler h, XmlSchema schema)\r