Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / EntityModel / SchemaObjectModel / StructuredType.cs / 2 / StructuredType.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Xml; using System.Data; using System.Data.Metadata.Edm; using System.Diagnostics; using System.Data.Entity; namespace System.Data.EntityModel.SchemaObjectModel { ////// Summary description for StructuredType. /// internal abstract class StructuredType : SchemaType { #region Instance Fields private bool? _baseTypeResolveResult; private string _unresolvedBaseType = null; private StructuredType _baseType = null; private bool _isAbstract = false; private SchemaElementLookUpTable_namedMembers = null; private ISchemaElementLookUpTable _properties = null; #endregion #region Static Fields private static readonly char[] NameSeparators = new char[] { '.' }; #endregion #region Public Properties /// /// /// public StructuredType BaseType { get { return _baseType; } private set { _baseType = value; } } ////// /// /// public ISchemaElementLookUpTableProperties { get { if (_properties == null) { _properties = new FilteredSchemaElementLookUpTable (NamedMembers); } return _properties; } } /// /// /// /// protected SchemaElementLookUpTableNamedMembers { get { if (_namedMembers == null) { _namedMembers = new SchemaElementLookUpTable (); } return _namedMembers; } } /// /// /// public virtual bool IsTypeHierarchyRoot { get { Debug.Assert((BaseType == null && _unresolvedBaseType == null) || (BaseType != null && _unresolvedBaseType != null), "you are checking for the hierarchy root before the basetype has been set"); // any type without a base is a base type return BaseType == null; } } ////// /// public bool IsAbstract { get { return _isAbstract; } } #endregion #region More Public Methods ////// Find a property by name in the type hierarchy /// /// simple property name ///the StructuredProperty object if name exists, null otherwise public StructuredProperty FindProperty(string name) { StructuredProperty property = Properties.LookUpEquivalentKey(name); if (property != null) return property; if (IsTypeHierarchyRoot) return null; return BaseType.FindProperty(name); } ////// Determines whether this type is of the same type as baseType, /// or is derived from baseType. /// /// ///true if this type is of the baseType, false otherwise public bool IsOfType(StructuredType baseType) { StructuredType type = this; while (type != null && type != baseType) { type = type.BaseType; } return (type == baseType); } #endregion #region Protected Methods ////// /// internal override void ResolveTopLevelNames() { base.ResolveTopLevelNames(); TryResolveBaseType(); foreach (SchemaElement member in NamedMembers) member.ResolveTopLevelNames(); } ////// /// ///internal override void Validate() { base.Validate(); foreach (SchemaElement member in NamedMembers) { if (BaseType != null) { StructuredType definingType; SchemaElement definingMember; string errorMessage = null; switch (BaseType.DefinesMemberName(member.Name, out definingType, out definingMember)) { case HowDefined.AsMember: errorMessage = System.Data.Entity.Strings.DuplicateMemberName(member.Name, FQName, definingType.FQName); break; case HowDefined.AsMemberWithDifferentCase: errorMessage = System.Data.Entity.Strings.EquivalentMemberName(member.Name, FQName, definingType.FQName, definingMember.Name); break; } if (errorMessage != null) member.AddError(ErrorCode.AlreadyDefined, EdmSchemaErrorSeverity.Error, errorMessage); } member.Validate(); } } /// /// /// /// protected StructuredType(Schema parentElement) : base(parentElement) { } ////// Add a member to the type /// /// the member being added protected void AddMember(SchemaElement newMember) { Debug.Assert(newMember != null, "newMember parameter is null"); if (string.IsNullOrEmpty(newMember.Name)) { // this is an error condition that has already been reported. return; } if (this.Schema.DataModel != SchemaDataModelOption.ProviderDataModel && Utils.CompareNames(newMember.Name, Name) == 0) { newMember.AddError(ErrorCode.BadProperty, EdmSchemaErrorSeverity.Error, System.Data.Entity.Strings.InvalidMemberNameMatchesTypeName(newMember.Name, FQName)); } NamedMembers.Add(newMember, true, Strings.PropertyNameAlreadyDefinedDuplicate); } ////// See if a name is a member in a type or any of its base types /// /// name to look for /// if defined, the type that defines it /// if defined, the member that defines it ///how name was defined private HowDefined DefinesMemberName(string name, out StructuredType definingType, out SchemaElement definingMember) { if (NamedMembers.ContainsKey(name)) { definingType = this; definingMember = NamedMembers[name]; return HowDefined.AsMember; } definingMember = NamedMembers.LookUpEquivalentKey(name); if (definingMember != null) { definingType = this; return HowDefined.AsMemberWithDifferentCase; } if (IsTypeHierarchyRoot) { definingType = null; definingMember = null; return HowDefined.NotDefined; } return BaseType.DefinesMemberName(name, out definingType, out definingMember); } #endregion #region Protected Properties ////// /// protected string UnresolvedBaseType { get { return _unresolvedBaseType; } set { _unresolvedBaseType = value; } } protected override bool HandleElement(XmlReader reader) { if (base.HandleElement(reader)) { return true; } else if (CanHandleElement(reader, XmlConstants.Property)) { HandlePropertyElement(reader); return true; } return false; } protected override bool HandleAttribute(XmlReader reader) { if (base.HandleAttribute(reader)) { return true; } else if (CanHandleAttribute(reader, XmlConstants.BaseType)) { HandleBaseTypeAttribute(reader); return true; } else if (CanHandleAttribute(reader, XmlConstants.Abstract)) { HandleAbstractAttribute(reader); return true; } return false; } #endregion #region Private Methods ////// /// private bool TryResolveBaseType() { if (_baseTypeResolveResult.HasValue) { return _baseTypeResolveResult.Value; } if (BaseType != null) { _baseTypeResolveResult = true; return _baseTypeResolveResult.Value; } if (UnresolvedBaseType == null) { _baseTypeResolveResult = true; return _baseTypeResolveResult.Value; } SchemaType element; if (!Schema.ResolveTypeName(this, UnresolvedBaseType, out element)) { _baseTypeResolveResult = false; return _baseTypeResolveResult.Value; } BaseType = element as StructuredType; if (BaseType == null) { AddError(ErrorCode.InvalidBaseType, EdmSchemaErrorSeverity.Error, System.Data.Entity.Strings.InvalidBaseTypeForStructuredType(UnresolvedBaseType, FQName)); _baseTypeResolveResult = false; return _baseTypeResolveResult.Value; } // verify that creating this link to the base type will not introduce a cycle; // if so, break the link and add an error if (CheckForInheritanceCycle()) { BaseType = null; AddError(ErrorCode.CycleInTypeHierarchy, EdmSchemaErrorSeverity.Error, System.Data.Entity.Strings.CycleInTypeHierarchy(FQName)); _baseTypeResolveResult = false; return _baseTypeResolveResult.Value; } _baseTypeResolveResult = true; return true; } ////// /// /// private void HandleBaseTypeAttribute(XmlReader reader) { if (UnresolvedBaseType != null) { AddAlreadyDefinedError(reader); return; } string baseType; if (!Utils.GetDottedName(this.Schema, reader, out baseType)) return; UnresolvedBaseType = baseType; } ////// /// /// private void HandleAbstractAttribute(XmlReader reader) { HandleBoolAttribute(reader, ref _isAbstract); } ////// /// /// private void HandlePropertyElement(XmlReader reader) { StructuredProperty property = new StructuredProperty(this); property.Parse(reader); AddMember(property); } ////// Determine if a cycle exists in the type hierarchy: use two pointers to /// walk the chain, if one catches up with the other, we have a cycle. /// ///true if a cycle exists in the type hierarchy, false otherwise private bool CheckForInheritanceCycle() { StructuredType baseType = BaseType; Debug.Assert(baseType != null); StructuredType ref1 = baseType; StructuredType ref2 = baseType; do { ref2 = ref2.BaseType; if (Object.ReferenceEquals(ref1, ref2)) return true; if (ref1 == null) return false; ref1 = ref1.BaseType; if (ref2 != null) ref2 = ref2.BaseType; } while (ref2 != null); return false; } #endregion #region Private Properties #endregion private enum HowDefined { NotDefined, AsMember, AsMemberWithDifferentCase, } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Xml; using System.Data; using System.Data.Metadata.Edm; using System.Diagnostics; using System.Data.Entity; namespace System.Data.EntityModel.SchemaObjectModel { ////// Summary description for StructuredType. /// internal abstract class StructuredType : SchemaType { #region Instance Fields private bool? _baseTypeResolveResult; private string _unresolvedBaseType = null; private StructuredType _baseType = null; private bool _isAbstract = false; private SchemaElementLookUpTable_namedMembers = null; private ISchemaElementLookUpTable _properties = null; #endregion #region Static Fields private static readonly char[] NameSeparators = new char[] { '.' }; #endregion #region Public Properties /// /// /// public StructuredType BaseType { get { return _baseType; } private set { _baseType = value; } } ////// /// /// public ISchemaElementLookUpTableProperties { get { if (_properties == null) { _properties = new FilteredSchemaElementLookUpTable (NamedMembers); } return _properties; } } /// /// /// /// protected SchemaElementLookUpTableNamedMembers { get { if (_namedMembers == null) { _namedMembers = new SchemaElementLookUpTable (); } return _namedMembers; } } /// /// /// public virtual bool IsTypeHierarchyRoot { get { Debug.Assert((BaseType == null && _unresolvedBaseType == null) || (BaseType != null && _unresolvedBaseType != null), "you are checking for the hierarchy root before the basetype has been set"); // any type without a base is a base type return BaseType == null; } } ////// /// public bool IsAbstract { get { return _isAbstract; } } #endregion #region More Public Methods ////// Find a property by name in the type hierarchy /// /// simple property name ///the StructuredProperty object if name exists, null otherwise public StructuredProperty FindProperty(string name) { StructuredProperty property = Properties.LookUpEquivalentKey(name); if (property != null) return property; if (IsTypeHierarchyRoot) return null; return BaseType.FindProperty(name); } ////// Determines whether this type is of the same type as baseType, /// or is derived from baseType. /// /// ///true if this type is of the baseType, false otherwise public bool IsOfType(StructuredType baseType) { StructuredType type = this; while (type != null && type != baseType) { type = type.BaseType; } return (type == baseType); } #endregion #region Protected Methods ////// /// internal override void ResolveTopLevelNames() { base.ResolveTopLevelNames(); TryResolveBaseType(); foreach (SchemaElement member in NamedMembers) member.ResolveTopLevelNames(); } ////// /// ///internal override void Validate() { base.Validate(); foreach (SchemaElement member in NamedMembers) { if (BaseType != null) { StructuredType definingType; SchemaElement definingMember; string errorMessage = null; switch (BaseType.DefinesMemberName(member.Name, out definingType, out definingMember)) { case HowDefined.AsMember: errorMessage = System.Data.Entity.Strings.DuplicateMemberName(member.Name, FQName, definingType.FQName); break; case HowDefined.AsMemberWithDifferentCase: errorMessage = System.Data.Entity.Strings.EquivalentMemberName(member.Name, FQName, definingType.FQName, definingMember.Name); break; } if (errorMessage != null) member.AddError(ErrorCode.AlreadyDefined, EdmSchemaErrorSeverity.Error, errorMessage); } member.Validate(); } } /// /// /// /// protected StructuredType(Schema parentElement) : base(parentElement) { } ////// Add a member to the type /// /// the member being added protected void AddMember(SchemaElement newMember) { Debug.Assert(newMember != null, "newMember parameter is null"); if (string.IsNullOrEmpty(newMember.Name)) { // this is an error condition that has already been reported. return; } if (this.Schema.DataModel != SchemaDataModelOption.ProviderDataModel && Utils.CompareNames(newMember.Name, Name) == 0) { newMember.AddError(ErrorCode.BadProperty, EdmSchemaErrorSeverity.Error, System.Data.Entity.Strings.InvalidMemberNameMatchesTypeName(newMember.Name, FQName)); } NamedMembers.Add(newMember, true, Strings.PropertyNameAlreadyDefinedDuplicate); } ////// See if a name is a member in a type or any of its base types /// /// name to look for /// if defined, the type that defines it /// if defined, the member that defines it ///how name was defined private HowDefined DefinesMemberName(string name, out StructuredType definingType, out SchemaElement definingMember) { if (NamedMembers.ContainsKey(name)) { definingType = this; definingMember = NamedMembers[name]; return HowDefined.AsMember; } definingMember = NamedMembers.LookUpEquivalentKey(name); if (definingMember != null) { definingType = this; return HowDefined.AsMemberWithDifferentCase; } if (IsTypeHierarchyRoot) { definingType = null; definingMember = null; return HowDefined.NotDefined; } return BaseType.DefinesMemberName(name, out definingType, out definingMember); } #endregion #region Protected Properties ////// /// protected string UnresolvedBaseType { get { return _unresolvedBaseType; } set { _unresolvedBaseType = value; } } protected override bool HandleElement(XmlReader reader) { if (base.HandleElement(reader)) { return true; } else if (CanHandleElement(reader, XmlConstants.Property)) { HandlePropertyElement(reader); return true; } return false; } protected override bool HandleAttribute(XmlReader reader) { if (base.HandleAttribute(reader)) { return true; } else if (CanHandleAttribute(reader, XmlConstants.BaseType)) { HandleBaseTypeAttribute(reader); return true; } else if (CanHandleAttribute(reader, XmlConstants.Abstract)) { HandleAbstractAttribute(reader); return true; } return false; } #endregion #region Private Methods ////// /// private bool TryResolveBaseType() { if (_baseTypeResolveResult.HasValue) { return _baseTypeResolveResult.Value; } if (BaseType != null) { _baseTypeResolveResult = true; return _baseTypeResolveResult.Value; } if (UnresolvedBaseType == null) { _baseTypeResolveResult = true; return _baseTypeResolveResult.Value; } SchemaType element; if (!Schema.ResolveTypeName(this, UnresolvedBaseType, out element)) { _baseTypeResolveResult = false; return _baseTypeResolveResult.Value; } BaseType = element as StructuredType; if (BaseType == null) { AddError(ErrorCode.InvalidBaseType, EdmSchemaErrorSeverity.Error, System.Data.Entity.Strings.InvalidBaseTypeForStructuredType(UnresolvedBaseType, FQName)); _baseTypeResolveResult = false; return _baseTypeResolveResult.Value; } // verify that creating this link to the base type will not introduce a cycle; // if so, break the link and add an error if (CheckForInheritanceCycle()) { BaseType = null; AddError(ErrorCode.CycleInTypeHierarchy, EdmSchemaErrorSeverity.Error, System.Data.Entity.Strings.CycleInTypeHierarchy(FQName)); _baseTypeResolveResult = false; return _baseTypeResolveResult.Value; } _baseTypeResolveResult = true; return true; } ////// /// /// private void HandleBaseTypeAttribute(XmlReader reader) { if (UnresolvedBaseType != null) { AddAlreadyDefinedError(reader); return; } string baseType; if (!Utils.GetDottedName(this.Schema, reader, out baseType)) return; UnresolvedBaseType = baseType; } ////// /// /// private void HandleAbstractAttribute(XmlReader reader) { HandleBoolAttribute(reader, ref _isAbstract); } ////// /// /// private void HandlePropertyElement(XmlReader reader) { StructuredProperty property = new StructuredProperty(this); property.Parse(reader); AddMember(property); } ////// Determine if a cycle exists in the type hierarchy: use two pointers to /// walk the chain, if one catches up with the other, we have a cycle. /// ///true if a cycle exists in the type hierarchy, false otherwise private bool CheckForInheritanceCycle() { StructuredType baseType = BaseType; Debug.Assert(baseType != null); StructuredType ref1 = baseType; StructuredType ref2 = baseType; do { ref2 = ref2.BaseType; if (Object.ReferenceEquals(ref1, ref2)) return true; if (ref1 == null) return false; ref1 = ref1.BaseType; if (ref2 != null) ref2 = ref2.BaseType; } while (ref2 != null); return false; } #endregion #region Private Properties #endregion private enum HowDefined { NotDefined, AsMember, AsMemberWithDifferentCase, } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
![Network programming in C#, Network Programming in VB.NET, Network Programming in .NET](/images/book.jpg)
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Funcletizer.cs
- Int32Collection.cs
- ServerIdentity.cs
- SpeakCompletedEventArgs.cs
- HttpCookieCollection.cs
- PropertyIdentifier.cs
- EventItfInfo.cs
- DesignerMetadata.cs
- XmlNodeChangedEventArgs.cs
- RightsManagementInformation.cs
- SqlBuilder.cs
- Rule.cs
- Win32Exception.cs
- CatalogZone.cs
- HttpHandlerAction.cs
- DesignerActionMethodItem.cs
- DayRenderEvent.cs
- StrokeFIndices.cs
- BinaryWriter.cs
- PostBackOptions.cs
- CollaborationHelperFunctions.cs
- MarkupCompilePass2.cs
- UpdateDelegates.Generated.cs
- PositiveTimeSpanValidator.cs
- WebPermission.cs
- BufferedGraphicsManager.cs
- StorageEntityContainerMapping.cs
- ScriptControlDescriptor.cs
- DeclarationUpdate.cs
- PTConverter.cs
- SqlUserDefinedTypeAttribute.cs
- ScriptRef.cs
- ChildTable.cs
- DeviceContext2.cs
- ExtensionQuery.cs
- SecurityUtils.cs
- FileInfo.cs
- SupportsEventValidationAttribute.cs
- XmlSchemaSimpleTypeRestriction.cs
- DragEventArgs.cs
- UnsafeNativeMethodsPenimc.cs
- BlurEffect.cs
- FigureParaClient.cs
- SourceLineInfo.cs
- TemplateEditingService.cs
- HttpWebRequestElement.cs
- ResourceReferenceExpressionConverter.cs
- OSFeature.cs
- BindValidationContext.cs
- XamlPathDataSerializer.cs
- AsyncContentLoadedEventArgs.cs
- FixedPosition.cs
- PropertyIDSet.cs
- GlobalProxySelection.cs
- HeaderedContentControl.cs
- RawTextInputReport.cs
- CodeSnippetStatement.cs
- Int64Converter.cs
- WebControlAdapter.cs
- TreeViewItemAutomationPeer.cs
- LoginCancelEventArgs.cs
- XmlSchemaComplexContentExtension.cs
- SmiEventSink_Default.cs
- PropertySegmentSerializer.cs
- CryptoKeySecurity.cs
- MetabaseSettings.cs
- ReadOnlyCollectionBase.cs
- Helper.cs
- CacheAxisQuery.cs
- XmlIlTypeHelper.cs
- ColorContext.cs
- WebRequest.cs
- BitmapDecoder.cs
- OdbcHandle.cs
- ReflectPropertyDescriptor.cs
- DependencyObjectProvider.cs
- ellipse.cs
- RSAPKCS1SignatureFormatter.cs
- mediaeventargs.cs
- DefaultAuthorizationContext.cs
- RoleServiceManager.cs
- DataControlFieldCell.cs
- FormViewInsertedEventArgs.cs
- CodeVariableDeclarationStatement.cs
- SerializationObjectManager.cs
- XmlAtomicValue.cs
- StructuredProperty.cs
- ColumnMapCopier.cs
- InfoCardArgumentException.cs
- AutomationElement.cs
- DataControlLinkButton.cs
- Resources.Designer.cs
- TextParagraphCache.cs
- SafeRightsManagementEnvironmentHandle.cs
- TextBox.cs
- BinHexEncoder.cs
- TextTabProperties.cs
- CodeConditionStatement.cs
- Msec.cs
- ReflectPropertyDescriptor.cs