From 03e69480554e3d9a808a807b284ec65244261287 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 15 Jul 2015 14:13:36 +0100 Subject: [PATCH] Moved recipe builder and execution API into Framework and simplified step names. This enables other modules to implement custom steps without taking a dependency on Orchard.Recipes, which would cause circular dependencies in certain cases (e.g. Orchard.Themes). --- .../Commands/ImportExportCommands.cs | 6 +- .../Orchard.ImportExport.csproj | 2 +- ...ecipeBuilderStep.cs => CustomStepsStep.cs} | 4 +- .../ImportExport/FeaturesExportHandler.cs | 39 ----------- .../ImportExport/FeaturesStep.cs | 14 ---- .../Orchard.Modules/Orchard.Modules.csproj | 9 ++- .../RecipeBuilderSteps/FeatureStep.cs | 68 +++++++++++++++++++ .../RecipeExecutionSteps/FeatureStep.cs | 2 +- .../ViewModels/FeatureStepViewModel.cs | 6 ++ .../ExportSteps/Feature.cshtml | 11 +++ .../Orchard.Recipes/Orchard.Recipes.csproj | 17 +---- ...entRecipeBuilderStep.cs => ContentStep.cs} | 4 +- ...taBuilderStep.cs => RecipeMetadataStep.cs} | 4 +- ...SettingsBuilderStep.cs => SettingsStep.cs} | 4 +- .../ImportExport/RolesExportEventHandler.cs | 2 +- .../Helpers/ExtensionManagerExtensions.cs | 16 +++++ .../Extensions/IExtensionManager.cs | 8 --- .../Environment/Features/FeatureManager.cs | 10 +++ .../Environment/Features/IFeatureManager.cs | 6 ++ .../ShellBuilders/CompositionStrategy.cs | 1 + .../ThemeAwareness/ThemeAwareViewEngine.cs | 1 + src/Orchard/Orchard.Framework.csproj | 11 +++ .../Recipes/Models}/BuildContext.cs | 0 .../Recipes/Models}/RecipeExecutionContext.cs | 0 .../Recipes}/Services/IRecipeBuilder.cs | 0 .../Recipes}/Services/IRecipeBuilderStep.cs | 0 .../Recipes}/Services/IRecipeExecutionStep.cs | 0 .../Recipes}/Services/IRecipeExecutor.cs | 0 .../Recipes}/Services/RecipeBuilder.cs | 0 .../Recipes}/Services/RecipeBuilderStep.cs | 0 .../Recipes}/Services/RecipeExecutionStep.cs | 0 .../Recipes}/Services/RecipeExecutor.cs | 0 32 files changed, 154 insertions(+), 91 deletions(-) rename src/Orchard.Web/Modules/Orchard.ImportExport/RecipeBuilderSteps/{CustomStepsRecipeBuilderStep.cs => CustomStepsStep.cs} (92%) delete mode 100644 src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Modules/RecipeBuilderSteps/FeatureStep.cs rename src/Orchard.Web/Modules/{Orchard.Recipes => Orchard.Modules}/RecipeExecutionSteps/FeatureStep.cs (98%) create mode 100644 src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeatureStepViewModel.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/ExportSteps/Feature.cshtml rename src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/{ContentRecipeBuilderStep.cs => ContentStep.cs} (98%) rename src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/{RecipeMetadataBuilderStep.cs => RecipeMetadataStep.cs} (95%) rename src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/{SettingsBuilderStep.cs => SettingsStep.cs} (96%) create mode 100644 src/Orchard/Environment/Extensions/Helpers/ExtensionManagerExtensions.cs rename src/{Orchard.Web/Modules/Orchard.Recipes/Services => Orchard/Recipes/Models}/BuildContext.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes/Services => Orchard/Recipes/Models}/RecipeExecutionContext.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/IRecipeBuilder.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/IRecipeBuilderStep.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/IRecipeExecutionStep.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/IRecipeExecutor.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/RecipeBuilder.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/RecipeBuilderStep.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/RecipeExecutionStep.cs (100%) rename src/{Orchard.Web/Modules/Orchard.Recipes => Orchard/Recipes}/Services/RecipeExecutor.cs (100%) diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Commands/ImportExportCommands.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Commands/ImportExportCommands.cs index afe76fcfd..0303855f3 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Commands/ImportExportCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Commands/ImportExportCommands.cs @@ -100,7 +100,7 @@ namespace Orchard.ImportExport.Commands { var recipeBuilderSteps = new List(); if (Metadata || Data) { - var dataStep = _orchardServices.WorkContext.Resolve(); + var dataStep = _orchardServices.WorkContext.Resolve(); if(Data) dataStep.DataContentTypes = exportTypes; @@ -113,12 +113,12 @@ namespace Orchard.ImportExport.Commands { } if (SiteSettings) { - var siteSettingsStep = _orchardServices.WorkContext.Resolve(); + var siteSettingsStep = _orchardServices.WorkContext.Resolve(); recipeBuilderSteps.Add(siteSettingsStep); } if (enteredSteps.Any()) { - var customStepsStep = _orchardServices.WorkContext.Resolve(); + var customStepsStep = _orchardServices.WorkContext.Resolve(); recipeBuilderSteps.Add(customStepsStep); } diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj b/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj index 9a41ee527..8776445ac 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj @@ -71,7 +71,7 @@ - + diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/RecipeBuilderSteps/CustomStepsRecipeBuilderStep.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/RecipeBuilderSteps/CustomStepsStep.cs similarity index 92% rename from src/Orchard.Web/Modules/Orchard.ImportExport/RecipeBuilderSteps/CustomStepsRecipeBuilderStep.cs rename to src/Orchard.Web/Modules/Orchard.ImportExport/RecipeBuilderSteps/CustomStepsStep.cs index 489564838..5f432d2fc 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/RecipeBuilderSteps/CustomStepsRecipeBuilderStep.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/RecipeBuilderSteps/CustomStepsStep.cs @@ -8,11 +8,11 @@ using Orchard.Localization; using Orchard.Recipes.Services; namespace Orchard.ImportExport.RecipeBuilderSteps { - public class CustomStepsRecipeBuilderStep : RecipeBuilderStep { + public class CustomStepsStep : RecipeBuilderStep { private readonly IEnumerable _exportEventHandlers; private readonly ICustomExportStep _customExportStep; - public CustomStepsRecipeBuilderStep(IEnumerable exportEventHandlers, ICustomExportStep customExportStep) { + public CustomStepsStep(IEnumerable exportEventHandlers, ICustomExportStep customExportStep) { _exportEventHandlers = exportEventHandlers; _customExportStep = customExportStep; CustomSteps = new List(); diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs deleted file mode 100644 index 98bc2267d..000000000 --- a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml.Linq; -using Orchard.Environment.Features; -using Orchard.Events; - -namespace Orchard.Modules.ImportExport { - public interface IExportEventHandler : IEventHandler { - void Exporting(dynamic context); - void Exported(dynamic context); - } - - public class FeaturesExportHandler : IExportEventHandler { - private readonly IFeatureManager _featureManager; - - public FeaturesExportHandler(IFeatureManager featureManager) { - _featureManager = featureManager; - } - - public void Exporting(dynamic context) { - if (!((IEnumerable)context.ExportOptions.CustomSteps).Contains("EnabledFeatures")) { - return; - } - - var enabledFeatures = _featureManager.GetEnabledFeatures(); - - var root = new XElement("Feature", new XAttribute("enable", String.Join(", ", enabledFeatures.Select(x => x.Id).OrderBy(x => x)))); - context.Document.Element("Orchard").Add(root); - - // Add the Migration element to force migrations run immediately after the features have been synced. - context.Document.Element("Orchard").Add(new XElement("Migration", new XAttribute("features", "*"))); - } - - public void Exported(dynamic context) { - } - } -} - diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs deleted file mode 100644 index b2af65b42..000000000 --- a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using Orchard.Events; - -namespace Orchard.Modules.ImportExport { - public interface ICustomExportStep : IEventHandler { - void Register(IList steps); - } - - public class FeaturesStep : ICustomExportStep { - public void Register(IList steps) { - steps.Add("EnabledFeatures"); - } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj index 48c3a1a63..cdaf528e4 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj +++ b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj @@ -72,8 +72,9 @@ - - + + + @@ -140,6 +141,10 @@ Designer + + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Modules/RecipeBuilderSteps/FeatureStep.cs b/src/Orchard.Web/Modules/Orchard.Modules/RecipeBuilderSteps/FeatureStep.cs new file mode 100644 index 000000000..88999c55c --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/RecipeBuilderSteps/FeatureStep.cs @@ -0,0 +1,68 @@ +using System; +using System.Linq; +using System.Xml.Linq; +using Orchard.ContentManagement; +using Orchard.Environment.Features; +using Orchard.Localization; +using Orchard.Modules.ViewModels; +using Orchard.Recipes.Services; + +namespace Orchard.Modules.RecipeBuilderSteps { + public class FeatureStep : RecipeBuilderStep { + private readonly IFeatureManager _featureManager; + + public FeatureStep(IFeatureManager featureManager) { + _featureManager = featureManager; + } + + public override string Name { + get { return "Feature"; } + } + + public override LocalizedString DisplayName { + get { return T("Features"); } + } + + public override LocalizedString Description { + get { return T("Exports enabled and disabled features."); } + } + + public override int Priority { get { return 0; } } + + public bool ExportEnabledFeatures { get; set; } + public bool ExportDisabledFeatures { get; set; } + + public override dynamic BuildEditor(dynamic shapeFactory) { + return UpdateEditor(shapeFactory, null); + } + + public override dynamic UpdateEditor(dynamic shapeFactory, IUpdateModel updater) { + var viewModel = new FeatureStepViewModel(); + + if (updater != null && updater.TryUpdateModel(viewModel, Prefix, null, null)) { + ExportEnabledFeatures = viewModel.ExportEnabledFeatures; + ExportDisabledFeatures = viewModel.ExportDisabledFeatures; + } + + return shapeFactory.EditorTemplate(TemplateName: "ExportSteps/Feature", Model: viewModel, Prefix: Prefix); + } + + public override void Build(BuildContext context) { + if (!ExportEnabledFeatures && !ExportDisabledFeatures) + return; + + var enabledFeatures = _featureManager.GetEnabledFeatures(); + var disabledFeatures = _featureManager.GetDisabledFeatures(); + var orchardElement = context.RecipeDocument.Element("Orchard"); + var root = new XElement("Feature"); + + if(ExportEnabledFeatures) + root.Add(new XAttribute("enable", String.Join(", ", enabledFeatures.Select(x => x.Id).OrderBy(x => x)))); + + if (ExportDisabledFeatures) + root.Add(new XAttribute("disable", String.Join(", ", disabledFeatures.Select(x => x.Id).OrderBy(x => x)))); + + orchardElement.Add(root); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeExecutionSteps/FeatureStep.cs b/src/Orchard.Web/Modules/Orchard.Modules/RecipeExecutionSteps/FeatureStep.cs similarity index 98% rename from src/Orchard.Web/Modules/Orchard.Recipes/RecipeExecutionSteps/FeatureStep.cs rename to src/Orchard.Web/Modules/Orchard.Modules/RecipeExecutionSteps/FeatureStep.cs index 35a367336..809526cf8 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeExecutionSteps/FeatureStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/RecipeExecutionSteps/FeatureStep.cs @@ -5,7 +5,7 @@ using Orchard.Environment.Features; using Orchard.Logging; using Orchard.Recipes.Services; -namespace Orchard.Recipes.RecipeExecutionSteps { +namespace Orchard.Modules.RecipeExecutionSteps { public class FeatureStep : RecipeExecutionStep { private readonly IFeatureManager _featureManager; diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeatureStepViewModel.cs b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeatureStepViewModel.cs new file mode 100644 index 000000000..a4082182a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeatureStepViewModel.cs @@ -0,0 +1,6 @@ +namespace Orchard.Modules.ViewModels { + public class FeatureStepViewModel { + public bool ExportEnabledFeatures { get; set; } + public bool ExportDisabledFeatures { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/ExportSteps/Feature.cshtml b/src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/ExportSteps/Feature.cshtml new file mode 100644 index 000000000..a0ded5b4a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/ExportSteps/Feature.cshtml @@ -0,0 +1,11 @@ +@model Orchard.Modules.ViewModels.FeatureStepViewModel +
+ @Html.CheckBoxFor(m => m.ExportEnabledFeatures) + @Html.LabelFor(m => m.ExportEnabledFeatures, T("Enabled Features").ToString(), new {@class = "forcheckbox"}) + @Html.Hint(T("Check this option to export the set of enabled features.")) +
+
+ @Html.CheckBoxFor(m => m.ExportDisabledFeatures) + @Html.LabelFor(m => m.ExportDisabledFeatures, T("Disabled Features").ToString(), new { @class = "forcheckbox" }) + @Html.Hint(T("Check this option to export the set of disabled features.")) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj index c4801b337..e6434ed7d 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj @@ -82,12 +82,11 @@ - - - + + + - @@ -95,16 +94,6 @@ - - - - - - - - - - diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/ContentRecipeBuilderStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/ContentStep.cs similarity index 98% rename from src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/ContentRecipeBuilderStep.cs rename to src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/ContentStep.cs index 4bc714a90..1c3bfbf14 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/ContentRecipeBuilderStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/ContentStep.cs @@ -10,12 +10,12 @@ using Orchard.Recipes.Services; using Orchard.Recipes.ViewModels; namespace Orchard.Recipes.RecipeBuilders { - public class ContentRecipeBuilderStep : RecipeBuilderStep { + public class ContentStep : RecipeBuilderStep { private readonly IContentDefinitionManager _contentDefinitionManager; private readonly IOrchardServices _orchardServices; private readonly IContentDefinitionWriter _contentDefinitionWriter; - public ContentRecipeBuilderStep( + public ContentStep( IContentDefinitionManager contentDefinitionManager, IOrchardServices orchardServices, IContentDefinitionWriter contentDefinitionWriter) { diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/RecipeMetadataBuilderStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/RecipeMetadataStep.cs similarity index 95% rename from src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/RecipeMetadataBuilderStep.cs rename to src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/RecipeMetadataStep.cs index a09be4bcb..f6e33f814 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/RecipeMetadataBuilderStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/RecipeMetadataStep.cs @@ -4,9 +4,9 @@ using Orchard.Recipes.Services; using Orchard.Recipes.ViewModels; namespace Orchard.Recipes.RecipeBuilders { - public class RecipeMetadataBuilderStep : RecipeBuilderStep { + public class RecipeMetadataStep : RecipeBuilderStep { private readonly IOrchardServices _orchardServices; - public RecipeMetadataBuilderStep(IOrchardServices orchardServices) { + public RecipeMetadataStep(IOrchardServices orchardServices) { _orchardServices = orchardServices; } diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/SettingsBuilderStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/SettingsStep.cs similarity index 96% rename from src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/SettingsBuilderStep.cs rename to src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/SettingsStep.cs index e37fed5a6..fdc8daca3 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/SettingsBuilderStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeBuilders/SettingsStep.cs @@ -7,10 +7,10 @@ using Orchard.Recipes.Services; using Orchard.Recipes.ViewModels; namespace Orchard.Recipes.RecipeBuilders { - public class SettingsBuilderStep : RecipeBuilderStep { + public class SettingsStep : RecipeBuilderStep { private readonly IOrchardServices _orchardServices; - public SettingsBuilderStep(IOrchardServices orchardServices) { + public SettingsStep(IOrchardServices orchardServices) { _orchardServices = orchardServices; } diff --git a/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs index d4b528f37..cb47585ad 100644 --- a/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs @@ -35,7 +35,7 @@ namespace Orchard.Roles.ImportExport { var root = new XElement("Roles"); context.Document.Element("Orchard").Add(root); - foreach (var role in roles.OrderBy(x => x)) { + foreach (var role in roles.OrderBy(x => x.Name)) { root.Add(new XElement("Role", new XAttribute("Name", role.Name), new XAttribute("Permissions", string.Join(",", role.RolesPermissions.Select(rolePermission => rolePermission.Permission.Name))))); diff --git a/src/Orchard/Environment/Extensions/Helpers/ExtensionManagerExtensions.cs b/src/Orchard/Environment/Extensions/Helpers/ExtensionManagerExtensions.cs new file mode 100644 index 000000000..87ea5790b --- /dev/null +++ b/src/Orchard/Environment/Extensions/Helpers/ExtensionManagerExtensions.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Linq; +using Orchard.Environment.Descriptor.Models; +using Orchard.Environment.Extensions.Models; + +namespace Orchard.Environment.Extensions.Helpers { + public static class ExtensionManagerExtensions { + public static IEnumerable EnabledFeatures(this IExtensionManager extensionManager, ShellDescriptor descriptor) { + return extensionManager.AvailableFeatures().Where(fd => descriptor.Features.Any(sf => sf.Name == fd.Id)); + } + + public static IEnumerable DisabledFeatures(this IExtensionManager extensionManager, ShellDescriptor descriptor) { + return extensionManager.AvailableFeatures().Where(fd => descriptor.Features.All(sf => sf.Name != fd.Id)); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/Extensions/IExtensionManager.cs b/src/Orchard/Environment/Extensions/IExtensionManager.cs index b79f0b95c..e48a482f3 100644 --- a/src/Orchard/Environment/Extensions/IExtensionManager.cs +++ b/src/Orchard/Environment/Extensions/IExtensionManager.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using System.Linq; -using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions.Models; namespace Orchard.Environment.Extensions { @@ -12,10 +10,4 @@ namespace Orchard.Environment.Extensions { IEnumerable LoadFeatures(IEnumerable featureDescriptors); } - - public static class ExtensionManagerExtensions { - public static IEnumerable EnabledFeatures(this IExtensionManager extensionManager, ShellDescriptor descriptor) { - return extensionManager.AvailableFeatures().Where(fd => descriptor.Features.Any(sf => sf.Name == fd.Id)); - } - } } diff --git a/src/Orchard/Environment/Features/FeatureManager.cs b/src/Orchard/Environment/Features/FeatureManager.cs index 8317e0f7b..cc8c4ed9f 100644 --- a/src/Orchard/Environment/Features/FeatureManager.cs +++ b/src/Orchard/Environment/Features/FeatureManager.cs @@ -4,6 +4,7 @@ using System.Linq; using Orchard.Environment.Descriptor; using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions; +using Orchard.Environment.Extensions.Helpers; using Orchard.Environment.Extensions.Models; using Orchard.Localization; using Orchard.Logging; @@ -48,6 +49,15 @@ namespace Orchard.Environment.Features { return _extensionManager.EnabledFeatures(currentShellDescriptor); } + /// + /// Retrieves the disabled features. + /// + /// An enumeration of feature descriptors for the disabled features. + public IEnumerable GetDisabledFeatures() { + var currentShellDescriptor = _shellDescriptorManager.GetShellDescriptor(); + return _extensionManager.DisabledFeatures(currentShellDescriptor); + } + /// /// Enables a list of features. /// diff --git a/src/Orchard/Environment/Features/IFeatureManager.cs b/src/Orchard/Environment/Features/IFeatureManager.cs index 962d09f2f..ccbbbb319 100644 --- a/src/Orchard/Environment/Features/IFeatureManager.cs +++ b/src/Orchard/Environment/Features/IFeatureManager.cs @@ -19,6 +19,12 @@ namespace Orchard.Environment.Features { /// An enumeration of feature descriptors for the enabled features. IEnumerable GetEnabledFeatures(); + /// + /// Retrieves the disabled features. + /// + /// An enumeration of feature descriptors for the disabled features. + IEnumerable GetDisabledFeatures(); + /// /// Enables a list of features. /// diff --git a/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs b/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs index 247a1040a..125a0e81a 100644 --- a/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs +++ b/src/Orchard/Environment/ShellBuilders/CompositionStrategy.cs @@ -10,6 +10,7 @@ using Orchard.ContentManagement.Records; using Orchard.Environment.Configuration; using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions; +using Orchard.Environment.Extensions.Helpers; using Orchard.Environment.Extensions.Models; using Orchard.Environment.ShellBuilders.Models; using Orchard.Logging; diff --git a/src/Orchard/Mvc/ViewEngines/ThemeAwareness/ThemeAwareViewEngine.cs b/src/Orchard/Mvc/ViewEngines/ThemeAwareness/ThemeAwareViewEngine.cs index 55ae0988a..0591f8dba 100644 --- a/src/Orchard/Mvc/ViewEngines/ThemeAwareness/ThemeAwareViewEngine.cs +++ b/src/Orchard/Mvc/ViewEngines/ThemeAwareness/ThemeAwareViewEngine.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Web.Mvc; using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions; +using Orchard.Environment.Extensions.Helpers; using Orchard.Environment.Extensions.Models; using Orchard.Logging; diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 42c3bfa61..f7248e7f0 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -149,9 +149,20 @@
+ + + + + + + + + + + diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/BuildContext.cs b/src/Orchard/Recipes/Models/BuildContext.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/BuildContext.cs rename to src/Orchard/Recipes/Models/BuildContext.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeExecutionContext.cs b/src/Orchard/Recipes/Models/RecipeExecutionContext.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeExecutionContext.cs rename to src/Orchard/Recipes/Models/RecipeExecutionContext.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeBuilder.cs b/src/Orchard/Recipes/Services/IRecipeBuilder.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeBuilder.cs rename to src/Orchard/Recipes/Services/IRecipeBuilder.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeBuilderStep.cs b/src/Orchard/Recipes/Services/IRecipeBuilderStep.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeBuilderStep.cs rename to src/Orchard/Recipes/Services/IRecipeBuilderStep.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeExecutionStep.cs b/src/Orchard/Recipes/Services/IRecipeExecutionStep.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeExecutionStep.cs rename to src/Orchard/Recipes/Services/IRecipeExecutionStep.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeExecutor.cs b/src/Orchard/Recipes/Services/IRecipeExecutor.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/IRecipeExecutor.cs rename to src/Orchard/Recipes/Services/IRecipeExecutor.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeBuilder.cs b/src/Orchard/Recipes/Services/RecipeBuilder.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeBuilder.cs rename to src/Orchard/Recipes/Services/RecipeBuilder.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeBuilderStep.cs b/src/Orchard/Recipes/Services/RecipeBuilderStep.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeBuilderStep.cs rename to src/Orchard/Recipes/Services/RecipeBuilderStep.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeExecutionStep.cs b/src/Orchard/Recipes/Services/RecipeExecutionStep.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeExecutionStep.cs rename to src/Orchard/Recipes/Services/RecipeExecutionStep.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeExecutor.cs b/src/Orchard/Recipes/Services/RecipeExecutor.cs similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeExecutor.cs rename to src/Orchard/Recipes/Services/RecipeExecutor.cs