From c8ba6fee15c9ca6ac7a32ab6566c9aa6eaef7d0b Mon Sep 17 00:00:00 2001 From: Suha Can Date: Thu, 15 Apr 2010 12:46:04 -0700 Subject: [PATCH] - ShellTopologyDescriptorManager implementation and tests. --HG-- branch : dev --- .../TopologyDescriptorManagerTests.cs | 17 ++--- .../Topology/TopologyDescriptorManager.cs | 76 +++++++++++++++++-- .../Models/ShellTopologyDescriptor.cs | 1 - 3 files changed, 77 insertions(+), 17 deletions(-) diff --git a/src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs b/src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs index 60e599d2e..ca1634f95 100644 --- a/src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs +++ b/src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using Autofac; using NUnit.Framework; using Orchard.Core.Settings.Topology; @@ -60,9 +59,9 @@ namespace Orchard.Tests.Modules.Settings.Topology { } [Test] - public void NonZeroInitialUpdateThrowsException() { + public void NonZeroInitialUpdateThrowsInvalidOperationException() { var manager = _container.Resolve(); - Assert.Throws(() => manager.UpdateTopologyDescriptor( + Assert.Throws(() => manager.UpdateTopologyDescriptor( 1, Enumerable.Empty(), Enumerable.Empty())); @@ -79,12 +78,12 @@ namespace Orchard.Tests.Modules.Settings.Topology { var topology = manager.GetTopologyDescriptor(); Assert.That(topology.SerialNumber, Is.Not.EqualTo(0)); - Assert.Throws(() => manager.UpdateTopologyDescriptor( + Assert.Throws(() => manager.UpdateTopologyDescriptor( 0, Enumerable.Empty(), Enumerable.Empty())); - Assert.Throws(() => manager.UpdateTopologyDescriptor( + Assert.Throws(() => manager.UpdateTopologyDescriptor( topology.SerialNumber + 665321, Enumerable.Empty(), Enumerable.Empty())); @@ -98,12 +97,12 @@ namespace Orchard.Tests.Modules.Settings.Topology { Assert.That(topology2.SerialNumber, Is.Not.EqualTo(0)); Assert.That(topology2.SerialNumber, Is.Not.EqualTo(topology.SerialNumber)); - Assert.Throws(() => manager.UpdateTopologyDescriptor( + Assert.Throws(() => manager.UpdateTopologyDescriptor( 0, Enumerable.Empty(), Enumerable.Empty())); - Assert.Throws(() => manager.UpdateTopologyDescriptor( + Assert.Throws(() => manager.UpdateTopologyDescriptor( topology.SerialNumber, Enumerable.Empty(), Enumerable.Empty())); @@ -113,7 +112,7 @@ namespace Orchard.Tests.Modules.Settings.Topology { Enumerable.Empty(), Enumerable.Empty()); - Assert.Throws(() => manager.UpdateTopologyDescriptor( + Assert.Throws(() => manager.UpdateTopologyDescriptor( topology2.SerialNumber, Enumerable.Empty(), Enumerable.Empty())); @@ -126,7 +125,7 @@ namespace Orchard.Tests.Modules.Settings.Topology { Assert.That(eventBus.LastMessageName, Is.Null); - Assert.Throws(() => manager.UpdateTopologyDescriptor( + Assert.Throws(() => manager.UpdateTopologyDescriptor( 5, Enumerable.Empty(), Enumerable.Empty())); diff --git a/src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs b/src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs index fa40b89f4..f8788178d 100644 --- a/src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs +++ b/src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs @@ -1,33 +1,95 @@ using System; using System.Collections.Generic; +using System.Linq; using Orchard.Core.Settings.Topology.Records; using Orchard.Data; using Orchard.Environment.Topology; using Orchard.Environment.Topology.Models; using Orchard.Events; +using Orchard.Localization; namespace Orchard.Core.Settings.Topology { public class TopologyDescriptorManager : ITopologyDescriptorManager { - private readonly IRepository _repository; + private readonly IRepository _topologyRecordRepository; private readonly IEventBus _eventBus; - private int _serialNumber; public TopologyDescriptorManager( IRepository repository, IEventBus eventBus) { - _repository = repository; + _topologyRecordRepository = repository; _eventBus = eventBus; + T = NullLocalizer.Instance; } + Localizer T { get; set; } + public ShellTopologyDescriptor GetTopologyDescriptor() { - return _serialNumber == 0 ? null : new ShellTopologyDescriptor { SerialNumber = _serialNumber }; + TopologyRecord topologyRecord = GetTopologyRecord(); + if (topologyRecord == null) return null; + return GetShellTopologyDescriptorFromRecord(topologyRecord); + } + + private static ShellTopologyDescriptor GetShellTopologyDescriptorFromRecord(TopologyRecord topologyRecord) { + ShellTopologyDescriptor descriptor = new ShellTopologyDescriptor { SerialNumber = topologyRecord.SerialNumber }; + var descriptorFeatures = new List(); + foreach (var topologyFeatureRecord in topologyRecord.EnabledFeatures) { + descriptorFeatures.Add(new TopologyFeature { Name = topologyFeatureRecord.Name }); + } + descriptor.EnabledFeatures = descriptorFeatures; + var descriptorParameters = new List(); + foreach (var topologyParameterRecord in topologyRecord.Parameters) { + descriptorParameters.Add( + new TopologyParameter { + Component = topologyParameterRecord.Component, + Name = topologyParameterRecord.Name, + Value = topologyParameterRecord.Value + }); + } + descriptor.Parameters = descriptorParameters; + + return descriptor; + } + + private TopologyRecord GetTopologyRecord() { + var records = from record in _topologyRecordRepository.Table select record; + return records.FirstOrDefault(); } public void UpdateTopologyDescriptor(int priorSerialNumber, IEnumerable enabledFeatures, IEnumerable parameters) { - if (priorSerialNumber != _serialNumber) - throw new Exception(); + TopologyRecord topologyRecord = GetTopologyRecord(); + var serialNumber = topologyRecord == null ? 0 : topologyRecord.SerialNumber; + if (priorSerialNumber != serialNumber) + throw new InvalidOperationException(T("Invalid serial number for shell topology").ToString()); + + if (topologyRecord == null) { + serialNumber++; + _topologyRecordRepository.Create(new TopologyRecord { + SerialNumber = serialNumber + }); + topologyRecord = _topologyRecordRepository.Get(x => x.SerialNumber == serialNumber); + } + else { + topologyRecord.SerialNumber++; + } + + var descriptorFeatureRecords = new List(); + foreach (var feature in enabledFeatures) { + descriptorFeatureRecords.Add(new TopologyFeatureRecord { Name = feature.Name, TopologyRecord = topologyRecord}); + } + topologyRecord.EnabledFeatures = descriptorFeatureRecords; + + var descriptorParameterRecords = new List(); + foreach (var parameter in parameters) { + descriptorParameterRecords.Add(new TopologyParameterRecord { + Component = parameter.Component, + Name = parameter.Name, + Value = parameter.Value, + TopologyRecord = topologyRecord + }); + } + topologyRecord.EnabledFeatures = descriptorFeatureRecords; + topologyRecord.Parameters = descriptorParameterRecords; - ++_serialNumber; _eventBus.Notify( typeof(ITopologyDescriptorManager).FullName + ".UpdateTopologyDescriptor", null); diff --git a/src/Orchard/Environment/Topology/Models/ShellTopologyDescriptor.cs b/src/Orchard/Environment/Topology/Models/ShellTopologyDescriptor.cs index a4dd84308..59736fd51 100644 --- a/src/Orchard/Environment/Topology/Models/ShellTopologyDescriptor.cs +++ b/src/Orchard/Environment/Topology/Models/ShellTopologyDescriptor.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using Orchard.Environment.Configuration; namespace Orchard.Environment.Topology.Models { public class ShellTopologyDescriptor {