From 092abfb56d837f2598446be9a06592d22b17f585 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 29 Jun 2016 15:31:10 +0200 Subject: [PATCH] Gets created packages deletion working, gets the min umb version field working on the created packages UI --- .../src/common/resources/package.resource.js | 9 + .../src/views/packager/delete.controller.js | 33 ++ .../src/views/packager/delete.html | 13 + .../developer/Packages/editPackage.aspx | 18 +- .../Editors/PackageInstallController.cs | 22 +- .../Trees/PackagesTreeController.cs | 17 +- .../developer/Packages/editPackage.aspx.cs | 4 + .../Packages/editPackage.aspx.designer.cs | 10 +- .../businesslogic/Packager/Package.cs | 3 + .../PackageInstance/CreatedPackage.cs | 6 +- .../PackageInstance/PackageInstance.cs | 112 ++++--- .../Packager/PackageInstance/utill.cs | 10 +- .../businesslogic/Packager/data.cs | 314 ++++++++++-------- 13 files changed, 358 insertions(+), 213 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/packager/delete.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/packager/delete.html diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js index 33889e35e4..dffa116515 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js @@ -24,6 +24,15 @@ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to get installed packages'); }, + deleteCreatedPackage: function (packageId) { + return umbRequestHelper.resourcePromise( + $http.post( + umbRequestHelper.getApiUrl( + "packageInstallApiBaseUrl", + "DeleteCreatedPackage", { packageId: packageId })), + 'Failed to get installed packages'); + }, + uninstall: function(packageId) { return umbRequestHelper.resourcePromise( $http.post( diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/delete.controller.js new file mode 100644 index 0000000000..a0539464cf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/packager/delete.controller.js @@ -0,0 +1,33 @@ +/** + * @ngdoc controller + * @name Umbraco.Editors.Packages.DeleteController + * @function + * + * @description + * The controller for deleting content + */ +function PackageDeleteController($scope, packageResource, treeService, navigationService) { + + $scope.performDelete = function() { + + //mark it for deletion (used in the UI) + $scope.currentNode.loading = true; + packageResource.deleteCreatedPackage($scope.currentNode.id).then(function () { + $scope.currentNode.loading = false; + + //get the root node before we remove it + var rootNode = treeService.getTreeRoot($scope.currentNode); + + //TODO: Need to sync tree, etc... + treeService.removeNode($scope.currentNode); + navigationService.hideMenu(); + }); + + }; + + $scope.cancel = function() { + navigationService.hideDialog(); + }; +} + +angular.module("umbraco").controller("Umbraco.Editors.Packages.DeleteController", PackageDeleteController); diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/delete.html b/src/Umbraco.Web.UI.Client/src/views/packager/delete.html new file mode 100644 index 0000000000..1a802ab657 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/packager/delete.html @@ -0,0 +1,13 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + + + + +
+
diff --git a/src/Umbraco.Web.UI/umbraco/developer/Packages/editPackage.aspx b/src/Umbraco.Web.UI/umbraco/developer/Packages/editPackage.aspx index edea60c62b..87faed4e43 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Packages/editPackage.aspx +++ b/src/Umbraco.Web.UI/umbraco/developer/Packages/editPackage.aspx @@ -35,13 +35,28 @@ * + + + + + + + + + * + Invalid version number (eg. 7.5.0) + + + - + * @@ -52,6 +67,7 @@ ControlToValidate="packageAuthorUrl">* + diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index 08fdf5303f..0a83c739cf 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -40,6 +40,9 @@ using Settings = umbraco.cms.businesslogic.packager.Settings; namespace Umbraco.Web.Editors { + /// + /// A controller used for installing packages and managing all of the data in the packages section in the back office + /// [PluginController("UmbracoApi")] [UmbracoApplicationAuthorize(Core.Constants.Applications.Developer)] public class PackageInstallController : UmbracoAuthorizedJsonController @@ -206,7 +209,6 @@ namespace Umbraco.Web.Editors global::umbraco.BusinessLogic.Actions.Action.ReRegisterActionsAndHandlers(); } - public IEnumerable GetInstalled() { return data.GetAllPackages(IOHelper.MapPath(Settings.InstalledPackagesSettings)) @@ -224,6 +226,24 @@ namespace Umbraco.Web.Editors }).ToList(); } + /// + /// Deletes a created package + /// + /// + /// + [HttpPost] + [HttpDelete] + public IHttpActionResult DeleteCreatedPackage(int packageId) + { + var package = CreatedPackage.GetById(packageId); + if (package == null) + return NotFound(); + + package.Delete(); + + return Ok(); + } + private void PopulateFromPackageData(LocalPackageInstallModel model) { var ins = new global::umbraco.cms.businesslogic.packager.Installer(Security.CurrentUser.Id); diff --git a/src/Umbraco.Web/Trees/PackagesTreeController.cs b/src/Umbraco.Web/Trees/PackagesTreeController.cs index b2df155112..d1eb4dc8d2 100644 --- a/src/Umbraco.Web/Trees/PackagesTreeController.cs +++ b/src/Umbraco.Web/Trees/PackagesTreeController.cs @@ -93,15 +93,22 @@ namespace Umbraco.Web.Trees { var menu = new MenuItemCollection(); - // Root actions - menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionNew.Instance.Alias))) - .ConvertLegacyMenuItem(null, Constants.Trees.Packages, queryStrings.GetValue("application")); - - if (id == "created") + // Root actions + if (id == "-1") + { + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionNew.Instance.Alias))) + .ConvertLegacyMenuItem(null, Constants.Trees.Packages, queryStrings.GetValue("application")); + } + else if (id == "created") { menu.Items.Add( Services.TextService.Localize(string.Format("actions/{0}", ActionRefresh.Instance.Alias)), true); } + else + { + //it's a package node + menu.Items.Add(ui.Text("actions", ActionDelete.Instance.Alias)); + } return menu; } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.cs index af26a25efe..4d6888a779 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.cs @@ -77,6 +77,8 @@ namespace umbraco.presentation.developer.packages packageReadme.Text = pack.Readme; packageVersion.Text = pack.Version; packageUrl.Text = pack.Url; + iconUrl.Text = pack.IconUrl; + umbracoVersion.Text = pack.UmbracoVersion != null ? pack.UmbracoVersion.ToString(3) : string.Empty; /*ACTIONS XML*/ tb_actions.Text = pack.Actions; @@ -374,9 +376,11 @@ namespace umbraco.presentation.developer.packages // Tab setup packageInfo = TabView1.NewTabPage("Package Properties"); packageInfo.Controls.Add(Pane1); + packageInfo.Controls.Add(Pane5); packageInfo.Controls.Add(Pane1_1); packageInfo.Controls.Add(Pane1_2); packageInfo.Controls.Add(Pane1_3); + packageContents = TabView1.NewTabPage("Package Contents"); packageContents.Controls.Add(Pane2); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.designer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.designer.cs index d089f385e1..a4c21695a7 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.designer.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx.designer.cs @@ -38,7 +38,15 @@ namespace umbraco.presentation.developer.packages { /// To modify move field declaration from designer file to code-behind file. /// protected global::umbraco.uicontrols.PropertyPanel pp_name; - + + protected global::umbraco.uicontrols.PropertyPanel pp_icon; + protected global::umbraco.uicontrols.PropertyPanel pp_umbracoVersion; + protected global::System.Web.UI.WebControls.TextBox iconUrl; + protected global::System.Web.UI.WebControls.TextBox umbracoVersion; + protected global::umbraco.uicontrols.Pane Pane5; + protected global::System.Web.UI.WebControls.RegularExpressionValidator VersionValidator; + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator7; + /// /// packageName control. /// diff --git a/src/umbraco.cms/businesslogic/Packager/Package.cs b/src/umbraco.cms/businesslogic/Packager/Package.cs index a12e2160bc..d557b30d21 100644 --- a/src/umbraco.cms/businesslogic/Packager/Package.cs +++ b/src/umbraco.cms/businesslogic/Packager/Package.cs @@ -1,10 +1,13 @@ using System; +using System.ComponentModel; using System.Runtime.CompilerServices; using umbraco.BusinessLogic; using umbraco.DataLayer; namespace umbraco.cms.businesslogic.packager { + [Obsolete("This class is not used and will be removed in future versions")] + [EditorBrowsable(EditorBrowsableState.Never)] public class Package { protected static ISqlHelper SqlHelper diff --git a/src/umbraco.cms/businesslogic/Packager/PackageInstance/CreatedPackage.cs b/src/umbraco.cms/businesslogic/Packager/PackageInstance/CreatedPackage.cs index 4f68d757ac..aa3a788be4 100644 --- a/src/umbraco.cms/businesslogic/Packager/PackageInstance/CreatedPackage.cs +++ b/src/umbraco.cms/businesslogic/Packager/PackageInstance/CreatedPackage.cs @@ -32,8 +32,10 @@ namespace umbraco.cms.businesslogic.packager public static CreatedPackage MakeNew(string name) { - var pack = new CreatedPackage(); - pack.Data = data.MakeNew(name, IOHelper.MapPath(Settings.CreatedPackagesSettings)); + var pack = new CreatedPackage + { + Data = data.MakeNew(name, IOHelper.MapPath(Settings.CreatedPackagesSettings)) + }; var e = new NewEventArgs(); pack.OnNew(e); diff --git a/src/umbraco.cms/businesslogic/Packager/PackageInstance/PackageInstance.cs b/src/umbraco.cms/businesslogic/Packager/PackageInstance/PackageInstance.cs index ca17abc440..736a7c82d1 100644 --- a/src/umbraco.cms/businesslogic/Packager/PackageInstance/PackageInstance.cs +++ b/src/umbraco.cms/businesslogic/Packager/PackageInstance/PackageInstance.cs @@ -6,92 +6,96 @@ using System.Collections.Generic; namespace umbraco.cms.businesslogic.packager { - public class PackageInstance + public class PackageInstance { - public int Id { get; set; } + public int Id { get; set; } - public string RepositoryGuid { get; set; } + public string RepositoryGuid { get; set; } - public string PackageGuid { get; set; } + public string PackageGuid { get; set; } - public bool HasUpdate { get; set; } + public bool HasUpdate { get; set; } - public bool EnableSkins { get; set; } + public bool EnableSkins { get; set; } - public Guid SkinRepoGuid { get; set; } + public Guid SkinRepoGuid { get; set; } + public string Name { get; set; } - public string Name { get; set; } + public string Url { get; set; } - public string Url { get; set; } + public string Folder { get; set; } - public string Folder { get; set; } + public string PackagePath { get; set; } - public string PackagePath { get; set; } + public string Version { get; set; } - public string Version { get; set; } + /// + /// The minimum umbraco version that this package requires + /// + public Version UmbracoVersion { get; set; } - public string Author { get; set; } + public string Author { get; set; } - public string AuthorUrl { get; set; } + public string AuthorUrl { get; set; } + public string License { get; set; } - public string License { get; set; } + public string LicenseUrl { get; set; } - public string LicenseUrl { get; set; } + public string Readme { get; set; } - public string Readme { get; set; } + public bool ContentLoadChildNodes { get; set; } - public bool ContentLoadChildNodes { get; set; } + public string ContentNodeId { get; set; } - public string ContentNodeId { get; set; } + public List Macros { get; set; } - public List Macros { get; set; } + public List Languages { get; set; } - public List Languages { get; set; } + public List DictionaryItems { get; set; } - public List DictionaryItems { get; set; } + public List Templates { get; set; } - public List Templates { get; set; } + public List Documenttypes { get; set; } - public List Documenttypes { get; set; } + public List Stylesheets { get; set; } - public List Stylesheets { get; set; } + public List Files { get; set; } - public List Files { get; set; } + public string LoadControl { get; set; } - public string LoadControl { get; set; } + public string Actions { get; set; } - public string Actions { get; set; } + public List DataTypes { get; set; } - public List DataTypes { get; set; } + public string IconUrl { get; set; } - public string IconUrl { get; set; } - - public PackageInstance() + public PackageInstance() { - SkinRepoGuid = Guid.Empty; - Name = string.Empty; - Url = string.Empty; - Folder = string.Empty; - PackagePath = string.Empty; - Version = string.Empty; - Author = string.Empty; - AuthorUrl = string.Empty; - License = string.Empty; - LicenseUrl = string.Empty; - Readme = string.Empty; - ContentNodeId = string.Empty; - IconUrl = string.Empty; - Macros = new List(); - Languages = new List(); - DictionaryItems = new List(); - Templates = new List(); - Documenttypes = new List(); - Stylesheets = new List(); - Files = new List(); - LoadControl = string.Empty; - DataTypes = new List(); + SkinRepoGuid = Guid.Empty; + Name = string.Empty; + Url = string.Empty; + Folder = string.Empty; + PackagePath = string.Empty; + Version = string.Empty; + UmbracoVersion = null; + Author = string.Empty; + AuthorUrl = string.Empty; + License = string.Empty; + LicenseUrl = string.Empty; + Readme = string.Empty; + ContentNodeId = string.Empty; + IconUrl = string.Empty; + Macros = new List(); + Languages = new List(); + DictionaryItems = new List(); + Templates = new List(); + Documenttypes = new List(); + Stylesheets = new List(); + Files = new List(); + LoadControl = string.Empty; + DataTypes = new List(); EnableSkins = false; ContentLoadChildNodes = false; } diff --git a/src/umbraco.cms/businesslogic/Packager/PackageInstance/utill.cs b/src/umbraco.cms/businesslogic/Packager/PackageInstance/utill.cs index fdebbc8e3c..e00666678d 100644 --- a/src/umbraco.cms/businesslogic/Packager/PackageInstance/utill.cs +++ b/src/umbraco.cms/businesslogic/Packager/PackageInstance/utill.cs @@ -18,6 +18,7 @@ using umbraco.cms.businesslogic.template; using umbraco.cms.businesslogic.web; using umbraco.cms.businesslogic.macro; using ICSharpCode.SharpZipLib.Zip; +using Umbraco.Core; using Umbraco.Core.IO; namespace umbraco.cms.businesslogic.packager { @@ -47,11 +48,12 @@ namespace umbraco.cms.businesslogic.packager { package.AppendChild(license); package.AppendChild(_node("url", pack.Url, doc)); - + XmlNode Requirements = doc.CreateElement("requirements"); - Requirements.AppendChild(_node("major", "3", doc)); - Requirements.AppendChild(_node("minor", "0", doc)); - Requirements.AppendChild(_node("patch", "0", doc)); + //NOTE: The defaults are 3.0.0 - I'm just leaving that here since that's the way it's been //SD + Requirements.AppendChild(_node("major", pack.UmbracoVersion == null ? "3" : pack.UmbracoVersion.Major.ToInvariantString(), doc)); + Requirements.AppendChild(_node("minor", pack.UmbracoVersion == null ? "0" : pack.UmbracoVersion.Minor.ToInvariantString(), doc)); + Requirements.AppendChild(_node("patch", pack.UmbracoVersion == null ? "0" : pack.UmbracoVersion.Build.ToInvariantString(), doc)); package.AppendChild(Requirements); info.AppendChild(package); diff --git a/src/umbraco.cms/businesslogic/Packager/data.cs b/src/umbraco.cms/businesslogic/Packager/data.cs index e4dead2657..96be0f4998 100644 --- a/src/umbraco.cms/businesslogic/Packager/data.cs +++ b/src/umbraco.cms/businesslogic/Packager/data.cs @@ -4,6 +4,7 @@ using System.Xml.XPath; using System.Collections.Generic; using System.IO; using Umbraco.Core; +using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -15,12 +16,12 @@ namespace umbraco.cms.businesslogic.packager public class data { private static XmlDocument _source; - + public static XmlDocument Source { get { - return _source; + return _source; } } @@ -47,43 +48,44 @@ namespace umbraco.cms.businesslogic.packager sw.Write(umbraco.cms.businesslogic.Packager.FileResources.PackageFiles.Packages); sw.Flush(); } - + } if (_source == null) { - _source = new XmlDocument(); + _source = new XmlDocument(); } - //error checking here - if (File.Exists(dataSource)) - { - var isEmpty = false; - using (var sr = new StreamReader(dataSource)) - { - if (sr.ReadToEnd().IsNullOrWhiteSpace()) - { - isEmpty = true; - } - } - if (isEmpty) - { - File.WriteAllText(dataSource, @""); - } - } + //error checking here + if (File.Exists(dataSource)) + { + var isEmpty = false; + using (var sr = new StreamReader(dataSource)) + { + if (sr.ReadToEnd().IsNullOrWhiteSpace()) + { + isEmpty = true; + } + } + if (isEmpty) + { + File.WriteAllText(dataSource, @""); + } + } _source.Load(dataSource); } public static XmlNode GetFromId(int Id, string dataSource, bool reload) { - if(reload) + if (reload) Reload(dataSource); return Source.SelectSingleNode("/packages/package [@id = '" + Id.ToString().ToUpper() + "']"); } - public static XmlNode GetFromGuid(string guid, string dataSource, bool reload) { + public static XmlNode GetFromGuid(string guid, string dataSource, bool reload) + { if (reload) Reload(dataSource); @@ -111,6 +113,8 @@ namespace umbraco.cms.businesslogic.packager instance.Attributes.Append(XmlHelper.AddAttribute(Source, "packagepath", "")); instance.Attributes.Append(XmlHelper.AddAttribute(Source, "repositoryGuid", "")); instance.Attributes.Append(XmlHelper.AddAttribute(Source, "iconUrl", "")); + //set to current version + instance.Attributes.Append(XmlHelper.AddAttribute(Source, "umbVersion", UmbracoVersion.Current.ToString(3))); instance.Attributes.Append(XmlHelper.AddAttribute(Source, "packageGuid", Guid.NewGuid().ToString())); instance.Attributes.Append(XmlHelper.AddAttribute(Source, "hasUpdate", "false")); @@ -151,15 +155,16 @@ namespace umbraco.cms.businesslogic.packager Source.Save(dataSource); var retVal = data.Package(maxId, dataSource); - return retVal; } - public static PackageInstance Package(int id, string datasource) { - return ConvertXmlToPackage( GetFromId(id, datasource, true) ); + public static PackageInstance Package(int id, string datasource) + { + return ConvertXmlToPackage(GetFromId(id, datasource, true)); } - public static PackageInstance Package(string guid, string datasource) { + public static PackageInstance Package(string guid, string datasource) + { XmlNode node = GetFromGuid(guid, datasource, true); if (node != null) return ConvertXmlToPackage(node); @@ -167,139 +172,148 @@ namespace umbraco.cms.businesslogic.packager return new PackageInstance(); } - public static List GetAllPackages(string dataSource) { + public static List GetAllPackages(string dataSource) + { Reload(dataSource); XmlNodeList nList = data.Source.SelectNodes("packages/package"); List retVal = new List(); - for (int i = 0; i < nList.Count; i++) - { - try - { - retVal.Add(ConvertXmlToPackage(nList[i])); - } - catch (Exception ex) - { - LogHelper.Error("An error occurred in GetAllPackages", ex); - } - } - - return retVal; - } - - private static PackageInstance ConvertXmlToPackage(XmlNode n) { - PackageInstance retVal = new PackageInstance(); - - if (n != null) { - retVal.Id = int.Parse(SafeAttribute("id",n)); - retVal.Name = SafeAttribute("name",n); - retVal.Folder = SafeAttribute("folder", n); - retVal.PackagePath = SafeAttribute("packagepath", n); - retVal.Version = SafeAttribute("version", n); - retVal.Url = SafeAttribute("url", n); - retVal.RepositoryGuid = SafeAttribute("repositoryGuid", n); - retVal.PackageGuid = SafeAttribute("packageGuid", n); - retVal.HasUpdate = bool.Parse(SafeAttribute("hasUpdate",n)); - - retVal.IconUrl = SafeAttribute("iconUrl", n); - - bool enableSkins = false; - bool.TryParse(SafeAttribute("enableSkins", n), out enableSkins); - retVal.EnableSkins = enableSkins; - - retVal.SkinRepoGuid = string.IsNullOrEmpty(SafeAttribute("skinRepoGuid", n)) ? Guid.Empty : new Guid(SafeAttribute("skinRepoGuid", n)); - - retVal.License = SafeNodeValue(n.SelectSingleNode("license")); - retVal.LicenseUrl = n.SelectSingleNode("license").Attributes.GetNamedItem("url").Value; - - retVal.Author = SafeNodeValue(n.SelectSingleNode("author")); - retVal.AuthorUrl = SafeAttribute("url", n.SelectSingleNode("author")); - - retVal.Readme = SafeNodeValue(n.SelectSingleNode("readme")); - retVal.Actions = SafeNodeInnerXml(n.SelectSingleNode("actions")); - - retVal.ContentNodeId = SafeAttribute("nodeId", n.SelectSingleNode("content")); - retVal.ContentLoadChildNodes = bool.Parse(SafeAttribute("loadChildNodes",n.SelectSingleNode("content"))); - - - retVal.Macros = new List(SafeNodeValue(n.SelectSingleNode("macros")).Trim(',').Split(',')); - retVal.Macros = new List(SafeNodeValue(n.SelectSingleNode("macros")).Trim(',').Split(',')); - retVal.Templates = new List(SafeNodeValue(n.SelectSingleNode("templates")).Trim(',').Split(',')); - retVal.Stylesheets = new List(SafeNodeValue(n.SelectSingleNode("stylesheets")).Trim(',').Split(',')); - retVal.Documenttypes = new List(SafeNodeValue(n.SelectSingleNode("documenttypes")).Trim(',').Split(',')); - retVal.Languages = new List(SafeNodeValue(n.SelectSingleNode("languages")).Trim(',').Split(',')); - retVal.DictionaryItems = new List(SafeNodeValue(n.SelectSingleNode("dictionaryitems")).Trim(',').Split(',')); - retVal.DataTypes = new List(SafeNodeValue(n.SelectSingleNode("datatypes")).Trim(',').Split(',')); - - XmlNodeList xmlFiles = n.SelectNodes("files/file"); - retVal.Files = new List(); - - for (int i = 0; i < xmlFiles.Count; i++) - retVal.Files.Add(xmlFiles[i].InnerText); - - retVal.LoadControl = SafeNodeValue(n.SelectSingleNode("loadcontrol")); + for (int i = 0; i < nList.Count; i++) + { + try + { + retVal.Add(ConvertXmlToPackage(nList[i])); } + catch (Exception ex) + { + LogHelper.Error("An error occurred in GetAllPackages", ex); + } + } return retVal; } - - public static void Delete(int Id, string dataSource) - { + + private static PackageInstance ConvertXmlToPackage(XmlNode n) + { + PackageInstance retVal = new PackageInstance(); + + if (n != null) + { + retVal.Id = int.Parse(SafeAttribute("id", n)); + retVal.Name = SafeAttribute("name", n); + retVal.Folder = SafeAttribute("folder", n); + retVal.PackagePath = SafeAttribute("packagepath", n); + retVal.Version = SafeAttribute("version", n); + retVal.Url = SafeAttribute("url", n); + retVal.RepositoryGuid = SafeAttribute("repositoryGuid", n); + retVal.PackageGuid = SafeAttribute("packageGuid", n); + retVal.HasUpdate = bool.Parse(SafeAttribute("hasUpdate", n)); + + retVal.IconUrl = SafeAttribute("iconUrl", n); + var umbVersion = SafeAttribute("umbVersion", n); + Version parsedVersion; + if (umbVersion.IsNullOrWhiteSpace() == false && Version.TryParse(umbVersion, out parsedVersion)) + { + retVal.UmbracoVersion = parsedVersion; + } + + bool enableSkins = false; + bool.TryParse(SafeAttribute("enableSkins", n), out enableSkins); + retVal.EnableSkins = enableSkins; + + retVal.SkinRepoGuid = string.IsNullOrEmpty(SafeAttribute("skinRepoGuid", n)) ? Guid.Empty : new Guid(SafeAttribute("skinRepoGuid", n)); + + retVal.License = SafeNodeValue(n.SelectSingleNode("license")); + retVal.LicenseUrl = n.SelectSingleNode("license").Attributes.GetNamedItem("url").Value; + + retVal.Author = SafeNodeValue(n.SelectSingleNode("author")); + retVal.AuthorUrl = SafeAttribute("url", n.SelectSingleNode("author")); + + retVal.Readme = SafeNodeValue(n.SelectSingleNode("readme")); + retVal.Actions = SafeNodeInnerXml(n.SelectSingleNode("actions")); + + retVal.ContentNodeId = SafeAttribute("nodeId", n.SelectSingleNode("content")); + retVal.ContentLoadChildNodes = bool.Parse(SafeAttribute("loadChildNodes", n.SelectSingleNode("content"))); + + retVal.Macros = new List(SafeNodeValue(n.SelectSingleNode("macros")).Trim(',').Split(',')); + retVal.Macros = new List(SafeNodeValue(n.SelectSingleNode("macros")).Trim(',').Split(',')); + retVal.Templates = new List(SafeNodeValue(n.SelectSingleNode("templates")).Trim(',').Split(',')); + retVal.Stylesheets = new List(SafeNodeValue(n.SelectSingleNode("stylesheets")).Trim(',').Split(',')); + retVal.Documenttypes = new List(SafeNodeValue(n.SelectSingleNode("documenttypes")).Trim(',').Split(',')); + retVal.Languages = new List(SafeNodeValue(n.SelectSingleNode("languages")).Trim(',').Split(',')); + retVal.DictionaryItems = new List(SafeNodeValue(n.SelectSingleNode("dictionaryitems")).Trim(',').Split(',')); + retVal.DataTypes = new List(SafeNodeValue(n.SelectSingleNode("datatypes")).Trim(',').Split(',')); + + XmlNodeList xmlFiles = n.SelectNodes("files/file"); + retVal.Files = new List(); + + for (int i = 0; i < xmlFiles.Count; i++) + retVal.Files.Add(xmlFiles[i].InnerText); + + retVal.LoadControl = SafeNodeValue(n.SelectSingleNode("loadcontrol")); + } + + return retVal; + } + + public static void Delete(int Id, string dataSource) + { Reload(dataSource); - // Remove physical xml file if any + // Remove physical xml file if any //PackageInstance p = new PackageInstance(Id); //TODO DELETE PACKAGE FOLDER... //p.Folder - XmlNode n = data.GetFromId(Id, dataSource, true); + XmlNode n = data.GetFromId(Id, dataSource, true); if (n != null) { data.Source.SelectSingleNode("/packages").RemoveChild(n); - data.Source.Save(dataSource); + data.Source.Save(dataSource); } - - } - public static void UpdateValue(XmlNode n, string Value) - { - if (n.FirstChild != null) - n.FirstChild.Value = Value; - else - { + } + + public static void UpdateValue(XmlNode n, string Value) + { + if (n.FirstChild != null) + n.FirstChild.Value = Value; + else + { n.AppendChild(Source.CreateTextNode(Value)); - } - //Save(); - } + } + //Save(); + } - public static void Save(PackageInstance package, string dataSource) - { + public static void Save(PackageInstance package, string dataSource) + { Reload(dataSource); var xmlDef = GetFromId(package.Id, dataSource, false); XmlHelper.SetAttribute(Source, xmlDef, "name", package.Name); - XmlHelper.SetAttribute(Source, xmlDef, "version",package.Version); - XmlHelper.SetAttribute(Source, xmlDef, "url",package.Url); - XmlHelper.SetAttribute(Source, xmlDef, "packagepath",package.PackagePath); - XmlHelper.SetAttribute(Source, xmlDef, "repositoryGuid",package.RepositoryGuid); - XmlHelper.SetAttribute(Source, xmlDef, "packageGuid",package.PackageGuid); - XmlHelper.SetAttribute(Source, xmlDef, "hasUpdate",package.HasUpdate.ToString()); - XmlHelper.SetAttribute(Source, xmlDef, "enableSkins",package.EnableSkins.ToString()); - XmlHelper.SetAttribute(Source, xmlDef, "skinRepoGuid",package.SkinRepoGuid.ToString()); - XmlHelper.SetAttribute(Source, xmlDef, "iconUrl", package.IconUrl); + XmlHelper.SetAttribute(Source, xmlDef, "version", package.Version); + XmlHelper.SetAttribute(Source, xmlDef, "url", package.Url); + XmlHelper.SetAttribute(Source, xmlDef, "packagepath", package.PackagePath); + XmlHelper.SetAttribute(Source, xmlDef, "repositoryGuid", package.RepositoryGuid); + XmlHelper.SetAttribute(Source, xmlDef, "packageGuid", package.PackageGuid); + XmlHelper.SetAttribute(Source, xmlDef, "hasUpdate", package.HasUpdate.ToString()); + XmlHelper.SetAttribute(Source, xmlDef, "enableSkins", package.EnableSkins.ToString()); + XmlHelper.SetAttribute(Source, xmlDef, "skinRepoGuid", package.SkinRepoGuid.ToString()); + XmlHelper.SetAttribute(Source, xmlDef, "iconUrl", package.IconUrl); + XmlHelper.SetAttribute(Source, xmlDef, "umbVersion", package.UmbracoVersion.ToString(3)); - var licenseNode = xmlDef.SelectSingleNode("license"); - if (licenseNode == null) - { - licenseNode = Source.CreateElement("license"); - xmlDef.AppendChild(licenseNode); - } + var licenseNode = xmlDef.SelectSingleNode("license"); + if (licenseNode == null) + { + licenseNode = Source.CreateElement("license"); + xmlDef.AppendChild(licenseNode); + } licenseNode.InnerText = package.License; XmlHelper.SetAttribute(Source, licenseNode, "url", package.LicenseUrl); var authorNode = xmlDef.SelectSingleNode("author"); - if (authorNode == null) - { + if (authorNode == null) + { authorNode = Source.CreateElement("author"); xmlDef.AppendChild(authorNode); } @@ -309,9 +323,9 @@ namespace umbraco.cms.businesslogic.packager XmlHelper.SetCDataNode(Source, xmlDef, "readme", package.Readme); XmlHelper.SetTextNode(Source, xmlDef, "actions", package.Actions); - var contentNode = xmlDef.SelectSingleNode("content"); - if (contentNode == null) - { + var contentNode = xmlDef.SelectSingleNode("content"); + if (contentNode == null) + { contentNode = Source.CreateElement("content"); xmlDef.AppendChild(contentNode); } @@ -345,42 +359,52 @@ namespace umbraco.cms.businesslogic.packager Source.Save(dataSource); } - + private static string SafeAttribute(string name, XmlNode n) { - return n.Attributes == null || n.Attributes[name] == null ? string.Empty : n.Attributes[name].Value; + return n.Attributes == null || n.Attributes[name] == null ? string.Empty : n.Attributes[name].Value; } - private static string SafeNodeValue(XmlNode n) { - try { + private static string SafeNodeValue(XmlNode n) + { + try + { return XmlHelper.GetNodeValue(n); - } catch { + } + catch + { return string.Empty; } } - private static string SafeNodeInnerXml(XmlNode n) { - try { + private static string SafeNodeInnerXml(XmlNode n) + { + try + { return n.InnerXml; - } catch { + } + catch + { return string.Empty; } } - private static string JoinList(List list, char seperator) { + private static string JoinList(List list, char seperator) + { string retVal = ""; - foreach (string str in list) { + foreach (string str in list) + { retVal += str + seperator; } return retVal.Trim(seperator); } - public data() - { + public data() + { - } + } } }