From c4621deae3d59e2f956344f460838d801281ef0e Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Thu, 14 Oct 2010 15:14:04 -0700 Subject: [PATCH] Adding a GetEnabledThemes() so the WidgetService can get the zones of only enabled themes --HG-- branch : dev --- .../Themes/Services/ThemeServiceTests.cs | 19 +++++++++++++++++ .../DefaultShapeTableManagerTests.cs | 9 ++++++++ .../Environment/DefaultOrchardHostTests.cs | 8 +++++++ .../Stubs/StubExtensionManager.cs | 9 ++++++++ .../Modules/Orchard.Setup/SetupMode.cs | 2 ++ .../Orchard.Themes/Services/ThemeService.cs | 21 ++++++++++++++++--- .../Services/WidgetsService.cs | 2 +- .../Extensions/ExtensionManager.cs | 21 +++++++++++++++++-- .../Extensions/IExtensionManager.cs | 3 +++ .../ShellBuilders/CompositionStrategy.cs | 9 +------- src/Orchard/Themes/IThemeService.cs | 1 + .../UI/Navigation/NavigationManager.cs | 5 +++-- 12 files changed, 93 insertions(+), 16 deletions(-) diff --git a/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs b/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs index 1a98a5948..b1b0c2310 100644 --- a/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs +++ b/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs @@ -207,10 +207,29 @@ namespace Orchard.Tests.Modules.Themes.Services { } } + public IEnumerable EnabledExtensions(ShellDescriptor descriptor) { + var extensions = new[] { + new ExtensionDescriptor {Name = "ThemeOne", ExtensionType = "Theme"}, + new ExtensionDescriptor {Name = "ThemeTwo", BaseTheme = "ThemeOne", ExtensionType = "Theme"}, + new ExtensionDescriptor {Name = "ThemeThree", BaseTheme = "TheThemeThatIsntThere", ExtensionType = "Theme"}, + new ExtensionDescriptor {Name = "ThemeFourBasedOnFive", BaseTheme = "ThemeFiveBasedOnFour", ExtensionType = "Theme"}, + new ExtensionDescriptor {Name = "ThemeFiveBasedOnFour", BaseTheme = "ThemeFourBasedOnFive", ExtensionType = "Theme"}, + }; + + foreach (var extension in extensions) { + extension.Features = new[] { new FeatureDescriptor { Extension = extension, Name = extension.Name } }; + yield return extension; + } + } + public IEnumerable AvailableFeatures() { return AvailableExtensions().SelectMany(ed => ed.Features); } + public IEnumerable EnabledFeatures(ShellDescriptor descriptor) { + return AvailableExtensions().SelectMany(ed => ed.Features); + } + public IEnumerable LoadFeatures(IEnumerable featureDescriptors) { return featureDescriptors.Select(FrameworkFeature); } diff --git a/src/Orchard.Tests/DisplayManagement/Descriptors/DefaultShapeTableManagerTests.cs b/src/Orchard.Tests/DisplayManagement/Descriptors/DefaultShapeTableManagerTests.cs index 7902ff2cf..e44a979d6 100644 --- a/src/Orchard.Tests/DisplayManagement/Descriptors/DefaultShapeTableManagerTests.cs +++ b/src/Orchard.Tests/DisplayManagement/Descriptors/DefaultShapeTableManagerTests.cs @@ -7,6 +7,7 @@ using NUnit.Framework; using Orchard.ContentManagement; using Orchard.DisplayManagement.Descriptors; using Orchard.DisplayManagement.Implementation; +using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; @@ -86,10 +87,18 @@ namespace Orchard.Tests.DisplayManagement.Descriptors { throw new NotSupportedException(); } + public IEnumerable EnabledExtensions(ShellDescriptor descriptor) { + throw new NotSupportedException(); + } + public IEnumerable AvailableFeatures() { return _availableFeautures; } + public IEnumerable EnabledFeatures(ShellDescriptor descriptor) { + throw new NotSupportedException(); + } + public IEnumerable LoadFeatures(IEnumerable featureDescriptors) { throw new NotSupportedException(); } diff --git a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs index 3de07ac2c..29ac5b3d4 100644 --- a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs +++ b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs @@ -90,11 +90,19 @@ namespace Orchard.Tests.Environment { yield return ext; } + public IEnumerable EnabledExtensions(ShellDescriptor descriptor) { + throw new NotSupportedException(); + } + public IEnumerable AvailableFeatures() { // note - doesn't order properly return AvailableExtensions().SelectMany(ed => ed.Features); } + public IEnumerable EnabledFeatures(ShellDescriptor descriptor) { + throw new NotSupportedException(); + } + public IEnumerable LoadFeatures(IEnumerable featureDescriptors) { foreach (var descriptor in featureDescriptors) { if (descriptor.Name == "Orchard.Framework") { diff --git a/src/Orchard.Tests/Stubs/StubExtensionManager.cs b/src/Orchard.Tests/Stubs/StubExtensionManager.cs index 0bdf7f756..09f596a8c 100644 --- a/src/Orchard.Tests/Stubs/StubExtensionManager.cs +++ b/src/Orchard.Tests/Stubs/StubExtensionManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Web; +using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; @@ -10,10 +11,18 @@ namespace Orchard.Tests.Stubs { throw new NotSupportedException(); } + public IEnumerable EnabledExtensions(ShellDescriptor descriptor) { + throw new NotSupportedException(); + } + public IEnumerable AvailableFeatures() { throw new NotSupportedException(); } + public IEnumerable EnabledFeatures(ShellDescriptor descriptor) { + throw new NotSupportedException(); + } + public IEnumerable LoadFeatures(IEnumerable featureDescriptors) { throw new NotSupportedException(); } diff --git a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs index ccca1cdc3..0395a666f 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs @@ -129,6 +129,8 @@ namespace Orchard.Setup { public void SetSiteTheme(string themeName) { } public ITheme GetRequestTheme(RequestContext requestContext) { return _theme; } public IEnumerable GetInstalledThemes() { return new[] { _theme }; } + public IEnumerable GetEnabledThemes() { return new[] { _theme }; } + public void InstallTheme(HttpPostedFileBase file) { } public void UninstallTheme(string themeName) { } public void EnableTheme(string themeName) { } diff --git a/src/Orchard.Web/Modules/Orchard.Themes/Services/ThemeService.cs b/src/Orchard.Web/Modules/Orchard.Themes/Services/ThemeService.cs index d1b8760e7..2c472c287 100644 --- a/src/Orchard.Web/Modules/Orchard.Themes/Services/ThemeService.cs +++ b/src/Orchard.Web/Modules/Orchard.Themes/Services/ThemeService.cs @@ -5,6 +5,7 @@ using System.Web; using System.Web.Routing; using JetBrains.Annotations; using Orchard.Environment.Descriptor; +using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; using Orchard.Localization; @@ -21,6 +22,7 @@ namespace Orchard.Themes.Services { private readonly IEnumerable _themeSelectors; private readonly IModuleService _moduleService; private readonly IWorkContextAccessor _workContextAccessor; + private readonly ShellDescriptor _shellDescriptor; private readonly IShellDescriptorManager _shellDescriptorManager; public ThemeService( @@ -28,12 +30,14 @@ namespace Orchard.Themes.Services { IExtensionManager extensionManager, IEnumerable themeSelectors, IModuleService moduleService, - IWorkContextAccessor workContextAccessor) { + IWorkContextAccessor workContextAccessor, + ShellDescriptor shellDescriptor) { _shellDescriptorManager = shellDescriptorManager; _extensionManager = extensionManager; _themeSelectors = themeSelectors; _moduleService = moduleService; _workContextAccessor = workContextAccessor; + _shellDescriptor = shellDescriptor; Logger = NullLogger.Instance; T = NullLocalizer.Instance; } @@ -167,11 +171,22 @@ namespace Orchard.Themes.Services { } /// - /// Loads only enabled themes + /// Loads only installed themes /// public IEnumerable GetInstalledThemes() { + return GetThemes(_extensionManager.AvailableExtensions()); + } + + /// + /// Loads only enabled themes + /// + public IEnumerable GetEnabledThemes() { + return GetThemes(_extensionManager.EnabledExtensions(_shellDescriptor)); + } + + private IEnumerable GetThemes(IEnumerable extensions) { var themes = new List(); - foreach (var descriptor in _extensionManager.AvailableExtensions()) { + foreach (var descriptor in extensions) { if (!string.Equals(descriptor.ExtensionType, "Theme", StringComparison.OrdinalIgnoreCase)) { continue; diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs index 386250c82..40127ac6e 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs @@ -42,7 +42,7 @@ namespace Orchard.Widgets.Services { public IEnumerable GetZones() { HashSet zones = new HashSet(); - foreach (var theme in _themeService.GetInstalledThemes().Where(theme => theme.Zones != null && !theme.Zones.Trim().Equals(string.Empty))) { + foreach (var theme in _themeService.GetEnabledThemes().Where(theme => theme.Zones != null && !theme.Zones.Trim().Equals(string.Empty))) { foreach (string zone in theme.Zones.Split(',').Where(zone => !zones.Contains(zone))) { zones.Add(zone.Trim()); } diff --git a/src/Orchard/Environment/Extensions/ExtensionManager.cs b/src/Orchard/Environment/Extensions/ExtensionManager.cs index 12b2baf9b..c1a497f05 100644 --- a/src/Orchard/Environment/Extensions/ExtensionManager.cs +++ b/src/Orchard/Environment/Extensions/ExtensionManager.cs @@ -4,14 +4,13 @@ using System.IO; using System.Linq; using System.Web; using ICSharpCode.SharpZipLib.Zip; +using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions.Folders; using Orchard.Environment.Extensions.Helpers; using Orchard.Environment.Extensions.Loaders; using Orchard.Environment.Extensions.Models; using Orchard.Localization; using Orchard.Logging; -using Orchard.Settings; -using Orchard.Themes; using Orchard.Utility; using Orchard.Utility.Extensions; @@ -36,12 +35,30 @@ namespace Orchard.Environment.Extensions { return _folders.SelectMany(folder => folder.AvailableExtensions()); } + public IEnumerable EnabledExtensions(ShellDescriptor descriptor) { + var enabledFeatures = EnabledFeatures(descriptor); + return _folders.SelectMany(folder => folder.AvailableExtensions()) + .Where(extensionDescriptor => + extensionDescriptor.Features.Any(featureDescriptor => + enabledFeatures.Any(availableFeature => featureDescriptor.Name == availableFeature.Name))); + } + public IEnumerable AvailableFeatures() { var featureDescriptors = AvailableExtensions().SelectMany(ext => ext.Features); var featureDescriptorsOrdered = featureDescriptors.OrderByDependencies(HasDependency); return featureDescriptorsOrdered.ToReadOnlyCollection(); } + public IEnumerable EnabledFeatures(ShellDescriptor descriptor) { + return AvailableExtensions() + .SelectMany(extensionDescriptor => extensionDescriptor.Features) + .Where(featureDescriptor => IsFeatureEnabledInDescriptor(featureDescriptor, descriptor)); + } + + private static bool IsFeatureEnabledInDescriptor(FeatureDescriptor featureDescriptor, ShellDescriptor shellDescriptor) { + return shellDescriptor.Features.Any(shellDescriptorFeature => shellDescriptorFeature.Name == featureDescriptor.Name); + } + /// /// Returns true if the item has an explicit or implicit dependency on the subject /// diff --git a/src/Orchard/Environment/Extensions/IExtensionManager.cs b/src/Orchard/Environment/Extensions/IExtensionManager.cs index 68377af42..8c3936b7d 100644 --- a/src/Orchard/Environment/Extensions/IExtensionManager.cs +++ b/src/Orchard/Environment/Extensions/IExtensionManager.cs @@ -1,11 +1,14 @@ using System.Collections.Generic; using System.Web; +using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions.Models; namespace Orchard.Environment.Extensions { public interface IExtensionManager { IEnumerable AvailableExtensions(); + IEnumerable EnabledExtensions(ShellDescriptor descriptor); IEnumerable AvailableFeatures(); + IEnumerable EnabledFeatures(ShellDescriptor descriptor); IEnumerable LoadFeatures(IEnumerable featureDescriptors); void InstallExtension(string extensionType, HttpPostedFileBase extensionBundle); diff --git a/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs b/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs index db5c8b1b2..3f142031f 100644 --- a/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs +++ b/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs @@ -32,10 +32,7 @@ namespace Orchard.Environment.ShellBuilders { } public ShellBlueprint Compose(ShellSettings settings, ShellDescriptor descriptor) { - var enabledFeatures = _extensionManager.AvailableExtensions() - .SelectMany(extensionDescriptor => extensionDescriptor.Features) - .Where(featureDescriptor => IsFeatureEnabledInDescriptor(featureDescriptor, descriptor)); - + var enabledFeatures = _extensionManager.EnabledFeatures(descriptor); var features = _extensionManager.LoadFeatures(enabledFeatures); if (descriptor.Features.Any(feature => feature.Name == "Orchard.Framework")) @@ -55,10 +52,6 @@ namespace Orchard.Environment.ShellBuilders { }; } - private static bool IsFeatureEnabledInDescriptor(FeatureDescriptor featureDescriptor, ShellDescriptor shellDescriptor) { - return shellDescriptor.Features.Any(shellDescriptorFeature => shellDescriptorFeature.Name == featureDescriptor.Name); - } - private static IEnumerable BuiltinFeatures() { yield return new Feature { Descriptor = new FeatureDescriptor { diff --git a/src/Orchard/Themes/IThemeService.cs b/src/Orchard/Themes/IThemeService.cs index d492f64e0..53e819c5d 100644 --- a/src/Orchard/Themes/IThemeService.cs +++ b/src/Orchard/Themes/IThemeService.cs @@ -14,6 +14,7 @@ namespace Orchard.Themes { void DisableTheme(string themeName); IEnumerable GetInstalledThemes(); + IEnumerable GetEnabledThemes(); void InstallTheme(HttpPostedFileBase file); void UninstallTheme(string themeName); } diff --git a/src/Orchard/UI/Navigation/NavigationManager.cs b/src/Orchard/UI/Navigation/NavigationManager.cs index ecf5120aa..e8471eecc 100644 --- a/src/Orchard/UI/Navigation/NavigationManager.cs +++ b/src/Orchard/UI/Navigation/NavigationManager.cs @@ -21,7 +21,8 @@ namespace Orchard.UI.Navigation { protected virtual IUser CurrentUser { get; [UsedImplicitly] private set; } public IEnumerable BuildMenu(string menuName) { - return FinishMenu(Crop(Reduce(Merge(AllSources(menuName)))).ToArray()); + var sources = GetSources(menuName); + return FinishMenu(Crop(Reduce(Merge(sources))).ToArray()); } private IEnumerable FinishMenu(IEnumerable menuItems) { @@ -79,7 +80,7 @@ namespace Orchard.UI.Navigation { } } - private IEnumerable> AllSources(string menuName) { + private IEnumerable> GetSources(string menuName) { foreach (var provider in _providers) { if (provider.MenuName == menuName) { var builder = new NavigationBuilder();