Passing along ShellSettings to apply DataPrefix to RecordTopology

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-04-19 16:52:22 -07:00
parent 78d5711e1a
commit ffa92f76e9
5 changed files with 95 additions and 43 deletions

View File

@@ -8,6 +8,7 @@ using Autofac.Core;
using Moq;
using NUnit.Framework;
using Orchard.ContentManagement.Records;
using Orchard.Environment.Configuration;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.Environment.Topology;
@@ -51,16 +52,21 @@ namespace Orchard.Tests.Environment {
});
}
private static ShellSettings BuildDefaultSettings() {
return new ShellSettings { Name = "Default" };
}
[Test]
public void TopologyIsNotNull() {
var descriptor = Build.TopologyDescriptor();
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var topology = compositionStrategy.Compose(BuildDefaultSettings(), descriptor);
Assert.That(topology, Is.Not.Null);
}
[Test]
public void DependenciesFromFeatureArePutIntoTopology() {
var descriptor = Build.TopologyDescriptor().WithFeatures("Foo", "Bar");
@@ -74,7 +80,7 @@ namespace Orchard.Tests.Environment {
_featureTypes["Bar"] = new[] { typeof(BarService1) };
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var topology = compositionStrategy.Compose(BuildDefaultSettings(), descriptor);
Assert.That(topology, Is.Not.Null);
Assert.That(topology.Dependencies.Count(), Is.EqualTo(2));
@@ -115,7 +121,7 @@ namespace Orchard.Tests.Environment {
_featureTypes["Foo"] = new[] { typeof(FooService1) };
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var topology = compositionStrategy.Compose(BuildDefaultSettings(), descriptor);
var foo = topology.Dependencies.SingleOrDefault(t => t.Type == typeof(FooService1));
Assert.That(foo, Is.Not.Null);
@@ -137,9 +143,9 @@ namespace Orchard.Tests.Environment {
_featureTypes["Bar"] = new[] { typeof(BetaModule) };
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var topology = compositionStrategy.Compose(BuildDefaultSettings(), descriptor);
var alpha = topology.Dependencies.Single(x => x.Type == typeof (AlphaModule));
var alpha = topology.Dependencies.Single(x => x.Type == typeof(AlphaModule));
var beta = topology.Dependencies.Single(x => x.Type == typeof(BetaModule));
Assert.That(alpha.Feature.Descriptor.Name, Is.EqualTo("Foo"));
@@ -170,11 +176,11 @@ namespace Orchard.Tests.Environment {
_featureTypes["Bar Minus"] = new[] { typeof(DeltaController), typeof(EpsilonController) };
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var topology = compositionStrategy.Compose(BuildDefaultSettings(), descriptor);
var gamma = topology.Controllers.Single(x => x.Type == typeof (GammaController));
var delta = topology.Controllers.Single(x => x.Type == typeof (DeltaController));
var epsilon = topology.Controllers.Single(x => x.Type == typeof (EpsilonController));
var gamma = topology.Controllers.Single(x => x.Type == typeof(GammaController));
var delta = topology.Controllers.Single(x => x.Type == typeof(DeltaController));
var epsilon = topology.Controllers.Single(x => x.Type == typeof(EpsilonController));
Assert.That(gamma.Feature.Descriptor.Name, Is.EqualTo("Foo Plus"));
Assert.That(gamma.AreaName, Is.EqualTo("MyCompany.Foo"));
@@ -221,10 +227,10 @@ namespace Orchard.Tests.Environment {
_featureTypes["Bar Minus"] = Enumerable.Empty<Type>();
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var topology = compositionStrategy.Compose(BuildDefaultSettings(), descriptor);
var foo = topology.Records.Single(x => x.Type == typeof (FooRecord));
var bar = topology.Records.Single(x => x.Type == typeof (BarRecord));
var foo = topology.Records.Single(x => x.Type == typeof(FooRecord));
var bar = topology.Records.Single(x => x.Type == typeof(BarRecord));
Assert.That(foo.Feature.Descriptor.Name, Is.EqualTo("Foo Plus"));
Assert.That(foo.TableName, Is.EqualTo("MyCompany_Foo_FooRecord"));
@@ -238,11 +244,11 @@ namespace Orchard.Tests.Environment {
var descriptor = Build.TopologyDescriptor().WithFeatures("Orchard.Framework");
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var topology = compositionStrategy.Compose(BuildDefaultSettings(), descriptor);
var ct = topology.Records.Single(x => x.Type == typeof (ContentTypeRecord));
var ci = topology.Records.Single(x => x.Type == typeof (ContentItemRecord));
var civ = topology.Records.Single(x => x.Type == typeof (ContentItemVersionRecord));
var ct = topology.Records.Single(x => x.Type == typeof(ContentTypeRecord));
var ci = topology.Records.Single(x => x.Type == typeof(ContentItemRecord));
var civ = topology.Records.Single(x => x.Type == typeof(ContentItemVersionRecord));
Assert.That(ct.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
Assert.That(ct.TableName, Is.EqualTo("Orchard_Framework_ContentTypeRecord"));
@@ -253,5 +259,35 @@ namespace Orchard.Tests.Environment {
Assert.That(civ.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
Assert.That(civ.TableName, Is.EqualTo("Orchard_Framework_ContentItemVersionRecord"));
}
[Test]
public void DataPrefixChangesTableName() {
var settings = BuildDefaultSettings();
settings.DataPrefix = "Yadda";
var descriptor = Build.TopologyDescriptor().WithFeatures("Foo Plus", "Bar", "Bar Minus");
_extensionDescriptors = new[] {
Build.ExtensionDescriptor("MyCompany.Foo", "Foo").WithFeatures("Foo", "Foo Plus"),
Build.ExtensionDescriptor("Bar").WithFeatures("Bar", "Bar Minus"),
};
_featureTypes["Foo"] = Enumerable.Empty<Type>();
_featureTypes["Foo Plus"] = new[] { typeof(FooRecord) };
_featureTypes["Bar"] = new[] { typeof(BarRecord) };
_featureTypes["Bar Minus"] = Enumerable.Empty<Type>();
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(settings, descriptor);
var foo = topology.Records.Single(x => x.Type == typeof(FooRecord));
var bar = topology.Records.Single(x => x.Type == typeof(BarRecord));
Assert.That(foo.Feature.Descriptor.Name, Is.EqualTo("Foo Plus"));
Assert.That(foo.TableName, Is.EqualTo("Yadda_MyCompany_Foo_FooRecord"));
Assert.That(bar.Feature.Descriptor.Name, Is.EqualTo("Bar"));
Assert.That(bar.TableName, Is.EqualTo("Yadda_Bar_BarRecord"));
}
}
}

View File

@@ -34,7 +34,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
.Returns(topologyDescriptor);
_container.Mock<ICompositionStrategy>()
.Setup(x => x.Compose(topologyDescriptor))
.Setup(x => x.Compose(settings, topologyDescriptor))
.Returns(topology);
_container.Mock<IShellContainerFactory>()
@@ -47,7 +47,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
var factory = _container.Resolve<IShellContextFactory>();
var context = factory.Create(settings);
var context = factory.CreateShellContext(settings);
Assert.That(context.Settings, Is.SameAs(settings));
Assert.That(context.Descriptor, Is.SameAs(topologyDescriptor));
@@ -58,10 +58,11 @@ namespace Orchard.Tests.Environment.ShellBuilders {
[Test]
public void NullSettingsReturnsSetupContext() {
var settings = new ShellSettings { Name = "Default" };
var topology = new ShellTopology();
_container.Mock<ICompositionStrategy>()
.Setup(x => x.Compose(It.IsAny<ShellDescriptor>()))
.Setup(x => x.Compose(settings, It.IsAny<ShellDescriptor>()))
.Returns(topology);
_container.Mock<IShellContainerFactory>()
@@ -69,7 +70,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
.Returns(_container.BeginLifetimeScope("shell"));
var factory = _container.Resolve<IShellContextFactory>();
var context = factory.Create(null);
var context = factory.CreateShellContext(null);
Assert.That(context.Descriptor.EnabledFeatures, Has.Some.With.Property("Name").EqualTo("Orchard.Setup"));
}

View File

@@ -92,12 +92,12 @@ namespace Orchard.Environment {
ShellContext CreateSetupContext() {
Logger.Debug("Creating shell context for setup");
return _shellContextFactory.Create(null);
return _shellContextFactory.CreateSetupContext();
}
ShellContext CreateShellContext(ShellSettings settings) {
Logger.Debug("Creating shell context for tenant {0}", settings.Name);
return _shellContextFactory.Create(settings);
return _shellContextFactory.CreateShellContext(settings);
}
protected virtual void BeginRequest() {

View File

@@ -6,9 +6,21 @@ using Orchard.Environment.Topology.Models;
using Orchard.Logging;
namespace Orchard.Environment.ShellBuilders {
/// <summary>
/// High-level coordinator that exercises other component capabilities to
/// build all of the artifacts for a running shell given a tenant settings.
/// </summary>
public interface IShellContextFactory {
ShellContext Create(ShellSettings settings);
/// <summary>
/// Builds a shell context given a specific tenant settings structure
/// </summary>
ShellContext CreateShellContext(ShellSettings settings);
/// <summary>
/// Builds a shell context for an uninitialized Orchard instance. Needed
/// to display setup user interface.
/// </summary>
ShellContext CreateSetupContext();
}
public class ShellContextFactory : IShellContextFactory {
@@ -28,10 +40,7 @@ namespace Orchard.Environment.ShellBuilders {
public ILogger Logger { get; set; }
public ShellContext Create(ShellSettings settings) {
if (settings == null) {
return CreateSetupContext();
}
public ShellContext CreateShellContext(ShellSettings settings) {
Logger.Debug("Creating shell context for tenant {0}", settings.Name);
@@ -41,7 +50,7 @@ namespace Orchard.Environment.ShellBuilders {
knownDescriptor = MinimumTopologyDescriptor();
}
var topology = _compositionStrategy.Compose(knownDescriptor);
var topology = _compositionStrategy.Compose(settings, knownDescriptor);
var shellScope = _shellContainerFactory.CreateContainer(settings, topology);
ShellDescriptor currentDescriptor;
@@ -54,7 +63,7 @@ namespace Orchard.Environment.ShellBuilders {
Logger.Information("Newer topology obtained. Rebuilding shell container.");
_shellDescriptorCache.Store(settings.Name, currentDescriptor);
topology = _compositionStrategy.Compose(currentDescriptor);
topology = _compositionStrategy.Compose(settings, currentDescriptor);
shellScope = _shellContainerFactory.CreateContainer(settings, topology);
}
@@ -78,16 +87,17 @@ namespace Orchard.Environment.ShellBuilders {
};
}
private ShellContext CreateSetupContext() {
public ShellContext CreateSetupContext() {
Logger.Warning("No shell settings available. Creating shell context for setup");
var settings = new ShellSettings { Name = "__Orchard__Setup__" };
var descriptor = new ShellDescriptor {
SerialNumber = -1,
EnabledFeatures = new[] { new ShellFeature { Name = "Orchard.Setup" } },
};
var topology = _compositionStrategy.Compose(descriptor);
var topology = _compositionStrategy.Compose(settings, descriptor);
var shellScope = _shellContainerFactory.CreateContainer(settings, topology);
return new ShellContext {

View File

@@ -6,6 +6,7 @@ using System.Web.Mvc;
using Autofac.Core;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Records;
using Orchard.Environment.Configuration;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.Environment.Topology.Models;
@@ -19,7 +20,7 @@ namespace Orchard.Environment.Topology {
/// Using information from the IExtensionManager, transforms and populates all of the
/// topology model the shell builders will need to correctly initialize a tenant IoC container.
/// </summary>
ShellTopology Compose(ShellDescriptor descriptor);
ShellTopology Compose(ShellSettings settings, ShellDescriptor descriptor);
}
public class CompositionStrategy : ICompositionStrategy {
@@ -29,7 +30,7 @@ namespace Orchard.Environment.Topology {
_extensionManager = extensionManager;
}
public ShellTopology Compose(ShellDescriptor descriptor) {
public ShellTopology Compose(ShellSettings settings, ShellDescriptor descriptor) {
var enabledFeatures = _extensionManager.AvailableExtensions()
.SelectMany(extensionDescriptor => extensionDescriptor.Features)
.Where(featureDescriptor => IsFeatureEnabledInTopology(featureDescriptor, descriptor));
@@ -42,7 +43,7 @@ namespace Orchard.Environment.Topology {
var modules = BuildTopology<DependencyTopology>(features, IsModule, BuildModule);
var dependencies = BuildTopology(features, IsDependency, (t, f) => BuildDependency(t, f, descriptor));
var controllers = BuildTopology<ControllerTopology>(features, IsController, BuildController);
var records = BuildTopology<RecordTopology>(features, IsRecord, BuildRecord);
var records = BuildTopology(features, IsRecord, (t, f) => BuildRecord(t, f, settings));
return new ShellTopology {
Dependencies = dependencies.Concat(modules).ToArray(),
@@ -129,14 +130,18 @@ namespace Orchard.Environment.Topology {
(!typeof(IContent).IsAssignableFrom(type) || typeof(ContentPartRecord).IsAssignableFrom(type));
}
private static RecordTopology BuildRecord(Type type, Feature feature) {
private static RecordTopology BuildRecord(Type type, Feature feature, ShellSettings settings) {
var extensionDescriptor = feature.Descriptor.Extension;
var extensionName = extensionDescriptor.Name.Replace('.', '_');
var dataPrefix = "";
if (!string.IsNullOrEmpty(settings.DataPrefix))
dataPrefix = settings.DataPrefix + "_";
return new RecordTopology {
Type = type,
Feature = feature,
TableName = extensionName + '_' + type.Name,
TableName = dataPrefix + extensionName + '_' + type.Name,
};
}
}