Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Metadata / ObjectLayer / ObjectItemLoadingSessionData.cs / 1305376 / ObjectItemLoadingSessionData.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System.Reflection;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Data.Metadata.Edm
{
internal sealed class ObjectItemLoadingSessionData
{
private Func _loaderFactory;
// all the types that we encountered while loading - this may contain types from various assemblies
private readonly Dictionary _typesInLoading;
//
private bool _conventionBasedRelationshipsAreLoaded = false;
private LoadMessageLogger _loadMessageLogger;
// list of errors encountered during loading
private readonly List _errors;
// keep the list of new assemblies that got loaded in this load assembly call. The reason why we need to keep a seperate
// list of assemblies is that we keep track of errors, and if there are no errors, only then do we add the list of assemblies
// to the global cache. Hence global cache is never polluted with invalid assemblies
private readonly Dictionary _listOfAssembliesLoaded = new Dictionary();
// List of known assemblies - this list is initially passed by the caller and we keep adding to it, as and when we load
// an assembly
private readonly KnownAssembliesSet _knownAssemblies;
private readonly LockedAssemblyCache _lockedAssemblyCache;
private readonly HashSet _loadersThatNeedLevel1PostSessionProcessing;
private readonly HashSet _loadersThatNeedLevel2PostSessionProcessing;
private readonly EdmItemCollection _edmItemCollection;
private Dictionary> _conventionCSpaceTypeNames;
private Dictionary _cspaceToOspace;
private object _originalLoaderCookie;
internal Dictionary TypesInLoading { get { return _typesInLoading; } }
internal Dictionary AssembliesLoaded { get { return _listOfAssembliesLoaded; } }
internal List EdmItemErrors { get { return _errors; } }
internal KnownAssembliesSet KnownAssemblies { get { return _knownAssemblies; } }
internal LockedAssemblyCache LockedAssemblyCache { get { return _lockedAssemblyCache; } }
internal EdmItemCollection EdmItemCollection { get { return _edmItemCollection; } }
internal Dictionary CspaceToOspace{ get { return _cspaceToOspace; } }
internal bool ConventionBasedRelationshipsAreLoaded
{
get { return _conventionBasedRelationshipsAreLoaded; }
set { _conventionBasedRelationshipsAreLoaded = value; }
}
internal LoadMessageLogger LoadMessageLogger
{
get
{
return this._loadMessageLogger;
}
}
// dictionary of types by name (not including namespace), we also track duplicate names
// so if one of those types is used we can log an error
internal Dictionary> ConventionCSpaceTypeNames
{
get
{
if (_edmItemCollection != null && _conventionCSpaceTypeNames == null)
{
_conventionCSpaceTypeNames = new Dictionary>();
// create the map and cache it
foreach (var structuralType in _edmItemCollection.GetItems().Where(item => item.BuiltInTypeKind != BuiltInTypeKind.AssociationType))
{
KeyValuePair pair;
if (_conventionCSpaceTypeNames.TryGetValue(structuralType.Name, out pair))
{
_conventionCSpaceTypeNames[structuralType.Name] = new KeyValuePair(pair.Key, pair.Value + 1);
}
else
{
pair = new KeyValuePair(structuralType, 1);
_conventionCSpaceTypeNames.Add(structuralType.Name, pair);
}
}
}
return _conventionCSpaceTypeNames;
}
}
internal Func ObjectItemAssemblyLoaderFactory
{
get { return _loaderFactory; }
set
{
if (_loaderFactory != value)
{
Debug.Assert(_loaderFactory == null || _typesInLoading.Count == 0, "Only reset the factory after types have not been loaded or load from the cache");
_loaderFactory = value;
}
}
}
internal object LoaderCookie
{
get
{
// be sure we get the same factory/cookie as we had before... if we had one
if (_originalLoaderCookie != null)
{
Debug.Assert(_loaderFactory == null ||
(object)_loaderFactory == _originalLoaderCookie, "The loader factory should determine the next loader, so we should always have the same loader factory");
return _originalLoaderCookie;
}
return _loaderFactory;
}
}
internal ObjectItemLoadingSessionData(KnownAssembliesSet knownAssemblies, LockedAssemblyCache lockedAssemblyCache, EdmItemCollection edmItemCollection, Action logLoadMessage, object loaderCookie)
{
Debug.Assert(loaderCookie == null || loaderCookie is Func, "This is a bad loader cookie");
_typesInLoading = new Dictionary(StringComparer.Ordinal);
_errors = new List();
_knownAssemblies = knownAssemblies;
_lockedAssemblyCache = lockedAssemblyCache;
_loadersThatNeedLevel1PostSessionProcessing = new HashSet();
_loadersThatNeedLevel2PostSessionProcessing = new HashSet();
_edmItemCollection = edmItemCollection;
_loadMessageLogger = new LoadMessageLogger(logLoadMessage);
_cspaceToOspace = new Dictionary();
_loaderFactory = (Func)loaderCookie;
_originalLoaderCookie = loaderCookie;
if (_loaderFactory == ObjectItemConventionAssemblyLoader.Create && _edmItemCollection != null)
{
foreach (KnownAssemblyEntry entry in _knownAssemblies.GetEntries(_loaderFactory, edmItemCollection))
{
foreach (StructuralType type in entry.CacheEntry.TypesInAssembly.OfType())
{
if (Helper.IsEntityType(type))
{
ClrEntityType entityType = (ClrEntityType)type;
_cspaceToOspace.Add(_edmItemCollection.GetItem(entityType.CSpaceTypeName), entityType);
}
else if (Helper.IsComplexType(type))
{
ClrComplexType complexType = (ClrComplexType)type;
_cspaceToOspace.Add(_edmItemCollection.GetItem(complexType.CSpaceTypeName), complexType);
}
else
{
Debug.Assert(Helper.IsAssociationType(type));
_cspaceToOspace.Add(_edmItemCollection.GetItem(type.FullName), type);
}
}
}
}
}
internal void RegisterForLevel1PostSessionProcessing(ObjectItemAssemblyLoader loader)
{
_loadersThatNeedLevel1PostSessionProcessing.Add(loader);
}
internal void RegisterForLevel2PostSessionProcessing(ObjectItemAssemblyLoader loader)
{
_loadersThatNeedLevel2PostSessionProcessing.Add(loader);
}
internal void CompleteSession()
{
foreach (ObjectItemAssemblyLoader loader in _loadersThatNeedLevel1PostSessionProcessing)
{
loader.OnLevel1SessionProcessing();
}
foreach (ObjectItemAssemblyLoader loader in _loadersThatNeedLevel2PostSessionProcessing)
{
loader.OnLevel2SessionProcessing();
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System.Reflection;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Data.Metadata.Edm
{
internal sealed class ObjectItemLoadingSessionData
{
private Func _loaderFactory;
// all the types that we encountered while loading - this may contain types from various assemblies
private readonly Dictionary _typesInLoading;
//
private bool _conventionBasedRelationshipsAreLoaded = false;
private LoadMessageLogger _loadMessageLogger;
// list of errors encountered during loading
private readonly List _errors;
// keep the list of new assemblies that got loaded in this load assembly call. The reason why we need to keep a seperate
// list of assemblies is that we keep track of errors, and if there are no errors, only then do we add the list of assemblies
// to the global cache. Hence global cache is never polluted with invalid assemblies
private readonly Dictionary _listOfAssembliesLoaded = new Dictionary();
// List of known assemblies - this list is initially passed by the caller and we keep adding to it, as and when we load
// an assembly
private readonly KnownAssembliesSet _knownAssemblies;
private readonly LockedAssemblyCache _lockedAssemblyCache;
private readonly HashSet _loadersThatNeedLevel1PostSessionProcessing;
private readonly HashSet _loadersThatNeedLevel2PostSessionProcessing;
private readonly EdmItemCollection _edmItemCollection;
private Dictionary> _conventionCSpaceTypeNames;
private Dictionary _cspaceToOspace;
private object _originalLoaderCookie;
internal Dictionary TypesInLoading { get { return _typesInLoading; } }
internal Dictionary AssembliesLoaded { get { return _listOfAssembliesLoaded; } }
internal List EdmItemErrors { get { return _errors; } }
internal KnownAssembliesSet KnownAssemblies { get { return _knownAssemblies; } }
internal LockedAssemblyCache LockedAssemblyCache { get { return _lockedAssemblyCache; } }
internal EdmItemCollection EdmItemCollection { get { return _edmItemCollection; } }
internal Dictionary CspaceToOspace{ get { return _cspaceToOspace; } }
internal bool ConventionBasedRelationshipsAreLoaded
{
get { return _conventionBasedRelationshipsAreLoaded; }
set { _conventionBasedRelationshipsAreLoaded = value; }
}
internal LoadMessageLogger LoadMessageLogger
{
get
{
return this._loadMessageLogger;
}
}
// dictionary of types by name (not including namespace), we also track duplicate names
// so if one of those types is used we can log an error
internal Dictionary> ConventionCSpaceTypeNames
{
get
{
if (_edmItemCollection != null && _conventionCSpaceTypeNames == null)
{
_conventionCSpaceTypeNames = new Dictionary>();
// create the map and cache it
foreach (var structuralType in _edmItemCollection.GetItems().Where(item => item.BuiltInTypeKind != BuiltInTypeKind.AssociationType))
{
KeyValuePair pair;
if (_conventionCSpaceTypeNames.TryGetValue(structuralType.Name, out pair))
{
_conventionCSpaceTypeNames[structuralType.Name] = new KeyValuePair(pair.Key, pair.Value + 1);
}
else
{
pair = new KeyValuePair(structuralType, 1);
_conventionCSpaceTypeNames.Add(structuralType.Name, pair);
}
}
}
return _conventionCSpaceTypeNames;
}
}
internal Func ObjectItemAssemblyLoaderFactory
{
get { return _loaderFactory; }
set
{
if (_loaderFactory != value)
{
Debug.Assert(_loaderFactory == null || _typesInLoading.Count == 0, "Only reset the factory after types have not been loaded or load from the cache");
_loaderFactory = value;
}
}
}
internal object LoaderCookie
{
get
{
// be sure we get the same factory/cookie as we had before... if we had one
if (_originalLoaderCookie != null)
{
Debug.Assert(_loaderFactory == null ||
(object)_loaderFactory == _originalLoaderCookie, "The loader factory should determine the next loader, so we should always have the same loader factory");
return _originalLoaderCookie;
}
return _loaderFactory;
}
}
internal ObjectItemLoadingSessionData(KnownAssembliesSet knownAssemblies, LockedAssemblyCache lockedAssemblyCache, EdmItemCollection edmItemCollection, Action logLoadMessage, object loaderCookie)
{
Debug.Assert(loaderCookie == null || loaderCookie is Func, "This is a bad loader cookie");
_typesInLoading = new Dictionary(StringComparer.Ordinal);
_errors = new List();
_knownAssemblies = knownAssemblies;
_lockedAssemblyCache = lockedAssemblyCache;
_loadersThatNeedLevel1PostSessionProcessing = new HashSet();
_loadersThatNeedLevel2PostSessionProcessing = new HashSet();
_edmItemCollection = edmItemCollection;
_loadMessageLogger = new LoadMessageLogger(logLoadMessage);
_cspaceToOspace = new Dictionary();
_loaderFactory = (Func)loaderCookie;
_originalLoaderCookie = loaderCookie;
if (_loaderFactory == ObjectItemConventionAssemblyLoader.Create && _edmItemCollection != null)
{
foreach (KnownAssemblyEntry entry in _knownAssemblies.GetEntries(_loaderFactory, edmItemCollection))
{
foreach (StructuralType type in entry.CacheEntry.TypesInAssembly.OfType())
{
if (Helper.IsEntityType(type))
{
ClrEntityType entityType = (ClrEntityType)type;
_cspaceToOspace.Add(_edmItemCollection.GetItem(entityType.CSpaceTypeName), entityType);
}
else if (Helper.IsComplexType(type))
{
ClrComplexType complexType = (ClrComplexType)type;
_cspaceToOspace.Add(_edmItemCollection.GetItem(complexType.CSpaceTypeName), complexType);
}
else
{
Debug.Assert(Helper.IsAssociationType(type));
_cspaceToOspace.Add(_edmItemCollection.GetItem(type.FullName), type);
}
}
}
}
}
internal void RegisterForLevel1PostSessionProcessing(ObjectItemAssemblyLoader loader)
{
_loadersThatNeedLevel1PostSessionProcessing.Add(loader);
}
internal void RegisterForLevel2PostSessionProcessing(ObjectItemAssemblyLoader loader)
{
_loadersThatNeedLevel2PostSessionProcessing.Add(loader);
}
internal void CompleteSession()
{
foreach (ObjectItemAssemblyLoader loader in _loadersThatNeedLevel1PostSessionProcessing)
{
loader.OnLevel1SessionProcessing();
}
foreach (ObjectItemAssemblyLoader loader in _loadersThatNeedLevel2PostSessionProcessing)
{
loader.OnLevel2SessionProcessing();
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DbDataSourceEnumerator.cs
- SchemaImporterExtensionElement.cs
- GenericAuthenticationEventArgs.cs
- ConnectionStringSettingsCollection.cs
- ToolStripPanel.cs
- DataGridClipboardCellContent.cs
- BackgroundFormatInfo.cs
- BidOverLoads.cs
- TextServicesPropertyRanges.cs
- OutArgument.cs
- SimpleTypeResolver.cs
- CacheAxisQuery.cs
- SoapElementAttribute.cs
- ThreadPool.cs
- BamlStream.cs
- IConvertible.cs
- PropertyValueChangedEvent.cs
- ResourceAssociationSetEnd.cs
- ManualResetEvent.cs
- ControlAdapter.cs
- XmlDownloadManager.cs
- HttpStaticObjectsCollectionBase.cs
- DefaultValueTypeConverter.cs
- FileUtil.cs
- X509Extension.cs
- XmlArrayItemAttribute.cs
- MouseWheelEventArgs.cs
- FormClosedEvent.cs
- MsmqInputChannelListener.cs
- Wildcard.cs
- HMACSHA512.cs
- ScriptComponentDescriptor.cs
- PeerCollaborationPermission.cs
- OdbcConnection.cs
- SettingsAttributeDictionary.cs
- SharedPersonalizationStateInfo.cs
- SmtpSection.cs
- ListenerConfig.cs
- AutomationPatternInfo.cs
- HtmlSelect.cs
- TargetFrameworkAttribute.cs
- Run.cs
- RectValueSerializer.cs
- TransportBindingElementImporter.cs
- PropertyInformation.cs
- CustomErrorCollection.cs
- COAUTHIDENTITY.cs
- CodeAssignStatement.cs
- OrthographicCamera.cs
- VersionedStreamOwner.cs
- EnvironmentPermission.cs
- PropertyItemInternal.cs
- PnrpPeerResolver.cs
- DataGridBoolColumn.cs
- COM2PropertyPageUITypeConverter.cs
- ResXFileRef.cs
- GPPOINTF.cs
- versioninfo.cs
- ColumnMap.cs
- NameValueSectionHandler.cs
- BigInt.cs
- KnownBoxes.cs
- CallbackValidator.cs
- GeneralTransformGroup.cs
- ColorConvertedBitmap.cs
- Brush.cs
- PropertyOrder.cs
- FloatMinMaxAggregationOperator.cs
- Attributes.cs
- AppDomain.cs
- Wildcard.cs
- entityreference_tresulttype.cs
- D3DImage.cs
- SystemSounds.cs
- Int32Converter.cs
- CurrencyWrapper.cs
- MailMessageEventArgs.cs
- MissingSatelliteAssemblyException.cs
- AliasGenerator.cs
- TypedTableBaseExtensions.cs
- XmlSchema.cs
- Region.cs
- PartManifestEntry.cs
- OleTxTransaction.cs
- DataSourceGroupCollection.cs
- SimpleType.cs
- EntityTransaction.cs
- RegexRunner.cs
- PointAnimationUsingKeyFrames.cs
- ListViewInsertionMark.cs
- SystemPens.cs
- WebPartConnectionsCloseVerb.cs
- GrammarBuilderDictation.cs
- DropDownHolder.cs
- CodeIdentifiers.cs
- LicenseProviderAttribute.cs
- InvalidDocumentContentsException.cs
- HttpCacheParams.cs
- ArcSegment.cs
- IntSecurity.cs