From 6540479d481de14640ff1145f1ecbd81fd9d03f7 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 24 Jun 2010 14:35:18 -0700 Subject: [PATCH] Point where basic infoset-based storage of fields is working Moved some namespaces to reorganize some parts of code Created a field storage api and default implementation Added InfosetPart that's always welded as mechanism to reach versioned and non-versioned ad-hoc data --HG-- branch : dev --- .../FieldStorageProviderSelectorTests.cs | 5 ++- .../InfosetFieldStorageProviderTests.cs | 5 ++- .../Common/Drivers/TextContentFieldDriver.cs | 45 ------------------- .../Core/Common/Drivers/TextFieldDriver.cs | 34 ++++++++++++++ .../Core/Common/Fields/TextContentField.cs | 10 ----- .../Core/Common/Fields/TextField.cs | 10 +++++ .../TextContentFieldDisplayViewModel.cs | 2 +- .../TextContentFieldEditorViewModel.cs | 6 +-- .../Fields/Common.TextContentField.ascx | 3 -- .../Fields/Common.TextField.ascx | 2 + .../Fields/Common.TextContentField.ascx | 7 --- .../Fields/Common.TextField.ascx | 6 +++ src/Orchard.Web/Core/Orchard.Core.csproj | 8 ++-- .../Core/Routable/Drivers/RoutableDriver.cs | 2 +- .../Metadata/ContentDefinitionManager.cs | 8 ++-- .../DefaultContentManager.cs | 12 ++--- .../Drivers/ContentFieldDriver.cs | 30 ++++++------- .../ContentFieldDriverCoordinator.cs | 2 +- .../ContentPartDriverCoordinator.cs | 41 +++++++++-------- .../FieldStorageProviderSelector.cs | 5 +-- .../FieldStorage/IFieldStorage.cs | 2 +- .../FieldStorage/IFieldStorageProvider.cs | 2 +- .../IFieldStorageProviderSelector.cs | 2 +- .../FieldStorage/InfosetStorage/Infoset.cs | 26 +++++++++++ .../InfosetStorage/InfosetHandler.cs | 34 ++++++++++++++ .../InfosetStorage/InfosetPart.cs | 11 +++++ .../InfosetStorage/InfosetStorageProvider.cs} | 9 ++-- .../Builders/ContentPartDefinitionBuilder.cs | 13 +++--- .../MetaData/ContentFieldInfo.cs | 2 +- .../MetaData/Models/ContentPartDefinition.cs | 11 +++-- .../Services/ContentDefinitionReader.cs | 6 +-- .../Records/ContentItemAlteration.cs | 2 + .../Records/ContentItemRecord.cs | 28 ++---------- .../Records/ContentItemVersionRecord.cs | 13 +++++- src/Orchard/Orchard.Framework.csproj | 13 +++--- 35 files changed, 240 insertions(+), 177 deletions(-) delete mode 100644 src/Orchard.Web/Core/Common/Drivers/TextContentFieldDriver.cs create mode 100644 src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs delete mode 100644 src/Orchard.Web/Core/Common/Fields/TextContentField.cs create mode 100644 src/Orchard.Web/Core/Common/Fields/TextField.cs delete mode 100644 src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextContentField.ascx create mode 100644 src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextField.ascx delete mode 100644 src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextContentField.ascx create mode 100644 src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextField.ascx rename src/Orchard/ContentManagement/{Drivers => }/FieldStorage/FieldStorageProviderSelector.cs (88%) rename src/Orchard/ContentManagement/{Drivers => }/FieldStorage/IFieldStorage.cs (70%) rename src/Orchard/ContentManagement/{Drivers => }/FieldStorage/IFieldStorageProvider.cs (81%) rename src/Orchard/ContentManagement/{Drivers => }/FieldStorage/IFieldStorageProviderSelector.cs (77%) create mode 100644 src/Orchard/ContentManagement/FieldStorage/InfosetStorage/Infoset.cs create mode 100644 src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetHandler.cs create mode 100644 src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetPart.cs rename src/Orchard/ContentManagement/{Drivers/FieldStorage/InfosetFieldStorageProvider.cs => FieldStorage/InfosetStorage/InfosetStorageProvider.cs} (83%) diff --git a/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/FieldStorageProviderSelectorTests.cs b/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/FieldStorageProviderSelectorTests.cs index 824e33532..17a8859ef 100644 --- a/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/FieldStorageProviderSelectorTests.cs +++ b/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/FieldStorageProviderSelectorTests.cs @@ -3,7 +3,8 @@ using System.Linq; using Autofac; using NUnit.Framework; using Orchard.ContentManagement; -using Orchard.ContentManagement.Drivers.FieldStorage; +using Orchard.ContentManagement.FieldStorage; +using Orchard.ContentManagement.FieldStorage.InfosetStorage; using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Models; @@ -17,7 +18,7 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage { public void Init() { var builder = new ContainerBuilder(); builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); _container = builder.Build(); diff --git a/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs b/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs index 11c84be71..740e433cc 100644 --- a/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs +++ b/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs @@ -5,7 +5,8 @@ using System.Text; using Autofac; using NUnit.Framework; using Orchard.ContentManagement; -using Orchard.ContentManagement.Drivers.FieldStorage; +using Orchard.ContentManagement.FieldStorage; +using Orchard.ContentManagement.FieldStorage.InfosetStorage; using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.Records; @@ -18,7 +19,7 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage { [SetUp] public void Init() { var builder = new ContainerBuilder(); - builder.RegisterType().As(); + builder.RegisterType().As(); _container = builder.Build(); _provider = _container.Resolve(); diff --git a/src/Orchard.Web/Core/Common/Drivers/TextContentFieldDriver.cs b/src/Orchard.Web/Core/Common/Drivers/TextContentFieldDriver.cs deleted file mode 100644 index fc438a4b8..000000000 --- a/src/Orchard.Web/Core/Common/Drivers/TextContentFieldDriver.cs +++ /dev/null @@ -1,45 +0,0 @@ -using JetBrains.Annotations; -using Orchard.ContentManagement; -using Orchard.ContentManagement.Drivers; -using Orchard.Core.Common.Fields; -using Orchard.Core.Common.ViewModels; - -namespace Orchard.Core.Common.Drivers { - [UsedImplicitly] - public class TextContentFieldDriver : ContentFieldDriver { - public IOrchardServices Services { get; set; } - private const string TemplateName = "Fields/Common.TextContentField"; - - public TextContentFieldDriver(IOrchardServices services) { - Services = services; - } - - protected override string Prefix { - get { return "TextContentField"; } - } - - protected override DriverResult Display(TextContentField field, string displayType) { - var model = new TextContentFieldDisplayViewModel { Text = field }; - - return ContentFieldTemplate(model, TemplateName, Prefix); - - } - - protected override DriverResult Editor(TextContentField field) { - var model = BuildEditorViewModel(field); - return ContentFieldTemplate(model, TemplateName, Prefix).Location("primary", "5"); - } - - protected override DriverResult Editor(TextContentField field, IUpdateModel updater) { - var model = BuildEditorViewModel(field); - updater.TryUpdateModel(model, Prefix, null, null); - return ContentFieldTemplate(model, TemplateName, Prefix).Location("primary", "5"); - } - - private static TextContentFieldEditorViewModel BuildEditorViewModel(TextContentField field) { - return new TextContentFieldEditorViewModel { - TextContentField = field - }; - } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs new file mode 100644 index 000000000..fb37f7b85 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs @@ -0,0 +1,34 @@ +using JetBrains.Annotations; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.Core.Common.Fields; + +namespace Orchard.Core.Common.Drivers { + [UsedImplicitly] + public class TextFieldDriver : ContentFieldDriver { + public IOrchardServices Services { get; set; } + private const string TemplateName = "Fields/Common.TextField"; + + public TextFieldDriver(IOrchardServices services) { + Services = services; + } + + private static string GetPrefix(TextField field, ContentPart part) { + return part.PartDefinition.Name + "." + field.Name; + } + + protected override DriverResult Display(ContentPart part, TextField field, string displayType) { + return ContentFieldTemplate(field, TemplateName, GetPrefix(field, part)); + } + + protected override DriverResult Editor(ContentPart part, TextField field) { + return ContentFieldTemplate(field, TemplateName, GetPrefix(field, part)).Location("primary", "5"); + } + + protected override DriverResult Editor(ContentPart part, TextField field, IUpdateModel updater) { + updater.TryUpdateModel(field, GetPrefix(field, part), null, null); + return Editor(part, field); + } + + } +} diff --git a/src/Orchard.Web/Core/Common/Fields/TextContentField.cs b/src/Orchard.Web/Core/Common/Fields/TextContentField.cs deleted file mode 100644 index 5bd7d5968..000000000 --- a/src/Orchard.Web/Core/Common/Fields/TextContentField.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Orchard.ContentManagement; - -namespace Orchard.Core.Common.Fields { - public class TextContentField : ContentField { - public string TextField { - get { return Getter("text"); } - set { Setter("text", value); } - } - } -} diff --git a/src/Orchard.Web/Core/Common/Fields/TextField.cs b/src/Orchard.Web/Core/Common/Fields/TextField.cs new file mode 100644 index 000000000..a7df68bd4 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Fields/TextField.cs @@ -0,0 +1,10 @@ +using Orchard.ContentManagement; + +namespace Orchard.Core.Common.Fields { + public class TextField : ContentField { + public string Value { + get { return Getter(null); } + set { Setter(null, value); } + } + } +} diff --git a/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldDisplayViewModel.cs b/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldDisplayViewModel.cs index f738aa305..65e75124d 100644 --- a/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldDisplayViewModel.cs +++ b/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldDisplayViewModel.cs @@ -2,6 +2,6 @@ namespace Orchard.Core.Common.ViewModels { public class TextContentFieldDisplayViewModel { - public TextContentField Text { get; set; } + public TextField Text { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldEditorViewModel.cs b/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldEditorViewModel.cs index f84408110..092686d08 100644 --- a/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldEditorViewModel.cs +++ b/src/Orchard.Web/Core/Common/ViewModels/TextContentFieldEditorViewModel.cs @@ -3,12 +3,12 @@ using Orchard.Core.Common.Fields; namespace Orchard.Core.Common.ViewModels { public class TextContentFieldEditorViewModel { - public TextContentField TextContentField { get; set; } + public TextField TextField { get; set; } [Required] public string Text { - get { return TextContentField.TextField; } - set { TextContentField.TextField = value; } + get { return TextField.Value; } + set { TextField.Value = value; } } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextContentField.ascx b/src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextContentField.ascx deleted file mode 100644 index 3ce167d1b..000000000 --- a/src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextContentField.ascx +++ /dev/null @@ -1,3 +0,0 @@ -<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Core.Common.ViewModels"%> -<%=Model.Text %> \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextField.ascx b/src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextField.ascx new file mode 100644 index 000000000..7b32c89e6 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Views/DisplayTemplates/Fields/Common.TextField.ascx @@ -0,0 +1,2 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +<%: Model.Value %> \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextContentField.ascx b/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextContentField.ascx deleted file mode 100644 index 09297e597..000000000 --- a/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextContentField.ascx +++ /dev/null @@ -1,7 +0,0 @@ -<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Core.Common.ViewModels"%> -
- <%: Html.LabelFor(m=>m.Text) %> - <%: Html.EditorFor(m=>m.Text) %> - <%: Html.ValidationMessageFor(m=>m.Text) %> -
\ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextField.ascx b/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextField.ascx new file mode 100644 index 000000000..b0efc7830 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields/Common.TextField.ascx @@ -0,0 +1,6 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +
+ + <%: Html.EditorFor(m=>m.Value) %> + <%: Html.ValidationMessageFor(m=>m.Value) %> +
diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 3ea26f65c..9c5b2fbe2 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -65,8 +65,8 @@ - - + + @@ -202,9 +202,9 @@ - + + - diff --git a/src/Orchard.Web/Core/Routable/Drivers/RoutableDriver.cs b/src/Orchard.Web/Core/Routable/Drivers/RoutableDriver.cs index 4280fbcf5..b9b7fdbcc 100644 --- a/src/Orchard.Web/Core/Routable/Drivers/RoutableDriver.cs +++ b/src/Orchard.Web/Core/Routable/Drivers/RoutableDriver.cs @@ -59,7 +59,7 @@ namespace Orchard.Core.Routable.Drivers { // TEMP: path format patterns replaces this logic var path = part.Record.Path; - if (path.EndsWith(part.Slug)) { + if (path != null && path.EndsWith(part.Slug)) { model.DisplayLeadingPath = path.Substring(0, path.Length - part.Slug.Length); } diff --git a/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs b/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs index 0523889b6..ee5bed54c 100644 --- a/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs +++ b/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs @@ -57,7 +57,7 @@ namespace Orchard.Core.Settings.Metadata { private ContentTypeDefinitionRecord Acquire(ContentTypeDefinition contentTypeDefinition) { var result = _typeDefinitionRepository.Fetch(x => x.Name == contentTypeDefinition.Name).SingleOrDefault(); if (result == null) { - result = new ContentTypeDefinitionRecord { Name = contentTypeDefinition.Name, DisplayName = contentTypeDefinition.DisplayName}; + result = new ContentTypeDefinitionRecord { Name = contentTypeDefinition.Name, DisplayName = contentTypeDefinition.DisplayName }; _typeDefinitionRepository.Create(result); } return result; @@ -111,7 +111,7 @@ namespace Orchard.Core.Settings.Metadata { record.Settings = _settingsWriter.Map(model.Settings).ToString(); var toRemove = record.ContentPartFieldDefinitionRecords - .Where(fieldDefinitionRecord => !model.Fields.Any(field => fieldDefinitionRecord.ContentFieldDefinitionRecord.Name == field.FieldDefinition.Name)) + .Where(partFieldDefinitionRecord => model.Fields.Any(partField => partFieldDefinitionRecord.Name == partField.Name)) .ToList(); foreach (var remove in toRemove) { @@ -120,9 +120,9 @@ namespace Orchard.Core.Settings.Metadata { foreach (var field in model.Fields) { var fieldName = field.FieldDefinition.Name; - var partFieldRecord = record.ContentPartFieldDefinitionRecords.SingleOrDefault(r => r.ContentFieldDefinitionRecord.Name == fieldName); + var partFieldRecord = record.ContentPartFieldDefinitionRecords.SingleOrDefault(r => r.Name == fieldName); if (partFieldRecord == null) { - partFieldRecord = new ContentPartFieldDefinitionRecord { + partFieldRecord = new ContentPartFieldDefinitionRecord { ContentFieldDefinitionRecord = Acquire(field.FieldDefinition), Name = field.Name }; diff --git a/src/Orchard/ContentManagement/DefaultContentManager.cs b/src/Orchard/ContentManagement/DefaultContentManager.cs index 6457da247..af8338985 100644 --- a/src/Orchard/ContentManagement/DefaultContentManager.cs +++ b/src/Orchard/ContentManagement/DefaultContentManager.cs @@ -79,10 +79,9 @@ namespace Orchard.ContentManagement { } var context3 = new InitializingContentContext { - ContentType = contentType, - ContentItem = context.Builder.Build() + ContentType = context2.ContentType, + ContentItem = context2.ContentItem, }; - context3.ContentItem.ContentManager = this; foreach (var handler in Handlers) { handler.Initializing(context3); @@ -276,7 +275,8 @@ namespace Orchard.ContentManagement { var buildingItemVersionRecord = new ContentItemVersionRecord { ContentItemRecord = contentItemRecord, Latest = true, - Published = false + Published = false, + Data = existingItemVersionRecord.Data, }; @@ -435,11 +435,11 @@ namespace Orchard.ContentManagement { var indexContentContext = new IndexContentContext(contentItem, documentIndex); // dispatch to handlers to retrieve index information - foreach ( var handler in Handlers ) { + foreach (var handler in Handlers) { handler.Indexing(indexContentContext); } - foreach ( var handler in Handlers ) { + foreach (var handler in Handlers) { handler.Indexed(indexContentContext); } } diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs index 3acce05ed..7338874c1 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; -using Orchard.ContentManagement.Drivers.FieldStorage; using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData.Models; @@ -11,23 +11,21 @@ namespace Orchard.ContentManagement.Drivers { protected virtual string Zone { get { return "body"; } } DriverResult IContentFieldDriver.BuildDisplayModel(BuildDisplayModelContext context) { - var results = context.ContentItem.Parts.SelectMany(part => part.Fields). - OfType(). - Select(field => Display(field, context.DisplayType)); - return Combined(results.ToArray()); + return Process(context.ContentItem, (part, field) => Display(part, field, context.DisplayType)); } DriverResult IContentFieldDriver.BuildEditorModel(BuildEditorModelContext context) { - var results = context.ContentItem.Parts.SelectMany(part => part.Fields). - OfType(). - Select(field => Editor(field)); - return Combined(results.ToArray()); + return Process(context.ContentItem, (part, field) => Editor(part, field)); } DriverResult IContentFieldDriver.UpdateEditorModel(UpdateEditorModelContext context) { - var results = context.ContentItem.Parts.SelectMany(part => part.Fields). - OfType(). - Select(field => Editor(field, context.Updater)); + return Process(context.ContentItem, (part, field) => Editor(part, field, context.Updater)); + } + + DriverResult Process(ContentItem item, Func effort) { + var results = item.Parts + .SelectMany(part => part.Fields.OfType().Select(field => new { part, field })) + .Select(pf => effort(pf.part, pf.field)); return Combined(results.ToArray()); } @@ -47,9 +45,9 @@ namespace Orchard.ContentManagement.Drivers { } - protected virtual DriverResult Display(TField field, string displayType) { return null; } - protected virtual DriverResult Editor(TField field) { return null; } - protected virtual DriverResult Editor(TField field, IUpdateModel updater) { return null; } + protected virtual DriverResult Display(ContentPart part, TField field, string displayType) { return null; } + protected virtual DriverResult Editor(ContentPart part, TField field) { return null; } + protected virtual DriverResult Editor(ContentPart part, TField field, IUpdateModel updater) { return null; } public ContentTemplateResult ContentFieldTemplate(object model) { diff --git a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs index b1788149c..83f584542 100644 --- a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs +++ b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; -using Orchard.ContentManagement.Drivers.FieldStorage; +using Orchard.ContentManagement.FieldStorage; using Orchard.ContentManagement.Handlers; using Orchard.Logging; diff --git a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs index 465fccb41..2bf714406 100644 --- a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs +++ b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs @@ -18,43 +18,46 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { } public ILogger Logger { get; set; } - + public override void Activating(ActivatingContentContext context) { var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(context.ContentType); if (contentTypeDefinition == null) return; - foreach (var partInfo in _drivers.SelectMany(cpp => cpp.GetPartInfo())) { - var partName = partInfo.PartName; - var typePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(p => p.PartDefinition.Name == partName); - if (typePartDefinition != null) { - context.Builder.Weld(partInfo.Factory(typePartDefinition)); - } + var partInfos = _drivers.SelectMany(cpp => cpp.GetPartInfo()); + + foreach (var typePartDefinition in contentTypeDefinition.Parts) { + var partName = typePartDefinition.PartDefinition.Name; + var partInfo = partInfos.FirstOrDefault(pi => pi.PartName == partName); + var part = partInfo != null + ? partInfo.Factory(typePartDefinition) + : new ContentPart { TypePartDefinition = typePartDefinition }; + context.Builder.Weld(part); } } public override void BuildDisplayModel(BuildDisplayModelContext context) { _drivers.Invoke(driver => { - var result = driver.BuildDisplayModel(context); - if (result != null) - result.Apply(context); - }, Logger); + var result = driver.BuildDisplayModel(context); + if (result != null) + result.Apply(context); + }, Logger); } public override void BuildEditorModel(BuildEditorModelContext context) { _drivers.Invoke(driver => { - var result = driver.BuildEditorModel(context); - if (result != null) - result.Apply(context); - }, Logger); + var result = driver.BuildEditorModel(context); + if (result != null) + result.Apply(context); + }, Logger); } public override void UpdateEditorModel(UpdateEditorModelContext context) { _drivers.Invoke(driver => { - var result = driver.UpdateEditorModel(context); - if (result != null) - result.Apply(context); - }, Logger); + var result = driver.UpdateEditorModel(context); + if (result != null) + result.Apply(context); + }, Logger); } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/FieldStorage/FieldStorageProviderSelector.cs b/src/Orchard/ContentManagement/FieldStorage/FieldStorageProviderSelector.cs similarity index 88% rename from src/Orchard/ContentManagement/Drivers/FieldStorage/FieldStorageProviderSelector.cs rename to src/Orchard/ContentManagement/FieldStorage/FieldStorageProviderSelector.cs index 818b1f64b..201bdf922 100644 --- a/src/Orchard/ContentManagement/Drivers/FieldStorage/FieldStorageProviderSelector.cs +++ b/src/Orchard/ContentManagement/FieldStorage/FieldStorageProviderSelector.cs @@ -1,9 +1,8 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Orchard.ContentManagement.MetaData.Models; -namespace Orchard.ContentManagement.Drivers.FieldStorage { +namespace Orchard.ContentManagement.FieldStorage { public class FieldStorageProviderSelector : IFieldStorageProviderSelector { public const string Storage = "Storage"; public const string DefaultProviderName = "Infoset"; diff --git a/src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorage.cs b/src/Orchard/ContentManagement/FieldStorage/IFieldStorage.cs similarity index 70% rename from src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorage.cs rename to src/Orchard/ContentManagement/FieldStorage/IFieldStorage.cs index 9fe9b702e..9a5a6edf4 100644 --- a/src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorage.cs +++ b/src/Orchard/ContentManagement/FieldStorage/IFieldStorage.cs @@ -1,6 +1,6 @@ using System; -namespace Orchard.ContentManagement.Drivers.FieldStorage { +namespace Orchard.ContentManagement.FieldStorage { public interface IFieldStorage { Func Getter { get; } Action Setter { get; } diff --git a/src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorageProvider.cs b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageProvider.cs similarity index 81% rename from src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorageProvider.cs rename to src/Orchard/ContentManagement/FieldStorage/IFieldStorageProvider.cs index 879789207..ee715e75d 100644 --- a/src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorageProvider.cs +++ b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageProvider.cs @@ -1,6 +1,6 @@ using Orchard.ContentManagement.MetaData.Models; -namespace Orchard.ContentManagement.Drivers.FieldStorage { +namespace Orchard.ContentManagement.FieldStorage { public interface IFieldStorageProvider : IDependency { string ProviderName { get; } diff --git a/src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorageProviderSelector.cs b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageProviderSelector.cs similarity index 77% rename from src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorageProviderSelector.cs rename to src/Orchard/ContentManagement/FieldStorage/IFieldStorageProviderSelector.cs index a454575cd..f09423d5e 100644 --- a/src/Orchard/ContentManagement/Drivers/FieldStorage/IFieldStorageProviderSelector.cs +++ b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageProviderSelector.cs @@ -1,6 +1,6 @@ using Orchard.ContentManagement.MetaData.Models; -namespace Orchard.ContentManagement.Drivers.FieldStorage { +namespace Orchard.ContentManagement.FieldStorage { public interface IFieldStorageProviderSelector : IDependency { IFieldStorageProvider GetProvider(ContentPartDefinition.Field partFieldDefinition); } diff --git a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/Infoset.cs b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/Infoset.cs new file mode 100644 index 000000000..1dd390671 --- /dev/null +++ b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/Infoset.cs @@ -0,0 +1,26 @@ +using System.Xml.Linq; + +namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { + public class Infoset { + private XElement _element; + + private void SetElement(XElement value) { + _element = value; + } + + public XElement Element { + get { + return _element ?? (_element = new XElement("Data")); + } + } + + public string Data { + get { + return _element == null ? null : Element.ToString(SaveOptions.DisableFormatting); + } + set { + SetElement(string.IsNullOrEmpty(value) ? null : XElement.Parse(value, LoadOptions.PreserveWhitespace)); + } + } + } +} diff --git a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetHandler.cs b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetHandler.cs new file mode 100644 index 000000000..78b9469fd --- /dev/null +++ b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetHandler.cs @@ -0,0 +1,34 @@ +using Orchard.ContentManagement.Handlers; + +namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { + public class InfosetHandler : ContentHandlerBase { + public override void Activating(ActivatingContentContext context) { + context.Builder.Weld(); + } + + public override void Creating(CreateContentContext context) { + var infosetPart = context.ContentItem.As(); + if (infosetPart != null) { + context.ContentItemRecord.Data = infosetPart.Infoset.Data; + context.ContentItemVersionRecord.Data = infosetPart.VersionInfoset.Data; + + infosetPart.Infoset = context.ContentItemRecord.Infoset; + infosetPart.VersionInfoset = context.ContentItemVersionRecord.Infoset; + } + } + public override void Loading(LoadContentContext context) { + var infosetPart = context.ContentItem.As(); + if (infosetPart != null) { + infosetPart.Infoset = context.ContentItemRecord.Infoset; + infosetPart.VersionInfoset = context.ContentItemVersionRecord.Infoset; + } + } + public override void Versioning(VersionContentContext context) { + var infosetPart = context.BuildingContentItem.As(); + if (infosetPart != null) { + infosetPart.Infoset = context.ContentItemRecord.Infoset; + infosetPart.VersionInfoset = context.BuildingItemVersionRecord.Infoset; + } + } + } +} \ No newline at end of file diff --git a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetPart.cs b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetPart.cs new file mode 100644 index 000000000..e0d74bd10 --- /dev/null +++ b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetPart.cs @@ -0,0 +1,11 @@ +namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { + public class InfosetPart : ContentPart { + public InfosetPart() { + Infoset = new Infoset(); + VersionInfoset = new Infoset(); + } + + public Infoset Infoset { get; set; } + public Infoset VersionInfoset { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProvider.cs b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs similarity index 83% rename from src/Orchard/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProvider.cs rename to src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs index 10623e57d..bcff1def3 100644 --- a/src/Orchard/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProvider.cs +++ b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs @@ -3,8 +3,8 @@ using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement.MetaData.Models; -namespace Orchard.ContentManagement.Drivers.FieldStorage { - public class InfosetFieldStorageProvider : IFieldStorageProvider { +namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { + public class InfosetStorageProvider : IFieldStorageProvider { public string ProviderName { get { return FieldStorageProviderSelector.DefaultProviderName; } } @@ -12,10 +12,11 @@ namespace Orchard.ContentManagement.Drivers.FieldStorage { public IFieldStorage BindStorage(ContentPart contentPart, ContentPartDefinition.Field partFieldDefinition) { var partName = XmlConvert.EncodeLocalName(contentPart.PartDefinition.Name); var fieldName = XmlConvert.EncodeLocalName(partFieldDefinition.Name); + var infosetPart = contentPart.As(); return new Storage { - Getter = name => Get(contentPart.ContentItem.Record.Infoset.Element, partName, fieldName, name), - Setter = (name, value) => Set(contentPart.ContentItem.Record.Infoset.Element, partName, fieldName, name, value) + Getter = name => Get(infosetPart.Infoset.Element, partName, fieldName, name), + Setter = (name, value) => Set(infosetPart.Infoset.Element, partName, fieldName, name, value) }; } diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs index 1694e8aac..eb61fbfa2 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs @@ -52,13 +52,16 @@ namespace Orchard.ContentManagement.MetaData.Builders { } public ContentPartDefinitionBuilder WithField(string fieldName, Action configuration) { - var fieldDefinition = new ContentFieldDefinition(fieldName); - var existingField = _fields.SingleOrDefault(x => x.FieldDefinition.Name == fieldDefinition.Name); + + var existingField = _fields.FirstOrDefault(x => x.Name == fieldName); if (existingField != null) { - _fields.Remove(existingField); + var toRemove = _fields.Where(x => x.Name == fieldName).ToArray(); + foreach (var remove in toRemove) { + _fields.Remove(remove); + } } else { - existingField = new ContentPartDefinition.Field(fieldDefinition, fieldName, new SettingsDictionary()); + existingField = new ContentPartDefinition.Field(fieldName); } var configurer = new FieldConfigurerImpl(existingField); configuration(configurer); @@ -84,7 +87,7 @@ namespace Orchard.ContentManagement.MetaData.Builders { class FieldConfigurerImpl : FieldConfigurer { private ContentFieldDefinition _fieldDefinition; - private string _fieldName; + private readonly string _fieldName; public FieldConfigurerImpl(ContentPartDefinition.Field field) : base(field) { diff --git a/src/Orchard/ContentManagement/MetaData/ContentFieldInfo.cs b/src/Orchard/ContentManagement/MetaData/ContentFieldInfo.cs index 39fbb4a92..479cf1d86 100644 --- a/src/Orchard/ContentManagement/MetaData/ContentFieldInfo.cs +++ b/src/Orchard/ContentManagement/MetaData/ContentFieldInfo.cs @@ -1,5 +1,5 @@ using System; -using Orchard.ContentManagement.Drivers.FieldStorage; +using Orchard.ContentManagement.FieldStorage; using Orchard.ContentManagement.MetaData.Models; namespace Orchard.ContentManagement.MetaData { diff --git a/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs b/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs index f4ecf6478..10d38079b 100644 --- a/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs +++ b/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs @@ -10,7 +10,7 @@ namespace Orchard.ContentManagement.MetaData.Models { Settings = settings; } - public ContentPartDefinition(string name) { + public ContentPartDefinition(string name) { Name = name; Fields = Enumerable.Empty(); Settings = new SettingsDictionary(); @@ -21,9 +21,14 @@ namespace Orchard.ContentManagement.MetaData.Models { public SettingsDictionary Settings { get; private set; } public class Field { - public Field(ContentFieldDefinition contentFieldDefinition, string name, SettingsDictionary settings) { - FieldDefinition = contentFieldDefinition; + public Field(string name) { Name = name; + FieldDefinition = new ContentFieldDefinition(null); + Settings = new SettingsDictionary(); + } + public Field( ContentFieldDefinition contentFieldDefinition, string name, SettingsDictionary settings) { + Name = name; + FieldDefinition = contentFieldDefinition; Settings = settings; } diff --git a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs index ab44c6b65..d287ccbdc 100644 --- a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs +++ b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs @@ -36,14 +36,14 @@ namespace Orchard.ContentManagement.MetaData.Services { foreach (var iter in source.Elements()) { var fieldElement = iter; - string[] fieldParameters = fieldElement.Name.LocalName.Split('.'); + var fieldParameters = XmlConvert.DecodeName(fieldElement.Name.LocalName).Split('.'); builder.WithField( - XmlConvert.DecodeName(fieldParameters[0]), + fieldParameters[0], fieldBuilder => { + fieldBuilder.OfType(fieldParameters[1]); foreach (var setting in _settingsReader.Map(fieldElement)) { fieldBuilder.WithSetting(setting.Key, setting.Value); } - fieldBuilder.OfType(fieldParameters[1]); }); } } diff --git a/src/Orchard/ContentManagement/Records/ContentItemAlteration.cs b/src/Orchard/ContentManagement/Records/ContentItemAlteration.cs index c9c87de08..5998a26b2 100644 --- a/src/Orchard/ContentManagement/Records/ContentItemAlteration.cs +++ b/src/Orchard/ContentManagement/Records/ContentItemAlteration.cs @@ -33,6 +33,7 @@ namespace Orchard.ContentManagement.Records { var alteration = (IAlteration)Activator.CreateInstance(type); alteration.Override(mapping); } + mapping.IgnoreProperty(x => x.Infoset); }); model.Override(mapping => { @@ -41,6 +42,7 @@ namespace Orchard.ContentManagement.Records { var alteration = (IAlteration)Activator.CreateInstance(type); alteration.Override(mapping); } + mapping.IgnoreProperty(x => x.Infoset); }); } diff --git a/src/Orchard/ContentManagement/Records/ContentItemRecord.cs b/src/Orchard/ContentManagement/Records/ContentItemRecord.cs index 8b1cb01f4..c66f48e6f 100644 --- a/src/Orchard/ContentManagement/Records/ContentItemRecord.cs +++ b/src/Orchard/ContentManagement/Records/ContentItemRecord.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; -using System.Xml.Linq; +using Orchard.ContentManagement.FieldStorage; +using Orchard.ContentManagement.FieldStorage.InfosetStorage; namespace Orchard.ContentManagement.Records { public class ContentItemRecord { @@ -15,30 +16,7 @@ namespace Orchard.ContentManagement.Records { public virtual ContentTypeRecord ContentType { get; set; } public virtual IList Versions { get; set; } - public virtual string Data { - get { return Infoset.Data; } - set { Infoset.Data = value; } - } - + public virtual string Data { get { return Infoset.Data; } set { Infoset.Data = value; } } public virtual Infoset Infoset { get; private set; } } - - public class Infoset { - private XElement _element; - - private void SetElement(XElement value) { - _element = value; - } - - public XElement Element { - get { - return _element ?? (_element = new XElement("Data")); - } - } - - public string Data { - get { return Element.ToString(SaveOptions.DisableFormatting); } - set { SetElement(XElement.Parse(value, LoadOptions.PreserveWhitespace)); } - } - } } diff --git a/src/Orchard/ContentManagement/Records/ContentItemVersionRecord.cs b/src/Orchard/ContentManagement/Records/ContentItemVersionRecord.cs index 96ddfd6ce..1eaa00875 100644 --- a/src/Orchard/ContentManagement/Records/ContentItemVersionRecord.cs +++ b/src/Orchard/ContentManagement/Records/ContentItemVersionRecord.cs @@ -1,10 +1,21 @@ +using System; +using Orchard.ContentManagement.FieldStorage; +using Orchard.ContentManagement.FieldStorage.InfosetStorage; + namespace Orchard.ContentManagement.Records { public class ContentItemVersionRecord { + public ContentItemVersionRecord() { + Infoset = new Infoset(); + } + public virtual int Id { get; set; } public virtual ContentItemRecord ContentItemRecord { get; set; } public virtual int Number { get; set; } public virtual bool Published { get; set; } public virtual bool Latest { get; set; } + + public virtual string Data { get { return Infoset.Data; } set { Infoset.Data = value; } } + public virtual Infoset Infoset { get; private set; } } -} \ No newline at end of file +} diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 59926405c..b286badb9 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -192,19 +192,21 @@ Code - + Code - - - - + + + + Code + + Code @@ -343,6 +345,7 @@ Code + Code