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);
+ }
+ }
+}