mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
- ShellTopologyDescriptorManager implementation and tests.
--HG-- branch : dev
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using Autofac;
|
using Autofac;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using Orchard.Core.Settings.Topology;
|
using Orchard.Core.Settings.Topology;
|
||||||
@@ -60,9 +59,9 @@ namespace Orchard.Tests.Modules.Settings.Topology {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void NonZeroInitialUpdateThrowsException() {
|
public void NonZeroInitialUpdateThrowsInvalidOperationException() {
|
||||||
var manager = _container.Resolve<ITopologyDescriptorManager>();
|
var manager = _container.Resolve<ITopologyDescriptorManager>();
|
||||||
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
|
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||||
1,
|
1,
|
||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>()));
|
Enumerable.Empty<TopologyParameter>()));
|
||||||
@@ -79,12 +78,12 @@ namespace Orchard.Tests.Modules.Settings.Topology {
|
|||||||
var topology = manager.GetTopologyDescriptor();
|
var topology = manager.GetTopologyDescriptor();
|
||||||
Assert.That(topology.SerialNumber, Is.Not.EqualTo(0));
|
Assert.That(topology.SerialNumber, Is.Not.EqualTo(0));
|
||||||
|
|
||||||
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
|
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||||
0,
|
0,
|
||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>()));
|
Enumerable.Empty<TopologyParameter>()));
|
||||||
|
|
||||||
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
|
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||||
topology.SerialNumber + 665321,
|
topology.SerialNumber + 665321,
|
||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>()));
|
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(0));
|
||||||
Assert.That(topology2.SerialNumber, Is.Not.EqualTo(topology.SerialNumber));
|
Assert.That(topology2.SerialNumber, Is.Not.EqualTo(topology.SerialNumber));
|
||||||
|
|
||||||
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
|
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||||
0,
|
0,
|
||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>()));
|
Enumerable.Empty<TopologyParameter>()));
|
||||||
|
|
||||||
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
|
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||||
topology.SerialNumber,
|
topology.SerialNumber,
|
||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>()));
|
Enumerable.Empty<TopologyParameter>()));
|
||||||
@@ -113,7 +112,7 @@ namespace Orchard.Tests.Modules.Settings.Topology {
|
|||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>());
|
Enumerable.Empty<TopologyParameter>());
|
||||||
|
|
||||||
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
|
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||||
topology2.SerialNumber,
|
topology2.SerialNumber,
|
||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>()));
|
Enumerable.Empty<TopologyParameter>()));
|
||||||
@@ -126,7 +125,7 @@ namespace Orchard.Tests.Modules.Settings.Topology {
|
|||||||
|
|
||||||
Assert.That(eventBus.LastMessageName, Is.Null);
|
Assert.That(eventBus.LastMessageName, Is.Null);
|
||||||
|
|
||||||
Assert.Throws<Exception>(() => manager.UpdateTopologyDescriptor(
|
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||||
5,
|
5,
|
||||||
Enumerable.Empty<TopologyFeature>(),
|
Enumerable.Empty<TopologyFeature>(),
|
||||||
Enumerable.Empty<TopologyParameter>()));
|
Enumerable.Empty<TopologyParameter>()));
|
||||||
|
|||||||
@@ -1,33 +1,95 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Orchard.Core.Settings.Topology.Records;
|
using Orchard.Core.Settings.Topology.Records;
|
||||||
using Orchard.Data;
|
using Orchard.Data;
|
||||||
using Orchard.Environment.Topology;
|
using Orchard.Environment.Topology;
|
||||||
using Orchard.Environment.Topology.Models;
|
using Orchard.Environment.Topology.Models;
|
||||||
using Orchard.Events;
|
using Orchard.Events;
|
||||||
|
using Orchard.Localization;
|
||||||
|
|
||||||
namespace Orchard.Core.Settings.Topology {
|
namespace Orchard.Core.Settings.Topology {
|
||||||
public class TopologyDescriptorManager : ITopologyDescriptorManager {
|
public class TopologyDescriptorManager : ITopologyDescriptorManager {
|
||||||
private readonly IRepository<TopologyRecord> _repository;
|
private readonly IRepository<TopologyRecord> _topologyRecordRepository;
|
||||||
private readonly IEventBus _eventBus;
|
private readonly IEventBus _eventBus;
|
||||||
private int _serialNumber;
|
|
||||||
|
|
||||||
public TopologyDescriptorManager(
|
public TopologyDescriptorManager(
|
||||||
IRepository<TopologyRecord> repository,
|
IRepository<TopologyRecord> repository,
|
||||||
IEventBus eventBus) {
|
IEventBus eventBus) {
|
||||||
_repository = repository;
|
_topologyRecordRepository = repository;
|
||||||
_eventBus = eventBus;
|
_eventBus = eventBus;
|
||||||
|
T = NullLocalizer.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Localizer T { get; set; }
|
||||||
|
|
||||||
public ShellTopologyDescriptor GetTopologyDescriptor() {
|
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) {
|
public void UpdateTopologyDescriptor(int priorSerialNumber, IEnumerable<TopologyFeature> enabledFeatures, IEnumerable<TopologyParameter> parameters) {
|
||||||
if (priorSerialNumber != _serialNumber)
|
TopologyRecord topologyRecord = GetTopologyRecord();
|
||||||
throw new Exception();
|
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(
|
_eventBus.Notify(
|
||||||
typeof(ITopologyDescriptorManager).FullName + ".UpdateTopologyDescriptor",
|
typeof(ITopologyDescriptorManager).FullName + ".UpdateTopologyDescriptor",
|
||||||
null);
|
null);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Orchard.Environment.Configuration;
|
|
||||||
|
|
||||||
namespace Orchard.Environment.Topology.Models {
|
namespace Orchard.Environment.Topology.Models {
|
||||||
public class ShellTopologyDescriptor {
|
public class ShellTopologyDescriptor {
|
||||||
|
|||||||
Reference in New Issue
Block a user