From 8db6633c919719afd8178a4abe275387ccba61a2 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Fri, 14 Mar 2014 12:11:38 +0100 Subject: [PATCH 1/2] Initial implementation of a new package installation approach based on PR-297. Everything is left internal as we don't know when something like this can be introduced. Idea is to be able to install a complete package using the PackagingService, so that we eventually can obsolete the old Packager/Installer-code. --- src/Umbraco.Core/Constants-Packaging.cs | 51 +++++++++++++++++++ .../Packaging/Models/InstallAction.cs | 21 ++++++++ .../Packaging/Models/InstallationSummary.cs | 24 +++++++++ src/Umbraco.Core/Packaging/Models/MetaData.cs | 23 +++++++++ .../Packaging/Models/UninstallAction.cs | 21 ++++++++ src/Umbraco.Core/Packaging/PackageBuilding.cs | 18 +++++++ .../Packaging/PackageExtraction.cs | 34 +++++++++++++ .../Packaging/PackageInstallation.cs | 35 +++++++++++++ src/Umbraco.Core/Services/PackagingService.cs | 16 ++++++ src/Umbraco.Core/Umbraco.Core.csproj | 14 +++-- 10 files changed, 254 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Core/Constants-Packaging.cs create mode 100644 src/Umbraco.Core/Packaging/Models/InstallAction.cs create mode 100644 src/Umbraco.Core/Packaging/Models/InstallationSummary.cs create mode 100644 src/Umbraco.Core/Packaging/Models/MetaData.cs create mode 100644 src/Umbraco.Core/Packaging/Models/UninstallAction.cs create mode 100644 src/Umbraco.Core/Packaging/PackageBuilding.cs create mode 100644 src/Umbraco.Core/Packaging/PackageExtraction.cs create mode 100644 src/Umbraco.Core/Packaging/PackageInstallation.cs diff --git a/src/Umbraco.Core/Constants-Packaging.cs b/src/Umbraco.Core/Constants-Packaging.cs new file mode 100644 index 0000000000..a73adf10de --- /dev/null +++ b/src/Umbraco.Core/Constants-Packaging.cs @@ -0,0 +1,51 @@ +namespace Umbraco.Core +{ + public static partial class Constants + { + /// + /// Defines the constants used for Umbraco packages in the package.config xml + /// + public static class Packaging + { + public const string UmbPackageNodeName = "umbPackage"; + public const string DataTypesNodeName = "DataTypes"; + public const string PackageXmlFileName = "package.xml"; + public const string UmbracoPackageExtention = ".umb"; + public const string DataTypeNodeName = "DataType"; + public const string LanguagesNodeName = "Languages"; + public const string FilesNodeName = "Files"; + public const string StylesheetsNodeName = "Stylesheets"; + public const string TemplatesNodeName = "Templates"; + public const string OrgnameNodeName = "orgName"; + public const string NameNodeName = "Name"; + public const string TemplateNodeName = "Template"; + public const string AliasNodeName = "Alias"; + public const string DictionaryitemsNodeName = "DictionaryItems"; + public const string MacrosNodeName = "macros"; + public const string DocumentSetNodeName = "DocumentSet"; + public const string DocumentTypesNodeName = "DocumentTypes"; + public const string DocumentTypeNodeName = "DocumentType"; + public const string FileNodeName = "file"; + public const string OrgPathNodeName = "orgPath"; + public const string GuidNodeName = "guid"; + public const string StylesheetNodeName = "styleSheet"; + public const string MacroNodeName = "macro"; + public const string InfoNodeName = "info"; + public const string PackageRequirementsMajorXpath = "/package/requirements/major"; + public const string PackageRequirementsMinorXpath = "/package/requirements/minor"; + public const string PackageRequirementsPatchXpath = "/package/requirements/patch"; + public const string PackageNameXpath = "/package/name"; + public const string PackageVersionXpath = "/package/version"; + public const string PackageUrlXpath = "/package/url"; + public const string PackageLicenseXpath = "/package/license"; + public const string AuthorNameXpath = "/author/name"; + public const string AuthorWebsiteXpath = "/author/website"; + public const string ReadmeXpath = "/readme"; + public const string ControlNodeName = "control"; + public const string ActionNodeName = "Action"; + public const string ActionsNodeName = "Actions"; + public const string UndoNodeAttribute = "undo"; + public const string RunatNodeAttribute = "runat"; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/Models/InstallAction.cs b/src/Umbraco.Core/Packaging/Models/InstallAction.cs new file mode 100644 index 0000000000..257f0c5a03 --- /dev/null +++ b/src/Umbraco.Core/Packaging/Models/InstallAction.cs @@ -0,0 +1,21 @@ +using System; +using System.Runtime.Serialization; +using System.Xml; + +namespace Umbraco.Core.Packaging.Models +{ + [Serializable] + [DataContract(IsReference = true)] + internal class InstallAction + { + public string Alias { get; set; } + + public string PackageName { get; set; } + + public string RunAt { get; set; }//NOTE Should this default to "install" + + public bool Undo { get; set; } + + public XmlNode XmlData { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs new file mode 100644 index 0000000000..7ee077855d --- /dev/null +++ b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Umbraco.Core.Packaging.Models +{ + [Serializable] + [DataContract(IsReference = true)] + internal class InstallationSummary + { + public MetaData MetaData { get; set; } + public IEnumerable DataTypesInstalled { get; set; } + public IEnumerable LanguagesInstalled { get; set; } + public IEnumerable DictionaryItemsInstalled { get; set; } + public IEnumerable MacrosInstalled { get; set; } + public IEnumerable> FilesInstalled { get; set;} + public IEnumerable TemplatesInstalled { get; set; } + public IEnumerable DocumentTypesInstalled { get; set; } + public IEnumerable StylesheetsInstalled { get; set; } + public IEnumerable DocumentsInstalled { get; set; } + public IEnumerable InstallActions { get; set; } + public IEnumerable UninstallActions { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/Models/MetaData.cs b/src/Umbraco.Core/Packaging/Models/MetaData.cs new file mode 100644 index 0000000000..28f1af230e --- /dev/null +++ b/src/Umbraco.Core/Packaging/Models/MetaData.cs @@ -0,0 +1,23 @@ +using System; +using System.Runtime.Serialization; + +namespace Umbraco.Core.Packaging.Models +{ + [Serializable] + [DataContract(IsReference = true)] + internal class MetaData + { + public string Name { get; set; } + public string Version { get; set; } + public string Url { get; set; } + public string License { get; set; } + public string LicenseUrl { get; set; } + public int ReqMajor { get; set; } + public int ReqMinor { get; set; } + public int ReqPatch { get; set; } + public string AuthorName { get; set; } + public string AuthorUrl { get; set; } + public string Readme { get; set; } + public string Control { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/Models/UninstallAction.cs b/src/Umbraco.Core/Packaging/Models/UninstallAction.cs new file mode 100644 index 0000000000..886c10afba --- /dev/null +++ b/src/Umbraco.Core/Packaging/Models/UninstallAction.cs @@ -0,0 +1,21 @@ +using System; +using System.Runtime.Serialization; +using System.Xml; + +namespace Umbraco.Core.Packaging.Models +{ + [Serializable] + [DataContract(IsReference = true)] + internal class UninstallAction + { + public string Alias { get; set; } + + public string PackageName { get; set; } + + public string RunAt { get; set; }//NOTE Should this default to "install" + + public bool Undo { get; set; }//NOTE: Should thid default to "False"? + + public XmlNode XmlData { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/PackageBuilding.cs b/src/Umbraco.Core/Packaging/PackageBuilding.cs new file mode 100644 index 0000000000..6cbb17b158 --- /dev/null +++ b/src/Umbraco.Core/Packaging/PackageBuilding.cs @@ -0,0 +1,18 @@ +using Umbraco.Core.Services; + +namespace Umbraco.Core.Packaging +{ + internal interface IPackageBuilding + { + } + + internal class PackageBuilding : IPackageBuilding + { + private readonly PackagingService _packagingService; + + public PackageBuilding(PackagingService packagingService) + { + _packagingService = packagingService; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/PackageExtraction.cs b/src/Umbraco.Core/Packaging/PackageExtraction.cs new file mode 100644 index 0000000000..d3de2a3da4 --- /dev/null +++ b/src/Umbraco.Core/Packaging/PackageExtraction.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; +using Umbraco.Core.IO; + +namespace Umbraco.Core.Packaging +{ + internal interface IPackageExtraction + { + bool Extract(string packageFilePath, string destinationFolder); + string ExtractToTemporaryFolder(string packageFilePath); + string GetPackageConfigFromArchive(string packageFilePath, string fileToRead = "package.xml"); + } + + internal class PackageExtraction : IPackageExtraction + { + public bool Extract(string packageFilePath, string destinationFolder) + { + return true; + } + + public string ExtractToTemporaryFolder(string packageFilePath) + { + string tempDir = Path.Combine(IOHelper.MapPath(SystemDirectories.Data), Guid.NewGuid().ToString("D")); + Directory.CreateDirectory(tempDir); + Extract(packageFilePath, tempDir); + return tempDir; + } + + public string GetPackageConfigFromArchive(string packageFilePath, string fileToRead = "package.xml") + { + return string.Empty; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/PackageInstallation.cs b/src/Umbraco.Core/Packaging/PackageInstallation.cs new file mode 100644 index 0000000000..5d8c292098 --- /dev/null +++ b/src/Umbraco.Core/Packaging/PackageInstallation.cs @@ -0,0 +1,35 @@ +using Umbraco.Core.Packaging.Models; +using Umbraco.Core.Services; + +namespace Umbraco.Core.Packaging +{ + internal interface IPackageInstallation + { + InstallationSummary InstallPackage(string packageFilePath, int userId = 0); + MetaData GetPackageMetaData(string packageFilePath); + } + + internal class PackageInstallation : IPackageInstallation + { + private readonly PackagingService _packagingService; + private readonly PackageExtraction _packageExtraction; + + public PackageInstallation(PackagingService packagingService, PackageExtraction packageExtraction) + { + _packagingService = packagingService; + _packageExtraction = packageExtraction; + } + + public InstallationSummary InstallPackage(string packageFilePath, int userId = 0) + { + var summary = new InstallationSummary(); + return summary; + } + + public MetaData GetPackageMetaData(string packageFilePath) + { + var metaData = new MetaData(); + return metaData; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index 816865d807..76f0274e60 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -12,6 +12,8 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Packaging; +using Umbraco.Core.Packaging.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.UnitOfWork; @@ -1198,5 +1200,19 @@ namespace Umbraco.Core.Services #region Stylesheets #endregion + + #region Installation + + internal InstallationSummary InstallPackage(string packageFilePath, int userId = 0) + { + //TODO Add events ? + var installer = new PackageInstallation(this, new PackageExtraction()); + return installer.InstallPackage(packageFilePath, userId); + } + + #endregion + + #region Package Building + #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 2158fb1409..929ec806b0 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -211,6 +211,13 @@ + + + + + + + @@ -854,6 +861,9 @@ Constants.cs + + + Constants.cs Constants.cs @@ -917,9 +927,7 @@ - - - +