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 {
[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"));
}
}
}

View File

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

View File

@@ -1,2 +1,5 @@
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 {
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");

View File

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

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