From 11472a96e4778caeb6731968975d98ab14098eb0 Mon Sep 17 00:00:00 2001 From: sfmskywalker Date: Sun, 1 Jun 2014 15:25:23 +0200 Subject: [PATCH] Implementing Import/Export. --- .../ImportExport/AuditTrailExportHandler.cs | 62 +++++++++++++++++++ .../ImportExport/AuditTrailExportStep.cs | 14 +++++ .../ImportExport/AuditTrailImportHandler.cs | 39 ++++++++++++ .../Orchard.AuditTrail.csproj | 3 + 4 files changed, 118 insertions(+) create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportStep.cs create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailImportHandler.cs diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportHandler.cs new file mode 100644 index 000000000..763b6e31e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportHandler.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using Orchard.AuditTrail.Models; +using Orchard.Data; +using Orchard.Events; + +namespace Orchard.AuditTrail.ImportExport { + public interface IExportEventHandler : IEventHandler { + void Exporting(dynamic context); + void Exported(dynamic context); + } + + public class AuditTrailExportEventHandler : IExportEventHandler { + private readonly IRepository _auditTrailEventRepository; + + public AuditTrailExportEventHandler(IRepository auditTrailEventRepository) { + _auditTrailEventRepository = auditTrailEventRepository; + } + + public void Exporting(dynamic context) { + } + + public void Exported(dynamic context) { + + if (!((IEnumerable)context.ExportOptions.CustomSteps).Contains("AuditTrail")) { + return; + } + + var records = _auditTrailEventRepository.Table.ToList(); + + if (!records.Any()) { + return; + } + + var root = new XElement("AuditTrail"); + context.Document.Element("Orchard").Add(root); + + foreach (var record in records) { + root.Add(new XElement("Event", + new XAttribute("Name", record.Event), + new XAttribute("Category", record.Category), + new XAttribute("User", record.UserName), + new XAttribute("CreatedUtc", record.CreatedUtc), + new XAttribute("EventFilterKey", record.EventFilterKey), + new XAttribute("EventFilterData", record.EventFilterData), + CreateElement("Comment", record.Comment), + CreateCDataElement("EventData", record.EventData))); + } + } + + private static XElement CreateElement(string name, string value) { + return !String.IsNullOrWhiteSpace(value) ? new XElement(name, value) : null; + } + + private static XElement CreateCDataElement(string name, string value) { + return !String.IsNullOrWhiteSpace(value) ? new XElement(name, new XCData(value)) : null; + } + } +} + diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportStep.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportStep.cs new file mode 100644 index 000000000..8caba42c4 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailExportStep.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Orchard.Events; + +namespace Orchard.AuditTrail.ImportExport { + public interface ICustomExportStep : IEventHandler { + void Register(IList steps); + } + + public class AuditTrailExportStep : ICustomExportStep { + public void Register(IList steps) { + steps.Add("AuditTrail"); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailImportHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailImportHandler.cs new file mode 100644 index 000000000..84dc8e8d7 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/ImportExport/AuditTrailImportHandler.cs @@ -0,0 +1,39 @@ +using System; +using Orchard.AuditTrail.Models; +using Orchard.ContentManagement; +using Orchard.Data; +using Orchard.Recipes.Models; +using Orchard.Recipes.Services; + +namespace Orchard.AuditTrail.ImportExport { + public class AuditTrailImportHandler : Component, IRecipeHandler { + private readonly IRepository _auditTrailEventRepository; + + public AuditTrailImportHandler(IRepository auditTrailEventRepository) { + _auditTrailEventRepository = auditTrailEventRepository; + } + + public void ExecuteRecipeStep(RecipeContext recipeContext) { + if (!String.Equals(recipeContext.RecipeStep.Name, "AuditTrail", StringComparison.OrdinalIgnoreCase)) { + return; + } + + foreach (var eventElement in recipeContext.RecipeStep.Step.Elements()) { + var record = new AuditTrailEventRecord { + Event = eventElement.Attr("Name"), + Category = eventElement.Attr("Category"), + UserName = eventElement.Attr("User"), + CreatedUtc = eventElement.Attr("CreatedUtc"), + EventFilterKey = eventElement.Attr("EventFilterKey"), + EventFilterData = eventElement.Attr("EventFilterData"), + Comment = eventElement.El("Comment"), + EventData = eventElement.El("EventData"), + }; + + _auditTrailEventRepository.Create(record); + } + + recipeContext.Executed = true; + } + } +} diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj index 5f2e41f16..235f13d75 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj @@ -136,6 +136,9 @@ + + +