From be296b4ac80a4ae782c57c2eb99c6c66123fcfce Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 6 Jan 2014 15:03:25 -0800 Subject: [PATCH] Adding shape templates invalidation --- .../Orchard.Templates/Handlers/ShapePartHandler.cs | 7 ++++++- .../Services/DefaultTemplateService.cs | 2 ++ .../Services/TemplateBindingStrategy.cs | 11 +++++++++-- .../Descriptors/DefaultShapeTableManager.cs | 7 ++++++- .../DisplayManagement/Descriptors/Interfaces.cs | 8 +++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Templates/Handlers/ShapePartHandler.cs b/src/Orchard.Web/Modules/Orchard.Templates/Handlers/ShapePartHandler.cs index af1653a15..86093169d 100644 --- a/src/Orchard.Web/Modules/Orchard.Templates/Handlers/ShapePartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Templates/Handlers/ShapePartHandler.cs @@ -1,13 +1,16 @@ -using Orchard.Compilation.Razor; +using Orchard.Caching; +using Orchard.Compilation.Razor; using Orchard.ContentManagement.Handlers; using Orchard.Data; using Orchard.Templates.Models; +using Orchard.Templates.Services; namespace Orchard.Templates.Handlers { public class ShapePartHandler : ContentHandler { private readonly IRazorTemplateHolder _razorTemplateHolder; public ShapePartHandler( + ISignals signals, IRepository repository, IRazorTemplateHolder razorTemplateHolder) { _razorTemplateHolder = razorTemplateHolder; @@ -15,6 +18,8 @@ namespace Orchard.Templates.Handlers { OnGetContentItemMetadata((ctx, part) => ctx.Metadata.DisplayText = part.Name); OnUpdated((ctx, part) => _razorTemplateHolder.Set(part.Name, part.Template)); + OnCreated((ctx, part) => signals.Trigger(DefaultTemplateService.TemplatesSignal)); + OnRemoved((ctx, part) => signals.Trigger(DefaultTemplateService.TemplatesSignal)); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Templates/Services/DefaultTemplateService.cs b/src/Orchard.Web/Modules/Orchard.Templates/Services/DefaultTemplateService.cs index 80799d1fb..c6c849729 100644 --- a/src/Orchard.Web/Modules/Orchard.Templates/Services/DefaultTemplateService.cs +++ b/src/Orchard.Web/Modules/Orchard.Templates/Services/DefaultTemplateService.cs @@ -11,6 +11,8 @@ using Orchard.Templates.Models; namespace Orchard.Templates.Services { public class DefaultTemplateService : ITemplateService { + public const string TemplatesSignal = "Orchard.Templates"; + private readonly IShapeFactory _shapeFactory; private readonly IDisplayHelperFactory _displayHelperFactory; private readonly IWorkContextAccessor _workContextAccessor; diff --git a/src/Orchard.Web/Modules/Orchard.Templates/Services/TemplateBindingStrategy.cs b/src/Orchard.Web/Modules/Orchard.Templates/Services/TemplateBindingStrategy.cs index 36855060f..91d89aa70 100644 --- a/src/Orchard.Web/Modules/Orchard.Templates/Services/TemplateBindingStrategy.cs +++ b/src/Orchard.Web/Modules/Orchard.Templates/Services/TemplateBindingStrategy.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Web; +using Orchard.Caching; using Orchard.Compilation.Razor; using Orchard.DisplayManagement.Descriptors; using Orchard.DisplayManagement.Implementation; @@ -8,15 +9,18 @@ using Orchard.Environment.Extensions.Models; using Orchard.Mvc.Spooling; namespace Orchard.Templates.Services { - public class TemplateBindingStrategy : IShapeTableProvider { + public class TemplateBindingStrategy : IShapeTableProvider, IShapeTableMonitor { private readonly ITemplateService _templateService; private readonly IRazorTemplateHolder _templateProvider; + private readonly ISignals _signals; public TemplateBindingStrategy( ITemplateService templateService, - IRazorTemplateHolder templateProvider) { + IRazorTemplateHolder templateProvider, + ISignals signals) { _templateService = templateService; _templateProvider = templateProvider; + _signals = signals; } public virtual Feature Feature { get; set; } @@ -105,5 +109,8 @@ namespace Orchard.Templates.Services { return invoke as IHtmlString ?? (invoke != null ? new HtmlString(invoke.ToString()) : null); } + public void Monitor(Action monitor) { + monitor(_signals.When(DefaultTemplateService.TemplatesSignal)); + } } } \ No newline at end of file diff --git a/src/Orchard/DisplayManagement/Descriptors/DefaultShapeTableManager.cs b/src/Orchard/DisplayManagement/Descriptors/DefaultShapeTableManager.cs index 3243e160a..9e6b69dba 100644 --- a/src/Orchard/DisplayManagement/Descriptors/DefaultShapeTableManager.cs +++ b/src/Orchard/DisplayManagement/Descriptors/DefaultShapeTableManager.cs @@ -17,18 +17,21 @@ namespace Orchard.DisplayManagement.Descriptors { private readonly ICacheManager _cacheManager; private readonly IParallelCacheContext _parallelCacheContext; private readonly IEnumerable _shapeTableEventHandlers; + private readonly IEnumerable _shapeTableMonitors; public DefaultShapeTableManager( IEnumerable> bindingStrategies, IExtensionManager extensionManager, ICacheManager cacheManager, IParallelCacheContext parallelCacheContext, - IEnumerable shapeTableEventHandlers + IEnumerable shapeTableEventHandlers, + IEnumerable shapeTableMonitors ) { _extensionManager = extensionManager; _cacheManager = cacheManager; _parallelCacheContext = parallelCacheContext; _shapeTableEventHandlers = shapeTableEventHandlers; + _shapeTableMonitors = shapeTableMonitors; _bindingStrategies = bindingStrategies; Logger = NullLogger.Instance; } @@ -78,6 +81,8 @@ namespace Orchard.DisplayManagement.Descriptors { _shapeTableEventHandlers.Invoke(ctx => ctx.ShapeTableCreated(result), Logger); + _shapeTableMonitors.Invoke(ctx => ctx.Monitor(x.Monitor), Logger); + Logger.Information("Done building shape table"); return result; }); diff --git a/src/Orchard/DisplayManagement/Descriptors/Interfaces.cs b/src/Orchard/DisplayManagement/Descriptors/Interfaces.cs index 2841fb818..46e9caf9b 100644 --- a/src/Orchard/DisplayManagement/Descriptors/Interfaces.cs +++ b/src/Orchard/DisplayManagement/Descriptors/Interfaces.cs @@ -1,4 +1,6 @@ -using Orchard.Events; +using System; +using Orchard.Caching; +using Orchard.Events; namespace Orchard.DisplayManagement.Descriptors { @@ -14,4 +16,8 @@ namespace Orchard.DisplayManagement.Descriptors { void ShapeTableCreated(ShapeTable shapeTable); } + public interface IShapeTableMonitor : IDependency { + void Monitor(Action monitor); + } + }