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:
Louis DeJardin
2010-04-19 13:51:15 -07:00
parent 7c793f4e0a
commit 8d78fee02b
9 changed files with 116 additions and 107 deletions

View File

@@ -11,9 +11,9 @@ using Orchard.Events;
namespace Orchard.Tests.Modules.Settings.Topology { namespace Orchard.Tests.Modules.Settings.Topology {
[TestFixture] [TestFixture]
public class TopologyDescriptorManagerTests : DatabaseEnabledTestsBase { public class ShellDescriptorManagerTests : DatabaseEnabledTestsBase {
public override void Register(ContainerBuilder builder) { public override void Register(ContainerBuilder builder) {
builder.RegisterType<TopologyDescriptorManager>().As<ITopologyDescriptorManager>(); builder.RegisterType<ShellDescriptorManager>().As<IShellDescriptorManager>();
builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance(); builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance();
} }
@@ -40,104 +40,104 @@ namespace Orchard.Tests.Modules.Settings.Topology {
[Test] [Test]
public void TopologyShouldBeNullWhenItsNotInitialized() { public void TopologyShouldBeNullWhenItsNotInitialized() {
var manager = _container.Resolve<ITopologyDescriptorManager>(); var manager = _container.Resolve<IShellDescriptorManager>();
var topology = manager.GetTopologyDescriptor(); var topology = manager.GetShellDescriptor();
Assert.That(topology, Is.Null); Assert.That(topology, Is.Null);
} }
[Test] [Test]
public void PriorSerialNumberOfZeroIsAcceptableForInitialUpdateAndSerialNumberIsNonzeroAfterwards() { public void PriorSerialNumberOfZeroIsAcceptableForInitialUpdateAndSerialNumberIsNonzeroAfterwards() {
var manager = _container.Resolve<ITopologyDescriptorManager>(); var manager = _container.Resolve<IShellDescriptorManager>();
manager.UpdateTopologyDescriptor( manager.UpdateShellDescriptor(
0, 0,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>()); Enumerable.Empty<ShellParameter>());
var topology = manager.GetTopologyDescriptor(); var topology = manager.GetShellDescriptor();
Assert.That(topology, Is.Not.Null); Assert.That(topology, Is.Not.Null);
Assert.That(topology.SerialNumber, Is.Not.EqualTo(0)); Assert.That(topology.SerialNumber, Is.Not.EqualTo(0));
} }
[Test] [Test]
public void NonZeroInitialUpdateThrowsInvalidOperationException() { public void NonZeroInitialUpdateThrowsInvalidOperationException() {
var manager = _container.Resolve<ITopologyDescriptorManager>(); var manager = _container.Resolve<IShellDescriptorManager>();
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor( Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
1, 1,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>())); Enumerable.Empty<ShellParameter>()));
} }
[Test] [Test]
public void OnlyCorrectSerialNumberOnLaterUpdatesDoesNotThrowException() { public void OnlyCorrectSerialNumberOnLaterUpdatesDoesNotThrowException() {
var manager = _container.Resolve<ITopologyDescriptorManager>(); var manager = _container.Resolve<IShellDescriptorManager>();
manager.UpdateTopologyDescriptor( manager.UpdateShellDescriptor(
0, 0,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>()); Enumerable.Empty<ShellParameter>());
var topology = manager.GetTopologyDescriptor(); var topology = manager.GetShellDescriptor();
Assert.That(topology.SerialNumber, Is.Not.EqualTo(0)); Assert.That(topology.SerialNumber, Is.Not.EqualTo(0));
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor( Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
0, 0,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>())); Enumerable.Empty<ShellParameter>()));
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor( Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
topology.SerialNumber + 665321, topology.SerialNumber + 665321,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>())); Enumerable.Empty<ShellParameter>()));
manager.UpdateTopologyDescriptor( manager.UpdateShellDescriptor(
topology.SerialNumber, topology.SerialNumber,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>()); 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(0));
Assert.That(topology2.SerialNumber, Is.Not.EqualTo(topology.SerialNumber)); Assert.That(topology2.SerialNumber, Is.Not.EqualTo(topology.SerialNumber));
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor( Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
0, 0,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>())); Enumerable.Empty<ShellParameter>()));
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor( Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
topology.SerialNumber, topology.SerialNumber,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>())); Enumerable.Empty<ShellParameter>()));
manager.UpdateTopologyDescriptor( manager.UpdateShellDescriptor(
topology2.SerialNumber, topology2.SerialNumber,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>()); Enumerable.Empty<ShellParameter>());
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor( Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
topology2.SerialNumber, topology2.SerialNumber,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>())); Enumerable.Empty<ShellParameter>()));
} }
[Test] [Test]
public void SuccessfulUpdateRaisesAnEvent() { public void SuccessfulUpdateRaisesAnEvent() {
var manager = _container.Resolve<ITopologyDescriptorManager>(); var manager = _container.Resolve<IShellDescriptorManager>();
var eventBus = _container.Resolve<IEventBus>() as StubEventBus; var eventBus = _container.Resolve<IEventBus>() as StubEventBus;
Assert.That(eventBus.LastMessageName, Is.Null); Assert.That(eventBus.LastMessageName, Is.Null);
Assert.Throws<InvalidOperationException>(() => manager.UpdateTopologyDescriptor( Assert.Throws<InvalidOperationException>(() => manager.UpdateShellDescriptor(
5, 5,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>())); Enumerable.Empty<ShellParameter>()));
Assert.That(eventBus.LastMessageName, Is.Null); Assert.That(eventBus.LastMessageName, Is.Null);
manager.UpdateTopologyDescriptor( manager.UpdateShellDescriptor(
0, 0,
Enumerable.Empty<TopologyFeature>(), Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<TopologyParameter>()); Enumerable.Empty<ShellParameter>());
Assert.That(eventBus.LastMessageName, Is.EqualTo(typeof(ITopologyDescriptorManager).FullName + ".UpdateTopologyDescriptor")); Assert.That(eventBus.LastMessageName, Is.EqualTo(typeof(IShellDescriptorManager).FullName + ".UpdateShellDescriptor"));
} }
} }
} }

View File

@@ -9,7 +9,7 @@ using Orchard.Environment.Topology.Models;
namespace Orchard.Tests.Environment.Topology { namespace Orchard.Tests.Environment.Topology {
[TestFixture] [TestFixture]
public class DefaultTopologyDescriptorCacheTests { public class DefaultShellDescriptorCacheTests {
private IContainer _container; private IContainer _container;
private string _tempFolder; private string _tempFolder;
private IAppDataFolder _appDataFolder; private IAppDataFolder _appDataFolder;
@@ -23,7 +23,7 @@ namespace Orchard.Tests.Environment.Topology {
_appDataFolder.SetBasePath(_tempFolder); _appDataFolder.SetBasePath(_tempFolder);
var builder = new ContainerBuilder(); var builder = new ContainerBuilder();
builder.RegisterInstance(_appDataFolder).As<IAppDataFolder>(); builder.RegisterInstance(_appDataFolder).As<IAppDataFolder>();
builder.RegisterType<TopologyDescriptorCache>().As<ITopologyDescriptorCache>(); builder.RegisterType<ShellDescriptorCache>().As<IShellDescriptorCache>();
_container = builder.Build(); _container = builder.Build();
} }
@@ -34,15 +34,15 @@ namespace Orchard.Tests.Environment.Topology {
[Test] [Test]
public void FetchReturnsNullForCacheMiss() { public void FetchReturnsNullForCacheMiss() {
var service = _container.Resolve<ITopologyDescriptorCache>(); var service = _container.Resolve<IShellDescriptorCache>();
var descriptor = service.Fetch("No such shell"); var descriptor = service.Fetch("No such shell");
Assert.That(descriptor, Is.Null); Assert.That(descriptor, Is.Null);
} }
[Test] [Test]
public void StoreCanBeCalledMoreThanOnceOnTheSameName() { public void StoreCanBeCalledMoreThanOnceOnTheSameName() {
var service = _container.Resolve<ITopologyDescriptorCache>(); var service = _container.Resolve<IShellDescriptorCache>();
var descriptor = new ShellTopologyDescriptor { SerialNumber = 6655321 }; var descriptor = new ShellDescriptor { SerialNumber = 6655321 };
service.Store("Hello", descriptor); service.Store("Hello", descriptor);
service.Store("Hello", descriptor); service.Store("Hello", descriptor);
var result = service.Fetch("Hello"); var result = service.Fetch("Hello");
@@ -52,10 +52,10 @@ namespace Orchard.Tests.Environment.Topology {
[Test] [Test]
public void SecondCallUpdatesData() { public void SecondCallUpdatesData() {
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); service.Store("Hello", descriptor1);
var descriptor2 = new ShellTopologyDescriptor { SerialNumber = 42 }; var descriptor2 = new ShellDescriptor { SerialNumber = 42 };
service.Store("Hello", descriptor2); service.Store("Hello", descriptor2);
var result = service.Fetch("Hello"); var result = service.Fetch("Hello");
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
@@ -64,9 +64,9 @@ namespace Orchard.Tests.Environment.Topology {
[Test] [Test]
public void StoreNullWillClearEntry() { 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); service.Store("Hello", descriptor1);
var result1 = service.Fetch("Hello"); var result1 = service.Fetch("Hello");
Assert.That(result1, Is.Not.Null); Assert.That(result1, Is.Not.Null);
@@ -79,17 +79,17 @@ namespace Orchard.Tests.Environment.Topology {
[Test] [Test]
public void AllDataWillRoundTrip() { public void AllDataWillRoundTrip() {
var service = _container.Resolve<ITopologyDescriptorCache>(); var service = _container.Resolve<IShellDescriptorCache>();
var descriptor = new ShellTopologyDescriptor { var descriptor = new ShellDescriptor {
SerialNumber = 6655321, SerialNumber = 6655321,
EnabledFeatures = new[] { EnabledFeatures = new[] {
new TopologyFeature { Name = "f2"}, new ShellFeature { Name = "f2"},
new TopologyFeature { Name = "f4"}, new ShellFeature { Name = "f4"},
}, },
Parameters = new[] { Parameters = new[] {
new TopologyParameter {Component = "p1", Name = "p2",Value = "p3"}, new ShellParameter {Component = "p1", Name = "p2",Value = "p3"},
new TopologyParameter {Component = "p4",Name = "p5", Value = "p6"}, new ShellParameter {Component = "p4",Name = "p5", Value = "p6"},
}, },
}; };
var descriptorInfo = descriptor.ToDataString(); var descriptorInfo = descriptor.ToDataString();
@@ -107,7 +107,7 @@ namespace Orchard.Tests.Environment.Topology {
static class DataContractExtensions { static class DataContractExtensions {
public static string ToDataString<T>(this T obj) { public static string ToDataString<T>(this T obj) {
var serializer = new DataContractSerializer(typeof(ShellTopologyDescriptor)); var serializer = new DataContractSerializer(typeof(ShellDescriptor));
var writer = new StringWriter(); var writer = new StringWriter();
using (var xmlWriter = XmlWriter.Create(writer)) { using (var xmlWriter = XmlWriter.Create(writer)) {
serializer.WriteObject(xmlWriter, obj); serializer.WriteObject(xmlWriter, obj);

View File

@@ -1,2 +1,5 @@
name: Settings name: Settings
antiforgery: enabled antiforgery: enabled
features:
Settings:
description: Site configuration support

View File

@@ -7,7 +7,7 @@ using Orchard.Logging;
namespace Orchard.Environment.ShellBuilders { namespace Orchard.Environment.ShellBuilders {
public interface IShellContextFactory { public interface IShellContextFactory {
ShellContext Create(ShellSettings settings); ShellContext Create(ShellSettings settings);
} }
@@ -35,18 +35,13 @@ namespace Orchard.Environment.ShellBuilders {
Logger.Debug("Creating shell context for tenant {0}", settings.Name); Logger.Debug("Creating shell context for tenant {0}", settings.Name);
var cachedDescriptor = _topologyDescriptorCache.Fetch(settings.Name); var knownDescriptor = _topologyDescriptorCache.Fetch(settings.Name);
if (cachedDescriptor == null) { if (knownDescriptor == null) {
Logger.Information("No topology cached. Starting with minimum components."); Logger.Information("No topology cached. Starting with minimum components.");
cachedDescriptor = new ShellTopologyDescriptor { knownDescriptor = MinimumTopologyDescriptor();
SerialNumber = 0,
EnabledFeatures = Enumerable.Empty<TopologyFeature>(),
Parameters = Enumerable.Empty<TopologyParameter>(),
};
} }
// handle null-(e.g. cache miss)
var topology = _compositionStrategy.Compose(cachedDescriptor); var topology = _compositionStrategy.Compose(knownDescriptor);
var shellScope = _shellContainerFactory.CreateContainer(settings, topology); var shellScope = _shellContainerFactory.CreateContainer(settings, topology);
ShellTopologyDescriptor currentDescriptor; ShellTopologyDescriptor currentDescriptor;
@@ -55,7 +50,7 @@ namespace Orchard.Environment.ShellBuilders {
currentDescriptor = topologyDescriptorProvider.GetTopologyDescriptor(); currentDescriptor = topologyDescriptorProvider.GetTopologyDescriptor();
} }
if (cachedDescriptor.SerialNumber != currentDescriptor.SerialNumber) { if (currentDescriptor != null && knownDescriptor.SerialNumber != currentDescriptor.SerialNumber) {
Logger.Information("Newer topology obtained. Rebuilding shell container."); Logger.Information("Newer topology obtained. Rebuilding shell container.");
_topologyDescriptorCache.Store(settings.Name, currentDescriptor); _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() { private ShellContext CreateSetupContext() {
Logger.Warning("No shell settings available. Creating shell context for setup"); Logger.Warning("No shell settings available. Creating shell context for setup");

View File

@@ -5,23 +5,23 @@ namespace Orchard.Environment.Topology {
/// <summary> /// <summary>
/// Service resolved out of the shell container. Primarily used by host. /// Service resolved out of the shell container. Primarily used by host.
/// </summary> /// </summary>
public interface ITopologyDescriptorManager { public interface IShellDescriptorManager : IDependency {
/// <summary> /// <summary>
/// Uses shell-specific database or other resources to return /// Uses shell-specific database or other resources to return
/// the current "correct" configuration. The host will use this information /// the current "correct" configuration. The host will use this information
/// to reinitialize the shell. /// to reinitialize the shell.
/// </summary> /// </summary>
ShellTopologyDescriptor GetTopologyDescriptor(); ShellDescriptor GetShellDescriptor();
/// <summary> /// <summary>
/// Alters databased information to match information passed as arguments. /// Alters databased information to match information passed as arguments.
/// Prior SerialNumber used for optomistic concurrency, and an exception /// Prior SerialNumber used for optomistic concurrency, and an exception
/// should be thrown if the number in storage doesn't match what's provided. /// should be thrown if the number in storage doesn't match what's provided.
/// </summary> /// </summary>
void UpdateTopologyDescriptor( void UpdateShellDescriptor(
int priorSerialNumber, int priorSerialNumber,
IEnumerable<TopologyFeature> enabledFeatures, IEnumerable<ShellFeature> enabledFeatures,
IEnumerable<TopologyParameter> parameters); IEnumerable<ShellParameter> parameters);
} }

View 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; }
}
}

View File

@@ -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; }
}
}