From cadfd78c55a26e1c16402906c4fd5ab744516835 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 28 Apr 2010 12:44:16 -0700 Subject: [PATCH] Orchard host recreates shell context based on significant events At the moment the events related to shell settings and shell descriptor changes will cause the host to rebuild their compositions. --HG-- branch : dev --- .hgignore | 1 + .../Bindings/OrchardSiteFactory.cs | 13 ----------- .../DefaultTenantManagerTests.cs | 10 ++++---- .../Topology/ShellDescriptorManager.cs | 2 +- .../Controllers/SetupController.cs | 3 --- .../Configuration/ShellSettingsManager.cs | 7 +++++- src/Orchard/Environment/DefaultOrchardHost.cs | 10 +++++++- .../DefaultOrchardHostEventSink.cs | 23 +++++++++++++++++++ src/Orchard/Environment/IOrchardHost.cs | 3 +-- src/Orchard/Events/DefaultOrchardEventBus.cs | 9 ++++---- src/Orchard/Orchard.Framework.csproj | 1 + 11 files changed, 53 insertions(+), 29 deletions(-) create mode 100644 src/Orchard/Environment/DefaultOrchardHostEventSink.cs diff --git a/.hgignore b/.hgignore index 704e42375..0e4e5c05c 100644 --- a/.hgignore +++ b/.hgignore @@ -12,3 +12,4 @@ glob:src/Orchard.Web/Modules/Orchard.DevTools/Module.txt glob:src/Orchard.Web/Modules/Orchard.Sandbox/Module.txt glob:src/Orchard.Web/Media/* glob:desktop.ini +glob:src/Orchard.Azure.suo diff --git a/src/Orchard.Specs/Bindings/OrchardSiteFactory.cs b/src/Orchard.Specs/Bindings/OrchardSiteFactory.cs index 605692f79..0558fb854 100644 --- a/src/Orchard.Specs/Bindings/OrchardSiteFactory.cs +++ b/src/Orchard.Specs/Bindings/OrchardSiteFactory.cs @@ -47,23 +47,11 @@ namespace Orchard.Specs.Bindings { descriptor.EnabledFeatures.Concat(new[] { new ShellFeature { Name = name } }), descriptor.Parameters); } - - Trace.WriteLine("This call to Host.Reinitialize should not be needed, eventually"); - MvcApplication.Host.Reinitialize_Obsolete(); }); } - [When(@"I cycle the app domain")] - public void WhenICycleTheAppDomain() { - var webApp = Binding(); - webApp.Host.Execute(() => { - Trace.WriteLine("This call to Host.Reinitialize should not be needed, eventually"); - MvcApplication.Host.Reinitialize_Obsolete(); - }); - } - [Given(@"I have tenant ""(.*)\"" on ""(.*)\"" as ""(.*)\""")] public void GivenIHaveTenantOnSiteAsName(string shellName, string hostName, string siteName) { var webApp = Binding(); @@ -76,7 +64,6 @@ namespace Orchard.Specs.Bindings { using (var environment = MvcApplication.CreateStandaloneEnvironment("Default")) { environment.Resolve().SaveSettings(shellSettings); } - MvcApplication.Host.Reinitialize_Obsolete(); }); webApp.WhenIGoToPathOnHost("Setup", hostName); diff --git a/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs b/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs index 6bae8039a..d47d66904 100644 --- a/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs +++ b/src/Orchard.Tests/Environment/Configuration/DefaultTenantManagerTests.cs @@ -1,7 +1,9 @@ using System.IO; using System.Linq; +using Moq; using NUnit.Framework; using Orchard.Environment.Configuration; +using Orchard.Events; namespace Orchard.Tests.Environment.Configuration { [TestFixture] @@ -26,7 +28,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); + 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")); @@ -41,7 +43,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); + IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock().Object); var settings = loader.LoadSettings(); Assert.That(settings.Count(), Is.EqualTo(2)); @@ -59,8 +61,8 @@ namespace Orchard.Tests.Environment.Configuration { [Test] public void NewSettingsCanBeStored() { _appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else"); - - IShellSettingsManager loader = new ShellSettingsManager(_appData); + + 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.Web/Core/Settings/Topology/ShellDescriptorManager.cs b/src/Orchard.Web/Core/Settings/Topology/ShellDescriptorManager.cs index bd38f87e4..98bcddd67 100644 --- a/src/Orchard.Web/Core/Settings/Topology/ShellDescriptorManager.cs +++ b/src/Orchard.Web/Core/Settings/Topology/ShellDescriptorManager.cs @@ -86,7 +86,7 @@ namespace Orchard.Core.Settings.Topology { } _eventBus.Notify( - typeof(IShellDescriptorManager).FullName + ".UpdateShellDescriptor", + "ShellDescriptor_Changed", null); } } diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs b/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs index 2ded69bb3..eb8e1abe4 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs @@ -173,9 +173,6 @@ namespace Orchard.Setup.Controllers { _shellSettingsManager.SaveSettings(shellSettings); - // MultiTenancy: This will not be needed when host listens to event bus - _orchardHost.Reinitialize_Obsolete(); - // redirect to the welcome page. return Redirect("~/"); } diff --git a/src/Orchard/Environment/Configuration/ShellSettingsManager.cs b/src/Orchard/Environment/Configuration/ShellSettingsManager.cs index d1de2a657..0267bc955 100644 --- a/src/Orchard/Environment/Configuration/ShellSettingsManager.cs +++ b/src/Orchard/Environment/Configuration/ShellSettingsManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Yaml.Serialization; +using Orchard.Events; using Orchard.Localization; namespace Orchard.Environment.Configuration { @@ -13,10 +14,12 @@ namespace Orchard.Environment.Configuration { public class ShellSettingsManager : IShellSettingsManager { private readonly IAppDataFolder _appDataFolder; + private readonly IEventBus _eventBus; Localizer T { get; set; } - public ShellSettingsManager(IAppDataFolder appDataFolder) { + public ShellSettingsManager(IAppDataFolder appDataFolder, IEventBus eventBus) { _appDataFolder = appDataFolder; + _eventBus = eventBus; T = NullLocalizer.Instance; } @@ -32,6 +35,8 @@ namespace Orchard.Environment.Configuration { var filePath = Path.Combine(Path.Combine("Sites", settings.Name), "Settings.txt"); _appDataFolder.CreateFile(filePath, ComposeSettings(settings)); + + _eventBus.Notify("ShellSettings_Saved", null); } IEnumerable LoadSettings() { diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index 3f6e182d3..35a1f394b 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -1,7 +1,7 @@ +using System; using System.Linq; using System.Web.Mvc; using Autofac; -using Autofac.Integration.Web; using System.Collections.Generic; using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; @@ -131,5 +131,13 @@ namespace Orchard.Environment { } } + public void Process(string messageName, IDictionary eventData) { + if (messageName == "ShellSettings_Saved") { + _current = null; + } + else if (messageName == "ShellDescriptor_Changed") { + _current = null; + } + } } } diff --git a/src/Orchard/Environment/DefaultOrchardHostEventSink.cs b/src/Orchard/Environment/DefaultOrchardHostEventSink.cs new file mode 100644 index 000000000..9d0542e21 --- /dev/null +++ b/src/Orchard/Environment/DefaultOrchardHostEventSink.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +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 : IEventBusHandler { + private readonly DefaultOrchardHost _host; + + public DefaultOrchardHostEventSink(IOrchardHost host) { + _host = host as DefaultOrchardHost; + } + + public void Process(string messageName, IDictionary eventData) { + if (_host != null) { + _host.Process(messageName, eventData); + } + } + } +} diff --git a/src/Orchard/Environment/IOrchardHost.cs b/src/Orchard/Environment/IOrchardHost.cs index 314560677..754ca84a0 100644 --- a/src/Orchard/Environment/IOrchardHost.cs +++ b/src/Orchard/Environment/IOrchardHost.cs @@ -27,6 +27,5 @@ namespace Orchard.Environment { /// Services may be resolved from within this instance to configure and initialize it's storage. /// IStandaloneEnvironment CreateStandaloneEnvironment(ShellSettings shellSettings); - } - + } } diff --git a/src/Orchard/Events/DefaultOrchardEventBus.cs b/src/Orchard/Events/DefaultOrchardEventBus.cs index d1ae5652d..820b1fa55 100644 --- a/src/Orchard/Events/DefaultOrchardEventBus.cs +++ b/src/Orchard/Events/DefaultOrchardEventBus.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Orchard.Logging; namespace Orchard.Events { public class DefaultOrchardEventBus : IEventBus { - private readonly IEnumerable _handlers; + private readonly Func> _handlers; - public DefaultOrchardEventBus(IEnumerable handlers) { + public DefaultOrchardEventBus(Func> handlers) { _handlers = handlers; Logger = NullLogger.Instance; } @@ -15,7 +16,7 @@ namespace Orchard.Events { #region Implementation of IEventBus public void Notify(string messageName, IDictionary eventData) { - _handlers.Invoke(handler => handler.Process(messageName, eventData), Logger); + _handlers().Invoke(handler => handler.Process(messageName, eventData), Logger); } #endregion diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 7be14bbab..00b4497e4 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -163,6 +163,7 @@ +