EpmSourceTree.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Server / System / Data / Services / Epm / EpmSourceTree.cs / 1305376 / EpmSourceTree.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//  
// Tree for managing SourceNames on EntityPropertyMappingAttributes
// for a ResourceType. 
//  
//
// @owner  [....] 
//---------------------------------------------------------------------

namespace System.Data.Services.Common
{ 
    using System.Collections.Generic;
    using System.Diagnostics; 
    using System.Linq; 
#if ASTORIA_CLIENT
    using System.Data.Services.Client; 
#else
    using System.Data.Services;
#endif
 
    /// 
    /// Tree representing the sourceName properties in all the EntityPropertyMappingAttributes for a resource type 
    ///  
    internal sealed class EpmSourceTree
    { 
        #region Fields

        /// Root of the tree
        private readonly EpmSourcePathSegment root; 

        ///  corresponding to this tree 
        private readonly EpmTargetTree epmTargetTree; 

        #endregion 

        /// Default constructor creates a null root
        /// Target xml tree
        internal EpmSourceTree(EpmTargetTree epmTargetTree) 
        {
            this.root = new EpmSourcePathSegment(""); 
            this.epmTargetTree = epmTargetTree; 
        }
 
        #region Properties

        /// 
        /// Root of the tree 
        /// 
        internal EpmSourcePathSegment Root 
        { 
            get
            { 
                return this.root;
            }
        }
 
        #endregion
 
        ///  
        /// Adds a path to the source and target tree which is obtained by looking at the EntityPropertyMappingAttribute in the 
        ///  
        /// EnitityPropertyMappingInfo holding the source path
        internal void Add(EntityPropertyMappingInfo epmInfo)
        {
            String sourceName = epmInfo.Attribute.SourcePath; 
            EpmSourcePathSegment currentProperty = this.Root;
            IList activeSubProperties = currentProperty.SubProperties; 
            EpmSourcePathSegment foundProperty = null; 

            Debug.Assert(!String.IsNullOrEmpty(sourceName), "Must have been validated during EntityPropertyMappingAttribute construction"); 
            foreach (String propertyName in sourceName.Split('/'))
            {
                if (propertyName.Length == 0)
                { 
                    throw new InvalidOperationException(Strings.EpmSourceTree_InvalidSourcePath(epmInfo.DefiningType.Name, sourceName));
                } 
 
                foundProperty = activeSubProperties.SingleOrDefault(e => e.PropertyName == propertyName);
                if (foundProperty != null) 
                {
                    currentProperty = foundProperty;
                }
                else 
                {
                    currentProperty = new EpmSourcePathSegment(propertyName); 
                    activeSubProperties.Add(currentProperty); 
                }
 
                activeSubProperties = currentProperty.SubProperties;
            }

            // Two EpmAttributes with same PropertyName in the same ResourceType, this could be a result of inheritance 
            if (foundProperty != null)
            { 
                Debug.Assert(Object.ReferenceEquals(foundProperty, currentProperty), "currentProperty variable should have been updated already to foundProperty"); 

                // Check for duplicates on the same entity type 
#if !ASTORIA_CLIENT
                Debug.Assert(foundProperty.SubProperties.Count == 0, "If non-leaf, it means we allowed complex type to be a leaf node");
                if (foundProperty.EpmInfo.DefiningType == epmInfo.DefiningType)
                { 
                    throw new InvalidOperationException(Strings.EpmSourceTree_DuplicateEpmAttrsWithSameSourceName(epmInfo.Attribute.SourcePath, epmInfo.DefiningType.Name));
                } 
#else 
                if (foundProperty.EpmInfo.DefiningType.Name == epmInfo.DefiningType.Name)
                { 
                    throw new InvalidOperationException(Strings.EpmSourceTree_DuplicateEpmAttrsWithSameSourceName(epmInfo.Attribute.SourcePath, epmInfo.DefiningType.Name));
                }
#endif
 
                // In case of inheritance, we need to remove the node from target tree which was mapped to base type property
                this.epmTargetTree.Remove(foundProperty.EpmInfo); 
            } 

            currentProperty.EpmInfo = epmInfo; 
            this.epmTargetTree.Add(epmInfo);
        }
    }
} 

// 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
This book is available now!
Buy at Amazon US or
Buy at Amazon UK