You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2017/08/02 04:12:28 UTC

[11/12] lucenenet git commit: Lucene.Net.Util.SPIClassIterator: Factored out code to get all non-Microsoft referenced assemblies into a new class in Support named AssemblyUtils

Lucene.Net.Util.SPIClassIterator: Factored out code to get all non-Microsoft referenced assemblies into a new class in Support named AssemblyUtils


Project: http://git-wip-us.apache.org/repos/asf/lucenenet/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucenenet/commit/1e522937
Tree: http://git-wip-us.apache.org/repos/asf/lucenenet/tree/1e522937
Diff: http://git-wip-us.apache.org/repos/asf/lucenenet/diff/1e522937

Branch: refs/heads/master
Commit: 1e5229375d35371b732e3f1b8f105d6a6a345d0c
Parents: a11ca03
Author: Shad Storhaug <sh...@shadstorhaug.com>
Authored: Mon Jul 31 13:51:17 2017 +0700
Committer: Shad Storhaug <sh...@shadstorhaug.com>
Committed: Wed Aug 2 09:54:25 2017 +0700

----------------------------------------------------------------------
 src/Lucene.Net/Lucene.Net.csproj        |   1 +
 src/Lucene.Net/Support/AssemblyUtils.cs | 138 +++++++++++++++++++++++++++
 src/Lucene.Net/Util/SPIClassIterator.cs | 115 +---------------------
 3 files changed, 140 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucenenet/blob/1e522937/src/Lucene.Net/Lucene.Net.csproj
----------------------------------------------------------------------
diff --git a/src/Lucene.Net/Lucene.Net.csproj b/src/Lucene.Net/Lucene.Net.csproj
index 211a013..368597a 100644
--- a/src/Lucene.Net/Lucene.Net.csproj
+++ b/src/Lucene.Net/Lucene.Net.csproj
@@ -394,6 +394,7 @@
     <Compile Include="Index\TwoStoredFieldsConsumers.cs" />
     <Compile Include="Index\UpgradeIndexMergePolicy.cs" />
     <Compile Include="LucenePackage.cs" />
+    <Compile Include="Support\AssemblyUtils.cs" />
     <Compile Include="Support\Document\DocumentExtensions.cs" />
     <Compile Include="Support\IO\Compression\LZOCompressor.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/1e522937/src/Lucene.Net/Support/AssemblyUtils.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net/Support/AssemblyUtils.cs b/src/Lucene.Net/Support/AssemblyUtils.cs
new file mode 100644
index 0000000..48c7439
--- /dev/null
+++ b/src/Lucene.Net/Support/AssemblyUtils.cs
@@ -0,0 +1,138 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+#if NETSTANDARD
+using Microsoft.Extensions.DependencyModel;
+#endif
+
+namespace Lucene.Net.Support
+{
+    /// <summary>
+    /// Methods for working with Assemblies.
+    /// </summary>
+    public class AssemblyUtils
+    {
+        /// <summary>
+        /// Gets a list of the host assembly's referenced assemblies excluding 
+        /// any Microsoft, System, or Mono prefixed assemblies or assemblies with
+        /// official Microsoft key hashes. Essentially, we get a list of all non
+        /// Microsoft assemblies here.
+        /// </summary>
+        /// <returns></returns>
+        public static IList<Assembly> GetReferencedAssemblies()
+        {
+            // .NET Port Hack: We do a 2-level deep check here because if the assembly you're
+            // hoping would be loaded hasn't been loaded yet into the app domain,
+            // it is unavailable. So we go to the next level on each and check each referenced
+            // assembly.
+#if NETSTANDARD
+            var dependencyContext = DependencyContext.Default;
+            var assemblyNames = dependencyContext.RuntimeLibraries
+                .SelectMany(lib => lib.GetDefaultAssemblyNames(dependencyContext))
+                .Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x))
+                .Distinct();
+            var assembliesLoaded = LoadAssemblyFromName(assemblyNames);
+#else
+            var assembliesLoaded = AppDomain.CurrentDomain.GetAssemblies();
+#endif
+            assembliesLoaded = assembliesLoaded.Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)).ToArray();
+
+            var referencedAssemblies = assembliesLoaded
+                .SelectMany(assembly =>
+                {
+                    return assembly
+                        .GetReferencedAssemblies()
+                        .Where(reference => !DotNetFrameworkFilter.IsFrameworkAssembly(reference))
+                        .Select(assemblyName => LoadAssemblyFromName(assemblyName));
+                })
+                .Where(x => x != null)
+                .Distinct();
+
+            return assembliesLoaded.Concat(referencedAssemblies).Distinct().ToList();
+        }
+
+        private static IEnumerable<Assembly> LoadAssemblyFromName(IEnumerable<AssemblyName> assemblyNames)
+        {
+            return assemblyNames.Select(x => LoadAssemblyFromName(x)).Where(x => x != null);
+        }
+
+        private static Assembly LoadAssemblyFromName(AssemblyName assemblyName)
+        {
+            try
+            {
+                return Assembly.Load(assemblyName);
+            }
+            catch
+            {
+                return null;
+            }
+        }
+
+        /// <summary>
+        /// Assembly filter logic from:
+        /// https://raw.githubusercontent.com/Microsoft/dotnet-apiport/master/src/Microsoft.Fx.Portability/Analyzer/DotNetFrameworkFilter.cs
+        /// </summary>
+        public static class DotNetFrameworkFilter
+        {
+            /// <summary>
+            /// These keys are a collection of public key tokens derived from all the reference assemblies in
+            /// "%ProgramFiles%\Reference Assemblies\Microsoft" on a Windows 10 machine with VS 2015 installed
+            /// </summary>
+            private static readonly ICollection<string> s_microsoftKeys = new HashSet<string>(new[]
+            {
+                "b77a5c561934e089", // ECMA
+                "b03f5f7f11d50a3a", // DEVDIV
+                "7cec85d7bea7798e", // SLPLAT
+                "31bf3856ad364e35", // Windows
+                "24eec0d8c86cda1e", // Phone
+                "0738eb9f132ed756", // Mono
+                "ddd0da4d3e678217", // Component model
+                "84e04ff9cfb79065", // Mono Android
+                "842cf8be1de50553"  // Xamarin.iOS
+            }, StringComparer.OrdinalIgnoreCase);
+
+            private static readonly IEnumerable<string> s_frameworkAssemblyNamePrefixes = new[]
+            {
+                "System.",
+                "Microsoft.",
+                "Mono."
+            };
+
+            /// <summary>
+            /// Gets a best guess as to whether this assembly is a .NET Framework assembly or not.
+            /// </summary>
+            public static bool IsFrameworkAssembly(Assembly assembly)
+            {
+                return assembly != null && IsFrameworkAssembly(assembly.GetName());
+            }
+
+            /// <summary>
+            /// Gets a best guess as to whether this assembly is a .NET Framework assembly or not.
+            /// </summary>
+            public static bool IsFrameworkAssembly(AssemblyName assembly)
+            {
+                if (assembly == null)
+                {
+                    return false;
+                }
+
+                if (s_frameworkAssemblyNamePrefixes.Any(p => assembly.Name.StartsWith(p, StringComparison.OrdinalIgnoreCase)))
+                {
+                    return true;
+                }
+
+                var publicKey = assembly.GetPublicKeyToken();
+
+                if (publicKey == default(byte[]))
+                {
+                    return false;
+                }
+
+                var publicKeyToken = string.Concat(publicKey.Select(i => i.ToString("x2")));
+
+                return s_microsoftKeys.Contains(publicKeyToken);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/1e522937/src/Lucene.Net/Util/SPIClassIterator.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net/Util/SPIClassIterator.cs b/src/Lucene.Net/Util/SPIClassIterator.cs
index 8a75309..f3c08f0 100644
--- a/src/Lucene.Net/Util/SPIClassIterator.cs
+++ b/src/Lucene.Net/Util/SPIClassIterator.cs
@@ -2,9 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Reflection;
-#if NETSTANDARD
-using Microsoft.Extensions.DependencyModel;
-#endif
 
 namespace Lucene.Net.Util
 {
@@ -41,34 +38,7 @@ namespace Lucene.Net.Util
         {
             types = new HashSet<Type>();
 
-            // .NET Port Hack: We do a 2-level deep check here because if the assembly you're
-            // hoping would be loaded hasn't been loaded yet into the app domain,
-            // it is unavailable. So we go to the next level on each and check each referenced
-            // assembly.
-#if NETSTANDARD
-            var dependencyContext = DependencyContext.Default;
-            var assemblyNames = dependencyContext.RuntimeLibraries
-                .SelectMany(lib => lib.GetDefaultAssemblyNames(dependencyContext))
-                .Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x))
-                .Distinct();
-            var assembliesLoaded = LoadAssemblyFromName(assemblyNames);
-#else
-            var assembliesLoaded = AppDomain.CurrentDomain.GetAssemblies();
-#endif
-            assembliesLoaded = assembliesLoaded.Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)).ToArray();
-
-            var referencedAssemblies = assembliesLoaded
-                .SelectMany(assembly =>
-                {
-                    return assembly
-                        .GetReferencedAssemblies()
-                        .Where(reference => !DotNetFrameworkFilter.IsFrameworkAssembly(reference))
-                        .Select(assemblyName => LoadAssemblyFromName(assemblyName));
-                })
-                .Where(x => x != null)
-                .Distinct();
-
-            var assembliesToExamine = assembliesLoaded.Concat(referencedAssemblies).Distinct().ToList();
+            var assembliesToExamine = Support.AssemblyUtils.GetReferencedAssemblies();
 
             // LUCENENET HACK:
             // Tests such as TestImpersonation.cs expect that the assemblies
@@ -154,89 +124,6 @@ namespace Lucene.Net.Util
         {
             return GetEnumerator();
         }
-
-        private static IEnumerable<Assembly> LoadAssemblyFromName(IEnumerable<AssemblyName> assemblyNames)
-        {
-            return assemblyNames.Select(x => LoadAssemblyFromName(x)).Where(x => x != null);
-        }
-
-        private static Assembly LoadAssemblyFromName(AssemblyName assemblyName)
-        {
-            try
-            {
-                return Assembly.Load(assemblyName);
-            }
-            catch
-            {
-                return null;
-            }
-        }
-
-        /// <summary>
-        /// Assembly filter logic from:
-        /// https://raw.githubusercontent.com/Microsoft/dotnet-apiport/master/src/Microsoft.Fx.Portability/Analyzer/DotNetFrameworkFilter.cs
-        /// </summary>
-        private static class DotNetFrameworkFilter
-        {
-            /// <summary>
-            /// These keys are a collection of public key tokens derived from all the reference assemblies in
-            /// "%ProgramFiles%\Reference Assemblies\Microsoft" on a Windows 10 machine with VS 2015 installed
-            /// </summary>
-            private static readonly ICollection<string> s_microsoftKeys = new HashSet<string>(new[]
-            {
-                "b77a5c561934e089", // ECMA
-                "b03f5f7f11d50a3a", // DEVDIV
-                "7cec85d7bea7798e", // SLPLAT
-                "31bf3856ad364e35", // Windows
-                "24eec0d8c86cda1e", // Phone
-                "0738eb9f132ed756", // Mono
-                "ddd0da4d3e678217", // Component model
-                "84e04ff9cfb79065", // Mono Android
-                "842cf8be1de50553"  // Xamarin.iOS
-            }, StringComparer.OrdinalIgnoreCase);
-
-            private static readonly IEnumerable<string> s_frameworkAssemblyNamePrefixes = new[]
-            {
-                "System.",
-                "Microsoft.",
-                "Mono."
-            };
-
-            /// <summary>
-            /// Gets a best guess as to whether this assembly is a .NET Framework assembly or not.
-            /// </summary>
-            public static bool IsFrameworkAssembly(Assembly assembly)
-            {
-                return assembly != null && IsFrameworkAssembly(assembly.GetName());
-            }
-
-            /// <summary>
-            /// Gets a best guess as to whether this assembly is a .NET Framework assembly or not.
-            /// </summary>
-            public static bool IsFrameworkAssembly(AssemblyName assembly)
-            {
-                if (assembly == null)
-                {
-                    return false;
-                }
-
-                if (s_frameworkAssemblyNamePrefixes.Any(p => assembly.Name.StartsWith(p, StringComparison.OrdinalIgnoreCase)))
-                {
-                    return true;
-                }
-
-                var publicKey = assembly.GetPublicKeyToken();
-
-                if (publicKey == default(byte[]))
-                {
-                    return false;
-                }
-
-                var publicKeyToken = string.Concat(publicKey.Select(i => i.ToString("x2")));
-
-                return s_microsoftKeys.Contains(publicKeyToken);
-            }
-        }
     }
 
     /* Being Re-written