mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Renaming ShellTopologyDescriptor to ShellDescriptor
More accurate and terse Associated tests, interface, component names changed to follow suit --HG-- branch : dev
This commit is contained in:
@@ -11,9 +11,9 @@ using Orchard.Events;
|
||||
|
||||
namespace Orchard.Tests.Modules.Settings.Topology {
|
||||
[TestFixture]
|
||||
public class TopologyDescriptorManagerTests : DatabaseEnabledTestsBase {
|
||||
public class ShellDescriptorManagerTests : DatabaseEnabledTestsBase {
|
||||
public override void Register(ContainerBuilder builder) {
|
||||
builder.RegisterType<TopologyDescriptorManager>().As<ITopologyDescriptorManager>();
|
||||
builder.RegisterType<ShellDescriptorManager>().As<IShellDescriptorManager>();
|
||||
builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance();
|
||||
|
||||
}
|
||||
@@ -40,104 +40,104 @@ namespace Orchard.Tests.Modules.Settings.Topology {
|
||||
|
||||
[Test]
|
||||
public void TopologyShouldBeNullWhenItsNotInitialized() {
|
||||
var manager = _container.Resolve<ITopologyDescriptorManager>();
|
||||
var topology = manager.GetTopologyDescriptor();
|
||||
var manager = _container.Resolve<IShellDescriptorManager>();
|
||||
var topology = manager.GetShellDescriptor();
|
||||
Assert.That(topology, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PriorSerialNumberOfZeroIsAcceptableForInitialUpdateAndSerialNumberIsNonzeroAfterwards() {
|
||||
var manager = _container.Resolve<ITopologyDescriptorManager>();
|
||||
manager.UpdateTopologyDescriptor(
|
||||
var manager = _container.Resolve<IShellDescriptorManager>();
|
||||
manager.UpdateShellDescriptor(
|
||||
0,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>());
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>());
|
||||
|
||||
var topology = manager.GetTopologyDescriptor();
|
||||
var topology = manager.GetShellDescriptor();
|
||||
Assert.That(topology, Is.Not.Null);
|
||||
Assert.That(topology.SerialNumber, Is.Not.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NonZeroInitialUpdateThrowsInvalidOperationException() {
|
||||
var manager = _container.Resolve<ITopologyDescriptorManager>();
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||
var manager = _container.Resolve<IShellDescriptorManager>();
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
|
||||
1,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>()));
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OnlyCorrectSerialNumberOnLaterUpdatesDoesNotThrowException() {
|
||||
var manager = _container.Resolve<ITopologyDescriptorManager>();
|
||||
manager.UpdateTopologyDescriptor(
|
||||
var manager = _container.Resolve<IShellDescriptorManager>();
|
||||
manager.UpdateShellDescriptor(
|
||||
0,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>());
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>());
|
||||
|
||||
var topology = manager.GetTopologyDescriptor();
|
||||
var topology = manager.GetShellDescriptor();
|
||||
Assert.That(topology.SerialNumber, Is.Not.EqualTo(0));
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
|
||||
0,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>()));
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>()));
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
|
||||
topology.SerialNumber + 665321,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>()));
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>()));
|
||||
|
||||
manager.UpdateTopologyDescriptor(
|
||||
manager.UpdateShellDescriptor(
|
||||
topology.SerialNumber,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>());
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>());
|
||||
|
||||
var topology2 = manager.GetTopologyDescriptor();
|
||||
var topology2 = manager.GetShellDescriptor();
|
||||
Assert.That(topology2.SerialNumber, Is.Not.EqualTo(0));
|
||||
Assert.That(topology2.SerialNumber, Is.Not.EqualTo(topology.SerialNumber));
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
|
||||
0,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>()));
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>()));
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
|
||||
topology.SerialNumber,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>()));
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>()));
|
||||
|
||||
manager.UpdateTopologyDescriptor(
|
||||
manager.UpdateShellDescriptor(
|
||||
topology2.SerialNumber,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>());
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>());
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
|
||||
topology2.SerialNumber,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>()));
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SuccessfulUpdateRaisesAnEvent() {
|
||||
var manager = _container.Resolve<ITopologyDescriptorManager>();
|
||||
var manager = _container.Resolve<IShellDescriptorManager>();
|
||||
var eventBus = _container.Resolve<IEventBus>() as StubEventBus;
|
||||
|
||||
Assert.That(eventBus.LastMessageName, Is.Null);
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor(
|
||||
Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
|
||||
5,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>()));
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>()));
|
||||
|
||||
Assert.That(eventBus.LastMessageName, Is.Null);
|
||||
|
||||
manager.UpdateTopologyDescriptor(
|
||||
manager.UpdateShellDescriptor(
|
||||
0,
|
||||
Enumerable.Empty<TopologyFeature>(),
|
||||
Enumerable.Empty<TopologyParameter>());
|
||||
Enumerable.Empty<ShellFeature>(),
|
||||
Enumerable.Empty<ShellParameter>());
|
||||
|
||||
Assert.That(eventBus.LastMessageName, Is.EqualTo(typeof(ITopologyDescriptorManager).FullName + ".UpdateTopologyDescriptor"));
|
||||
Assert.That(eventBus.LastMessageName, Is.EqualTo(typeof(IShellDescriptorManager).FullName + ".UpdateShellDescriptor"));
|
||||
}
|
||||
}
|
||||
}
|
@@ -9,7 +9,7 @@ using Orchard.Environment.Topology.Models;
|
||||
|
||||
namespace Orchard.Tests.Environment.Topology {
|
||||
[TestFixture]
|
||||
public class DefaultTopologyDescriptorCacheTests {
|
||||
public class DefaultShellDescriptorCacheTests {
|
||||
private IContainer _container;
|
||||
private string _tempFolder;
|
||||
private IAppDataFolder _appDataFolder;
|
||||
@@ -23,7 +23,7 @@ namespace Orchard.Tests.Environment.Topology {
|
||||
_appDataFolder.SetBasePath(_tempFolder);
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterInstance(_appDataFolder).As<IAppDataFolder>();
|
||||
builder.RegisterType<TopologyDescriptorCache>().As<ITopologyDescriptorCache>();
|
||||
builder.RegisterType<ShellDescriptorCache>().As<IShellDescriptorCache>();
|
||||
_container = builder.Build();
|
||||
}
|
||||
|
||||
@@ -34,15 +34,15 @@ namespace Orchard.Tests.Environment.Topology {
|
||||
|
||||
[Test]
|
||||
public void FetchReturnsNullForCacheMiss() {
|
||||
var service = _container.Resolve<ITopologyDescriptorCache>();
|
||||
var service = _container.Resolve<IShellDescriptorCache>();
|
||||
var descriptor = service.Fetch("No such shell");
|
||||
Assert.That(descriptor, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StoreCanBeCalledMoreThanOnceOnTheSameName() {
|
||||
var service = _container.Resolve<ITopologyDescriptorCache>();
|
||||
var descriptor = new ShellTopologyDescriptor { SerialNumber = 6655321 };
|
||||
var service = _container.Resolve<IShellDescriptorCache>();
|
||||
var descriptor = new ShellDescriptor { SerialNumber = 6655321 };
|
||||
service.Store("Hello", descriptor);
|
||||
service.Store("Hello", descriptor);
|
||||
var result = service.Fetch("Hello");
|
||||
@@ -52,10 +52,10 @@ namespace Orchard.Tests.Environment.Topology {
|
||||
|
||||
[Test]
|
||||
public void SecondCallUpdatesData() {
|
||||
var service = _container.Resolve<ITopologyDescriptorCache>();
|
||||
var descriptor1 = new ShellTopologyDescriptor { SerialNumber = 6655321 };
|
||||
var service = _container.Resolve<IShellDescriptorCache>();
|
||||
var descriptor1 = new ShellDescriptor { SerialNumber = 6655321 };
|
||||
service.Store("Hello", descriptor1);
|
||||
var descriptor2 = new ShellTopologyDescriptor { SerialNumber = 42 };
|
||||
var descriptor2 = new ShellDescriptor { SerialNumber = 42 };
|
||||
service.Store("Hello", descriptor2);
|
||||
var result = service.Fetch("Hello");
|
||||
Assert.That(result, Is.Not.Null);
|
||||
@@ -64,9 +64,9 @@ namespace Orchard.Tests.Environment.Topology {
|
||||
|
||||
[Test]
|
||||
public void StoreNullWillClearEntry() {
|
||||
var service = _container.Resolve<ITopologyDescriptorCache>();
|
||||
var service = _container.Resolve<IShellDescriptorCache>();
|
||||
|
||||
var descriptor1 = new ShellTopologyDescriptor { SerialNumber = 6655321 };
|
||||
var descriptor1 = new ShellDescriptor { SerialNumber = 6655321 };
|
||||
service.Store("Hello", descriptor1);
|
||||
var result1 = service.Fetch("Hello");
|
||||
Assert.That(result1, Is.Not.Null);
|
||||
@@ -79,17 +79,17 @@ namespace Orchard.Tests.Environment.Topology {
|
||||
|
||||
[Test]
|
||||
public void AllDataWillRoundTrip() {
|
||||
var service = _container.Resolve<ITopologyDescriptorCache>();
|
||||
var service = _container.Resolve<IShellDescriptorCache>();
|
||||
|
||||
var descriptor = new ShellTopologyDescriptor {
|
||||
var descriptor = new ShellDescriptor {
|
||||
SerialNumber = 6655321,
|
||||
EnabledFeatures = new[] {
|
||||
new TopologyFeature { Name = "f2"},
|
||||
new TopologyFeature { Name = "f4"},
|
||||
new ShellFeature { Name = "f2"},
|
||||
new ShellFeature { Name = "f4"},
|
||||
},
|
||||
Parameters = new[] {
|
||||
new TopologyParameter {Component = "p1", Name = "p2",Value = "p3"},
|
||||
new TopologyParameter {Component = "p4",Name = "p5", Value = "p6"},
|
||||
new ShellParameter {Component = "p1", Name = "p2",Value = "p3"},
|
||||
new ShellParameter {Component = "p4",Name = "p5", Value = "p6"},
|
||||
},
|
||||
};
|
||||
var descriptorInfo = descriptor.ToDataString();
|
||||
@@ -107,7 +107,7 @@ namespace Orchard.Tests.Environment.Topology {
|
||||
|
||||
static class DataContractExtensions {
|
||||
public static string ToDataString<T>(this T obj) {
|
||||
var serializer = new DataContractSerializer(typeof(ShellTopologyDescriptor));
|
||||
var serializer = new DataContractSerializer(typeof(ShellDescriptor));
|
||||
var writer = new StringWriter();
|
||||
using (var xmlWriter = XmlWriter.Create(writer)) {
|
||||
serializer.WriteObject(xmlWriter, obj);
|
@@ -1,2 +1,5 @@
|
||||
name: Settings
|
||||
antiforgery: enabled
|
||||
antiforgery: enabled
|
||||
features:
|
||||
Settings:
|
||||
description: Site configuration support
|
||||
|
@@ -7,7 +7,7 @@ using Orchard.Logging;
|
||||
|
||||
namespace Orchard.Environment.ShellBuilders {
|
||||
|
||||
public interface IShellContextFactory {
|
||||
public interface IShellContextFactory {
|
||||
ShellContext Create(ShellSettings settings);
|
||||
}
|
||||
|
||||
@@ -35,18 +35,13 @@ namespace Orchard.Environment.ShellBuilders {
|
||||
|
||||
Logger.Debug("Creating shell context for tenant {0}", settings.Name);
|
||||
|
||||
var cachedDescriptor = _topologyDescriptorCache.Fetch(settings.Name);
|
||||
if (cachedDescriptor == null) {
|
||||
var knownDescriptor = _topologyDescriptorCache.Fetch(settings.Name);
|
||||
if (knownDescriptor == null) {
|
||||
Logger.Information("No topology cached. Starting with minimum components.");
|
||||
cachedDescriptor = new ShellTopologyDescriptor {
|
||||
SerialNumber = 0,
|
||||
EnabledFeatures = Enumerable.Empty<TopologyFeature>(),
|
||||
Parameters = Enumerable.Empty<TopologyParameter>(),
|
||||
};
|
||||
knownDescriptor = MinimumTopologyDescriptor();
|
||||
}
|
||||
// handle null-(e.g. cache miss)
|
||||
|
||||
var topology = _compositionStrategy.Compose(cachedDescriptor);
|
||||
var topology = _compositionStrategy.Compose(knownDescriptor);
|
||||
var shellScope = _shellContainerFactory.CreateContainer(settings, topology);
|
||||
|
||||
ShellTopologyDescriptor currentDescriptor;
|
||||
@@ -55,7 +50,7 @@ namespace Orchard.Environment.ShellBuilders {
|
||||
currentDescriptor = topologyDescriptorProvider.GetTopologyDescriptor();
|
||||
}
|
||||
|
||||
if (cachedDescriptor.SerialNumber != currentDescriptor.SerialNumber) {
|
||||
if (currentDescriptor != null && knownDescriptor.SerialNumber != currentDescriptor.SerialNumber) {
|
||||
Logger.Information("Newer topology obtained. Rebuilding shell container.");
|
||||
|
||||
_topologyDescriptorCache.Store(settings.Name, currentDescriptor);
|
||||
@@ -72,6 +67,17 @@ namespace Orchard.Environment.ShellBuilders {
|
||||
};
|
||||
}
|
||||
|
||||
private static ShellTopologyDescriptor MinimumTopologyDescriptor() {
|
||||
return new ShellTopologyDescriptor {
|
||||
SerialNumber = -1,
|
||||
EnabledFeatures = new[] {
|
||||
new TopologyFeature {Name = "Orchard.Framework"},
|
||||
new TopologyFeature {Name = "Settings"},
|
||||
},
|
||||
Parameters = Enumerable.Empty<TopologyParameter>(),
|
||||
};
|
||||
}
|
||||
|
||||
private ShellContext CreateSetupContext() {
|
||||
Logger.Warning("No shell settings available. Creating shell context for setup");
|
||||
|
||||
|
@@ -5,23 +5,23 @@ namespace Orchard.Environment.Topology {
|
||||
/// <summary>
|
||||
/// Service resolved out of the shell container. Primarily used by host.
|
||||
/// </summary>
|
||||
public interface ITopologyDescriptorManager {
|
||||
public interface IShellDescriptorManager : IDependency {
|
||||
/// <summary>
|
||||
/// Uses shell-specific database or other resources to return
|
||||
/// the current "correct" configuration. The host will use this information
|
||||
/// to reinitialize the shell.
|
||||
/// </summary>
|
||||
ShellTopologyDescriptor GetTopologyDescriptor();
|
||||
ShellDescriptor GetShellDescriptor();
|
||||
|
||||
/// <summary>
|
||||
/// Alters databased information to match information passed as arguments.
|
||||
/// Prior SerialNumber used for optomistic concurrency, and an exception
|
||||
/// should be thrown if the number in storage doesn't match what's provided.
|
||||
/// </summary>
|
||||
void UpdateTopologyDescriptor(
|
||||
void UpdateShellDescriptor(
|
||||
int priorSerialNumber,
|
||||
IEnumerable<TopologyFeature> enabledFeatures,
|
||||
IEnumerable<TopologyParameter> parameters);
|
||||
IEnumerable<ShellFeature> enabledFeatures,
|
||||
IEnumerable<ShellParameter> parameters);
|
||||
}
|
||||
|
||||
|
25
src/Orchard/Environment/Topology/Models/ShellDescriptor.cs
Normal file
25
src/Orchard/Environment/Topology/Models/ShellDescriptor.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Orchard.Environment.Topology.Models {
|
||||
public class ShellDescriptor {
|
||||
public ShellDescriptor() {
|
||||
EnabledFeatures = Enumerable.Empty<ShellFeature>();
|
||||
Parameters = Enumerable.Empty<ShellParameter>();
|
||||
}
|
||||
|
||||
public int SerialNumber { get; set; }
|
||||
public IEnumerable<ShellFeature> EnabledFeatures { get; set; }
|
||||
public IEnumerable<ShellParameter> Parameters { get; set; }
|
||||
}
|
||||
|
||||
public class ShellFeature {
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
public class ShellParameter {
|
||||
public string Component { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
@@ -1,25 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Orchard.Environment.Topology.Models {
|
||||
public class ShellTopologyDescriptor {
|
||||
public ShellTopologyDescriptor() {
|
||||
EnabledFeatures = Enumerable.Empty<TopologyFeature>();
|
||||
Parameters = Enumerable.Empty<TopologyParameter>();
|
||||
}
|
||||
|
||||
public int SerialNumber { get; set; }
|
||||
public IEnumerable<TopologyFeature> EnabledFeatures { get; set; }
|
||||
public IEnumerable<TopologyParameter> Parameters { get; set; }
|
||||
}
|
||||
|
||||
public class TopologyFeature {
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
public class TopologyParameter {
|
||||
public string Component { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user