using System; using System.Xml; using System.Xml.XPath; using System.Collections.Generic; using System.IO; namespace umbraco.cms.businesslogic.packager { public class data { private static XmlDocument _source; public static XmlDocument Source { get { return _source; } } public static void Reload(string dataSource) { //do some error checking and create the folders/files if they don't exist if (!File.Exists(dataSource)) { if (!Directory.Exists(IO.IOHelper.MapPath(Settings.PackagerRoot))) { Directory.CreateDirectory(IO.IOHelper.MapPath(Settings.PackagerRoot)); } if (!Directory.Exists(IO.IOHelper.MapPath(Settings.PackagesStorage))) { Directory.CreateDirectory(IO.IOHelper.MapPath(Settings.PackagesStorage)); } if (!Directory.Exists(IO.IOHelper.MapPath(Settings.InstalledPackagesStorage))) { Directory.CreateDirectory(IO.IOHelper.MapPath(Settings.InstalledPackagesStorage)); } StreamWriter sw = File.CreateText(dataSource); sw.Write(umbraco.cms.businesslogic.Packager.FileResources.PackageFiles.Packages); sw.Flush(); sw.Close(); } if (_source == null) { _source = new XmlDocument(); } _source.Load(dataSource); } public static XmlNode GetFromId(int Id, string dataSource, bool reload) { if(reload) Reload(dataSource); return Source.SelectSingleNode("/packages/package [@id = '" + Id.ToString().ToUpper() + "']"); } public static XmlNode GetFromGuid(string guid, string dataSource, bool reload) { if (reload) Reload(dataSource); return Source.SelectSingleNode("/packages/package [@packageGuid = '" + guid + "']"); } public static PackageInstance MakeNew(string Name, string dataSource) { PackageInstance retVal = new PackageInstance(); try { Reload(dataSource); int _maxId = 1; // Find max id foreach (XmlNode n in Source.SelectNodes("packages/package")) { if (int.Parse(n.Attributes.GetNamedItem("id").Value) >= _maxId) _maxId = int.Parse(n.Attributes.GetNamedItem("id").Value) + 1; } XmlElement instance = Source.CreateElement("package"); instance.Attributes.Append(xmlHelper.addAttribute(Source, "id", _maxId.ToString())); instance.Attributes.Append(xmlHelper.addAttribute(Source, "version", "")); instance.Attributes.Append(xmlHelper.addAttribute(Source, "url", "")); instance.Attributes.Append(xmlHelper.addAttribute(Source, "name", Name)); instance.Attributes.Append(xmlHelper.addAttribute(Source, "folder", System.Guid.NewGuid().ToString())); instance.Attributes.Append(xmlHelper.addAttribute(Source, "packagepath", "")); instance.Attributes.Append(xmlHelper.addAttribute(Source, "repositoryGuid", "")); instance.Attributes.Append(xmlHelper.addAttribute(Source, "packageGuid", System.Guid.NewGuid().ToString())); instance.Attributes.Append(xmlHelper.addAttribute(Source, "hasUpdate", "false")); XmlElement license = Source.CreateElement("license"); license.InnerText = "MIT license"; license.Attributes.Append(xmlHelper.addAttribute(Source, "url", "http://www.opensource.org/licenses/mit-license.php")); instance.AppendChild(license); XmlElement author = Source.CreateElement("author"); author.InnerText = ""; author.Attributes.Append(xmlHelper.addAttribute(Source, "url", "")); instance.AppendChild(author); instance.AppendChild(xmlHelper.addTextNode(Source, "readme", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "actions", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "datatypes", "")); XmlElement content = Source.CreateElement("content"); content.InnerText = ""; content.Attributes.Append(xmlHelper.addAttribute(Source, "nodeId", "")); content.Attributes.Append(xmlHelper.addAttribute(Source, "loadChildNodes", "false")); instance.AppendChild(content); instance.AppendChild(xmlHelper.addTextNode(Source, "templates", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "stylesheets", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "documenttypes", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "macros", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "files", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "languages", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "dictionaryitems", "")); instance.AppendChild(xmlHelper.addTextNode(Source, "loadcontrol", "")); Source.SelectSingleNode("packages").AppendChild(instance); Source.Save(dataSource); retVal = data.Package(_maxId, dataSource); } catch (Exception ex) { BusinessLogic.Log.Add(BusinessLogic.LogTypes.Error, 0, ex.ToString()); } return retVal; } public static PackageInstance Package(int id, string datasource) { return ConvertXmlToPackage( GetFromId(id, datasource, true) ); } public static PackageInstance Package(string guid, string datasource) { try { XmlNode node = GetFromGuid(guid, datasource, true); if(node != null) return ConvertXmlToPackage(node); else return new PackageInstance(); } catch(Exception ex) { BusinessLogic.Log.Add(BusinessLogic.LogTypes.Error, 0, ex.ToString()); return new PackageInstance(); } } 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) { BusinessLogic.Log.Add(BusinessLogic.LogTypes.Debug, new BusinessLogic.User(0), -1, ex.ToString()); } } 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.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 //PackageInstance p = new PackageInstance(Id); //TODO DELETE PACKAGE FOLDER... //p.Folder XmlNode n = data.GetFromId(Id, dataSource, true); data.Source.SelectSingleNode("/packages").RemoveChild(n); data.Source.Save(dataSource); } public static void UpdateValue(XmlNode n, string Value) { if (n.FirstChild != null) n.FirstChild.Value = Value; else { n.AppendChild(Source.CreateTextNode(Value)); } //Save(); } public static void Save(PackageInstance package, string dataSource) { try { Reload(dataSource); XmlNode _xmlDef = GetFromId(package.Id, dataSource, false); _xmlDef.Attributes.GetNamedItem("name").Value = package.Name; _xmlDef.Attributes.GetNamedItem("version").Value = package.Version; _xmlDef.Attributes.GetNamedItem("url").Value = package.Url; _xmlDef.Attributes.GetNamedItem("packagepath").Value = package.PackagePath; _xmlDef.Attributes.GetNamedItem("repositoryGuid").Value = package.RepositoryGuid; _xmlDef.Attributes.GetNamedItem("packageGuid").Value = package.PackageGuid; _xmlDef.Attributes.GetNamedItem("hasUpdate").Value = package.HasUpdate.ToString(); _xmlDef.SelectSingleNode("license").FirstChild.Value = package.License; _xmlDef.SelectSingleNode("license").Attributes.GetNamedItem("url").Value = package.LicenseUrl; _xmlDef.SelectSingleNode("author").InnerText = package.Author; _xmlDef.SelectSingleNode("author").Attributes.GetNamedItem("url").Value = package.AuthorUrl; _xmlDef.SelectSingleNode("readme").InnerXml = ""; if(_xmlDef.SelectSingleNode("actions") == null) _xmlDef.AppendChild(xmlHelper.addTextNode(Source, "actions", "")); _xmlDef.SelectSingleNode("actions").InnerXml = package.Actions; _xmlDef.SelectSingleNode("content").Attributes.GetNamedItem("nodeId").Value = package.ContentNodeId.ToString(); _xmlDef.SelectSingleNode("content").Attributes.GetNamedItem("loadChildNodes").Value = package.ContentLoadChildNodes.ToString(); _xmlDef.SelectSingleNode("macros").InnerText = joinList(package.Macros, ','); _xmlDef.SelectSingleNode("templates").InnerText = joinList(package.Templates, ','); _xmlDef.SelectSingleNode("stylesheets").InnerText = joinList(package.Stylesheets, ','); _xmlDef.SelectSingleNode("documenttypes").InnerText = joinList(package.Documenttypes, ','); _xmlDef.SelectSingleNode("languages").InnerText = joinList(package.Languages, ','); _xmlDef.SelectSingleNode("dictionaryitems").InnerText = joinList(package.DictionaryItems, ','); _xmlDef.SelectSingleNode("datatypes").InnerText = joinList(package.DataTypes, ','); _xmlDef.SelectSingleNode("files").InnerXml = ""; foreach (string fileStr in package.Files) { if(!string.IsNullOrEmpty(fileStr.Trim())) _xmlDef.SelectSingleNode("files").AppendChild(xmlHelper.addTextNode(data.Source, "file", fileStr)); } _xmlDef.SelectSingleNode("loadcontrol").InnerText = package.LoadControl; Source.Save(dataSource); } catch(Exception F) { BusinessLogic.User myUser = new BusinessLogic.User(0); BusinessLogic.Log.Add(BusinessLogic.LogTypes.Error, myUser, 0, F.ToString()); } } private static string safeAttribute(string name, XmlNode n) { try { return n.Attributes.GetNamedItem(name).Value; } catch { return ""; } } private static string safeNodeValue(XmlNode n) { try { return xmlHelper.GetNodeValue(n); } catch { return ""; } } private static string safeNodeInnerXml(XmlNode n) { try { return n.InnerXml; } catch { return ""; } } private static string joinList(List list, char seperator) { string retVal = ""; foreach (string str in list) { retVal += str + seperator.ToString(); } return retVal.Trim(seperator); } public data() { } } }