diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index 6c8e352d7..3c7800dd1 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -1,6 +1,5 @@ using System.Linq; using System.Threading; -using System.Web; using System.Web.Mvc; using System.Collections.Generic; using Orchard.Caching; @@ -19,9 +18,9 @@ using Orchard.Utility.Extensions; namespace Orchard.Environment { public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler { private readonly ControllerBuilder _controllerBuilder; + private readonly IHostLocalRestart _hostLocalRestart; private readonly IShellSettingsManager _shellSettingsManager; private readonly IShellContextFactory _shellContextFactory; - private readonly IShellDescriptorCache _shellDescriptorCache; private readonly IRunningShellTable _runningShellTable; private readonly IProcessingEngine _processingEngine; private readonly IExtensionLoaderCoordinator _extensionLoaderCoordinator; @@ -33,21 +32,21 @@ namespace Orchard.Environment { public DefaultOrchardHost( IShellSettingsManager shellSettingsManager, IShellContextFactory shellContextFactory, - IShellDescriptorCache shellDescriptorCache, IRunningShellTable runningShellTable, IProcessingEngine processingEngine, IExtensionLoaderCoordinator extensionLoaderCoordinator, ICacheManager cacheManager, - ControllerBuilder controllerBuilder) { + ControllerBuilder controllerBuilder, + IHostLocalRestart hostLocalRestart ) { _shellSettingsManager = shellSettingsManager; _shellContextFactory = shellContextFactory; - _shellDescriptorCache = shellDescriptorCache; _runningShellTable = runningShellTable; _processingEngine = processingEngine; _extensionLoaderCoordinator = extensionLoaderCoordinator; _cacheManager = cacheManager; _controllerBuilder = controllerBuilder; + _hostLocalRestart = hostLocalRestart; T = NullLocalizer.Instance; Logger = NullLogger.Instance; @@ -152,7 +151,7 @@ namespace Orchard.Environment { _cacheManager.Get("OrchardHost_Extensions", ctx => { _extensionLoaderCoordinator.MonitorExtensions(ctx.Monitor); - _shellDescriptorCache.Monitor(ctx.Monitor); + _hostLocalRestart.Monitor(ctx.Monitor); _current = null; return ""; }); diff --git a/src/Orchard/Environment/Descriptor/ShellDescriptorCache.cs b/src/Orchard/Environment/Descriptor/ShellDescriptorCache.cs index 1c5654eaa..8904049c6 100644 --- a/src/Orchard/Environment/Descriptor/ShellDescriptorCache.cs +++ b/src/Orchard/Environment/Descriptor/ShellDescriptorCache.cs @@ -27,11 +27,6 @@ namespace Orchard.Environment.Descriptor { /// Loss of storage is expected. /// void Store(string shellName, ShellDescriptor descriptor); - - /// - /// Monitor changes on the persistent storage. - /// - void Monitor(Action monitor); } public class ShellDescriptorCache : IShellDescriptorCache { @@ -104,10 +99,6 @@ namespace Orchard.Environment.Descriptor { _appDataFolder.CreateFile(DescriptorCacheFileName, saveWriter.ToString()); } - public void Monitor(Action monitor) { - monitor(_appDataFolder.WhenPathChanges(DescriptorCacheFileName)); - } - #endregion private void VerifyCacheFile() { diff --git a/src/Orchard/Environment/IHostLocalRestart.cs b/src/Orchard/Environment/IHostLocalRestart.cs new file mode 100644 index 000000000..debdb4150 --- /dev/null +++ b/src/Orchard/Environment/IHostLocalRestart.cs @@ -0,0 +1,52 @@ +using System; +using Orchard.Caching; +using Orchard.Environment.Configuration; +using Orchard.Environment.Descriptor; +using Orchard.Environment.Descriptor.Models; +using Orchard.FileSystems.AppData; +using Orchard.Logging; + +namespace Orchard.Environment { + public interface IHostLocalRestart { + /// + /// Monitor changes on the persistent storage. + /// + void Monitor(Action monitor); + } + + public class DefaultHostLocalRestart : IHostLocalRestart, IShellDescriptorManagerEventHandler, IShellSettingsManagerEventHandler { + private readonly IAppDataFolder _appDataFolder; + private const string fileName = "hrestart.txt"; + + public DefaultHostLocalRestart(IAppDataFolder appDataFolder) { + _appDataFolder = appDataFolder; + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + + public void Monitor(Action monitor) { + if (!_appDataFolder.FileExists(fileName)) + TouchFile(); + + monitor(_appDataFolder.WhenPathChanges(fileName)); + } + + void IShellSettingsManagerEventHandler.Saved(ShellSettings settings) { + TouchFile(); + } + + void IShellDescriptorManagerEventHandler.Changed(ShellDescriptor descriptor) { + TouchFile(); + } + + private void TouchFile() { + try { + _appDataFolder.CreateFile(fileName, "Host Restart"); + } + catch(Exception e) { + Logger.Warning("Error updateting file '{0}': {1}", fileName, e.Message); + } + } + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index 7390b09d3..04db8880b 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -35,6 +35,7 @@ namespace Orchard.Environment { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 9251df55f..f04a55bab 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -368,6 +368,7 @@ Code +