From d0c0ec56a454da0de0a55d62829534adc9ee7fab Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Wed, 8 Jan 2014 14:12:39 +0100 Subject: [PATCH] Adding event handlers to the PackagingService --- src/Umbraco.Core/Models/ContentExtensions.cs | 2 +- .../Services/IPackagingService.cs | 24 ++- src/Umbraco.Core/Services/PackagingService.cs | 165 +++++++++++++++++- 3 files changed, 173 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index e8e58ca9ba..49d62db1bf 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -671,7 +671,7 @@ namespace Umbraco.Core.Models /// Xml representation of the passed in public static XElement ToXml(this IMember member) { - return ApplicationContext.Current.Services.PackagingService.Export(member); + return ((PackagingService)(ApplicationContext.Current.Services.PackagingService)).Export(member); } #endregion diff --git a/src/Umbraco.Core/Services/IPackagingService.cs b/src/Umbraco.Core/Services/IPackagingService.cs index 5acaf0fccf..9f318988d7 100644 --- a/src/Umbraco.Core/Services/IPackagingService.cs +++ b/src/Umbraco.Core/Services/IPackagingService.cs @@ -12,16 +12,18 @@ namespace Umbraco.Core.Services /// Xml to import /// Optional parent Id for the content being imported /// Optional Id of the user performing the import + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated content - IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0); + IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0, bool raiseEvents = true); /// /// Imports and saves package xml as /// /// Xml to import /// Optional id of the User performing the operation. Default is zero (admin). + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated ContentTypes - IEnumerable ImportContentTypes(XElement element, int userId = 0); + IEnumerable ImportContentTypes(XElement element, int userId = 0, bool raiseEvents = true); /// /// Imports and saves package xml as @@ -29,46 +31,52 @@ namespace Umbraco.Core.Services /// Xml to import /// Boolean indicating whether or not to import the /// Optional id of the User performing the operation. Default is zero (admin). + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated ContentTypes - IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0); + IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0, bool raiseEvents = true); /// /// Imports and saves package xml as /// /// Xml to import /// + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated DataTypeDefinitions - IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0); + IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0, bool raiseEvents = true); /// /// Imports and saves package xml as /// /// Xml to import /// Optional user id + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated Templates - IEnumerable ImportTemplates(XElement element, int userId = 0); + IEnumerable ImportTemplates(XElement element, int userId = 0, bool raiseEvents = true); /// /// Exports an to xml as an /// /// ContentType to export + /// Optional parameter indicating whether or not to raise events /// containing the xml representation of the ContentType item. - XElement Export(IContentType contentType); + XElement Export(IContentType contentType, bool raiseEvents = true); /// /// Exports an item to xml as an /// /// Content to export /// Optional parameter indicating whether to include descendents + /// Optional parameter indicating whether or not to raise events /// containing the xml representation of the Content object - XElement Export(IContent content, bool deep = false); + XElement Export(IContent content, bool deep = false, bool raiseEvents = true); /// /// Exports an item to xml as an /// /// Media to export /// Optional parameter indicating whether to include descendents + /// Optional parameter indicating whether or not to raise events /// containing the xml representation of the Media object - XElement Export(IMedia media, bool deep = false); + XElement Export(IMedia media, bool deep = false, bool raiseEvents = true); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index e59bb9df7b..970a278c3b 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text.RegularExpressions; using System.Xml.Linq; using Umbraco.Core.Configuration; +using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -103,9 +104,16 @@ namespace Umbraco.Core.Services /// /// Content to export /// Optional parameter indicating whether to include descendents + /// Optional parameter indicating whether or not to raise events /// containing the xml representation of the Content object - public XElement Export(IContent content, bool deep = false) + public XElement Export(IContent content, bool deep = false, bool raiseEvents = true) { + if (raiseEvents) + { + if (ExportingContent.IsRaisedEventCancelled(new SaveEventArgs(content), this)) + return default(XElement); + } + //nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias); var nodeName = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "node" : content.ContentType.Alias.ToSafeAliasWithForcingCheck(); @@ -124,6 +132,9 @@ namespace Umbraco.Core.Services AddChildXml(descendants, currentChildren, xml); } + if(raiseEvents) + ContentExported.RaiseEvent(new SaveEventArgs(xml, false), this); + return xml; } @@ -187,9 +198,16 @@ namespace Umbraco.Core.Services /// Xml to import /// Optional parent Id for the content being imported /// Optional Id of the user performing the import + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated content - public IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0) + public IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0, bool raiseEvents = true) { + if (raiseEvents) + { + if (ImportingContent.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + return Enumerable.Empty(); + } + var name = element.Name.LocalName; if (name.Equals("DocumentSet")) { @@ -202,6 +220,8 @@ namespace Umbraco.Core.Services if (contents.Any()) _contentService.Save(contents, userId); + if(raiseEvents) + ContentImported.RaiseEvent(new SaveEventArgs(contents, false), this); return contents; } @@ -214,6 +234,8 @@ namespace Umbraco.Core.Services if (contents.Any()) _contentService.Save(contents, userId); + if(raiseEvents) + ContentImported.RaiseEvent(new SaveEventArgs(contents, false), this); return contents; } @@ -344,9 +366,16 @@ namespace Umbraco.Core.Services /// Exports an to xml as an /// /// ContentType to export + /// Optional parameter indicating whether or not to raise events /// containing the xml representation of the ContentType item. - public XElement Export(IContentType contentType) + public XElement Export(IContentType contentType, bool raiseEvents = true) { + if (raiseEvents) + { + if (ExportingContentType.IsRaisedEventCancelled(new SaveEventArgs(contentType), this)) + return default(XElement); + } + var info = new XElement("Info", new XElement("Name", contentType.Name), new XElement("Alias", contentType.Alias), @@ -407,6 +436,10 @@ namespace Umbraco.Core.Services structure, genericProperties, tabs); + + if (raiseEvents) + ContentTypeExported.RaiseEvent(new SaveEventArgs(xml, false), this); + return xml; } @@ -415,8 +448,9 @@ namespace Umbraco.Core.Services /// /// Xml to import /// Optional id of the User performing the operation. Default is zero (admin). + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated ContentTypes - public IEnumerable ImportContentTypes(XElement element, int userId = 0) + public IEnumerable ImportContentTypes(XElement element, int userId = 0, bool raiseEvents = true) { return ImportContentTypes(element, true, userId); } @@ -427,9 +461,16 @@ namespace Umbraco.Core.Services /// Xml to import /// Boolean indicating whether or not to import the /// Optional id of the User performing the operation. Default is zero (admin). + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated ContentTypes - public IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0) + public IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0, bool raiseEvents = true) { + if (raiseEvents) + { + if (ImportingContentType.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + return Enumerable.Empty(); + } + var name = element.Name.LocalName; if (name.Equals("DocumentTypes") == false && name.Equals("DocumentType") == false) { @@ -476,6 +517,9 @@ namespace Umbraco.Core.Services _contentTypeService.Save(updatedContentTypes, userId); } + if (raiseEvents) + ContentTypeImported.RaiseEvent(new SaveEventArgs(list, false), this); + return list; } @@ -750,7 +794,7 @@ namespace Umbraco.Core.Services /// /// /// - internal XElement Export(IEnumerabledataTypeDefinitions) + internal XElement Export(IEnumerable dataTypeDefinitions) { var container = new XElement("DataTypes"); foreach (var d in dataTypeDefinitions) @@ -794,9 +838,16 @@ namespace Umbraco.Core.Services /// /// Xml to import /// + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated DataTypeDefinitions - public IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0) + public IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0, bool raiseEvents = true) { + if (raiseEvents) + { + if (ImportingDataType.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + return Enumerable.Empty(); + } + var name = element.Name.LocalName; if (name.Equals("DataTypes") == false && name.Equals("DataType") == false) { @@ -859,6 +910,10 @@ namespace Umbraco.Core.Services SavePrevaluesFromXml(list, dataTypeElements); } + + if (raiseEvents) + DataTypeImported.RaiseEvent(new SaveEventArgs(list, false), this); + return list; } @@ -934,9 +989,16 @@ namespace Umbraco.Core.Services /// /// Media to export /// Optional parameter indicating whether to include descendents + /// Optional parameter indicating whether or not to raise events /// containing the xml representation of the Media object - public XElement Export(IMedia media, bool deep = false) + public XElement Export(IMedia media, bool deep = false, bool raiseEvents = true) { + if (raiseEvents) + { + if (ExportingMedia.IsRaisedEventCancelled(new SaveEventArgs(media), this)) + return default(XElement); + } + //nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias); var nodeName = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "node" : media.ContentType.Alias.ToSafeAliasWithForcingCheck(); @@ -955,6 +1017,9 @@ namespace Umbraco.Core.Services AddChildXml(descendants, currentChildren, xml); } + if(raiseEvents) + MediaExported.RaiseEvent(new SaveEventArgs(xml, false), this); + return xml; } @@ -1055,9 +1120,16 @@ namespace Umbraco.Core.Services /// /// Xml to import /// Optional user id + /// Optional parameter indicating whether or not to raise events /// An enumrable list of generated Templates - public IEnumerable ImportTemplates(XElement element, int userId = 0) + public IEnumerable ImportTemplates(XElement element, int userId = 0, bool raiseEvents = true) { + if (raiseEvents) + { + if (ImportingTemplate.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + return Enumerable.Empty(); + } + var name = element.Name.LocalName; if (name.Equals("Templates") == false && name.Equals("Template") == false) { @@ -1126,6 +1198,9 @@ namespace Umbraco.Core.Services if (templates.Any()) _fileService.SaveTemplate(templates, userId); + if(raiseEvents) + TemplateImported.RaiseEvent(new SaveEventArgs(templates, false), this); + return templates; } @@ -1146,5 +1221,77 @@ namespace Umbraco.Core.Services } #endregion + + #region Event Handlers + /// + /// Occurs before Importing Content + /// + public static event TypedEventHandler> ImportingContent; + + /// + /// Occurs after Content is Imported and Saved + /// + public static event TypedEventHandler> ContentImported; + + /// + /// Occurs before Exporting Content + /// + public static event TypedEventHandler> ExportingContent; + + /// + /// Occurs after Content is Exported to Xml + /// + public static event TypedEventHandler> ContentExported; + + /// + /// Occurs before Exporting Media + /// + public static event TypedEventHandler> ExportingMedia; + + /// + /// Occurs after Media is Exported to Xml + /// + public static event TypedEventHandler> MediaExported; + + /// + /// Occurs before Importing ContentType + /// + public static event TypedEventHandler> ImportingContentType; + + /// + /// Occurs after ContentType is Imported and Saved + /// + public static event TypedEventHandler> ContentTypeImported; + + /// + /// Occurs before Exporting ContentType + /// + public static event TypedEventHandler> ExportingContentType; + + /// + /// Occurs after ContentType is Exported to Xml + /// + public static event TypedEventHandler> ContentTypeExported; + + /// + /// Occurs before Importing DataType + /// + public static event TypedEventHandler> ImportingDataType; + + /// + /// Occurs after DataType is Imported and Saved + /// + public static event TypedEventHandler> DataTypeImported; + + /// + /// Occurs before Importing Template + /// + public static event TypedEventHandler> ImportingTemplate; + + /// + /// Occurs after Template is Imported and Saved + /// + public static event TypedEventHandler> TemplateImported; + #endregion } } \ No newline at end of file