- ShellTopologyDescriptorManager implementation and tests.

--HG--
branch : dev
This commit is contained in:
Suha Can
2010-04-15 12:46:04 -07:00
parent a1c639bd0f
commit c8ba6fee15
3 changed files with 77 additions and 17 deletions

View File

@@ -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<ITopologyDescriptorManager>();
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
1,
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>()));
@@ -79,12 +78,12 @@ namespace Orchard.Tests.Modules.Settings.Topology {
var topology = manager.GetTopologyDescriptor();
Assert.That(topology.SerialNumber, Is.Not.EqualTo(0));
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
0,
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>()));
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
topology.SerialNumber + 665321,
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>()));
@@ -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<Exception>(() => manager.UpdateTopologyDescriptor(
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
0,
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>()));
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
topology.SerialNumber,
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>()));
@@ -113,7 +112,7 @@ namespace Orchard.Tests.Modules.Settings.Topology {
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>());
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
topology2.SerialNumber,
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>()));
@@ -126,7 +125,7 @@ namespace Orchard.Tests.Modules.Settings.Topology {
Assert.That(eventBus.LastMessageName, Is.Null);
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
5,
Enumerable.Empty<TopologyFeature>(),
Enumerable.Empty<TopologyParameter>()));

View File

@@ -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<TopologyRecord> _repository;
private readonly IRepository<TopologyRecord> _topologyRecordRepository;
private readonly IEventBus _eventBus;
private int _serialNumber;
public TopologyDescriptorManager(
IRepository<TopologyRecord> 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<TopologyFeature>();
foreach (var topologyFeatureRecord in topologyRecord.EnabledFeatures) {
descriptorFeatures.Add(new TopologyFeature { Name = topologyFeatureRecord.Name });
}
descriptor.EnabledFeatures = descriptorFeatures;
var descriptorParameters = new List<TopologyParameter>();
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<TopologyFeature> enabledFeatures, IEnumerable<TopologyParameter> 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<TopologyFeatureRecord>();
foreach (var feature in enabledFeatures) {
descriptorFeatureRecords.Add(new TopologyFeatureRecord { Name = feature.Name, TopologyRecord = topologyRecord});
}
topologyRecord.EnabledFeatures = descriptorFeatureRecords;
var descriptorParameterRecords = new List<TopologyParameterRecord>();
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);

View File

@@ -1,5 +1,4 @@
using System.Collections.Generic;
using Orchard.Environment.Configuration;
namespace Orchard.Environment.Topology.Models {
public class ShellTopologyDescriptor {