Incremental improvement to extension manager

--HG--
branch : perf
extra : rebase_source : f2697bf60ab12c79e848e1794652e19ac5933d3a
This commit is contained in:
Louis DeJardin
2010-11-12 18:58:35 -08:00
parent 00f0653c63
commit 30191928b5
7 changed files with 33 additions and 67 deletions

View File

@@ -1,3 +1 @@
setup /SiteName:Profiling /AdminUsername:admin /AdminPassword:profiling-secret /DatabaseProvider:SqlCe /EnabledFeatures:Profiling,Orchard.Framework,Routable,Common,Dashboard,Feeds,Orchard.PublishLater,HomePage,Contents,Messaging,Navigation,Reports,Scheduling,Indexing,Settings,Localization,XmlRpc,Orchard.Users,Orchard.Roles,TinyMce,Orchard.Themes,Orchard.MultiTenancy,Orchard.Blogs,Orchard.Comments,Orchard.Modules,Orchard.Widgets,Orchard.Media,Orchard.Tags,Orchard.Experimental
add profiling data
feature disable Orchard.Experimental

View File

@@ -11,6 +11,7 @@ using Orchard.Environment.Extensions.Loaders;
using Orchard.Environment.Extensions.Models;
using Orchard.FileSystems.Dependencies;
using Orchard.Tests.Extensions.ExtensionTypes;
using Orchard.Tests.Stubs;
namespace Orchard.Tests.Environment.Extensions {
[TestFixture]
@@ -265,7 +266,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features);
@@ -291,7 +292,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features);
@@ -326,7 +327,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features)
.Single(x => x.Name == "TestFeature");
@@ -356,7 +357,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features)
.Single(x => x.Name == "TestFeature");
@@ -384,7 +385,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testModule = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features)
.Single(x => x.Name == "TestModule");
@@ -408,7 +409,7 @@ Version: 1.0.3
OrchardVersion: 1
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
@@ -427,7 +428,7 @@ Version: 1.0.3
OrchardVersion: 1
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));

View File

@@ -11,6 +11,7 @@ using Orchard.Environment.Extensions.Loaders;
using Orchard.Environment.Extensions.Models;
using Orchard.FileSystems.Dependencies;
using Orchard.Tests.Extensions.ExtensionTypes;
using Orchard.Tests.Stubs;
namespace Orchard.Tests.Environment.Extensions {
[TestFixture]
@@ -268,7 +269,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features);
@@ -294,7 +295,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features);
@@ -329,7 +330,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features)
.Single(x => x.Name == "TestFeature");
@@ -359,7 +360,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testFeature = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features)
.Single(x => x.Name == "TestFeature");
@@ -387,7 +388,7 @@ Features:
Description: Contains the Phi type.
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var testModule = extensionManager.AvailableExtensions()
.SelectMany(x => x.Features)
.Single(x => x.Name == "TestModule");
@@ -411,7 +412,7 @@ Version: 1.0.3
OrchardVersion: 1
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
@@ -447,7 +448,7 @@ Features:
Dependencies: Beta
");
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var features = extensionManager.AvailableFeatures();
Assert.That(features.Aggregate("<", (a,b)=>a+b.Name+"<"), Is.EqualTo("<Beta<Gamma<Alpha<"));
}
@@ -487,7 +488,7 @@ Version: 1.0.3
OrchardVersion: 1
");
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var features = extensionManager.AvailableFeatures();
Assert.That(features.Count(), Is.EqualTo(4));
}
@@ -530,7 +531,7 @@ Features:
Dependencies: Alpha
");
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader });
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader }, new StubCacheManager());
var features = extensionManager.AvailableFeatures();
Assert.That(features.Aggregate("<", (a, b) => a + b.Name + "<"), Is.EqualTo("<Beta<Gamma<Alpha<Classic<"));
}

View File

@@ -3,7 +3,7 @@
@Display(Model.Metadata.ChildContent)
@{
var workContext = ViewContext.GetWorkContext();
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.ThemeName);
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.Name);
<!--
<ul>
@foreach(var binding in shapeTable.Bindings) {

View File

@@ -2,7 +2,7 @@
@using Orchard.DisplayManagement.Descriptors;
@{
var workContext = ViewContext.GetWorkContext();
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.ThemeName);
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.Name);
var descriptor = shapeTable.Descriptors[Model.Metadata.Type];
}

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Orchard.Caching;
using Orchard.Environment.Extensions.Folders;
using Orchard.Environment.Extensions.Loaders;
using Orchard.Environment.Extensions.Models;
@@ -13,15 +14,17 @@ using Orchard.Utility.Extensions;
namespace Orchard.Environment.Extensions {
public class ExtensionManager : IExtensionManager {
private readonly IEnumerable<IExtensionFolders> _folders;
private readonly ICacheManager _cacheManager;
private readonly IEnumerable<IExtensionLoader> _loaders;
private IEnumerable<FeatureDescriptor> _featureDescriptors;
public Localizer T { get; set; }
public ILogger Logger { get; set; }
public ExtensionManager(IEnumerable<IExtensionFolders> folders, IEnumerable<IExtensionLoader> loaders) {
public ExtensionManager(IEnumerable<IExtensionFolders> folders, IEnumerable<IExtensionLoader> loaders, ICacheManager cacheManager) {
_folders = folders;
_loaders = loaders.OrderBy(x => x.Order);
_cacheManager = cacheManager;
_loaders = loaders.OrderBy(x => x.Order).ToArray();
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
}
@@ -67,35 +70,20 @@ namespace Orchard.Environment.Extensions {
item.Dependencies.Any(x => StringComparer.OrdinalIgnoreCase.Equals(x, subject.Name));
}
private IEnumerable<ExtensionEntry> LoadedExtensions() {
foreach (var descriptor in AvailableExtensions()) {
ExtensionEntry entry = null;
try {
entry = BuildEntry(descriptor);
}
catch (HttpCompileException ex) {
Logger.Warning(ex, "Unable to load extension {0}", descriptor.Name);
}
if (entry != null)
yield return entry;
}
}
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors) {
return featureDescriptors
.Select(LoadFeature)
.Select(descriptor => _cacheManager.Get(descriptor.Name, ctx => LoadFeature(descriptor)))
.ToArray();
}
private Feature LoadFeature(FeatureDescriptor featureDescriptor) {
var extensionDescriptor = featureDescriptor.Extension;
var featureName = featureDescriptor.Name;
var extensionName = extensionDescriptor.Name;
string extensionName = GetExtensionForFeature(featureName);
if (extensionName == null)
throw new ArgumentException(T("Feature {0} was not found in any of the installed extensions", featureName).ToString());
var extension = LoadedExtensions().Where(x => x.Descriptor.Name == extensionName).FirstOrDefault();
if (extension == null) {
var extensionEntry = _cacheManager.Get(extensionName, ctx => BuildEntry(extensionDescriptor));
if (extensionEntry == null) {
// If the feature could not be compiled for some reason,
// return a "null" feature, i.e. a feature with no exported types.
return new Feature {
@@ -104,7 +92,7 @@ namespace Orchard.Environment.Extensions {
};
}
var extensionTypes = extension.ExportedTypes.Where(t => t.IsClass && !t.IsAbstract);
var extensionTypes = extensionEntry.ExportedTypes.Where(t => t.IsClass && !t.IsAbstract);
var featureTypes = new List<Type>();
foreach (var type in extensionTypes) {
@@ -127,20 +115,6 @@ namespace Orchard.Environment.Extensions {
return extensionName;
}
private string GetExtensionForFeature(string featureName) {
foreach (var extensionDescriptor in AvailableExtensions()) {
if (String.Equals(extensionDescriptor.Name, featureName, StringComparison.OrdinalIgnoreCase)) {
return extensionDescriptor.Name;
}
foreach (var feature in extensionDescriptor.Features) {
if (String.Equals(feature.Name, featureName, StringComparison.OrdinalIgnoreCase)) {
return extensionDescriptor.Name;
}
}
}
return null;
}
private ExtensionEntry BuildEntry(ExtensionDescriptor descriptor) {
foreach (var loader in _loaders) {
ExtensionEntry entry = loader.Load(descriptor);

View File

@@ -14,14 +14,6 @@ namespace Orchard.Environment.Extensions {
}
public static class ExtensionManagerExtensions {
public static IEnumerable<ExtensionDescriptor> EnabledExtensions(this IExtensionManager extensionManager, ShellDescriptor descriptor) {
var enabledFeatures = EnabledFeatures(extensionManager, descriptor);
return extensionManager.AvailableExtensions()
.Where(extensionDescriptor =>
extensionDescriptor.Features.Any(featureDescriptor =>
enabledFeatures.Any(availableFeature => featureDescriptor.Name == availableFeature.Name)));
}
public static IEnumerable<FeatureDescriptor> EnabledFeatures(this IExtensionManager extensionManager, ShellDescriptor descriptor) {
return extensionManager.AvailableExtensions()
.SelectMany(extensionDescriptor => extensionDescriptor.Features)