diff --git a/DNN Platform/Library/Framework/Reflection.cs b/DNN Platform/Library/Framework/Reflection.cs index bc9ec0893fd..deff68252d7 100644 --- a/DNN Platform/Library/Framework/Reflection.cs +++ b/DNN Platform/Library/Framework/Reflection.cs @@ -302,10 +302,15 @@ public static Type CreateType(string TypeName, string CacheKey, bool UseCache, b } public static object CreateInstance(Type Type) + { + return CreateInstance(Type, null); + } + + public static object CreateInstance(Type Type, object[] args) { if (Type != null) { - return Type.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, null, null); + return Type.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, args, null); } else { diff --git a/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs b/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs index babd65c2965..8edc5d22bce 100644 --- a/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs +++ b/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs @@ -376,7 +376,17 @@ public Analyzer GetCustomAnalyzer() try { var analyzerType = Reflection.CreateType(customAnalyzerType); - analyzer = Reflection.CreateInstance(analyzerType) as Analyzer; + + // If parameterless ctor exists, use that; if not, pass the Lucene Version. + if (analyzerType?.GetConstructor(Type.EmptyTypes) != null) + { + analyzer = Reflection.CreateInstance(analyzerType) as Analyzer; + } + else if (analyzerType?.GetConstructor(new Type[] { typeof(Lucene.Net.Util.Version) }) != null) + { + analyzer = Reflection.CreateInstance(analyzerType, new object[] { Constants.LuceneVersion }) as Analyzer; + } + if (analyzer == null) { throw new ArgumentException(string.Format( diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj index f7493eeb454..588d014ba43 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj @@ -179,6 +179,7 @@ + @@ -205,6 +206,7 @@ + diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs new file mode 100644 index 00000000000..063226fe2e2 --- /dev/null +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs @@ -0,0 +1,36 @@ +namespace DotNetNuke.Tests.Core.Framework +{ + using System.Text; + using DotNetNuke.Framework; + using NUnit.Framework; + + public class ReflectionTests + { + [Test] + public void CreateInstance_WithArgs_WorksCorrectly() + { + // Arrange + var typeToCreate = typeof(StringBuilder); + var argToPass = new object[] { "one" }; + + // Act + var result = (StringBuilder)Reflection.CreateInstance(typeToCreate, argToPass); + + // Assert + Assert.AreEqual("one", result.ToString()); + } + + [Test] + public void CreateInstance_WithoutArgs_WorksCorrectly() + { + // Arrange + var typeToCreate = typeof(StringBuilder); + + // Act + var result = (StringBuilder)Reflection.CreateInstance(typeToCreate); + + // Assert + Assert.AreEqual(string.Empty, result.ToString()); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs new file mode 100644 index 00000000000..8f4450861a2 --- /dev/null +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs @@ -0,0 +1,54 @@ +namespace DotNetNuke.Tests.Core.Services.Search.Internals +{ + using System.Data; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Services.Search.Internals; + using DotNetNuke.Tests.Utilities.Mocks; + using Lucene.Net.Analysis.Cz; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; + + public class LuceneControllerImplTests + { + [Test] + public void GetCustomAnalyzer_WithTheProvidedAnalyzer_ReturnsTheAnalyzerCorrectly() + { + // Arrange + const string HostSettingsTableName = "HostSettings"; + const string SettingNameColumnName = "SettingName"; + const string SettingValueColumnName = "SettingValue"; + const string SettingIsSecureColumnName = "SettingIsSecure"; + const string CustomAnalyzerCacheKeyName = "Search_CustomAnalyzer"; + const string CzechAnalyzerTypeName = "Lucene.Net.Analysis.Cz.CzechAnalyzer, Lucene.Net.Contrib.Analyzers"; + var services = new ServiceCollection(); + var mockData = MockComponentProvider.CreateDataProvider(); + var hostSettings = new DataTable(HostSettingsTableName); + var nameCol = hostSettings.Columns.Add(SettingNameColumnName); + hostSettings.Columns.Add(SettingValueColumnName); + hostSettings.Columns.Add(SettingIsSecureColumnName); + hostSettings.PrimaryKey = new[] { nameCol }; + hostSettings.Rows.Add(CustomAnalyzerCacheKeyName, CzechAnalyzerTypeName, true); + mockData.Setup(c => c.GetHostSettings()).Returns(hostSettings.CreateDataReader()); + var mockedApplicationStatusInfo = new Mock(); + mockedApplicationStatusInfo.Setup(s => s.Status).Returns(UpgradeStatus.Install); + mockedApplicationStatusInfo.Setup(s => s.ApplicationMapPath).Returns(string.Empty); + services.AddTransient(container => Mock.Of()); + services.AddTransient(container => mockedApplicationStatusInfo.Object); + services.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = services.BuildServiceProvider(); + MockComponentProvider.CreateDataCacheProvider(); + DataCache.ClearCache(); + var luceneController = new LuceneControllerImpl(); + + // Act + var analyzer = luceneController.GetCustomAnalyzer(); + + // Assert + Assert.IsInstanceOf(analyzer); + } + } +}