/// <summary>
        /// This constructor expects to get the paths that have potential to turn into multiple 
        /// artifacts like
        /// 
        /// res://*/foo.csdl   -- could be multiple assemblies
        /// res://MyAssembly/  -- could be multiple artifacts in the one assembly
        /// 
        /// </summary>
        /// <param name="path">The path to the (collection of) resources</param>
        /// <param name="uriRegistry">The global registry of URIs</param>
        /// <param name="resolveAssembly"></param>
        internal MetadataArtifactLoaderCompositeResource(string originalPath, string assemblyName, string resourceName, ICollection<string> uriRegistry, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(resolver != null);

            _originalPath = originalPath;
            _children = LoadResources(assemblyName, resourceName, uriRegistry, resolver).AsReadOnly();
        }
        /// <summary>
        /// Load all resources from a specific assembly.
        /// </summary>
        /// <param name="fullName">The full name identifying the assembly to
        /// load resources from</param>
        /// <param name="uriRegistry">The global registry of URIs</param>
        /// <param name="resolveAssembly">delegate for resolve the assembly</param>
        private static Assembly ResolveAssemblyName(string assemblyName, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(resolver != null);

            AssemblyName referenceName = new AssemblyName(assemblyName);
            Assembly     assembly;

            if (!resolver.TryResolveAssemblyReference(referenceName, out assembly))
            {
                throw new FileNotFoundException(Strings.UnableToResolveAssembly(assemblyName));
            }

            return(assembly);
        }
        [ResourceConsumption(ResourceScope.Machine)] //For CheckArtifactExtension method call. But the path is not created in this method.
        internal static MetadataArtifactLoader Create(
            string path,
            ExtensionCheck extensionCheck,
            string validExtension,
            ICollection<string> uriRegistry,
            MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(path != null);
            Debug.Assert(resolver != null);

            // res:// -based artifacts
            //
            if (PathStartsWithResPrefix(path))
            {
                return MetadataArtifactLoaderCompositeResource.CreateResourceLoader(
                    path, extensionCheck, validExtension, uriRegistry, resolver);
            }

            // Files and Folders
            //
            var normalizedPath = NormalizeFilePaths(path);
            if (Directory.Exists(normalizedPath))
            {
                return new MetadataArtifactLoaderCompositeFile(normalizedPath, uriRegistry);
            }
            else if (File.Exists(normalizedPath))
            {
                switch (extensionCheck)
                {
                    case ExtensionCheck.Specific:
                        CheckArtifactExtension(normalizedPath, validExtension);
                        break;

                    case ExtensionCheck.All:
                        if (!IsValidArtifact(normalizedPath))
                        {
                            throw new MetadataException(Strings.InvalidMetadataPath);
                        }
                        break;
                }

                return new MetadataArtifactLoaderFile(normalizedPath, uriRegistry);
            }

            throw new MetadataException(Strings.InvalidMetadataPath);
        }
        [ResourceConsumption(ResourceScope.Machine)] //For CheckArtifactExtension method call. But the path is not created in this method.
        internal static MetadataArtifactLoader Create(string path,
                                                      ExtensionCheck extensionCheck,
                                                      string validExtension,
                                                      ICollection <string> uriRegistry,
                                                      MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(path != null);
            Debug.Assert(resolver != null);

            // res:// -based artifacts
            //
            if (MetadataArtifactLoader.PathStartsWithResPrefix(path))
            {
                return(MetadataArtifactLoaderCompositeResource.CreateResourceLoader(path, extensionCheck, validExtension, uriRegistry, resolver));
            }

            // Files and Folders
            //
            string normalizedPath = MetadataArtifactLoader.NormalizeFilePaths(path);

            if (Directory.Exists(normalizedPath))
            {
                return(new MetadataArtifactLoaderCompositeFile(normalizedPath, uriRegistry));
            }
            else if (File.Exists(normalizedPath))
            {
                switch (extensionCheck)
                {
                case ExtensionCheck.Specific:
                    CheckArtifactExtension(normalizedPath, validExtension);
                    break;

                case ExtensionCheck.All:
                    if (!MetadataArtifactLoader.IsValidArtifact(normalizedPath))
                    {
                        throw EntityUtil.Metadata(Strings.InvalidMetadataPath);
                    }
                    break;
                }

                return(new MetadataArtifactLoaderFile(normalizedPath, uriRegistry));
            }

            throw EntityUtil.Metadata(Strings.InvalidMetadataPath);
        }
        internal static MetadataArtifactLoader CreateResourceLoader(
            string path, ExtensionCheck extensionCheck, string validExtension, ICollection<string> uriRegistry,
            MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(path != null);
            Debug.Assert(PathStartsWithResPrefix(path));

            // if the supplied path ends with a separator, or contains only one
            // segment (i.e., the name of an assembly, or the wildcard character),
            // create a composite loader that can extract resources from one or 
            // more assemblies
            //
            var createCompositeResLoader = false;
            string assemblyName = null;
            string resourceName = null;
            ParseResourcePath(path, out assemblyName, out resourceName);
            createCompositeResLoader = (assemblyName != null) && (resourceName == null || assemblyName.Trim() == wildcard);

            ValidateExtension(extensionCheck, validExtension, resourceName);

            if (createCompositeResLoader)
            {
                return new MetadataArtifactLoaderCompositeResource(path, assemblyName, resourceName, uriRegistry, resolver);
            }

            Debug.Assert(!string.IsNullOrEmpty(resourceName), "we should not get here is the resourceName is null");
            var assembly = ResolveAssemblyName(assemblyName, resolver);
            return new MetadataArtifactLoaderResource(assembly, resourceName, uriRegistry);
        }
        /// <summary>
        /// Load all resources from a specific assembly.
        /// </summary>
        /// <param name="fullName">The full name identifying the assembly to
        /// load resources from</param>
        /// <param name="uriRegistry">The global registry of URIs</param>
        /// <param name="resolveAssembly">delegate for resolve the assembly</param>
        private static Assembly ResolveAssemblyName(string assemblyName, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(resolver != null);

            var referenceName = new AssemblyName(assemblyName);
            Assembly assembly;
            if (!resolver.TryResolveAssemblyReference(referenceName, out assembly))
            {
                throw new FileNotFoundException(Strings.UnableToResolveAssembly(assemblyName));
            }

            return assembly;
        }
        /// <summary>
        /// Load all resources from the assembly/assemblies identified in the resource path.
        /// </summary>
        /// <param name="uriRegistry">The global registry of URIs</param>
        /// <param name="resolveAssembly"></param>
        /// <returns></returns>
        private static List<MetadataArtifactLoaderResource> LoadResources(
            string assemblyName, string resourceName, ICollection<string> uriRegistry, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(resolver != null);

            var loaders = new List<MetadataArtifactLoaderResource>();
            Debug.Assert(!string.IsNullOrEmpty(assemblyName));

            if (assemblyName == wildcard)
            {
                foreach (var assembly in resolver.GetWildcardAssemblies())
                {
                    if (AssemblyContainsResource(assembly, ref resourceName))
                    {
                        LoadResourcesFromAssembly(assembly, resourceName, uriRegistry, loaders);
                    }
                }
            }
            else
            {
                var assembly = ResolveAssemblyName(assemblyName, resolver);
                LoadResourcesFromAssembly(assembly, resourceName, uriRegistry, loaders);
            }

            if (resourceName != null
                && loaders.Count == 0)
            {
                // they were asking for a specific resource name, and we didn't find it
                throw new MetadataException(Strings.UnableToLoadResource);
            }

            return loaders;
        }
        [ResourceConsumption(ResourceScope.Machine)] //For Create method call. But the paths are not created in this method.
        internal static MetadataArtifactLoader CreateCompositeFromFilePaths(IEnumerable <string> filePaths, string validExtension, MetadataArtifactAssemblyResolver resolver)
        {
            ExtensionCheck extensionCheck;

            if (string.IsNullOrEmpty(validExtension))
            {
                extensionCheck = ExtensionCheck.All;
            }
            else
            {
                extensionCheck = ExtensionCheck.Specific;
            }

            List <MetadataArtifactLoader> loaders = new List <MetadataArtifactLoader>();

            // The following set is used to remove duplicate paths from the incoming array
            HashSet <string> uriRegistry = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            foreach (string path in filePaths)
            {
                if (string.IsNullOrEmpty(path))
                {
                    throw EntityUtil.Metadata(System.Data.Entity.Strings.NotValidInputPath,
                                              EntityUtil.CollectionParameterElementIsNullOrEmpty("filePaths"));
                }

                string trimedPath = path.Trim();
                if (trimedPath.Length > 0)
                {
                    loaders.Add(MetadataArtifactLoader.Create(
                                    trimedPath,
                                    extensionCheck,
                                    validExtension,
                                    uriRegistry,
                                    resolver)
                                );
                }
            }

            return(MetadataArtifactLoader.Create(loaders));
        }
        private static void LoadAllResourcesFromAssembly(Assembly assembly, ICollection<string> uriRegistry, List<MetadataArtifactLoaderResource> loaders, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(assembly != null);
            string[] allresources = GetManifestResourceNamesForAssembly(assembly);

            foreach (string resourceName in allresources)
            {
                CreateAndAddSingleResourceLoader(assembly, resourceName, uriRegistry, loaders);
            }
        }
 private static void LoadResourcesFromAssembly(Assembly assembly, string resourceName, ICollection<string> uriRegistry, List<MetadataArtifactLoaderResource> loaders, MetadataArtifactAssemblyResolver resolver)
 {
     if (resourceName == null)
     {
         LoadAllResourcesFromAssembly(assembly, uriRegistry, loaders, resolver);
     }
     else if (AssemblyContainsResource(assembly, ref resourceName))
     {
         CreateAndAddSingleResourceLoader(assembly, resourceName, uriRegistry, loaders);
     }
     else
     {
         throw EntityUtil.Metadata(System.Data.Entity.Strings.UnableToLoadResource);
     }
 }
Exemplo n.º 11
0
        [ResourceConsumption(ResourceScope.Machine)] //For Create method call. But the paths are not created in this method.
        internal static MetadataArtifactLoader CreateCompositeFromFilePaths(IEnumerable<string> filePaths, string validExtension, MetadataArtifactAssemblyResolver resolver)
        {
            ExtensionCheck extensionCheck;
            if (string.IsNullOrEmpty(validExtension))
            {
                extensionCheck = ExtensionCheck.All;
            }
            else
            {
                extensionCheck = ExtensionCheck.Specific;
            }
            
            List<MetadataArtifactLoader> loaders = new List<MetadataArtifactLoader>();

            // The following set is used to remove duplicate paths from the incoming array
            HashSet<string> uriRegistry = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

            foreach(string path in filePaths)
            {
                if (string.IsNullOrEmpty(path))
                {
                    throw EntityUtil.Metadata(System.Data.Entity.Strings.NotValidInputPath,
                                              EntityUtil.CollectionParameterElementIsNullOrEmpty("filePaths"));
                }

                string trimedPath = path.Trim();
                if (trimedPath.Length > 0)
                {
                    loaders.Add(MetadataArtifactLoader.Create(
                                            trimedPath,
                                            extensionCheck,
                                            validExtension,
                                            uriRegistry,
                                            resolver)
                                        );
                }
            }

            return MetadataArtifactLoader.Create(loaders);
        }
        /// <summary>
        /// This constructor expects to get the paths that have potential to turn into multiple
        /// artifacts like
        ///
        /// res://*/foo.csdl   -- could be multiple assemblies
        /// res://MyAssembly/  -- could be multiple artifacts in the one assembly
        ///
        /// </summary>
        /// <param name="path">The path to the (collection of) resources</param>
        /// <param name="uriRegistry">The global registry of URIs</param>
        /// <param name="resolveAssembly"></param>
        internal MetadataArtifactLoaderCompositeResource(string originalPath, string assemblyName, string resourceName, ICollection <string> uriRegistry, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(resolver != null);

            _originalPath = originalPath;
            _children     = LoadResources(assemblyName, resourceName, uriRegistry, resolver).AsReadOnly();
        }
        internal static MetadataArtifactLoader CreateResourceLoader(string path, ExtensionCheck extensionCheck, string validExtension, ICollection <string> uriRegistry, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(path != null);
            Debug.Assert(MetadataArtifactLoader.PathStartsWithResPrefix(path));

            // if the supplied path ends with a separator, or contains only one
            // segment (i.e., the name of an assembly, or the wildcard character),
            // create a composite loader that can extract resources from one or
            // more assemblies
            //
            bool   createCompositeResLoader = false;
            string assemblyName             = null;
            string resourceName             = null;

            ParseResourcePath(path, out assemblyName, out resourceName);
            createCompositeResLoader = (assemblyName != null) && (resourceName == null || assemblyName.Trim() == wildcard);

            ValidateExtension(extensionCheck, validExtension, resourceName);

            if (createCompositeResLoader)
            {
                return(new MetadataArtifactLoaderCompositeResource(path, assemblyName, resourceName, uriRegistry, resolver));
            }

            Debug.Assert(!string.IsNullOrEmpty(resourceName), "we should not get here is the resourceName is null");
            Assembly assembly = ResolveAssemblyName(assemblyName, resolver);

            return(new MetadataArtifactLoaderResource(assembly, resourceName, uriRegistry));
        }
        private static void LoadAllResourcesFromAssembly(Assembly assembly, ICollection <string> uriRegistry, List <MetadataArtifactLoaderResource> loaders, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(assembly != null);
            string[] allresources = GetManifestResourceNamesForAssembly(assembly);

            foreach (string resourceName in allresources)
            {
                CreateAndAddSingleResourceLoader(assembly, resourceName, uriRegistry, loaders);
            }
        }
 private static void LoadResourcesFromAssembly(Assembly assembly, string resourceName, ICollection <string> uriRegistry, List <MetadataArtifactLoaderResource> loaders, MetadataArtifactAssemblyResolver resolver)
 {
     if (resourceName == null)
     {
         LoadAllResourcesFromAssembly(assembly, uriRegistry, loaders, resolver);
     }
     else if (AssemblyContainsResource(assembly, ref resourceName))
     {
         CreateAndAddSingleResourceLoader(assembly, resourceName, uriRegistry, loaders);
     }
     else
     {
         throw EntityUtil.Metadata(System.Data.Entity.Strings.UnableToLoadResource);
     }
 }
        /// <summary>
        /// Load all resources from the assembly/assemblies identified in the resource path.
        /// </summary>
        /// <param name="uriRegistry">The global registry of URIs</param>
        /// <param name="resolveAssembly"></param>
        /// <returns></returns>
        private static List <MetadataArtifactLoaderResource> LoadResources(string assemblyName, string resourceName, ICollection <string> uriRegistry, MetadataArtifactAssemblyResolver resolver)
        {
            Debug.Assert(resolver != null);

            List <MetadataArtifactLoaderResource> loaders = new List <MetadataArtifactLoaderResource>();

            Debug.Assert(!string.IsNullOrEmpty(assemblyName));

            if (assemblyName == MetadataArtifactLoader.wildcard)
            {
                foreach (Assembly assembly in resolver.GetWildcardAssemblies())
                {
                    if (AssemblyContainsResource(assembly, ref resourceName))
                    {
                        LoadResourcesFromAssembly(assembly, resourceName, uriRegistry, loaders, resolver);
                    }
                }
            }
            else
            {
                Assembly assembly = ResolveAssemblyName(assemblyName, resolver);
                LoadResourcesFromAssembly(assembly, resourceName, uriRegistry, loaders, resolver);
            }

            if (resourceName != null && loaders.Count == 0)
            {
                // they were asking for a specific resource name, and we didn't find it
                throw EntityUtil.Metadata(System.Data.Entity.Strings.UnableToLoadResource);
            }

            return(loaders);
        }