Incremental work towards infoset field storage

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-06-23 11:13:03 -07:00
parent 32d59676dc
commit b9c26d3422
13 changed files with 197 additions and 20 deletions

View File

@@ -0,0 +1,78 @@
using System;
using System.Linq;
using Autofac;
using NUnit.Framework;
using Orchard.ContentManagement.Drivers.FieldStorage;
using Orchard.ContentManagement.MetaData.Builders;
using Orchard.ContentManagement.MetaData.Models;
namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage {
[TestFixture]
public class FieldStorageProviderSelectorTests {
private IContainer _container;
private IFieldStorageProviderSelector _selector;
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterType<FieldStorageProviderSelector>().As<IFieldStorageProviderSelector>();
builder.RegisterType<InfosetFieldStorageProvider>().As<IFieldStorageProvider>();
builder.RegisterType<TestProvider>().As<IFieldStorageProvider>();
_container = builder.Build();
_selector = _container.Resolve<IFieldStorageProviderSelector>();
}
class TestProvider : IFieldStorageProvider {
public string ProviderName {
get { return "TestProvName"; }
}
public IFieldStorage BindStorage(ContentPartDefinition.Field partFieldDefinition) {
throw new NotImplementedException();
}
}
[Test]
public void ShouldReturnProviderByName() {
var part1Definition = new ContentPartDefinitionBuilder()
.WithField("Hello", fb => fb.OfType("Text").WithSetting("Storage", "TestProvName"))
.Build();
var part2Definition = new ContentPartDefinitionBuilder()
.WithField("World", fb => fb.OfType("Text").WithSetting("Storage", "Infoset"))
.Build();
var provider1 = _selector.GetProvider(part1Definition.Fields.Single());
var provider2 = _selector.GetProvider(part2Definition.Fields.Single());
Assert.That(provider1.ProviderName, Is.EqualTo("TestProvName"));
Assert.That(provider2.ProviderName, Is.EqualTo("Infoset"));
}
[Test]
public void ShouldReturnInfosetWhenNullEmptyMissingOrInvalid() {
var part1Definition = new ContentPartDefinitionBuilder()
.WithField("Hello", fb => fb.OfType("Text").WithSetting("Storage", null))
.Build();
var part2Definition = new ContentPartDefinitionBuilder()
.WithField("World", fb => fb.OfType("Text").WithSetting("Storage", ""))
.Build();
var part3Definition = new ContentPartDefinitionBuilder()
.WithField("World", fb => fb.OfType("Text"))
.Build();
var part4Definition = new ContentPartDefinitionBuilder()
.WithField("World", fb => fb.OfType("Text").WithSetting("Storage", "NoSuchName"))
.Build();
var provider1 = _selector.GetProvider(part1Definition.Fields.Single());
var provider2 = _selector.GetProvider(part2Definition.Fields.Single());
var provider3 = _selector.GetProvider(part3Definition.Fields.Single());
var provider4 = _selector.GetProvider(part4Definition.Fields.Single());
Assert.That(provider1.ProviderName, Is.EqualTo("Infoset"));
Assert.That(provider2.ProviderName, Is.EqualTo("Infoset"));
Assert.That(provider3.ProviderName, Is.EqualTo("Infoset"));
Assert.That(provider4.ProviderName, Is.EqualTo("Infoset"));
}
}
}

View File

@@ -151,6 +151,7 @@
<Compile Include="ContentManagement\DefaultContentManagerTests.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="ContentManagement\Drivers\FieldStorage\FieldStorageProviderSelectorTests.cs" />
<Compile Include="ContentManagement\Handlers\ContentHandlerTests.cs" />
<Compile Include="ContentManagement\Handlers\ModelBuilderTests.cs" />
<Compile Include="ContentManagement\MetaData\Builders\ContentTypeDefinitionBuilderTests.cs" />

View File

@@ -1,21 +1,15 @@
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;
namespace Orchard.ContentManagement.Drivers {
public interface IContentFieldDriver : IEvents {
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
DriverResult BuildEditorModel(BuildEditorModelContext context);
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
IEnumerable<ContentFieldInfo> GetFieldInfo();
}
public abstract class ContentFieldDriver<TField> : IContentFieldDriver where TField : ContentField, new() {
protected virtual string Prefix { get { return ""; } }
protected virtual string Zone { get { return "body"; } }
public IFieldStorageProviderSelector FieldStorageProviderSelector { get; set; }
DriverResult IContentFieldDriver.BuildDisplayModel(BuildDisplayModelContext context) {
var results = context.ContentItem.Parts.SelectMany(part => part.Fields).
@@ -42,13 +36,23 @@ namespace Orchard.ContentManagement.Drivers {
var contentFieldInfo = new[] {
new ContentFieldInfo {
FieldTypeName = typeof (TField).Name,
Factory = partFieldDefinition => new TField {PartFieldDefinition = partFieldDefinition}
Factory = FieldInstanceFactory
}
};
return contentFieldInfo;
}
private TField FieldInstanceFactory(ContentPartDefinition.Field partFieldDefinition) {
var fieldStorageProvider = FieldStorageProviderSelector.GetProvider(partFieldDefinition);
var fieldStorage = fieldStorageProvider.BindStorage(partFieldDefinition);
return new TField {
PartFieldDefinition = partFieldDefinition,
Getter = fieldStorage.Getter,
Setter = fieldStorage.Setter,
};
}
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; }

View File

@@ -3,15 +3,6 @@ using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData;
namespace Orchard.ContentManagement.Drivers {
public interface IContentPartDriver : IEvents {
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
DriverResult BuildEditorModel(BuildEditorModelContext context);
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
IEnumerable<ContentPartInfo> GetPartInfo();
}
public abstract class ContentPartDriver<TContent> : IContentPartDriver where TContent : ContentPart, new() {
protected virtual string Prefix { get { return ""; } }
protected virtual string Zone { get { return "body"; } }

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Orchard.ContentManagement.MetaData.Models;
namespace Orchard.ContentManagement.Drivers.FieldStorage {
public class FieldStorageProviderSelector : IFieldStorageProviderSelector {
public const string Storage = "Storage";
public const string DefaultProviderName = "Infoset";
private readonly IEnumerable<IFieldStorageProvider> _storageProviders;
public FieldStorageProviderSelector(IEnumerable<IFieldStorageProvider> storageProviders) {
_storageProviders = storageProviders;
}
public IFieldStorageProvider GetProvider(ContentPartDefinition.Field partFieldDefinition) {
IFieldStorageProvider provider = null;
string storage;
if (partFieldDefinition.Settings.TryGetValue(Storage, out storage))
provider = Locate(storage);
return provider ?? Locate(DefaultProviderName);
}
private IFieldStorageProvider Locate(string providerName) {
return _storageProviders.FirstOrDefault(provider => provider.ProviderName == providerName);
}
}
}

View File

@@ -0,0 +1,8 @@
using System;
namespace Orchard.ContentManagement.Drivers.FieldStorage {
public interface IFieldStorage {
Func<string, string> Getter { get; }
Action<string, string> Setter { get; }
}
}

View File

@@ -0,0 +1,8 @@
using Orchard.ContentManagement.MetaData.Models;
namespace Orchard.ContentManagement.Drivers.FieldStorage {
public interface IFieldStorageProvider : IDependency {
string ProviderName { get; }
IFieldStorage BindStorage(ContentPartDefinition.Field partFieldDefinition);
}
}

View File

@@ -0,0 +1,7 @@
using Orchard.ContentManagement.MetaData.Models;
namespace Orchard.ContentManagement.Drivers.FieldStorage {
public interface IFieldStorageProviderSelector : IDependency {
IFieldStorageProvider GetProvider(ContentPartDefinition.Field partFieldDefinition);
}
}

View File

@@ -0,0 +1,14 @@
using System;
using Orchard.ContentManagement.MetaData.Models;
namespace Orchard.ContentManagement.Drivers.FieldStorage {
public class InfosetFieldStorageProvider : IFieldStorageProvider {
public string ProviderName {
get { return FieldStorageProviderSelector.DefaultProviderName; }
}
public IFieldStorage BindStorage(ContentPartDefinition.Field partFieldDefinition) {
throw new NotImplementedException();
}
}
}

View File

@@ -0,0 +1,13 @@
using System.Collections.Generic;
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData;
namespace Orchard.ContentManagement.Drivers {
public interface IContentFieldDriver : IEvents {
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
DriverResult BuildEditorModel(BuildEditorModelContext context);
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
IEnumerable<ContentFieldInfo> GetFieldInfo();
}
}

View File

@@ -0,0 +1,13 @@
using System.Collections.Generic;
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData;
namespace Orchard.ContentManagement.Drivers {
public interface IContentPartDriver : IEvents {
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
DriverResult BuildEditorModel(BuildEditorModelContext context);
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
IEnumerable<ContentPartInfo> GetPartInfo();
}
}

View File

@@ -12,5 +12,6 @@ namespace Orchard.ContentManagement.Records {
public virtual ContentTypeRecord ContentType { get; set; }
public virtual IList<ContentItemVersionRecord> Versions { get; set; }
public virtual IList<ContentItemVersionRecord> Infoset { get; set; }
}
}

View File

@@ -192,9 +192,16 @@
<Compile Include="ContentManagement\Drivers\DriverResult.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="ContentManagement\Drivers\FieldStorage\FieldStorageProviderSelector.cs" />
<Compile Include="ContentManagement\Drivers\IContentFieldDriver.cs" />
<Compile Include="ContentManagement\Drivers\IContentItemDriver.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="ContentManagement\Drivers\IContentPartDriver.cs" />
<Compile Include="ContentManagement\Drivers\FieldStorage\IFieldStorage.cs" />
<Compile Include="ContentManagement\Drivers\FieldStorage\IFieldStorageProvider.cs" />
<Compile Include="ContentManagement\Drivers\FieldStorage\IFieldStorageProviderSelector.cs" />
<Compile Include="ContentManagement\Drivers\FieldStorage\InfosetFieldStorageProvider.cs" />
<Compile Include="ContentManagement\Extenstions\UrlHelperExtensions.cs">
<SubType>Code</SubType>
</Compile>