diff --git a/src/Orchard.Core.Tests/Settings/Metadata/ContentDefinitionManagerTests.cs b/src/Orchard.Core.Tests/Settings/Metadata/ContentDefinitionManagerTests.cs index f3ef73370..0e1870fab 100644 --- a/src/Orchard.Core.Tests/Settings/Metadata/ContentDefinitionManagerTests.cs +++ b/src/Orchard.Core.Tests/Settings/Metadata/ContentDefinitionManagerTests.cs @@ -1,16 +1,13 @@ using System; using System.IO; using System.Linq; -using System.Xml.Linq; using Autofac; using Moq; using NHibernate; using NUnit.Framework; using Orchard.Caching; -using Orchard.ContentManagement; using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData.Builders; -using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Services; using Orchard.Core.Settings.Metadata; using Orchard.Core.Settings.Metadata.Records; @@ -46,9 +43,7 @@ namespace Orchard.Core.Tests.Settings.Metadata { builder.RegisterAutoMocking(); builder.RegisterType().As(); builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); - builder.RegisterType(typeof(SettingsFormatter)) - .As(typeof(IMapper)) - .As(typeof(IMapper)); + builder.RegisterType(typeof(SettingsFormatter)).As(typeof(ISettingsFormatter)); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/ImportExport/Services/ImportExportServiceTests.cs b/src/Orchard.Tests.Modules/ImportExport/Services/ImportExportServiceTests.cs index 9114ef13c..d0ada843c 100644 --- a/src/Orchard.Tests.Modules/ImportExport/Services/ImportExportServiceTests.cs +++ b/src/Orchard.Tests.Modules/ImportExport/Services/ImportExportServiceTests.cs @@ -72,8 +72,7 @@ namespace Orchard.Tests.Modules.ImportExport.Services { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); - builder.RegisterInstance(new Mock>().Object); - builder.RegisterInstance(new Mock>().Object); + builder.RegisterInstance(new Mock().Object); _session = _sessionFactory.OpenSession(); builder.RegisterInstance(new DefaultContentManagerTests.TestSessionLocator(_session)).As(); diff --git a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs index d1b3cf64c..11a2a1e06 100644 --- a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs +++ b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs @@ -53,9 +53,7 @@ namespace Orchard.Tests.Modules.Users.Controllers { builder.RegisterType().SingleInstance(); builder.RegisterType().As(); builder.RegisterType().As(); - builder.RegisterType(typeof(SettingsFormatter)) - .As(typeof(IMapper)) - .As(typeof(IMapper)); + builder.RegisterType(typeof(SettingsFormatter)).As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As().InstancePerDependency(); @@ -70,7 +68,6 @@ namespace Orchard.Tests.Modules.Users.Controllers { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); - builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs b/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs index 34798a93b..e51772e86 100644 --- a/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs +++ b/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs @@ -71,9 +71,7 @@ namespace Orchard.Tests.Modules.Users.Services { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); - builder.RegisterType(typeof(SettingsFormatter)) - .As(typeof(IMapper)) - .As(typeof(IMapper)); + builder.RegisterType(typeof(SettingsFormatter)).As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs b/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs index fa95bb8ee..bd95c6001 100644 --- a/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs +++ b/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs @@ -76,15 +76,13 @@ namespace Orchard.Tests.Modules.Users.Services { [SetUp] public void Init() { var builder = new ContainerBuilder(); - //builder.RegisterModule(new ImplicitCollectionSupportModule()); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterInstance(_clock = new StubClock()).As(); builder.RegisterType().As(); builder.RegisterType().As(); - builder.RegisterType(typeof(SettingsFormatter)) - .As(typeof(IMapper)) - .As(typeof(IMapper)); + builder.RegisterType(typeof(SettingsFormatter)).As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/XmlRpc/Controllers/HomeControllerTests.cs b/src/Orchard.Tests.Modules/XmlRpc/Controllers/HomeControllerTests.cs index 3a91336d2..1600465e7 100644 --- a/src/Orchard.Tests.Modules/XmlRpc/Controllers/HomeControllerTests.cs +++ b/src/Orchard.Tests.Modules/XmlRpc/Controllers/HomeControllerTests.cs @@ -17,8 +17,8 @@ namespace Orchard.Tests.Modules.XmlRpc.Controllers { var builder = new ContainerBuilder(); //builder.RegisterModule(new ImplicitCollectionSupportModule()); builder.RegisterType(); - builder.RegisterType().As>(); - builder.RegisterType().As>(); + builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(thing1).As(); builder.RegisterInstance(thing2).As(); diff --git a/src/Orchard.Tests.Modules/XmlRpc/Controllers/LiveWriterControllerTests.cs b/src/Orchard.Tests.Modules/XmlRpc/Controllers/LiveWriterControllerTests.cs index 47653b9cb..04cbc041b 100644 --- a/src/Orchard.Tests.Modules/XmlRpc/Controllers/LiveWriterControllerTests.cs +++ b/src/Orchard.Tests.Modules/XmlRpc/Controllers/LiveWriterControllerTests.cs @@ -17,8 +17,8 @@ namespace Orchard.Tests.Modules.XmlRpc.Controllers { var builder = new ContainerBuilder(); builder.RegisterType(); - builder.RegisterType().As>(); - builder.RegisterType().As>(); + builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(thing).As(); builder.RegisterInstance(thingToo).As(); diff --git a/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcReaderTests.cs b/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcReaderTests.cs index e25911522..dd71f43a9 100644 --- a/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcReaderTests.cs +++ b/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcReaderTests.cs @@ -1,22 +1,16 @@ using System; using System.Xml.Linq; using NUnit.Framework; -using Orchard.Core.XmlRpc.Models; using Orchard.Core.XmlRpc.Services; namespace Orchard.Tests.Modules.XmlRpc.Services { [TestFixture] public class XmlRpcReaderTests { - private IMapper _methodCallMapper; - private IMapper _structMapper; - private IMapper _arrayMapper; + private IXmlRpcReader _xmlRpcReader; [SetUp] public void Init() { - var mapper = new XmlRpcReader(); - _methodCallMapper = mapper; - _structMapper = mapper; - _arrayMapper = mapper; + _xmlRpcReader = new XmlRpcReader(); } [Test] @@ -26,7 +20,7 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { hello world "); - var methodCall = _methodCallMapper.Map(source); + var methodCall = _xmlRpcReader.MapToMethodCall(source); Assert.That(methodCall, Is.Not.Null); Assert.That(methodCall.MethodName, Is.EqualTo("hello world")); } @@ -48,7 +42,7 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { "); - var methodCall = _methodCallMapper.Map(source); + var methodCall = _xmlRpcReader.MapToMethodCall(source); Assert.That(methodCall, Is.Not.Null); Assert.That(methodCall.Params, Has.Count.EqualTo(8)); Assert.That(methodCall.Params[0].Value, Is.EqualTo(-12)); @@ -57,7 +51,7 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { Assert.That(methodCall.Params[3].Value, Is.EqualTo(false)); Assert.That(methodCall.Params[4].Value, Is.EqualTo("hello world")); Assert.That(methodCall.Params[5].Value, Is.EqualTo(-12.214)); - Assert.That(methodCall.Params[6].Value, Is.EqualTo(new DateTime(1998,7,17,14,8,55))); + Assert.That(methodCall.Params[6].Value, Is.EqualTo(new DateTime(1998, 7, 17, 14, 8, 55))); Assert.That(methodCall.Params[7].Value, Is.EqualTo(Convert.FromBase64String("eW91IGNhbid0IHJlYWQgdGhpcyE="))); } @@ -75,7 +69,7 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { eighteW91IGNhbid0IHJlYWQgdGhpcyE= "); - var xmlStruct = _structMapper.Map(source); + var xmlStruct = _xmlRpcReader.MapToStruct(source); Assert.That(xmlStruct["one"], Is.EqualTo(-12)); Assert.That(xmlStruct["two"], Is.EqualTo(42)); Assert.That(xmlStruct["three"], Is.EqualTo(true)); @@ -94,7 +88,7 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { sevenFOO "); - var xmlStruct = _structMapper.Map(source); + var xmlStruct = _xmlRpcReader.MapToStruct(source); Assert.That(xmlStruct["seven"], Is.GreaterThan(DateTime.Now.AddSeconds(-1))); Assert.That(xmlStruct["seven"], Is.LessThan(DateTime.Now.AddSeconds(1))); } @@ -112,7 +106,7 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { "); - var xmlArray = _arrayMapper.Map(source); + var xmlArray = _xmlRpcReader.MapToArray(source); Assert.That(xmlArray.Data, Has.Count.EqualTo(4)); Assert.That(xmlArray[0], Is.EqualTo(12)); Assert.That(xmlArray[1], Is.EqualTo("Egypt")); diff --git a/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcWriterTests.cs b/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcWriterTests.cs index dfc91a6ef..6ee4d3372 100644 --- a/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcWriterTests.cs +++ b/src/Orchard.Tests.Modules/XmlRpc/Services/XmlRpcWriterTests.cs @@ -9,11 +9,10 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { [Test] public void MethodResponseWriterShouldSendParametersWithValues() { var mapper = new XmlRpcWriter(); - IMapper resposeMapper = mapper; var response = new XRpcMethodResponse(); response.Params.Add(new XRpcData { Value = 42 }); - var element = resposeMapper.Map(response); + var element = mapper.MapMethodResponse(response); Assert.That(NoSpace(element.ToString()), Is.EqualTo("42")); } @@ -21,7 +20,6 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { [Test] public void ArrayAndStructShouldWorkAsExpected() { var mapper = new XmlRpcWriter(); - IMapper arrayMapper = mapper; var arr = new XRpcArray(); var structParam = XRpcData.For(new XRpcStruct()); @@ -31,7 +29,7 @@ namespace Orchard.Tests.Modules.XmlRpc.Services { structParam.Value.Members.Add("Hello", XRpcData.For("world")); - var element = arrayMapper.Map(arr); + var element = mapper.MapArray(arr); Assert.That(NoSpace(element.ToString()), Is.EqualTo(NoSpace(@" diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index f26e94ac8..092645456 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -257,6 +257,8 @@ + + diff --git a/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs b/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs index 7be131e76..57311dafc 100644 --- a/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs +++ b/src/Orchard.Web/Core/Settings/Metadata/ContentDefinitionManager.cs @@ -5,6 +5,7 @@ using System.Xml.Linq; using Orchard.Caching; using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData.Models; +using Orchard.ContentManagement.MetaData.Services; using Orchard.Core.Settings.Metadata.Records; using Orchard.Data; using Orchard.Logging; @@ -18,8 +19,7 @@ namespace Orchard.Core.Settings.Metadata { private readonly IRepository _typeDefinitionRepository; private readonly IRepository _partDefinitionRepository; private readonly IRepository _fieldDefinitionRepository; - private readonly IMapper _settingsReader; - private readonly IMapper _settingsWriter; + private readonly ISettingsFormatter _settingsFormatter; public ContentDefinitionManager( ICacheManager cacheManager, @@ -27,15 +27,13 @@ namespace Orchard.Core.Settings.Metadata { IRepository typeDefinitionRepository, IRepository partDefinitionRepository, IRepository fieldDefinitionRepository, - IMapper settingsReader, - IMapper settingsWriter) { + ISettingsFormatter settingsFormatter) { _cacheManager = cacheManager; _signals = signals; _typeDefinitionRepository = typeDefinitionRepository; _partDefinitionRepository = partDefinitionRepository; _fieldDefinitionRepository = fieldDefinitionRepository; - _settingsReader = settingsReader; - _settingsWriter = settingsWriter; + _settingsFormatter = settingsFormatter; } public ContentTypeDefinition GetTypeDefinition(string name) { @@ -45,6 +43,38 @@ namespace Orchard.Core.Settings.Metadata { }); } + public void DeleteTypeDefinition(string name) { + var record = _typeDefinitionRepository.Fetch(x => x.Name == name).SingleOrDefault(); + + // deletes the content type record associated + if (record != null) { + _typeDefinitionRepository.Delete(record); + } + + // invalidates the cache + TriggerContentDefinitionSignal(); + } + + public void DeletePartDefinition(string name) { + // remove parts from current types + var typesWithPart = ListTypeDefinitions().Where(typeDefinition => typeDefinition.Parts.Any(part => part.PartDefinition.Name == name)); + + foreach (var typeDefinition in typesWithPart) { + this.AlterTypeDefinition(typeDefinition.Name, builder => builder.RemovePart(name)); + } + + // delete part + var record = _partDefinitionRepository.Fetch(x => x.Name == name).SingleOrDefault(); + + if (record != null) { + _partDefinitionRepository.Delete(record); + } + + // invalidates the cache + TriggerContentDefinitionSignal(); + + } + public ContentPartDefinition GetPartDefinition(string name) { return _cacheManager.Get(name ?? string.Empty, ctx => { MonitorContentDefinitionSignal(ctx); @@ -83,39 +113,6 @@ namespace Orchard.Core.Settings.Metadata { Apply(contentPartDefinition, Acquire(contentPartDefinition)); } - public void DeleteTypeDefinition(string name) { - var record = _typeDefinitionRepository.Fetch(x => x.Name == name).SingleOrDefault(); - - // deletes the content type record associated - if (record != null) { - _typeDefinitionRepository.Delete(record); - } - - // invalidates the cache - TriggerContentDefinitionSignal(); - } - - public void DeletePartDefinition(string name) { - // remove parts from current types - var typesWithPart = ListTypeDefinitions().Where(typeDefinition => typeDefinition.Parts.Any(part => part.PartDefinition.Name == name)); - - foreach (var typeDefinition in typesWithPart) { - this.AlterTypeDefinition(typeDefinition.Name, builder => builder.RemovePart(name)); - } - - // delete part - var record = _partDefinitionRepository.Fetch(x => x.Name == name).SingleOrDefault(); - - if (record != null) { - _partDefinitionRepository.Delete(record); - } - - // invalidates the cache - TriggerContentDefinitionSignal(); - - } - - private void MonitorContentDefinitionSignal(AcquireContext ctx) { ctx.Monitor(_signals.When(ContentDefinitionSignal)); } @@ -153,7 +150,7 @@ namespace Orchard.Core.Settings.Metadata { private void Apply(ContentTypeDefinition model, ContentTypeDefinitionRecord record) { record.DisplayName = model.DisplayName; - record.Settings = _settingsWriter.Map(model.Settings).ToString(); + record.Settings = _settingsFormatter.Map(model.Settings).ToString(); var toRemove = record.ContentTypePartDefinitionRecords .Where(partDefinitionRecord => !model.Parts.Any(part => partDefinitionRecord.ContentPartDefinitionRecord.Name == part.PartDefinition.Name)) @@ -175,11 +172,11 @@ namespace Orchard.Core.Settings.Metadata { } private void Apply(ContentTypePartDefinition model, ContentTypePartDefinitionRecord record) { - record.Settings = Compose(_settingsWriter.Map(model.Settings)); + record.Settings = Compose(_settingsFormatter.Map(model.Settings)); } private void Apply(ContentPartDefinition model, ContentPartDefinitionRecord record) { - record.Settings = _settingsWriter.Map(model.Settings).ToString(); + record.Settings = _settingsFormatter.Map(model.Settings).ToString(); var toRemove = record.ContentPartFieldDefinitionRecords .Where(partFieldDefinitionRecord => !model.Fields.Any(partField => partFieldDefinitionRecord.Name == partField.Name)) @@ -204,7 +201,7 @@ namespace Orchard.Core.Settings.Metadata { } private void Apply(ContentPartFieldDefinition model, ContentPartFieldDefinitionRecord record) { - record.Settings = Compose(_settingsWriter.Map(model.Settings)); + record.Settings = Compose(_settingsFormatter.Map(model.Settings)); } ContentTypeDefinition Build(ContentTypeDefinitionRecord source) { @@ -212,27 +209,27 @@ namespace Orchard.Core.Settings.Metadata { source.Name, source.DisplayName, source.ContentTypePartDefinitionRecords.Select(Build), - _settingsReader.Map(Parse(source.Settings))); + _settingsFormatter.Map(Parse(source.Settings))); } ContentTypePartDefinition Build(ContentTypePartDefinitionRecord source) { return new ContentTypePartDefinition( Build(source.ContentPartDefinitionRecord), - _settingsReader.Map(Parse(source.Settings))); + _settingsFormatter.Map(Parse(source.Settings))); } ContentPartDefinition Build(ContentPartDefinitionRecord source) { return new ContentPartDefinition( source.Name, source.ContentPartFieldDefinitionRecords.Select(Build), - _settingsReader.Map(Parse(source.Settings))); + _settingsFormatter.Map(Parse(source.Settings))); } ContentPartFieldDefinition Build(ContentPartFieldDefinitionRecord source) { return new ContentPartFieldDefinition( Build(source.ContentFieldDefinitionRecord), source.Name, - _settingsReader.Map(Parse(source.Settings))); + _settingsFormatter.Map(Parse(source.Settings))); } ContentFieldDefinition Build(ContentFieldDefinitionRecord source) { diff --git a/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs b/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs index d3270e56e..9a1bc0eab 100644 --- a/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs +++ b/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs @@ -1,17 +1,17 @@ using System.Collections.Generic; using System.Web; using System.Web.Mvc; -using System.Xml.Linq; using Orchard.Core.XmlRpc.Models; +using Orchard.Core.XmlRpc.Services; using Orchard.Logging; namespace Orchard.Core.XmlRpc.Controllers { public class HomeController : Controller { - private readonly IMapper _writer; + private readonly IXmlRpcWriter _writer; private readonly IEnumerable _xmlRpcHandlers; public HomeController( - IMapper writer, + IXmlRpcWriter writer, IEnumerable xmlRpcHandlers) { _writer = writer; _xmlRpcHandlers = xmlRpcHandlers; @@ -29,7 +29,7 @@ namespace Orchard.Core.XmlRpc.Controllers { if (methodResponse == null) throw new HttpException(500, "TODO: xmlrpc fault"); - var content = _writer.Map(methodResponse).ToString(); + var content = _writer.MapMethodResponse(methodResponse).ToString(); return Content(content, "text/xml"); } diff --git a/src/Orchard.Web/Core/XmlRpc/Models/ModelBinderProvider.cs b/src/Orchard.Web/Core/XmlRpc/Models/ModelBinderProvider.cs index 3e95febac..9e3458232 100644 --- a/src/Orchard.Web/Core/XmlRpc/Models/ModelBinderProvider.cs +++ b/src/Orchard.Web/Core/XmlRpc/Models/ModelBinderProvider.cs @@ -2,32 +2,33 @@ using System.Web.Mvc; using System.Xml; using System.Xml.Linq; +using Orchard.Core.XmlRpc.Services; using Orchard.Mvc.ModelBinders; using IModelBinderProvider = Orchard.Mvc.ModelBinders.IModelBinderProvider; namespace Orchard.Core.XmlRpc.Models { public class ModelBinderProvider : IModelBinderProvider, IModelBinder { - private readonly IMapper _mapper; + private readonly IXmlRpcReader _mapper; - public ModelBinderProvider(IMapper mapper) { + public ModelBinderProvider(IXmlRpcReader mapper) { _mapper = mapper; } public IEnumerable GetModelBinders() { return new[] { new ModelBinderDescriptor { - ModelBinder =this, - Type=typeof(XRpcMethodCall) + ModelBinder = this, + Type = typeof(XRpcMethodCall) } }; } public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { - //Ah! xmlrpc is a value provider!!! + // Ah! xmlrpc is a value provider!!! // TODO: refactor this? using (var xmlReader = XmlReader.Create(controllerContext.HttpContext.Request.InputStream)) { var element = XElement.Load(xmlReader); - return _mapper.Map(element); + return _mapper.MapToMethodCall(element); } } } diff --git a/src/Orchard.Web/Core/XmlRpc/Services/IXmlRpcReader.cs b/src/Orchard.Web/Core/XmlRpc/Services/IXmlRpcReader.cs new file mode 100644 index 000000000..5472600ee --- /dev/null +++ b/src/Orchard.Web/Core/XmlRpc/Services/IXmlRpcReader.cs @@ -0,0 +1,37 @@ +using System.Xml.Linq; +using Orchard.Core.XmlRpc.Models; + +namespace Orchard.Core.XmlRpc.Services { + /// + /// Abstraction to read XML and convert it to rpc entities. + /// + public interface IXmlRpcReader : IDependency { + /// + /// Maps an XML element to a rpc method call. + /// + /// The XML element to be mapped. + /// The rpc method call. + XRpcMethodCall MapToMethodCall(XElement source); + + /// + /// Maps an XML element to rpc data. + /// + /// The XML element to be mapped. + /// The rpc data. + XRpcData MapToData(XElement source); + + /// + /// Maps an XML element to a rpc struct. + /// + /// The XML element to be mapped. + /// The rpc struct. + XRpcStruct MapToStruct(XElement source); + + /// + /// Maps an XML element to a rpc array. + /// + /// The XML element to be mapped. + /// The rpc array. + XRpcArray MapToArray(XElement source); + } +} diff --git a/src/Orchard.Web/Core/XmlRpc/Services/IXmlRpcWriter.cs b/src/Orchard.Web/Core/XmlRpc/Services/IXmlRpcWriter.cs new file mode 100644 index 000000000..3ff3f388a --- /dev/null +++ b/src/Orchard.Web/Core/XmlRpc/Services/IXmlRpcWriter.cs @@ -0,0 +1,37 @@ +using System.Xml.Linq; +using Orchard.Core.XmlRpc.Models; + +namespace Orchard.Core.XmlRpc.Services { + /// + /// Abstraction to write XML based on rpc entities. + /// + public interface IXmlRpcWriter : IDependency { + /// + /// Maps a method response to XML. + /// + /// The method response to be mapped. + /// The XML element. + XElement MapMethodResponse(XRpcMethodResponse rpcMethodResponse); + + /// + /// Maps rpc data to XML. + /// + /// The rpc data. + /// The XML element. + XElement MapData(XRpcData rpcData); + + /// + /// Maps a rpc struct to XML. + /// + /// The rpc struct. + /// The XML element. + XElement MapStruct(XRpcStruct rpcStruct); + + /// + /// Maps a rpc array to XML. + /// + /// The rpc array. + /// The XML element. + XElement MapArray(XRpcArray rpcArray); + } +} diff --git a/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcReader.cs b/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcReader.cs index 90fb19c95..4fa06f90f 100644 --- a/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcReader.cs +++ b/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcReader.cs @@ -6,91 +6,120 @@ using System.Xml.Linq; using Orchard.Core.XmlRpc.Models; namespace Orchard.Core.XmlRpc.Services { - public class XmlRpcReader : - IMapper, - IMapper, - IMapper, - IMapper { - + /// + /// Abstraction to read XML and convert it to rpc entities. + /// + public class XmlRpcReader : IXmlRpcReader { + /// + /// Provides the mapping function based on a type name. + /// private readonly IDictionary> _dispatch; + /// + /// Initializes a new instance of the class. + /// public XmlRpcReader() { _dispatch = new Dictionary> - { - {"i4",x=>new XRpcData { Value = (int)x }}, - {"int", x=>new XRpcData { Value = (int)x }}, - {"boolean", x=>new XRpcData { Value = ((string)x=="1") }}, - {"string", x=>new XRpcData { Value = (string)x }}, - {"double", x=>new XRpcData { Value = (double)x }}, - {"dateTime.iso8601", x=> { - DateTime parsedDateTime; - // try parsing a "normal" datetime string then try what live writer gives us - if(!DateTime.TryParse(x.Value, out parsedDateTime) - && !DateTime.TryParseExact(x.Value, "yyyyMMddTHH:mm:ss", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None, out parsedDateTime)) { - parsedDateTime = DateTime.Now; - } - return new XRpcData {Value = parsedDateTime}; - }}, - {"base64", x=>new XRpcData { Value = Convert.FromBase64String((string)x) }}, - {"struct", x=>XRpcData.For(Map(x))} , - {"array", x=>XRpcData.For(Map(x))} , - }; + { + { "i4", x => new XRpcData { Value = (int)x } }, + { "int", x => new XRpcData { Value = (int)x } }, + { "boolean", x => new XRpcData { Value = (string)x == "1" } }, + { "string", x => new XRpcData { Value = (string)x } }, + { "double", x => new XRpcData { Value = (double)x } }, + { "dateTime.iso8601", x => { + DateTime parsedDateTime; + + // try parsing a "normal" datetime string then try what live writer gives us + if (!DateTime.TryParse(x.Value, out parsedDateTime) + && !DateTime.TryParseExact(x.Value, "yyyyMMddTHH:mm:ss", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None, out parsedDateTime)) { + parsedDateTime = DateTime.Now; + } + + return new XRpcData { Value = parsedDateTime }; + } }, + { "base64", x => new XRpcData { Value = Convert.FromBase64String((string)x) } }, + { "struct", x => XRpcData.For(MapToStruct(x)) }, + { "array", x => XRpcData.For(MapToArray(x)) }, + }; } - T2 Map(XElement t1) { - return ((IMapper)this).Map(t1); - } - - XRpcData MapValue(XContainer t1) { - var element = t1.Elements().SingleOrDefault(); - - Func dispatch; - if (_dispatch.TryGetValue(element.Name.LocalName, out dispatch) == false) - throw new ApplicationException("Unknown XmlRpc value type " + element.Name.LocalName); - - return dispatch(element); - } - - XRpcMethodCall IMapper.Map(XElement source) { + /// + /// Maps an XML element to a rpc method call. + /// + /// The XML element to be mapped. + /// The rpc method call. + public XRpcMethodCall MapToMethodCall(XElement source) { return new XRpcMethodCall { MethodName = (string)source.Element("methodName"), - Params = source.Elements("params").Elements("param").Select(Map).ToList() + Params = source.Elements("params").Elements("param").Select(MapToData).ToList() }; } - - XRpcData IMapper.Map(XElement source) { + /// + /// Maps an XML element to rpc data. + /// + /// The XML element to be mapped. + /// The rpc data. + public XRpcData MapToData(XElement source) { var value = source.Element("value"); - if (value == null) + if (value == null) { return new XRpcData(); + } var element = value.Elements().SingleOrDefault(); Func dispatch; - if (_dispatch.TryGetValue(element.Name.LocalName, out dispatch) == false) + if (_dispatch.TryGetValue(element.Name.LocalName, out dispatch) == false) { throw new ApplicationException("Unknown XmlRpc value type " + element.Name.LocalName); + } return dispatch(element); } - XRpcStruct IMapper.Map(XElement source) { + /// + /// Maps an XML element to a rpc struct. + /// + /// The XML element to be mapped. + /// The rpc struct. + public XRpcStruct MapToStruct(XElement source) { var result = new XRpcStruct(); foreach (var member in source.Elements("member")) { result.Members.Add( (string)member.Element("name"), MapValue(member.Element("value"))); } + return result; } - - XRpcArray IMapper.Map(XElement source) { + /// + /// Maps an XML element to a rpc array. + /// + /// The XML element to be mapped. + /// The rpc array. + public XRpcArray MapToArray(XElement source) { var result = new XRpcArray(); foreach (var value in source.Elements("data").Elements("value")) { result.Data.Add(MapValue(value)); } + return result; } + /// + /// Maps an XML container to rpc data. + /// + /// The XML container to be mapped. + /// The rpc data. + private XRpcData MapValue(XContainer source) { + var element = source.Elements().SingleOrDefault(); + + Func dispatch; + if (_dispatch.TryGetValue(element.Name.LocalName, out dispatch) == false) { + throw new ApplicationException("Unknown XmlRpc value type " + element.Name.LocalName); + } + + return dispatch(element); + } } -} \ No newline at end of file +} diff --git a/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs b/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs index 8cd9d84de..a67b12daa 100644 --- a/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs +++ b/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs @@ -3,69 +3,98 @@ using System.Collections.Generic; using System.Linq; using System.Xml.Linq; using Orchard.Core.XmlRpc.Models; +using Orchard.Validation; namespace Orchard.Core.XmlRpc.Services { - public class XmlRpcWriter : - IMapper, - IMapper, - IMapper, - IMapper { - - public XmlRpcWriter() { - _dispatch = new Dictionary> - { - {typeof(int), p=>new XElement("int", (int)p.Value)}, - {typeof(bool), p=>new XElement("boolean", (bool)p.Value?"1":"0")}, - {typeof(string), p=>new XElement("string", p.Value)}, - {typeof(double), p=>new XElement("double", (double)p.Value)}, - {typeof(DateTime), p=>new XElement("dateTime.iso8601", ((DateTime)p.Value).ToString("yyyyMMddTHH:mm:ssZ"))}, - {typeof(DateTime?), p=>new XElement("dateTime.iso8601", ((DateTime?)p.Value).Value.ToString("yyyyMMddTHH:mm:ssZ"))}, - {typeof(byte[]), p=>new XElement("base64", Convert.ToBase64String((byte[])p.Value))}, - {typeof(XRpcStruct), p=>Map((XRpcStruct)p.Value)}, - {typeof(XRpcArray), p=>Map((XRpcArray)p.Value)}, - }; - } - + /// + /// Abstraction to write XML based on rpc entities. + /// + public class XmlRpcWriter : IXmlRpcWriter { + /// + /// Provides the mapping function based on a type. + /// private readonly IDictionary> _dispatch; - XElement IMapper.Map(XRpcMethodResponse source) { + /// + /// Initializes a new instance of the class. + /// + public XmlRpcWriter() { + _dispatch = new Dictionary> + { + { typeof(int), p => new XElement("int", (int)p.Value) }, + { typeof(bool), p => new XElement("boolean", (bool)p.Value ? "1" : "0") }, + { typeof(string), p => new XElement("string", p.Value) }, + { typeof(double), p => new XElement("double", (double)p.Value) }, + { typeof(DateTime), p => new XElement("dateTime.iso8601", ((DateTime)p.Value).ToString("yyyyMMddTHH:mm:ssZ")) }, + { typeof(DateTime?), p => new XElement("dateTime.iso8601", ((DateTime?)p.Value).Value.ToString("yyyyMMddTHH:mm:ssZ")) }, + { typeof(byte[]), p => new XElement("base64", Convert.ToBase64String((byte[])p.Value)) }, + { typeof(XRpcStruct), p => MapStruct((XRpcStruct)p.Value) }, + { typeof(XRpcArray), p => MapArray((XRpcArray)p.Value) }, + }; + } + + /// + /// Maps a method response to XML. + /// + /// The method response to be mapped. + /// The XML element. + public XElement MapMethodResponse(XRpcMethodResponse rpcMethodResponse) { + Argument.ThrowIfNull(rpcMethodResponse, "rpcMethodResponse"); + return new XElement( "methodResponse", new XElement( "params", - source.Params.Select( + rpcMethodResponse.Params.Select( p => new XElement("param", MapValue(p))))); } - XElement IMapper.Map(XRpcData source) { - return new XElement("param", MapValue(source)); + /// + /// Maps rpc data to XML. + /// + /// The rpc data. + /// The XML element. + public XElement MapData(XRpcData rpcData) { + Argument.ThrowIfNull(rpcData, "rpcData"); + + return new XElement("param", MapValue(rpcData)); } - XElement IMapper.Map(XRpcStruct source) { + /// + /// Maps a rpc struct to XML. + /// + /// The rpc struct. + /// The XML element. + public XElement MapStruct(XRpcStruct rpcStruct) { return new XElement( "struct", - source.Members.Select( + rpcStruct.Members.Select( kv => new XElement( "member", new XElement("name", kv.Key), MapValue(kv.Value)))); } - XElement IMapper.Map(XRpcArray source) { + /// + /// Maps a rpc array to XML. + /// + /// The rpc array. + /// The XML element. + public XElement MapArray(XRpcArray rpcArray) { return new XElement( "array", new XElement( "data", - source.Data.Select(d => MapValue(d)))); + rpcArray.Data.Select(MapValue))); } - XElement Map(T t) { - return ((IMapper)this).Map(t); + /// + /// Maps rpc data to XML. + /// + /// The rpc data. + /// The XML element. + private XElement MapValue(XRpcData rpcData) { + return new XElement("value", _dispatch[rpcData.Type](rpcData)); } - - private XElement MapValue(XRpcData data) { - return new XElement("value", _dispatch[data.Type](data)); - } - - } -} \ No newline at end of file + } +} diff --git a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs index 44ec15de7..6c8d5d6af 100644 --- a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs +++ b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs @@ -2,35 +2,60 @@ using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement.MetaData.Builders; -using Orchard.ContentManagement.MetaData.Models; +using Orchard.Validation; namespace Orchard.ContentManagement.MetaData.Services { + /// + /// The content definition reader is used to import both content type and content part definitions from a XML format. + /// public class ContentDefinitionReader : IContentDefinitionReader { - private readonly IMapper _settingsReader; + /// + /// The settings formatter to be used to convert the settings between a XML format and a dictionary. + /// + private readonly ISettingsFormatter _settingsFormatter; - public ContentDefinitionReader(IMapper settingsReader) { - _settingsReader = settingsReader; + /// + /// Initializes a new instance of the class. + /// + /// The settings formatter to be used to convert the settings between a dictionary and an XML format. + public ContentDefinitionReader(ISettingsFormatter settingsFormatter) { + Argument.ThrowIfNull(settingsFormatter, "settingsFormatter"); + + _settingsFormatter = settingsFormatter; } - public void Merge(XElement source, ContentTypeDefinitionBuilder builder) { - builder.Named(XmlConvert.DecodeName(source.Name.LocalName)); - foreach (var setting in _settingsReader.Map(source)) { - builder.WithSetting(setting.Key, setting.Value); + /// + /// Merges a given content type definition provided in a XML format into a content type definition builder. + /// + /// The XML content type definition. + /// The content type definition builder. + public void Merge(XElement element, ContentTypeDefinitionBuilder contentTypeDefinitionBuilder) { + Argument.ThrowIfNull(element, "element"); + Argument.ThrowIfNull(contentTypeDefinitionBuilder, "contentTypeDefinitionBuilder"); + + // Merge name + contentTypeDefinitionBuilder.Named(XmlConvert.DecodeName(element.Name.LocalName)); + + // Merge settings + foreach (var setting in _settingsFormatter.Map(element)) { + contentTypeDefinitionBuilder.WithSetting(setting.Key, setting.Value); } - foreach (var iter in source.Elements()) { + + // Merge parts + foreach (var iter in element.Elements()) { var partElement = iter; var partName = XmlConvert.DecodeName(partElement.Name.LocalName); if (partName == "remove") { var nameAttribute = partElement.Attribute("name"); if (nameAttribute != null) { - builder.RemovePart(nameAttribute.Value); + contentTypeDefinitionBuilder.RemovePart(nameAttribute.Value); } } else { - builder.WithPart( + contentTypeDefinitionBuilder.WithPart( partName, partBuilder => { - foreach (var setting in _settingsReader.Map(partElement)) { + foreach (var setting in _settingsFormatter.Map(partElement)) { partBuilder.WithSetting(setting.Key, setting.Value); } }); @@ -38,13 +63,25 @@ namespace Orchard.ContentManagement.MetaData.Services { } } - public void Merge(XElement source, ContentPartDefinitionBuilder builder) { - builder.Named(XmlConvert.DecodeName(source.Name.LocalName)); - foreach (var setting in _settingsReader.Map(source)) { - builder.WithSetting(setting.Key, setting.Value); + /// + /// Merges a given content part definition provided in a XML format into a content part definition builder. + /// + /// The XML content type definition. + /// The content part definition builder. + public void Merge(XElement element, ContentPartDefinitionBuilder contentPartDefinitionBuilder) { + Argument.ThrowIfNull(element, "element"); + Argument.ThrowIfNull(contentPartDefinitionBuilder, "contentPartDefinitionBuilder"); + + // Merge name + contentPartDefinitionBuilder.Named(XmlConvert.DecodeName(element.Name.LocalName)); + + // Merge settings + foreach (var setting in _settingsFormatter.Map(element)) { + contentPartDefinitionBuilder.WithSetting(setting.Key, setting.Value); } - foreach (var iter in source.Elements()) { + // Merge fields + foreach (var iter in element.Elements()) { var fieldElement = iter; var fieldParameters = XmlConvert.DecodeName(fieldElement.Name.LocalName).Split(new[] { '.' }, 2); var fieldName = fieldParameters.FirstOrDefault(); @@ -52,15 +89,15 @@ namespace Orchard.ContentManagement.MetaData.Services { if (fieldName == "remove") { var nameAttribute = fieldElement.Attribute("name"); if (nameAttribute != null) { - builder.RemoveField(nameAttribute.Value); + contentPartDefinitionBuilder.RemoveField(nameAttribute.Value); } } else { - builder.WithField( + contentPartDefinitionBuilder.WithField( fieldName, fieldBuilder => { fieldBuilder.OfType(fieldType); - foreach (var setting in _settingsReader.Map(fieldElement)) { + foreach (var setting in _settingsFormatter.Map(fieldElement)) { fieldBuilder.WithSetting(setting.Key, setting.Value); } }); diff --git a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs index 86800dab9..9c300f255 100644 --- a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs +++ b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs @@ -1,42 +1,76 @@ using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement.MetaData.Models; +using Orchard.Validation; namespace Orchard.ContentManagement.MetaData.Services { + /// + /// The content definition writer is used to export both content type and content part definitions to a XML format. + /// public class ContentDefinitionWriter : IContentDefinitionWriter { - private readonly IMapper _settingsWriter; + /// + /// The settings formatter to be used to convert the settings between a dictionary and an XML format. + /// + private readonly ISettingsFormatter _settingsFormatter; - public ContentDefinitionWriter(IMapper settingsWriter) { - _settingsWriter = settingsWriter; + /// + /// Initializes a new instance of the class. + /// + /// The settings formatter to be used to convert the settings between a dictionary and an XML format. + public ContentDefinitionWriter(ISettingsFormatter settingsFormatter) { + Argument.ThrowIfNull(settingsFormatter, "settingsFormatter"); + + _settingsFormatter = settingsFormatter; } - public XElement Export(ContentTypeDefinition typeDefinition) { - var typeElement = NewElement(typeDefinition.Name, typeDefinition.Settings); - if (typeElement.Attribute("DisplayName") == null && typeDefinition.DisplayName != null) { - typeElement.Add(new XAttribute("DisplayName", typeDefinition.DisplayName)); + /// + /// Exports a content type definition to a XML format. + /// + /// The type definition to be exported. + /// The content type definition in an XML format. + public XElement Export(ContentTypeDefinition contentTypeDefinition) { + Argument.ThrowIfNull(contentTypeDefinition, "typeDefinition"); + + var typeElement = NewElement(contentTypeDefinition.Name, contentTypeDefinition.Settings); + if (typeElement.Attribute("DisplayName") == null && contentTypeDefinition.DisplayName != null) { + typeElement.Add(new XAttribute("DisplayName", contentTypeDefinition.DisplayName)); } - foreach(var typePart in typeDefinition.Parts) { + foreach (var typePart in contentTypeDefinition.Parts) { typeElement.Add(NewElement(typePart.PartDefinition.Name, typePart.Settings)); } + return typeElement; } - public XElement Export(ContentPartDefinition partDefinition) { - var partElement = NewElement(partDefinition.Name, partDefinition.Settings); - foreach(var partField in partDefinition.Fields) { - var attributeName = partField.Name + "." + partField.FieldDefinition.Name; + /// + /// Exports a content part definition to a XML format. + /// + /// The part definition to be exported. + /// The content part definition in a XML format. + public XElement Export(ContentPartDefinition contentPartDefinition) { + Argument.ThrowIfNull(contentPartDefinition, "contentPartDefinition"); + + var partElement = NewElement(contentPartDefinition.Name, contentPartDefinition.Settings); + foreach (var partField in contentPartDefinition.Fields) { + var attributeName = string.Format("{0}.{1}", partField.Name, partField.FieldDefinition.Name); var partFieldElement = NewElement(attributeName, partField.Settings); partElement.Add(partFieldElement); } + return partElement; } + /// + /// Builds a new XML element with a given name and a settings dictionary. + /// + /// The name of the element to be mapped to XML. + /// The settings dictionary to be used as the element's attributes. + /// The new XML element. private XElement NewElement(string name, SettingsDictionary settings) { - var element = new XElement(XmlConvert.EncodeLocalName(name)); - foreach(var settingAttribute in _settingsWriter.Map(settings).Attributes()) { - element.Add(settingAttribute); - } + XElement element = _settingsFormatter.Map(settings); + element.Name = XmlConvert.EncodeLocalName(name); + return element; } } diff --git a/src/Orchard/ContentManagement/MetaData/Services/ISettingsFormatter.cs b/src/Orchard/ContentManagement/MetaData/Services/ISettingsFormatter.cs new file mode 100644 index 000000000..6b592128f --- /dev/null +++ b/src/Orchard/ContentManagement/MetaData/Services/ISettingsFormatter.cs @@ -0,0 +1,23 @@ +using System.Xml.Linq; +using Orchard.ContentManagement.MetaData.Models; + +namespace Orchard.ContentManagement.MetaData.Services { + /// + /// Abstraction to manage settings metadata on a content. + /// + public interface ISettingsFormatter : IDependency { + /// + /// Maps an XML element to a settings dictionary. + /// + /// The XML element to be mapped. + /// The settings dictionary. + SettingsDictionary Map(XElement element); + + /// + /// Maps a settings dictionary to an XML element. + /// + /// The settings dictionary. + /// The XML element. + XElement Map(SettingsDictionary settingsDictionary); + } +} diff --git a/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs b/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs index 065d060c2..20b9769ef 100644 --- a/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs +++ b/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs @@ -4,22 +4,40 @@ using System.Xml.Linq; using Orchard.ContentManagement.MetaData.Models; namespace Orchard.ContentManagement.MetaData.Services { - public class SettingsFormatter : - IMapper, - IMapper { - - public SettingsDictionary Map(XElement source) { - if (source == null) + /// + /// Abstraction to manage settings metadata on a content. + /// + public class SettingsFormatter : ISettingsFormatter { + /// + /// Maps an XML element to a settings dictionary. + /// + /// The XML element to be mapped. + /// The settings dictionary. + public SettingsDictionary Map(XElement element) { + if (element == null) { return new SettingsDictionary(); + } - return new SettingsDictionary(source.Attributes().ToDictionary(attr => XmlConvert.DecodeName(attr.Name.LocalName), attr => attr.Value)); + return new SettingsDictionary( + element.Attributes() + .ToDictionary(attr => XmlConvert.DecodeName(attr.Name.LocalName), attr => attr.Value)); } - public XElement Map(SettingsDictionary source) { - if (source == null) + /// + /// Maps a settings dictionary to an XML element. + /// + /// The settings dictionary. + /// The XML element. + public XElement Map(SettingsDictionary settingsDictionary) { + if (settingsDictionary == null) { return new XElement("settings"); + } - return new XElement("settings", source.Where(kv => kv.Value != null).Select(kv => new XAttribute(XmlConvert.EncodeLocalName(kv.Key), kv.Value))); + return new XElement( + "settings", + settingsDictionary + .Where(kv => kv.Value != null) + .Select(kv => new XAttribute(XmlConvert.EncodeLocalName(kv.Key), kv.Value))); } } } diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 2f8e1ae97..260dc4f56 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -179,6 +179,7 @@ +