From ffcccf7ae163ce5264863531318a46336e2eec10 Mon Sep 17 00:00:00 2001 From: paynecrl97 Date: Mon, 8 Jun 2015 10:47:16 +0100 Subject: [PATCH] Adds `ILayerEvaluationService` and implementation. The default implementation of this service is merely an abstraction of the logic that already existed in `WidgetFilter` --- .../Orchard.Widgets/Filters/WidgetFilter.cs | 34 +++---------- .../Orchard.Widgets/Orchard.Widgets.csproj | 2 + .../Orchard.Widgets/RuleEngine/RuleManager.cs | 3 +- .../Services/DefaultLayerEvaluationService.cs | 51 +++++++++++++++++++ .../Services/ILayerEvaluationService.cs | 8 +++ 5 files changed, 69 insertions(+), 29 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/Services/DefaultLayerEvaluationService.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/Services/ILayerEvaluationService.cs diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Filters/WidgetFilter.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Filters/WidgetFilter.cs index aa1f6ea6d..40301d9eb 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Filters/WidgetFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Filters/WidgetFilter.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Linq; using System.Web.Mvc; using Orchard.ContentManagement; using Orchard.ContentManagement.Aspects; @@ -9,25 +8,24 @@ using Orchard.Logging; using Orchard.Mvc.Filters; using Orchard.Themes; using Orchard.UI.Admin; -using Orchard.Widgets.Models; using Orchard.Widgets.Services; namespace Orchard.Widgets.Filters { public class WidgetFilter : FilterProvider, IResultFilter { private readonly IWorkContextAccessor _workContextAccessor; - private readonly IRuleManager _ruleManager; private readonly IWidgetsService _widgetsService; private readonly IOrchardServices _orchardServices; + private readonly ILayerEvaluationService _layerEvaluationService; public WidgetFilter( - IWorkContextAccessor workContextAccessor, - IRuleManager ruleManager, + IWorkContextAccessor workContextAccessor, IWidgetsService widgetsService, - IOrchardServices orchardServices) { + IOrchardServices orchardServices, + ILayerEvaluationService layerEvaluationService) { _workContextAccessor = workContextAccessor; - _ruleManager = ruleManager; _widgetsService = widgetsService; _orchardServices = orchardServices; + _layerEvaluationService = layerEvaluationService; Logger = NullLogger.Instance; T = NullLocalizer.Instance; } @@ -51,25 +49,7 @@ namespace Orchard.Widgets.Filters { return; } - // Once the Rule Engine is done: - // Get Layers and filter by zone and rule - // NOTE: .ForType("Layer") is faster than .Query() - IEnumerable activeLayers = _orchardServices.ContentManager.Query().ForType("Layer").List(); - - var activeLayerIds = new List(); - foreach (var activeLayer in activeLayers) { - // ignore the rule if it fails to execute - try { - if (_ruleManager.Matches(activeLayer.LayerRule)) { - activeLayerIds.Add(activeLayer.ContentItem.Id); - } - } - catch(Exception e) { - Logger.Warning(e, T("An error occured during layer evaluation on: {0}", activeLayer.Name).Text); - } - } - - IEnumerable widgetParts = _widgetsService.GetWidgets(layerIds: activeLayerIds.ToArray()); + var widgetParts = _widgetsService.GetWidgets(_layerEvaluationService.GetActiveLayerIds().ToArray()); // Build and add shape to zone. var zones = workContext.Layout.Zones; diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj index b198577f6..3a77a1a27 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj @@ -90,6 +90,8 @@ + + diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs index 0f5ad2245..cba7bc5e6 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using System.Security.Cryptography.X509Certificates; using Orchard.Localization; using Orchard.Scripting; using Orchard.Widgets.Services; @@ -21,7 +20,7 @@ namespace Orchard.Widgets.RuleEngine { public bool Matches(string expression) { var evaluator = _evaluators.FirstOrDefault(); if (evaluator == null) { - throw new OrchardException(T("There are currently not scripting engine enabled")); + throw new OrchardException(T("There are currently no scripting engines enabled")); } var result = evaluator.Evaluate(expression, new List { new GlobalMethodProvider(this) }); diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/DefaultLayerEvaluationService.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/DefaultLayerEvaluationService.cs new file mode 100644 index 000000000..a88580508 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/DefaultLayerEvaluationService.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using Orchard.Localization; +using Orchard.Logging; +using Orchard.Widgets.Models; +using Orchard.ContentManagement; + +namespace Orchard.Widgets.Services{ + public class DefaultLayerEvaluationService : ILayerEvaluationService { + private readonly IRuleManager _ruleManager; + private readonly IOrchardServices _orchardServices; + + public DefaultLayerEvaluationService(IRuleManager ruleManager, IOrchardServices orchardServices) { + _ruleManager = ruleManager; + _orchardServices = orchardServices; + + Logger = NullLogger.Instance; + T = NullLocalizer.Instance; + } + + public ILogger Logger { get; set; } + public Localizer T { get; private set; } + + public IEnumerable GetActiveLayerIds() + { + // Once the Rule Engine is done: + // Get Layers and filter by zone and rule + // NOTE: .ForType("Layer") is faster than .Query() + var activeLayers = _orchardServices.ContentManager.Query().ForType("Layer").List(); + + var activeLayerIds = new List(); + foreach (var activeLayer in activeLayers) + { + // ignore the rule if it fails to execute + try + { + if (_ruleManager.Matches(activeLayer.LayerRule)) + { + activeLayerIds.Add(activeLayer.ContentItem.Id); + } + } + catch (Exception e) + { + Logger.Warning(e, T("An error occured during layer evaluation on: {0}", activeLayer.Name).Text); + } + } + + return activeLayerIds; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/ILayerEvaluationService.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/ILayerEvaluationService.cs new file mode 100644 index 000000000..22bae241c --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/ILayerEvaluationService.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Orchard.Widgets.Services +{ + public interface ILayerEvaluationService : IDependency { + IEnumerable GetActiveLayerIds(); + } +} \ No newline at end of file