-// 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
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
- \r
- internal bool istoplevel = false;\r
+ private XmlSchemaContentType resolvedContentType;\r
+\r
+ internal bool ValidatedIsAbstract;\r
+ internal bool ParentIsSchema = false;\r
+\r
private static string xmlname = "complexType";\r
\r
- public XmlSchemaComplexType()\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
get{ return anyAttribute; }\r
set{ anyAttribute = value; }\r
}\r
-\r
#endregion\r
\r
#region XmlIgnore\r
[XmlIgnore]\r
public XmlSchemaContentType ContentType \r
{\r
- get{\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 != null ?\r
- XmlSchemaContentType.ElementOnly :\r
- XmlSchemaContentType.Empty;\r
- }\r
+ get{ return resolvedContentType; }\r
}\r
[XmlIgnore]\r
public XmlSchemaParticle ContentTypeParticle \r
/// 4. block must be absent\r
/// \r
/// </remarks>\r
- [MonoTODO]\r
- internal int Compile(ValidationEventHandler h, XmlSchema schema)\r
+ internal override int Compile(ValidationEventHandler h, XmlSchema schema)\r
{\r
// If this is already compiled this time, simply skip.\r
if (this.IsComplied (schema.CompilationId))\r
- return 0;\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(istoplevel)\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\r
{\r
//TODO: Check what all is not allowed\r
- blockResolved = Block & (XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Restriction);\r
+ if ((Block & XmlSchemaUtil.ComplexTypeBlockAllowed) != Block)\r
+ error (h, "Invalid block specification.");\r
+ blockResolved = Block & XmlSchemaUtil.ComplexTypeBlockAllowed;\r
}\r
}\r
else\r
blockResolved = XmlSchemaDerivationMethod.All;\r
break;\r
case XmlSchemaDerivationMethod.None:\r
- blockResolved = XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Restriction;\r
+ blockResolved = XmlSchemaDerivationMethod.Empty;\r
break;\r
default:\r
- blockResolved = schema.BlockDefault & (XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Restriction);\r
+ blockResolved = schema.BlockDefault & XmlSchemaUtil.ComplexTypeBlockAllowed;\r
break;\r
}\r
}\r
+\r
if(Final != XmlSchemaDerivationMethod.None)\r
{\r
if(Final == XmlSchemaDerivationMethod.All)\r
- {\r
finalResolved = XmlSchemaDerivationMethod.All;\r
- }\r
+ else if ((Final & XmlSchemaUtil.FinalAllowed) != Final)\r
+ error (h, "Invalid final specification.");\r
else\r
- {\r
- //TODO: Check what all is not allowed\r
- finalResolved = Final & (XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Restriction);\r
- }\r
+ finalResolved = Final;\r
}\r
else\r
{\r
finalResolved = XmlSchemaDerivationMethod.All;\r
break;\r
case XmlSchemaDerivationMethod.None:\r
- finalResolved = XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Restriction;\r
+ finalResolved = XmlSchemaDerivationMethod.Empty;\r
break;\r
default:\r
- finalResolved = schema.FinalDefault & (XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Restriction);\r
+ finalResolved = schema.FinalDefault & XmlSchemaUtil.FinalAllowed;\r
break;\r
}\r
}\r
}\r
\r
// Process contents and BaseSchemaType\r
- if(ContentModel != null)\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
- if(ContentModel is XmlSchemaSimpleContent)\r
+ XmlSchemaSimpleContent smodel = ContentModel as XmlSchemaSimpleContent;\r
+ if(smodel != null)\r
{\r
- XmlSchemaSimpleContent smodel = (XmlSchemaSimpleContent)ContentModel;\r
- errorCount += smodel.Compile(h,schema);\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
- baseTypeName = sscr.BaseTypeName;\r
- if (sscr.BaseType != null) {\r
- sscr.BaseType.Compile (h, schema);\r
- BaseSchemaTypeInternal = sscr.BaseType;\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 if(ContentModel is XmlSchemaComplexContent)\r
+ else\r
{\r
- XmlSchemaComplexContent cmodel = (XmlSchemaComplexContent)ContentModel;\r
- errorCount += cmodel.Compile(h,schema);\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 = cmodel.Content as XmlSchemaComplexContentRestriction;\r
- contentTypeParticle = sccr.Particle;\r
- baseTypeName = sccr.BaseTypeName;\r
- }\r
- }\r
-\r
- // fill base schema type\r
- if (BaseSchemaTypeInternal == null && baseTypeName != null) { // simple content restriction may have type itself.\r
- if (baseTypeName.Namespace == XmlSchema.Namespace)\r
- BaseSchemaTypeInternal = XmlSchemaDatatype.FromName (baseTypeName);\r
- else {\r
- BaseSchemaTypeInternal = schema.SchemaTypes [baseTypeName];\r
- if (BaseSchemaTypeInternal == null)\r
- schema.MissingBaseSchemaTypeRefs.Add (this, baseTypeName);\r
+ XmlSchemaComplexContentRestriction sccr = (XmlSchemaComplexContentRestriction) cmodel.Content;\r
+ if (sccr != null) {\r
+ contentTypeParticle = sccr.Particle;\r
+ baseTypeName = sccr.BaseTypeName;\r
+ }\r
}\r
}\r
}\r
this.CompilationId = schema.CompilationId;\r
return errorCount;\r
}\r
- \r
- [MonoTODO]\r
- internal int Validate(ValidationEventHandler h)\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
+ 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
\r
+ private void ValidateImmediateParticle (ValidationEventHandler h, XmlSchema schema)\r
+ {\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
+\r
+ private void ValidateImmediateAttributes (ValidationEventHandler h, XmlSchema schema)\r
+ {\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
+\r
+ private void ValidateContentModel (ValidationEventHandler h, XmlSchema schema)\r
+ {\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
+\r
+ private void AddExtensionAttributes (XmlSchemaObjectCollection attributes,\r
+ XmlSchemaAnyAttribute anyAttribute, ValidationEventHandler h, XmlSchema schema)\r
+ {\r
+ }\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
+ 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
+\r
+ // 3.4.6 Type Derivation OK (Complex)\r
+ internal void ValidateTypeDerivationOK (object b, ValidationEventHandler h, XmlSchema schema)\r
+ {\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
}\r
else if(reader.Name == "block")\r
{\r
- ctype.block = XmlSchemaUtil.ReadDerivationAttribute(reader,out innerex, "block");\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, "block");\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
}\r
return ctype;\r
}\r
+#endregion\r
}\r
}\r