mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
- ShellTopologyDescriptorManager implementation and tests.
--HG-- branch : dev
This commit is contained in:
@@ -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>()));
|
||||
|
@@ -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);
|
||||
|
@@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Environment.Configuration;
|
||||
|
||||
namespace Orchard.Environment.Topology.Models {
|
||||
public class ShellTopologyDescriptor {
|
||||
|
Reference in New Issue
Block a user