From 3abc44e7734091d5002ac53b452176b45974dc4e Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 12 May 2010 20:52:00 -0700 Subject: [PATCH] Fixing unit tests and adjusting mechanics related to events for host layer components DefaultOrchardHost may now implement eventhandler interfaces directly DefaultOrchardHostEventSink assistant is obsolete for that reason DefaultOrchardEventBus changed to use interface methodinfo rather than class methodinfo OrchardStarter includes EventsModule with root container to allow components to receive event firing proxies Special case added to CompositionStrategy to prevent DefaultOrchardHost from being re-registered when shell container is built EventsModule is internal to prevent it from being re-registered in the same way --HG-- branch : dev --- .../Topology/ShellDescriptorManagerTests.cs | 13 ++++---- .../DefaultTenantManagerTests.cs | 7 ++-- src/Orchard.Tests/Stubs/StubHttpContext.cs | 10 +++++- .../IShellSettingsManagerEventHandler.cs | 8 ++--- .../Configuration/ShellSettingsManager.cs | 5 --- .../DefaultOrchardHostEventSink.cs | 33 ------------------- src/Orchard/Environment/OrchardStarter.cs | 3 +- .../Topology/CompositionStrategy.cs | 1 + src/Orchard/Events/DefaultOrchardEventBus.cs | 13 ++++---- src/Orchard/Events/EventsModule.cs | 2 +- src/Orchard/Orchard.Framework.csproj | 4 +-- 11 files changed, 35 insertions(+), 64 deletions(-) delete mode 100644 src/Orchard/Environment/DefaultOrchardHostEventSink.cs diff --git a/src/Orchard.Tests.Modules/Settings/Topology/ShellDescriptorManagerTests.cs b/src/Orchard.Tests.Modules/Settings/Topology/ShellDescriptorManagerTests.cs index 63233a045..6c41371af 100644 --- a/src/Orchard.Tests.Modules/Settings/Topology/ShellDescriptorManagerTests.cs +++ b/src/Orchard.Tests.Modules/Settings/Topology/ShellDescriptorManagerTests.cs @@ -15,20 +15,19 @@ namespace Orchard.Tests.Modules.Settings.Topology { public override void Register(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType().As().SingleInstance(); - + builder.RegisterSource(new EventsRegistrationSource()); } public class StubEventBus : IEventBus { public string LastMessageName { get; set; } - public IDictionary LastEventData { get; set; } + public IDictionary LastEventData { get; set; } public void Notify_Obsolete(string messageName, IDictionary eventData) { - LastMessageName = messageName; - LastEventData = eventData; } - public void Notify(string messageName, Dictionary eventData) { - throw new NotImplementedException(); + public void Notify(string messageName, Dictionary eventData) { + LastMessageName = messageName; + LastEventData = eventData; } } @@ -141,7 +140,7 @@ namespace Orchard.Tests.Modules.Settings.Topology { Enumerable.Empty(), Enumerable.Empty()); - Assert.That(eventBus.LastMessageName, Is.EqualTo("ShellDescriptor_Changed")); + Assert.That(eventBus.LastMessageName, Is.EqualTo("IShellDescriptorManagerEventHandler.Changed")); } } } diff --git a/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs b/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs index ae0a59102..48e77c1fa 100644 --- a/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs +++ b/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs @@ -3,7 +3,6 @@ using System.Linq; using Moq; using NUnit.Framework; using Orchard.Environment.Configuration; -using Orchard.Events; namespace Orchard.Tests.Environment.Configuration { [TestFixture] @@ -28,7 +27,7 @@ namespace Orchard.Tests.Environment.Configuration { _appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else"); - IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock().Object); + IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock().Object); var settings = loader.LoadSettings().Single(); Assert.That(settings, Is.Not.Null); Assert.That(settings.Name, Is.EqualTo("Default")); @@ -43,7 +42,7 @@ namespace Orchard.Tests.Environment.Configuration { _appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else"); _appData.CreateFile("Sites\\Another\\Settings.txt", "Name: Another\r\nDataProvider: SQLite2\r\nDataConnectionString: something else2"); - IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock().Object); + IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock().Object); var settings = loader.LoadSettings(); Assert.That(settings.Count(), Is.EqualTo(2)); @@ -62,7 +61,7 @@ namespace Orchard.Tests.Environment.Configuration { public void NewSettingsCanBeStored() { _appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else"); - IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock().Object); + IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock().Object); var foo = new ShellSettings {Name = "Foo", DataProvider = "Bar", DataConnectionString = "Quux"}; Assert.That(loader.LoadSettings().Count(), Is.EqualTo(1)); diff --git a/src/Orchard.Tests/Stubs/StubHttpContext.cs b/src/Orchard.Tests/Stubs/StubHttpContext.cs index df66a262a..0337c90fe 100644 --- a/src/Orchard.Tests/Stubs/StubHttpContext.cs +++ b/src/Orchard.Tests/Stubs/StubHttpContext.cs @@ -12,10 +12,12 @@ namespace Orchard.Tests.Stubs { public StubHttpContext() { _appRelativeCurrentExecutionFilePath = "~/yadda"; + _hostHeader = "localhost"; } public StubHttpContext(string appRelativeCurrentExecutionFilePath) { _appRelativeCurrentExecutionFilePath = appRelativeCurrentExecutionFilePath; + _hostHeader = "localhost"; } public StubHttpContext(string appRelativeCurrentExecutionFilePath, string hostHeader) { @@ -38,6 +40,7 @@ namespace Orchard.Tests.Stubs { class StubHttpRequest : HttpRequestBase { private readonly StubHttpContext _httpContext; private NameValueCollection _serverVariables; + private NameValueCollection _headers; public StubHttpRequest(StubHttpContext httpContext) { _httpContext = httpContext; @@ -54,7 +57,12 @@ namespace Orchard.Tests.Stubs { public override string PathInfo { get { return ""; } } - + public override NameValueCollection Headers { + get { + return _headers = _headers + ?? new NameValueCollection { { "Host", _httpContext._hostHeader } }; + } + } public override NameValueCollection ServerVariables { get { return _serverVariables = _serverVariables diff --git a/src/Orchard/Environment/Configuration/IShellSettingsManagerEventHandler.cs b/src/Orchard/Environment/Configuration/IShellSettingsManagerEventHandler.cs index a32e0448c..f0aff295d 100644 --- a/src/Orchard/Environment/Configuration/IShellSettingsManagerEventHandler.cs +++ b/src/Orchard/Environment/Configuration/IShellSettingsManagerEventHandler.cs @@ -1,7 +1,7 @@ -using Orchard.Environment.Configuration; +using Orchard.Events; -namespace Orchard.Events { - public interface IShellSettingsEventHandler : IEventHandler { +namespace Orchard.Environment.Configuration { + public interface IShellSettingsManagerEventHandler : IEventHandler { void Saved(ShellSettings settings); } -} +} \ No newline at end of file diff --git a/src/Orchard/Environment/Configuration/ShellSettingsManager.cs b/src/Orchard/Environment/Configuration/ShellSettingsManager.cs index 61156d7e9..9604f4855 100644 --- a/src/Orchard/Environment/Configuration/ShellSettingsManager.cs +++ b/src/Orchard/Environment/Configuration/ShellSettingsManager.cs @@ -6,11 +6,6 @@ using System.Yaml.Serialization; using Orchard.Localization; namespace Orchard.Environment.Configuration { - public interface IShellSettingsManager { - IEnumerable LoadSettings(); - void SaveSettings(ShellSettings settings); - } - public class ShellSettingsManager : IShellSettingsManager { private readonly IAppDataFolder _appDataFolder; private readonly IShellSettingsManagerEventHandler _events; diff --git a/src/Orchard/Environment/DefaultOrchardHostEventSink.cs b/src/Orchard/Environment/DefaultOrchardHostEventSink.cs deleted file mode 100644 index fa4f3ac4d..000000000 --- a/src/Orchard/Environment/DefaultOrchardHostEventSink.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using Orchard.Environment.Configuration; -using Orchard.Environment.Topology; -using Orchard.Environment.Topology.Models; -using Orchard.Events; - -namespace Orchard.Environment { - /// - /// This handler forwards calls to the IOrchardHost when it is an instance of DefaultOrchardHost. - /// The reason for this is to avoid adding IEventBusHandler, because DefaultOrchardHost is a component - /// that should not be detected and registererd automatically as an IDependency. - /// - public class DefaultOrchardHostEventSink : IShellSettingsEventHandler, IShellDescriptorManagerEventHandler { - private readonly IShellSettingsEventHandler _shellSettingsEventHandler; - private readonly IShellDescriptorManagerEventHandler _shellDescriptorManagerEventHandler; - - public DefaultOrchardHostEventSink(IOrchardHost host) { - _shellSettingsEventHandler = host as IShellSettingsEventHandler; - _shellDescriptorManagerEventHandler = host as IShellDescriptorManagerEventHandler; - } - - void IShellSettingsEventHandler.Saved(ShellSettings settings) { - if (_shellSettingsEventHandler != null) - _shellSettingsEventHandler.Saved(settings); - } - - void IShellDescriptorManagerEventHandler.Changed(ShellDescriptor descriptor) { - if (_shellDescriptorManagerEventHandler != null) - _shellDescriptorManagerEventHandler.Changed(descriptor); - } - } -} diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index b2ca7ad74..5d959d057 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -20,12 +20,13 @@ namespace Orchard.Environment { public static IContainer CreateHostContainer(Action registrations) { var builder = new ContainerBuilder(); builder.RegisterModule(new LoggingModule()); + builder.RegisterModule(new EventsModule()); // a single default host implementation is needed for bootstrapping a web app domain builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().As().SingleInstance(); { builder.RegisterType().As().SingleInstance(); diff --git a/src/Orchard/Environment/Topology/CompositionStrategy.cs b/src/Orchard/Environment/Topology/CompositionStrategy.cs index d50313f7f..f6dcd70fc 100644 --- a/src/Orchard/Environment/Topology/CompositionStrategy.cs +++ b/src/Orchard/Environment/Topology/CompositionStrategy.cs @@ -67,6 +67,7 @@ namespace Orchard.Environment.Topology { ExportedTypes = typeof(OrchardStarter).Assembly.GetExportedTypes() .Where(t => t.IsClass && !t.IsAbstract) + .Except(new[] { typeof(DefaultOrchardHost) }) .ToArray() }; } diff --git a/src/Orchard/Events/DefaultOrchardEventBus.cs b/src/Orchard/Events/DefaultOrchardEventBus.cs index bcc835836..8fac5d6ab 100644 --- a/src/Orchard/Events/DefaultOrchardEventBus.cs +++ b/src/Orchard/Events/DefaultOrchardEventBus.cs @@ -34,7 +34,8 @@ namespace Orchard.Events { string interfaceName = parameters[0]; string methodName = parameters[1]; - foreach (var eventHandler in _eventHandlers()) { + var eventHandlers = _eventHandlers(); + foreach (var eventHandler in eventHandlers) { TryInvoke(eventHandler, interfaceName, methodName, eventData); } } @@ -43,14 +44,14 @@ namespace Orchard.Events { Type type = eventHandler.GetType(); foreach (var interfaceType in type.GetInterfaces()) { if (String.Equals(interfaceType.Name, interfaceName, StringComparison.OrdinalIgnoreCase)) { - TryInvokeMethod(eventHandler, methodName, arguments); + TryInvokeMethod(eventHandler, interfaceType, methodName, arguments); break; } } } - private static void TryInvokeMethod(IEventHandler eventHandler, string methodName, IDictionary arguments) { - MethodInfo method = GetMatchingMethod(eventHandler, methodName, arguments); + private static void TryInvokeMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary arguments) { + MethodInfo method = GetMatchingMethod(eventHandler, interfaceType, methodName, arguments); if (method != null) { List parameters = new List(); foreach (var methodParameter in method.GetParameters()) { @@ -60,8 +61,8 @@ namespace Orchard.Events { } } - private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, string methodName, IDictionary arguments) { - List allMethods = new List(eventHandler.GetType().GetMethods()); + private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary arguments) { + List allMethods = new List(interfaceType.GetMethods()); List candidates = new List(allMethods); foreach (var method in allMethods) { diff --git a/src/Orchard/Events/EventsModule.cs b/src/Orchard/Events/EventsModule.cs index 2aa10ef52..3cbbfa388 100644 --- a/src/Orchard/Events/EventsModule.cs +++ b/src/Orchard/Events/EventsModule.cs @@ -1,7 +1,7 @@ using Autofac; namespace Orchard.Events { - public class EventsModule : Module { + internal class EventsModule : Module { protected override void Load(ContainerBuilder builder) { builder.RegisterSource(new EventsRegistrationSource()); base.Load(builder); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 7f7d0d197..06774acad 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -162,8 +162,8 @@ + - @@ -184,7 +184,7 @@ - +