From 01f861707854bf767a55e9c60ac796d4f2366ca7 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 28 Jun 2010 17:21:19 -0700 Subject: [PATCH] Changing the Getter/Setter deletages to an IFieldStorage interface Deletages seemed inconsistent with design of rest of system Interface allows for typed accessor methods, which will be important for columnar backing --HG-- branch : dev --- .../InfosetFieldStorageProviderTests.cs | 42 +++++++++---------- .../Core/Common/Fields/TextField.cs | 5 ++- src/Orchard/ContentManagement/ContentField.cs | 4 +- .../Drivers/ContentFieldDriver.cs | 3 +- .../FieldStorage/IFieldStorage.cs | 12 +++++- .../InfosetStorage/InfosetStorageProvider.cs | 15 ++----- .../FieldStorage/SimpleFieldStorage.cs | 25 +++++++++++ src/Orchard/Orchard.Framework.csproj | 1 + 8 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs diff --git a/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs b/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs index 740e433cc..b64acb8dc 100644 --- a/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs +++ b/src/Orchard.Tests/ContentManagement/Drivers/FieldStorage/InfosetFieldStorageProviderTests.cs @@ -60,9 +60,9 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage { public void GettingUnsetNamedAndUnnamedValueIsSafeAndNull() { var part = CreateContentItemPart(); var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single()); - Assert.That(storage.Getter(null), Is.Null); - Assert.That(storage.Getter("value"), Is.Null); - Assert.That(storage.Getter("This is a test"), Is.Null); + Assert.That(storage.Get(null), Is.Null); + Assert.That(storage.Get("value"), Is.Null); + Assert.That(storage.Get("This is a test"), Is.Null); } [Test] @@ -70,10 +70,10 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage { var part = CreateContentItemPart(); var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single()); - Assert.That(storage.Getter("alpha"), Is.Null); - storage.Setter("alpha", "one"); - Assert.That(storage.Getter("alpha"), Is.Not.Null); - Assert.That(storage.Getter("alpha"), Is.EqualTo("one")); + Assert.That(storage.Get("alpha"), Is.Null); + storage.Set("alpha", "one"); + Assert.That(storage.Get("alpha"), Is.Not.Null); + Assert.That(storage.Get("alpha"), Is.EqualTo("one")); } [Test] @@ -81,14 +81,14 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage { var part = CreateContentItemPart(); var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single()); - Assert.That(storage.Getter(null), Is.Null); - Assert.That(storage.Getter(""), Is.Null); - storage.Setter(null, "one"); - Assert.That(storage.Getter(null), Is.EqualTo("one")); - Assert.That(storage.Getter(""), Is.EqualTo("one")); - storage.Setter(null, "two"); - Assert.That(storage.Getter(null), Is.EqualTo("two")); - Assert.That(storage.Getter(""), Is.EqualTo("two")); + Assert.That(storage.Get(null), Is.Null); + Assert.That(storage.Get(""), Is.Null); + storage.Set(null, "one"); + Assert.That(storage.Get(null), Is.EqualTo("one")); + Assert.That(storage.Get(""), Is.EqualTo("one")); + storage.Set(null, "two"); + Assert.That(storage.Get(null), Is.EqualTo("two")); + Assert.That(storage.Get(""), Is.EqualTo("two")); } [Test] @@ -96,8 +96,8 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage { var part = CreateContentItemPart(); var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single()); - storage.Setter(null, "one"); - storage.Setter("alpha", "two"); + storage.Set(null, "one"); + storage.Set("alpha", "two"); Assert.That(part.ContentItem.Record.Data, Is.EqualTo("one")); } @@ -107,14 +107,14 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage { var part = CreateContentItemPart(); var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single()); - storage.Setter(null, "one"); - storage.Setter("alpha", "two"); + storage.Set(null, "one"); + storage.Set("alpha", "two"); Assert.That(part.ContentItem.Record.Data, Is.EqualTo("one")); part.ContentItem.Record.Data = "three"; - storage.Setter(null, "three"); - storage.Setter("alpha", "four"); + storage.Set(null, "three"); + storage.Set("alpha", "four"); } [Test] diff --git a/src/Orchard.Web/Core/Common/Fields/TextField.cs b/src/Orchard.Web/Core/Common/Fields/TextField.cs index a7df68bd4..1a26a10da 100644 --- a/src/Orchard.Web/Core/Common/Fields/TextField.cs +++ b/src/Orchard.Web/Core/Common/Fields/TextField.cs @@ -1,10 +1,11 @@ using Orchard.ContentManagement; +using Orchard.ContentManagement.FieldStorage; namespace Orchard.Core.Common.Fields { public class TextField : ContentField { public string Value { - get { return Getter(null); } - set { Setter(null, value); } + get { return Storage.Get(); } + set { Storage.Set(value); } } } } diff --git a/src/Orchard/ContentManagement/ContentField.cs b/src/Orchard/ContentManagement/ContentField.cs index d557c121c..3d3486ac5 100644 --- a/src/Orchard/ContentManagement/ContentField.cs +++ b/src/Orchard/ContentManagement/ContentField.cs @@ -1,4 +1,5 @@ using System; +using Orchard.ContentManagement.FieldStorage; using Orchard.ContentManagement.MetaData.Models; namespace Orchard.ContentManagement { @@ -8,7 +9,6 @@ namespace Orchard.ContentManagement { public ContentPartDefinition.Field PartFieldDefinition { get; set; } public ContentFieldDefinition FieldDefinition { get { return PartFieldDefinition.FieldDefinition; } } - public Func Getter { get; set; } - public Action Setter { get; set; } + public IFieldStorage Storage { protected get; set; } } } diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs index 64139d934..9e98216be 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs @@ -34,8 +34,7 @@ namespace Orchard.ContentManagement.Drivers { FieldTypeName = typeof (TField).Name, Factory = (partFieldDefinition, storage) => new TField { PartFieldDefinition = partFieldDefinition, - Getter = storage.Getter, - Setter = storage.Setter, + Storage = storage, } } }; diff --git a/src/Orchard/ContentManagement/FieldStorage/IFieldStorage.cs b/src/Orchard/ContentManagement/FieldStorage/IFieldStorage.cs index 9a5a6edf4..cc82db104 100644 --- a/src/Orchard/ContentManagement/FieldStorage/IFieldStorage.cs +++ b/src/Orchard/ContentManagement/FieldStorage/IFieldStorage.cs @@ -2,7 +2,15 @@ namespace Orchard.ContentManagement.FieldStorage { public interface IFieldStorage { - Func Getter { get; } - Action Setter { get; } + T Get(string name); + void Set(string name, T value); + } + public static class FieldStorageExtension{ + public static T Get(this IFieldStorage storage) { + return storage.Get(null); + } + public static void Set(this IFieldStorage storage, T value) { + storage.Set(null, value); + } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs index bcff1def3..a0fb51ab9 100644 --- a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs +++ b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs @@ -1,5 +1,4 @@ -using System; -using System.Xml; +using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement.MetaData.Models; @@ -14,10 +13,9 @@ namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { var fieldName = XmlConvert.EncodeLocalName(partFieldDefinition.Name); var infosetPart = contentPart.As(); - return new Storage { - Getter = name => Get(infosetPart.Infoset.Element, partName, fieldName, name), - Setter = (name, value) => Set(infosetPart.Infoset.Element, partName, fieldName, name, value) - }; + return new SimpleFieldStorage( + name => Get(infosetPart.Infoset.Element, partName, fieldName, name), + (name, value) => Set(infosetPart.Infoset.Element, partName, fieldName, name, value)); } private static string Get(XElement element, string partName, string fieldName, string valueName) { @@ -57,10 +55,5 @@ namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { fieldElement.SetAttributeValue(XmlConvert.EncodeLocalName(valueName), value); } } - - class Storage : IFieldStorage { - public Func Getter { get; set; } - public Action Setter { get; set; } - } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs b/src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs new file mode 100644 index 000000000..2897bf430 --- /dev/null +++ b/src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs @@ -0,0 +1,25 @@ +using System; +using System.Globalization; + +namespace Orchard.ContentManagement.FieldStorage { + public class SimpleFieldStorage : IFieldStorage { + public SimpleFieldStorage(Func getter, Action setter) { + Getter = getter; + Setter = setter; + } + + public Func Getter { get; set; } + public Action Setter { get; set; } + + public T Get(string name) { + var value = Getter(name); + return string.IsNullOrEmpty(value) + ? default(T) + : (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture); + } + + public void Set(string name, T value) { + Setter(name, Convert.ToString(value, CultureInfo.InvariantCulture)); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 194d3ea19..2edd3eaaf 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -207,6 +207,7 @@ + Code