private EdmMember LoadScalarProperty( Type clrType, PropertyInfo property, out bool isEntityKeyProperty) { EdmMember edmMember = (EdmMember)null; isEntityKeyProperty = false; PrimitiveType primitiveType; if (!ObjectItemAssemblyLoader.TryGetPrimitiveType(property.PropertyType, out primitiveType)) { this.SessionData.EdmItemErrors.Add(new EdmItemError(Strings.Validator_OSpace_ScalarPropertyNotPrimitive((object)property.Name, (object)property.DeclaringType.FullName, (object)property.PropertyType.FullName))); } else { IEnumerable <EdmScalarPropertyAttribute> customAttributes = property.GetCustomAttributes <EdmScalarPropertyAttribute>(false); isEntityKeyProperty = customAttributes.First <EdmScalarPropertyAttribute>().EntityKeyProperty; bool isNullable = customAttributes.First <EdmScalarPropertyAttribute>().IsNullable; edmMember = (EdmMember) new EdmProperty(property.Name, TypeUsage.Create((EdmType)primitiveType, new FacetValues() { Nullable = (FacetValueContainer <bool?>) new bool?(isNullable) }), property, clrType); } return(edmMember); }
internal static void LoadAssembly( Assembly assembly, bool loadReferencedAssemblies, KnownAssembliesSet knownAssemblies, EdmItemCollection edmItemCollection, Action <String> logLoadMessage, ref object loaderCookie, out Dictionary <string, EdmType> typesInLoading, out List <EdmItemError> errors) { Debug.Assert( loaderCookie == null || loaderCookie is Func <Assembly, ObjectItemLoadingSessionData, ObjectItemAssemblyLoader>, "This is a bad loader cookie"); typesInLoading = null; errors = null; using (var lockedAssemblyCache = AquireLockedAssemblyCache()) { var loadingData = new ObjectItemLoadingSessionData( knownAssemblies, lockedAssemblyCache, edmItemCollection, logLoadMessage, loaderCookie); LoadAssembly(assembly, loadReferencedAssemblies, loadingData); loaderCookie = loadingData.LoaderCookie; // resolve references to top level types (base types, navigation properties returns and associations, and complex type properties) loadingData.CompleteSession(); if (loadingData.EdmItemErrors.Count == 0) { // do the validation for the all the new types // Now, perform validation on all the new types var validator = new EdmValidator(); validator.SkipReadOnlyItems = true; validator.Validate(loadingData.TypesInLoading.Values, loadingData.EdmItemErrors); // Update the global cache if there are no errors if (loadingData.EdmItemErrors.Count == 0) { if (ObjectItemAssemblyLoader.IsAttributeLoader(loadingData.ObjectItemAssemblyLoaderFactory)) { // we only cache items from the attribute loader globally, the // items loaded by convention will change depending on the cspace // provided. cspace will have a cache of it's own for assemblies UpdateCache(lockedAssemblyCache, loadingData.AssembliesLoaded); } else if (loadingData.EdmItemCollection != null && ObjectItemAssemblyLoader.IsConventionLoader(loadingData.ObjectItemAssemblyLoaderFactory)) { UpdateCache(loadingData.EdmItemCollection, loadingData.AssembliesLoaded); } } } if (loadingData.TypesInLoading.Count > 0) { foreach (var edmType in loadingData.TypesInLoading.Values) { edmType.SetReadOnly(); } } // Update the out parameters once you are done with loading typesInLoading = loadingData.TypesInLoading; errors = loadingData.EdmItemErrors; } }
private static void LoadAssembly( Assembly assembly, bool loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData) { KnownAssemblyEntry entry; bool flag; if (loadingData.KnownAssemblies.TryGetKnownAssembly(assembly, (object)loadingData.ObjectItemAssemblyLoaderFactory, loadingData.EdmItemCollection, out entry)) { flag = !entry.ReferencedAssembliesAreLoaded && loadReferencedAssemblies; } else { ObjectItemAssemblyLoader.CreateLoader(assembly, loadingData).Load(); flag = loadReferencedAssemblies; } if (!flag) { return; } if (entry == null && loadingData.KnownAssemblies.TryGetKnownAssembly(assembly, (object)loadingData.ObjectItemAssemblyLoaderFactory, loadingData.EdmItemCollection, out entry) || entry != null) { entry.ReferencedAssembliesAreLoaded = true; } foreach (Assembly referencedAssembly in MetadataAssemblyHelper.GetNonSystemReferencedAssemblies(assembly)) { AssemblyCache.LoadAssembly(referencedAssembly, loadReferencedAssemblies, loadingData); } }
public bool HaveSeenInCompatibleContext(object loaderCookie, EdmItemCollection itemCollection) { // a new "context" is only when we have not seen this assembly with an itemCollection that is non-null // and we now have a non-null itemCollection, and we are not already in AttributeLoader mode. return(SeenWithEdmItemCollection || itemCollection == null || ObjectItemAssemblyLoader.IsAttributeLoader(loaderCookie)); }
protected static void LoadAssemblies( IEnumerable <Assembly> assemblies, ObjectItemLoadingSessionData sessionData) { foreach (Assembly assembly in assemblies) { ObjectItemAssemblyLoader.CreateLoader(assembly, sessionData).Load(); } }
private static void LoadAssembly(Assembly assembly, bool loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData) { // Check if the assembly is already loaded KnownAssemblyEntry entry; var shouldLoadReferences = false; if (loadingData.KnownAssemblies.TryGetKnownAssembly( assembly, loadingData.ObjectItemAssemblyLoaderFactory, loadingData.EdmItemCollection, out entry)) { shouldLoadReferences = !entry.ReferencedAssembliesAreLoaded && loadReferencedAssemblies; } else { var loader = ObjectItemAssemblyLoader.CreateLoader(assembly, loadingData); loader.Load(); shouldLoadReferences = loadReferencedAssemblies; } if (shouldLoadReferences) { if (entry == null && loadingData.KnownAssemblies.TryGetKnownAssembly( assembly, loadingData.ObjectItemAssemblyLoaderFactory, loadingData.EdmItemCollection, out entry) || entry != null) { entry.ReferencedAssembliesAreLoaded = true; } Debug.Assert(entry != null, "we should always have an entry, why don't we?"); // We will traverse through all the statically linked assemblies and their dependencies. // Only assemblies with the EdmSchemaAttribute will be loaded and rest will be ignored // Even if the schema attribute is missing, we should still check all the dependent assemblies // any of the dependent assemblies can have the schema attribute // After the given assembly has been loaded, check on the flag in _knownAssemblies to see if it has already // been recursively loaded. The flag can be true if it was already loaded before this function was called foreach (var referencedAssembly in MetadataAssemblyHelper.GetNonSystemReferencedAssemblies(assembly)) { // filter out "known" assemblies to prevent unnecessary loading // recursive call LoadAssembly(referencedAssembly, loadReferencedAssemblies, loadingData); } } }
internal static void LoadAssembly( Assembly assembly, bool loadReferencedAssemblies, KnownAssembliesSet knownAssemblies, EdmItemCollection edmItemCollection, Action <string> logLoadMessage, ref object loaderCookie, out Dictionary <string, EdmType> typesInLoading, out List <EdmItemError> errors) { typesInLoading = (Dictionary <string, EdmType>)null; errors = (List <EdmItemError>)null; using (LockedAssemblyCache lockedAssemblyCache = AssemblyCache.AquireLockedAssemblyCache()) { ObjectItemLoadingSessionData loadingData = new ObjectItemLoadingSessionData(knownAssemblies, lockedAssemblyCache, edmItemCollection, logLoadMessage, loaderCookie); AssemblyCache.LoadAssembly(assembly, loadReferencedAssemblies, loadingData); loaderCookie = loadingData.LoaderCookie; loadingData.CompleteSession(); if (loadingData.EdmItemErrors.Count == 0) { new EdmValidator() { SkipReadOnlyItems = true }.Validate <EdmType>((IEnumerable <EdmType>)loadingData.TypesInLoading.Values, loadingData.EdmItemErrors); if (loadingData.EdmItemErrors.Count == 0) { if (ObjectItemAssemblyLoader.IsAttributeLoader(loadingData.ObjectItemAssemblyLoaderFactory)) { AssemblyCache.UpdateCache(lockedAssemblyCache, loadingData.AssembliesLoaded); } else if (loadingData.EdmItemCollection != null && ObjectItemAssemblyLoader.IsConventionLoader(loadingData.ObjectItemAssemblyLoaderFactory)) { AssemblyCache.UpdateCache(loadingData.EdmItemCollection, loadingData.AssembliesLoaded); } } } if (loadingData.TypesInLoading.Count > 0) { foreach (MetadataItem metadataItem in loadingData.TypesInLoading.Values) { metadataItem.SetReadOnly(); } } typesInLoading = loadingData.TypesInLoading; errors = loadingData.EdmItemErrors; } }
internal void RegisterForLevel2PostSessionProcessing(ObjectItemAssemblyLoader loader) { _loadersThatNeedLevel2PostSessionProcessing.Add(loader); }
protected virtual void LoadClosureAssemblies() { ObjectItemAssemblyLoader.LoadAssemblies((IEnumerable <Assembly>) this.CacheEntry.ClosureAssemblies, this.SessionData); }
internal static bool IsAttributeLoader(object loaderCookie) { return(ObjectItemAssemblyLoader.IsAttributeLoader(loaderCookie as Func <Assembly, ObjectItemLoadingSessionData, ObjectItemAssemblyLoader>)); }