diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj index 9767218cd..d7428a54f 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj @@ -117,6 +117,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/RemoveContentDefinitionStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/RemoveContentDefinitionStep.cs new file mode 100644 index 000000000..ab7400b7f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/RemoveContentDefinitionStep.cs @@ -0,0 +1,88 @@ +using System; +using System.Linq; +using System.Xml; +using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData; +using Orchard.ContentTypes.Events; +using Orchard.Localization; +using Orchard.Logging; +using Orchard.Recipes.Models; +using Orchard.Recipes.Services; + +namespace Orchard.Recipes.Providers.Executors { + public class RemoveContentDefinitionStep : RecipeExecutionStep { + private readonly IContentDefinitionManager _contentDefinitionManager; + private readonly IContentDefinitionEventHandler _contentDefinitonEventHandlers; + + public RemoveContentDefinitionStep( + RecipeExecutionLogger logger, IContentDefinitionManager contentDefinitionManager, IContentDefinitionEventHandler contentDefinitonEventHandlers) : base(logger) { + _contentDefinitionManager = contentDefinitionManager; + _contentDefinitonEventHandlers = contentDefinitonEventHandlers; + } + + public override string Name { + get { return "RemoveContentDefinition"; } + } + + public override LocalizedString DisplayName { + get { return T("Remove Content Definition"); } + } + + public override LocalizedString Description { + get { return T("Removes a list of content definitions."); } + } + + // + // + // + // + // + // + // + // + // + public override void Execute(RecipeExecutionContext context) { + foreach (var metadataElement in context.RecipeStep.Step.Elements()) { + Logger.Debug("Processing element '{0}'.", metadataElement.Name.LocalName); + switch (metadataElement.Name.LocalName) { + case "Types": + foreach (var element in metadataElement.Elements()) { + var typeName = XmlConvert.DecodeName(element.Name.LocalName); + + Logger.Information("Removing content type '{0}'.", typeName); + try { + _contentDefinitionManager.DeleteTypeDefinition(typeName); + _contentDefinitonEventHandlers.ContentTypeRemoved(new ContentTypeRemovedContext {ContentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(typeName)}); + } + catch (Exception ex) { + Logger.Error(ex, "Error while removing content type '{0}'.", typeName); + throw; + } + } + break; + + case "Parts": + foreach (var element in metadataElement.Elements()) { + var partElement = element; + var partName = XmlConvert.DecodeName(element.Name.LocalName); + + Logger.Information("Removing content part definition '{0}'.", partName); + try { + _contentDefinitionManager.DeletePartDefinition(partName); + _contentDefinitonEventHandlers.ContentPartRemoved(new ContentPartRemovedContext {ContentPartDefinition = _contentDefinitionManager.GetPartDefinition(partName)}); + } + catch (Exception ex) { + Logger.Error(ex, "Error while removing content part definition for '{0}'.", partName); + throw; + } + } + break; + + default: + Logger.Warning("Unrecognized element '{0}' encountered; skipping", metadataElement.Name.LocalName); + break; + } + } + } + } +}