From a7928f87eeca24d04345c551f37b5fa1e70da01f Mon Sep 17 00:00:00 2001 From: jakobdyrby Date: Fri, 6 Jun 2014 15:58:32 +0200 Subject: [PATCH] small ajustments --- src/Umbraco.Core/Constants-Packaging.cs | 83 +++++------ .../Packaging/Models/InstallationSummary.cs | 23 ++- .../Packaging/PackageInstallation.cs | 139 +++++++++++------- .../Packaging/PackageInstallationTest.cs | 6 +- 4 files changed, 152 insertions(+), 99 deletions(-) diff --git a/src/Umbraco.Core/Constants-Packaging.cs b/src/Umbraco.Core/Constants-Packaging.cs index 5db3d02532..4e9f294406 100644 --- a/src/Umbraco.Core/Constants-Packaging.cs +++ b/src/Umbraco.Core/Constants-Packaging.cs @@ -7,47 +7,48 @@ /// 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 NameNodeName = "Name"; - public const string TemplateNodeName = "Template"; - public const string AliasNodeNameSmall = "alias"; - public const string AliasNodeNameCapital = "Alias"; - public const string DictionaryItemsNodeName = "DictionaryItems"; - public const string DictionaryItemNodeName = "DictionaryItem"; - 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 OrgNameNodeName = "orgName"; - 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"; + 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 NameNodeName = "Name"; + public const string TemplateNodeName = "Template"; + public const string AliasNodeNameSmall = "alias"; + public const string AliasNodeNameCapital = "Alias"; + public const string DictionaryItemsNodeName = "DictionaryItems"; + public const string DictionaryItemNodeName = "DictionaryItem"; + 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 OrgNameNodeName = "orgName"; + 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 PackageLicenseXpathUrlAttribute = "url"; + 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/InstallationSummary.cs b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs index c627f9b813..1d136f8716 100644 --- a/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs +++ b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs @@ -1,10 +1,11 @@ using System; -using System.Collections.Generic; using System.Runtime.Serialization; using Umbraco.Core.Models; namespace Umbraco.Core.Packaging.Models { + + [Serializable] [DataContract(IsReference = true)] internal class InstallationSummary @@ -14,11 +15,29 @@ namespace Umbraco.Core.Packaging.Models public ILanguage[] LanguagesInstalled { get; set; } public IDictionaryItem[] DictionaryItemsInstalled { get; set; } public IMacro[] MacrosInstalled { get; set; } - public IEnumerable> FilesInstalled { get; set; } + public Details[] FilesInstalled { get; set; } public ITemplate[] TemplatesInstalled { get; set; } public IContentType[] DocumentTypesInstalled { get; set; } public IStylesheet[] StylesheetsInstalled { get; set; } public IContent[] DocumentsInstalled { get; set; } public PackageAction[] Actions { get; set; } } + + [Serializable] + [DataContract(IsReference = true)] + public enum InstallStatus + { + Inserted, + Overwridden + } + + + [Serializable] + [DataContract(IsReference = true)] + public class Details + { + public InstallStatus Status { get; set; } + public TItem Destination { get; set; } + public TItem Source { get; set; } + } } \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/PackageInstallation.cs b/src/Umbraco.Core/Packaging/PackageInstallation.cs index 031d477ae7..830a71600e 100644 --- a/src/Umbraco.Core/Packaging/PackageInstallation.cs +++ b/src/Umbraco.Core/Packaging/PackageInstallation.cs @@ -135,29 +135,39 @@ namespace Umbraco.Core.Packaging try { - - return new InstallationSummary - { - MetaData = metaData, - DataTypesInstalled = - dataTypes == null ? new IDataTypeDefinition[0] : InstallDataTypes(dataTypes, userId), - LanguagesInstalled = languages == null ? new ILanguage[0] : InstallLanguages(languages, userId), - DictionaryItemsInstalled = - dictionaryItems == null ? new IDictionaryItem[0] : InstallDictionaryItems(dictionaryItems), - MacrosInstalled = macroes == null ? new IMacro[0] : InstallMacros(macroes, userId), - FilesInstalled = - packageFile == null - ? Enumerable.Empty>() - : InstallFiles(packageFile, files), - TemplatesInstalled = templates == null ? new ITemplate[0] : InstallTemplats(templates, userId), - DocumentTypesInstalled = - documentTypes == null ? new IContentType[0] : InstallDocumentTypes(documentTypes, userId), - StylesheetsInstalled = - styleSheets == null ? new IStylesheet[0] : InstallStylesheets(styleSheets, userId), - DocumentsInstalled = documentSet == null ? new IContent[0] : InstallDocuments(documentSet, userId), - Actions = actions == null ? new PackageAction[0] : GetPackageActions(actions, metaData.Name), + var installationSummary = new InstallationSummary() { MetaData = metaData }; - }; + var dataTypeDefinitions = EmptyArrayIfNull(dataTypes) ?? InstallDataTypes(dataTypes, userId); + installationSummary.DataTypesInstalled = dataTypeDefinitions; + + var languagesInstalled = EmptyArrayIfNull(languages) ?? InstallLanguages(languages, userId); + installationSummary.LanguagesInstalled = languagesInstalled; + + var dictionaryInstalled = EmptyArrayIfNull(dictionaryItems) ?? InstallDictionaryItems(dictionaryItems); + installationSummary.DictionaryItemsInstalled = dictionaryInstalled; + + var macros = EmptyArrayIfNull(macroes)?? InstallMacros(macroes, userId); + installationSummary.MacrosInstalled = macros; + + var keyValuePairs = EmptyArrayIfNull>(packageFile) ?? InstallFiles(packageFile, files); + installationSummary.FilesInstalled = keyValuePairs; + + var templatesInstalled = EmptyArrayIfNull(templates) ?? InstallTemplats(templates, userId); + installationSummary.TemplatesInstalled = templatesInstalled; + + var documentTypesInstalled = EmptyArrayIfNull(documentTypes) ?? InstallDocumentTypes(documentTypes, userId); + installationSummary.DocumentTypesInstalled =documentTypesInstalled; + + var stylesheetsInstalled = EmptyArrayIfNull(styleSheets) ?? InstallStylesheets(styleSheets, userId); + installationSummary.StylesheetsInstalled = stylesheetsInstalled; + + var documentsInstalled = EmptyArrayIfNull(documentSet) ?? InstallDocuments(documentSet, userId); + installationSummary.DocumentsInstalled = documentsInstalled; + + var packageActions = EmptyArrayIfNull(actions) ?? GetPackageActions(actions, metaData.Name); + installationSummary.Actions = packageActions; + + return installationSummary; } catch (Exception e) { @@ -165,7 +175,10 @@ namespace Umbraco.Core.Packaging } } - + private static T[] EmptyArrayIfNull(object obj) + { + return obj == null ? new T[0] : null; + } private XDocument GetConfigXmlDoc(string packageFilePath) @@ -321,14 +334,20 @@ namespace Umbraco.Core.Packaging } - private IEnumerable> InstallFiles(string packageFilePath, XElement filesElement) + private Details[] InstallFiles(string packageFilePath, XElement filesElement) { return ExtractFileInPackageInfos(filesElement).Select(fpi => { bool existingOverrided = _packageExtraction.CopyFileFromArchive(packageFilePath, fpi.FileNameInPackage, fpi.FullPath); - return new KeyValuePair(fpi.FullPath, existingOverrided); + return new Details() + { + Source = fpi.FileNameInPackage, + Destination = fpi.FullPath, + Status = existingOverrided ? InstallStatus.Overwridden : InstallStatus.Inserted + }; + }).ToArray(); } @@ -471,41 +490,57 @@ namespace Umbraco.Core.Packaging "xRootElement"); } - XElement majorElement = infoElement.XPathSelectElement(Constants.Packaging.PackageRequirementsMajorXpath); - XElement minorElement = infoElement.XPathSelectElement(Constants.Packaging.PackageRequirementsMinorXpath); - XElement patchElement = infoElement.XPathSelectElement(Constants.Packaging.PackageRequirementsPatchXpath); - XElement nameElement = infoElement.XPathSelectElement(Constants.Packaging.PackageNameXpath); - XElement versionElement = infoElement.XPathSelectElement(Constants.Packaging.PackageVersionXpath); - XElement urlElement = infoElement.XPathSelectElement(Constants.Packaging.PackageUrlXpath); - XElement licenseElement = infoElement.XPathSelectElement(Constants.Packaging.PackageLicenseXpath); - XElement authorNameElement = infoElement.XPathSelectElement(Constants.Packaging.AuthorNameXpath); - XElement authorUrlElement = infoElement.XPathSelectElement(Constants.Packaging.AuthorWebsiteXpath); - XElement readmeElement = infoElement.XPathSelectElement(Constants.Packaging.ReadmeXpath); + var majorElement = infoElement.XPathSelectElement(Constants.Packaging.PackageRequirementsMajorXpath); + var minorElement = infoElement.XPathSelectElement(Constants.Packaging.PackageRequirementsMinorXpath); + var patchElement = infoElement.XPathSelectElement(Constants.Packaging.PackageRequirementsPatchXpath); + var nameElement = infoElement.XPathSelectElement(Constants.Packaging.PackageNameXpath); + var versionElement = infoElement.XPathSelectElement(Constants.Packaging.PackageVersionXpath); + var urlElement = infoElement.XPathSelectElement(Constants.Packaging.PackageUrlXpath); + var licenseElement = infoElement.XPathSelectElement(Constants.Packaging.PackageLicenseXpath); + var authorNameElement = infoElement.XPathSelectElement(Constants.Packaging.AuthorNameXpath); + var authorUrlElement = infoElement.XPathSelectElement(Constants.Packaging.AuthorWebsiteXpath); + var readmeElement = infoElement.XPathSelectElement(Constants.Packaging.ReadmeXpath); XElement controlElement = xRootElement.Element(Constants.Packaging.ControlNodeName); - int val; - return new MetaData { - Name = nameElement == null ? string.Empty : nameElement.Value, - Version = versionElement == null ? string.Empty : versionElement.Value, - Url = urlElement == null ? string.Empty : urlElement.Value, - License = licenseElement == null ? string.Empty : licenseElement.Value, - LicenseUrl = - licenseElement == null - ? string.Empty - : licenseElement.HasAttributes ? licenseElement.AttributeValue("url") : string.Empty, - AuthorName = authorNameElement == null ? string.Empty : authorNameElement.Value, - AuthorUrl = authorUrlElement == null ? string.Empty : authorUrlElement.Value, - Readme = readmeElement == null ? string.Empty : readmeElement.Value, - ReqMajor = majorElement == null ? 0 : int.TryParse(majorElement.Value, out val) ? val : 0, - ReqMinor = minorElement == null ? 0 : int.TryParse(minorElement.Value, out val) ? val : 0, - ReqPatch = patchElement == null ? 0 : int.TryParse(patchElement.Value, out val) ? val : 0, - Control = controlElement == null ? string.Empty : controlElement.Value + Name = StringValue(nameElement), + Version = StringValue(versionElement), + Url = StringValue(urlElement), + License = StringValue(licenseElement), + LicenseUrl = StringAttribute(licenseElement, Constants.Packaging.PackageLicenseXpathUrlAttribute), + AuthorName = StringValue(authorNameElement), + AuthorUrl = StringValue(authorUrlElement), + Readme = StringValue(readmeElement), + Control = StringValue(controlElement), + ReqMajor = IntValue(majorElement), + ReqMinor = IntValue(minorElement), + ReqPatch = IntValue(patchElement), + }; } + private static string StringValue(XElement xElement, string defaultValue = "") + { + return xElement == null ? defaultValue : xElement.Value; + } + + private static string StringAttribute(XElement xElement, string attribute, string defaultValue = "") + { + return xElement == null + ? defaultValue + : xElement.HasAttributes ? xElement.AttributeValue(attribute) : defaultValue; + } + + + private static int IntValue(XElement xElement, int defaultValue = 0) + { + int val; + return xElement == null ? defaultValue : int.TryParse(xElement.Value, out val) ? val : defaultValue; + } + + private static string UpdatePathPlaceholders(string path) { if (path.Contains("[$")) diff --git a/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs b/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs index bebeab66df..a0a5f9f5da 100644 --- a/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs +++ b/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Packaging; using Umbraco.Core.Packaging.Models; using Umbraco.Core.Services; -namespace Umbraco.Tests.Services +namespace Umbraco.Tests.Packaging { [TestFixture] public class PackageInstallationTest @@ -56,8 +56,6 @@ namespace Umbraco.Tests.Services string test; packageExtraction.Setup(a => a.ReadTextFileFromArchive(pagePath, Constants.Packaging.PackageXmlFileName, out test)).Returns(Xml); - - var fileService = new Mock(); var macroService = new Mock(); var packagingService = new Mock(); @@ -69,7 +67,7 @@ namespace Umbraco.Tests.Services // Assert Assert.IsNotNull(installationSummary); - Assert.Inconclusive("Lots of more tests can be written"); + //Assert.Inconclusive("Lots of more tests can be written"); } }