From 88cd8653961ebffdaa7a8e467eb8234fe6535fea Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 28 Sep 2012 17:49:37 -0700 Subject: [PATCH] #18930: Isolating fields in content handlers Work Item: 18930 --HG-- branch : 1.x --- .../Core/Common/Drivers/TextFieldDriver.cs | 12 ++++--- .../Drivers/ContentFieldDriver.cs | 32 +++++++++---------- .../ContentFieldDriverCoordinator.cs | 10 +++++- .../Handlers/BuildShapeContext.cs | 2 ++ .../Handlers/ContentContextBase.cs | 2 ++ .../Handlers/GetContentItemMetadataContext.cs | 3 ++ .../Handlers/ImportContentContext.cs | 1 + src/Orchard/InvokeExtensions.cs | 25 +++++++++++++++ 8 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs index cb473e5e0..08ff42425 100644 --- a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs +++ b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Web; using JetBrains.Annotations; @@ -37,10 +38,8 @@ namespace Orchard.Core.Common.Drivers { return ContentShape("Fields_Common_Text", GetDifferentiator(field, part), () => { var settings = field.PartFieldDefinition.Settings.GetModel(); - object fieldValue = field.Value; - fieldValue = new HtmlString(_htmlFilters.Aggregate(field.Value, (text, filter) => filter.ProcessContent(text, settings.Flavor))); - + object fieldValue = new HtmlString(_htmlFilters.Aggregate(field.Value, (text, filter) => filter.ProcessContent(text, settings.Flavor))); return shapeHelper.Fields_Common_Text(Name: field.Name, Value: fieldValue); }); } @@ -59,6 +58,11 @@ namespace Orchard.Core.Common.Drivers { } protected override DriverResult Editor(ContentPart part, TextField field, IUpdateModel updater, dynamic shapeHelper) { + + if(field.Name == "Note") { + throw new ArgumentException(); + } + var viewModel = new TextFieldDriverViewModel { Field = field, Text = field.Value, diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs index 1dcf4efcc..3a8a1f7c4 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs @@ -5,14 +5,15 @@ using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.MetaData; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Shapes; +using Orchard.Logging; namespace Orchard.ContentManagement.Drivers { public abstract class ContentFieldDriver : IContentFieldDriver where TField : ContentField, new() { protected virtual string Prefix { get { return ""; } } protected virtual string Zone { get { return "Content"; } } - void IContentFieldDriver.GetContentItemMetadata(GetContentItemMetadataContext context) { - Process(context.ContentItem, (part, field) => GetContentItemMetadata(part, field, context.Metadata)); + void IContentFieldDriver.GetContentItemMetadata(GetContentItemMetadataContext context) { + Process(context.ContentItem, (part, field) => GetContentItemMetadata(part, field, context.Metadata), context.Logger); } DriverResult IContentFieldDriver.BuildDisplayShape(BuildDisplayContext context) { @@ -25,7 +26,7 @@ namespace Orchard.ContentManagement.Drivers { } return result; - }); + }, context.Logger); } DriverResult IContentFieldDriver.BuildEditorShape(BuildEditorContext context) { @@ -38,7 +39,7 @@ namespace Orchard.ContentManagement.Drivers { } return result; - }); + }, context.Logger); } DriverResult IContentFieldDriver.UpdateEditorShape(UpdateEditorContext context) { @@ -51,40 +52,39 @@ namespace Orchard.ContentManagement.Drivers { } return result; - }); + }, context.Logger); } void IContentFieldDriver.Importing(ImportContentContext context) { - Process(context.ContentItem, (part, field) => Importing(part, field, context)); + Process(context.ContentItem, (part, field) => Importing(part, field, context), context.Logger); } void IContentFieldDriver.Imported(ImportContentContext context) { - Process(context.ContentItem, (part, field) => Imported(part, field, context)); + Process(context.ContentItem, (part, field) => Imported(part, field, context), context.Logger); } void IContentFieldDriver.Exporting(ExportContentContext context) { - Process(context.ContentItem, (part, field) => Exporting(part, field, context)); + Process(context.ContentItem, (part, field) => Exporting(part, field, context), context.Logger); } void IContentFieldDriver.Exported(ExportContentContext context) { - Process(context.ContentItem, (part, field) => Exported(part, field, context)); + Process(context.ContentItem, (part, field) => Exported(part, field, context), context.Logger); } void IContentFieldDriver.Describe(DescribeMembersContext context) { Describe(context); } - void Process(ContentItem item, Action effort) { + void Process(ContentItem item, Action effort, ILogger logger) { var occurences = item.Parts.SelectMany(part => part.Fields.OfType().Select(field => new { part, field })); - foreach (var occurence in occurences) { - effort(occurence.part, occurence.field); - } + occurences.Invoke(pf => effort(pf.part, pf.field), logger); } - DriverResult Process(ContentItem item, Func effort) { + DriverResult Process(ContentItem item, Func effort, ILogger logger) { var results = item.Parts - .SelectMany(part => part.Fields.OfType().Select(field => new { part, field })) - .Select(pf => effort(pf.part, pf.field)); + .SelectMany(part => part.Fields.OfType().Select(field => new { part, field })) + .Invoke(pf => effort(pf.part, pf.field), logger); + return Combined(results.ToArray()); } diff --git a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs index 7b66700cc..5583b779e 100644 --- a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs +++ b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs @@ -25,7 +25,7 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { public ILogger Logger { get; set; } public override void Initializing(InitializingContentContext context) { - var fieldInfos = _drivers.SelectMany(x => x.GetFieldInfo()); + var fieldInfos = _drivers.SelectMany(x => x.GetFieldInfo()).ToArray(); var parts = context.ContentItem.Parts; foreach (var contentPart in parts) { foreach (var partFieldDefinition in contentPart.PartDefinition.Fields) { @@ -46,11 +46,13 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { } public override void GetContentItemMetadata(GetContentItemMetadataContext context) { + context.Logger = Logger; _drivers.Invoke(driver => driver.GetContentItemMetadata(context), Logger); } public override void BuildDisplay(BuildDisplayContext context) { _drivers.Invoke(driver => { + context.Logger = Logger; var result = driver.BuildDisplayShape(context); if (result != null) result.Apply(context); @@ -59,6 +61,7 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { public override void BuildEditor(BuildEditorContext context) { _drivers.Invoke(driver => { + context.Logger = Logger; var result = driver.BuildEditorShape(context); if (result != null) result.Apply(context); @@ -67,6 +70,7 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { public override void UpdateEditor(UpdateEditorContext context) { _drivers.Invoke(driver => { + context.Logger = Logger; var result = driver.UpdateEditorShape(context); if (result != null) result.Apply(context); @@ -74,24 +78,28 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { } public override void Importing(ImportContentContext context) { + context.Logger = Logger; foreach (var contentFieldDriver in _drivers) { contentFieldDriver.Importing(context); } } public override void Imported(ImportContentContext context) { + context.Logger = Logger; foreach (var contentFieldDriver in _drivers) { contentFieldDriver.Imported(context); } } public override void Exporting(ExportContentContext context) { + context.Logger = Logger; foreach (var contentFieldDriver in _drivers) { contentFieldDriver.Exporting(context); } } public override void Exported(ExportContentContext context) { + context.Logger = Logger; foreach (var contentFieldDriver in _drivers) { contentFieldDriver.Exported(context); } diff --git a/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs b/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs index 1692199a9..56debf7e1 100644 --- a/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs +++ b/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs @@ -1,6 +1,7 @@ using System; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Logging; namespace Orchard.ContentManagement.Handlers { public class BuildShapeContext { @@ -20,6 +21,7 @@ namespace Orchard.ContentManagement.Handlers { public IShape Layout { get; set; } public string GroupId { get; private set; } public ContentPart ContentPart { get; set; } + public ILogger Logger { get; set; } public Func FindPlacement { get; set; } } diff --git a/src/Orchard/ContentManagement/Handlers/ContentContextBase.cs b/src/Orchard/ContentManagement/Handlers/ContentContextBase.cs index 26de6bd77..76855d057 100644 --- a/src/Orchard/ContentManagement/Handlers/ContentContextBase.cs +++ b/src/Orchard/ContentManagement/Handlers/ContentContextBase.cs @@ -1,4 +1,5 @@ using Orchard.ContentManagement.Records; +using Orchard.Logging; namespace Orchard.ContentManagement.Handlers { public class ContentContextBase { @@ -15,5 +16,6 @@ namespace Orchard.ContentManagement.Handlers { public ContentItem ContentItem { get; private set; } public ContentItemRecord ContentItemRecord { get; private set; } public IContentManager ContentManager { get; private set; } + public ILogger Logger { get; set; } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Handlers/GetContentItemMetadataContext.cs b/src/Orchard/ContentManagement/Handlers/GetContentItemMetadataContext.cs index 6e9779854..73b6dc132 100644 --- a/src/Orchard/ContentManagement/Handlers/GetContentItemMetadataContext.cs +++ b/src/Orchard/ContentManagement/Handlers/GetContentItemMetadataContext.cs @@ -1,6 +1,9 @@ +using Orchard.Logging; + namespace Orchard.ContentManagement.Handlers { public class GetContentItemMetadataContext { public ContentItem ContentItem { get; set; } public ContentItemMetadata Metadata { get; set; } + public ILogger Logger { get; set; } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Handlers/ImportContentContext.cs b/src/Orchard/ContentManagement/Handlers/ImportContentContext.cs index 73f4fa8e5..5d90d4053 100644 --- a/src/Orchard/ContentManagement/Handlers/ImportContentContext.cs +++ b/src/Orchard/ContentManagement/Handlers/ImportContentContext.cs @@ -6,6 +6,7 @@ namespace Orchard.ContentManagement.Handlers { public XElement Data { get; set; } private ImportContentSession Session { get; set; } + public ImportContentContext(ContentItem contentItem, XElement data, ImportContentSession importContentSession) : base(contentItem) { Data = data; diff --git a/src/Orchard/InvokeExtensions.cs b/src/Orchard/InvokeExtensions.cs index 86c67a073..d4dfc8d57 100644 --- a/src/Orchard/InvokeExtensions.cs +++ b/src/Orchard/InvokeExtensions.cs @@ -31,6 +31,31 @@ namespace Orchard { } } + public static IEnumerable Invoke(this IEnumerable events, Func dispatch, ILogger logger) { + + foreach (var sink in events) { + TResult result = default(TResult); + try { + result = dispatch(sink); + } + catch (Exception ex) { + if (IsLogged(ex)) { + logger.Error(ex, "{2} thrown from {0} by {1}", + typeof(TEvents).Name, + sink.GetType().FullName, + ex.GetType().Name); + } + + if (ex.IsFatal()) { + throw; + } + } + + yield return result; + } + } + + private static bool IsLogged(Exception ex) { return ex is OrchardSecurityException || !ex.IsFatal(); }