File: System\Xml\Schema\SchemaElementDecl.cs
Project: ndp\fx\src\Xml\System.Xml.csproj (System.Xml)
//------------------------------------------------------------------------------
// <copyright file="SchemaElementDecl.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright> 
// <owner current="true" primary="true">Microsoft</owner>                                                               
//------------------------------------------------------------------------------
 
namespace System.Xml.Schema {
 
    using System;
    using System.Collections;
    using System.Diagnostics;
    using System.Collections.Generic;
 
    internal sealed class SchemaElementDecl : SchemaDeclBase, IDtdAttributeListInfo {
        Dictionary<XmlQualifiedName, SchemaAttDef> attdefs = new Dictionary<XmlQualifiedName, SchemaAttDef>();
        List<IDtdDefaultAttributeInfo> defaultAttdefs;
        bool isIdDeclared;
        bool hasNonCDataAttribute = false;
 
#if !SILVERLIGHT
        bool isAbstract = false;
        bool isNillable = false;
        bool hasRequiredAttribute = false;
        bool isNotationDeclared;
        Dictionary<XmlQualifiedName, XmlQualifiedName> prohibitedAttributes = new Dictionary<XmlQualifiedName, XmlQualifiedName>(); 
        ContentValidator contentValidator;
        XmlSchemaAnyAttribute anyAttribute;
        XmlSchemaDerivationMethod block;
        CompiledIdentityConstraint[] constraints;
        XmlSchemaElement schemaElement;
 
        internal static readonly SchemaElementDecl Empty = new SchemaElementDecl();
#endif
 
        //
// Constructor
//
#if !SILVERLIGHT
        internal SchemaElementDecl() {
        }
        
        internal SchemaElementDecl(XmlSchemaDatatype dtype) {
            Datatype = dtype;
            contentValidator = ContentValidator.TextOnly;
        }
#endif
 
        internal SchemaElementDecl(XmlQualifiedName name, String prefix) 
        : base(name, prefix) {
        }
 
//
// Static methods
//
#if !SILVERLIGHT
        internal static SchemaElementDecl CreateAnyTypeElementDecl() {
            SchemaElementDecl anyTypeElementDecl = new SchemaElementDecl();
            anyTypeElementDecl.Datatype = DatatypeImplementation.AnySimpleType.Datatype;
            return anyTypeElementDecl;
        }
#endif
        
//
// IDtdAttributeListInfo interface
//
#region IDtdAttributeListInfo Members
 
        string IDtdAttributeListInfo.Prefix {
            get { return ((SchemaElementDecl)this).Prefix; }
        }
 
        string IDtdAttributeListInfo.LocalName {
            get { return ((SchemaElementDecl)this).Name.Name; }
        }
 
        bool IDtdAttributeListInfo.HasNonCDataAttributes {
            get { return hasNonCDataAttribute; }
        }
 
        IDtdAttributeInfo IDtdAttributeListInfo.LookupAttribute(string prefix, string localName) {
            XmlQualifiedName qname = new XmlQualifiedName(localName, prefix);
            SchemaAttDef attDef;
            if (attdefs.TryGetValue(qname, out attDef)) {
                return attDef;
            }
            return null;
        }
 
        IEnumerable<IDtdDefaultAttributeInfo> IDtdAttributeListInfo.LookupDefaultAttributes() {
            return defaultAttdefs;
        }
 
        IDtdAttributeInfo IDtdAttributeListInfo.LookupIdAttribute() {
            foreach (SchemaAttDef attDef in attdefs.Values) {
                if (attDef.TokenizedType == XmlTokenizedType.ID) {
                    return (IDtdAttributeInfo)attDef;
                }
            }
            return null;
        }
#endregion
 
//
// SchemaElementDecl properties
//
        internal bool IsIdDeclared {
            get { return isIdDeclared;}
            set { isIdDeclared = value;}
        }
 
        internal bool HasNonCDataAttribute {
            get { return hasNonCDataAttribute; }
            set { hasNonCDataAttribute = value; }
        }
 
#if !SILVERLIGHT
        internal SchemaElementDecl Clone() {
            return (SchemaElementDecl) MemberwiseClone();
        }
 
        internal bool IsAbstract {
            get { return isAbstract;}
            set { isAbstract = value;}
        }
 
        internal bool IsNillable {
            get { return isNillable;}
            set { isNillable = value;}
        }
 
        internal XmlSchemaDerivationMethod Block {
             get { return block; }
             set { block = value; }
        }
 
        internal bool IsNotationDeclared {
            get { return isNotationDeclared; }
            set { isNotationDeclared = value; }
        }
 
        internal bool HasDefaultAttribute {
            get { return defaultAttdefs != null; }
        }
 
        internal bool HasRequiredAttribute {
            get { return hasRequiredAttribute; }
            set { hasRequiredAttribute = value; }
        }
 
        internal ContentValidator ContentValidator {
            get { return contentValidator;}
            set { contentValidator = value;}
        }
 
        internal XmlSchemaAnyAttribute AnyAttribute {
            get { return anyAttribute; }
            set { anyAttribute = value; }
        }
 
        internal CompiledIdentityConstraint[] Constraints {
            get { return constraints; }
            set { constraints = value; }
        }
        
        internal XmlSchemaElement SchemaElement {
            get { return schemaElement;}
            set { schemaElement = value;}
        }
#endif
        // add a new SchemaAttDef to the SchemaElementDecl
        internal void AddAttDef(SchemaAttDef attdef) {
            attdefs.Add(attdef.Name, attdef);
#if !SILVERLIGHT
            if (attdef.Presence == SchemaDeclBase.Use.Required || attdef.Presence == SchemaDeclBase.Use.RequiredFixed) {
                hasRequiredAttribute = true;
            }
#endif
            if (attdef.Presence == SchemaDeclBase.Use.Default || attdef.Presence == SchemaDeclBase.Use.Fixed) { //Not adding RequiredFixed here
                if (defaultAttdefs == null) {
                    defaultAttdefs = new List<IDtdDefaultAttributeInfo>();
                }
                defaultAttdefs.Add(attdef);
            }
        }
        
        /*
         * Retrieves the attribute definition of the named attribute.
         * @param name  The name of the attribute.
         * @return  an attribute definition object; returns null if it is not found.
         */
        internal SchemaAttDef GetAttDef(XmlQualifiedName qname) {
            SchemaAttDef attDef;
            if (attdefs.TryGetValue(qname, out attDef)) {
                return attDef;
            }
            return null;
        }
 
        internal IList<IDtdDefaultAttributeInfo> DefaultAttDefs {
            get { return defaultAttdefs; }
        }
 
#if !SILVERLIGHT
        internal Dictionary<XmlQualifiedName, SchemaAttDef> AttDefs {
            get { return attdefs; }
        }
 
        internal Dictionary<XmlQualifiedName, XmlQualifiedName> ProhibitedAttributes {
            get { return prohibitedAttributes; }
        }
 
        internal void CheckAttributes(Hashtable presence, bool standalone) {
            foreach(SchemaAttDef attdef in attdefs.Values) {
                if (presence[attdef.Name] == null) {
                    if (attdef.Presence == SchemaDeclBase.Use.Required) {
                        throw new XmlSchemaException(Res.Sch_MissRequiredAttribute, attdef.Name.ToString());
                    }
                    else if (standalone && attdef.IsDeclaredInExternal && (attdef.Presence == SchemaDeclBase.Use.Default || attdef.Presence == SchemaDeclBase.Use.Fixed)) {
                        throw new XmlSchemaException(Res.Sch_StandAlone, string.Empty);
                    }
                }
            }
        }
#endif
    }
}