public void Publish() { var package = this; var pack = package.Data; var e = new PublishEventArgs(); package.FireBeforePublish(e); if (e.Cancel == false) { var outInt = 0; //Path checking... var localPath = IOHelper.MapPath(SystemDirectories.Media + "/" + pack.Folder); if (Directory.Exists(localPath) == false) { Directory.CreateDirectory(localPath); } //Init package file... CreatePackageManifest(); //Info section.. AppendElement(utill.PackageInfo(pack, _packageManifest)); //Documents and tags... var contentNodeId = 0; if (string.IsNullOrEmpty(pack.ContentNodeId) == false && int.TryParse(pack.ContentNodeId, out contentNodeId)) { if (contentNodeId > 0) { //Create the Documents/DocumentSet node XmlNode documents = _packageManifest.CreateElement("Documents"); XmlNode documentSet = _packageManifest.CreateElement("DocumentSet"); XmlAttribute importMode = _packageManifest.CreateAttribute("importMode", ""); importMode.Value = "root"; documentSet.Attributes.Append(importMode); documents.AppendChild(documentSet); //load content from umbraco. var umbDocument = new Document(contentNodeId); documentSet.AppendChild(umbDocument.ToXml(_packageManifest, pack.ContentLoadChildNodes)); AppendElement(documents); ////Create the TagProperties node - this is used to store a definition for all //// document properties that are tags, this ensures that we can re-import tags properly //XmlNode tagProps = _packageManifest.CreateElement("TagProperties"); ////before we try to populate this, we'll do a quick lookup to see if any of the documents //// being exported contain published tags. //var allExportedIds = documents.SelectNodes("//@id").Cast<XmlNode>() // .Select(x => x.Value.TryConvertTo<int>()) // .Where(x => x.Success) // .Select(x => x.Result) // .ToArray(); //var allContentTags = new List<ITag>(); //foreach (var exportedId in allExportedIds) //{ // allContentTags.AddRange( // ApplicationContext.Current.Services.TagService.GetTagsForEntity(exportedId)); //} ////This is pretty round-about but it works. Essentially we need to get the properties that are tagged //// but to do that we need to lookup by a tag (string) //var allTaggedEntities = new List<TaggedEntity>(); //foreach (var group in allContentTags.Select(x => x.Group).Distinct()) //{ // allTaggedEntities.AddRange( // ApplicationContext.Current.Services.TagService.GetTaggedContentByTagGroup(group)); //} ////Now, we have all property Ids/Aliases and their referenced document Ids and tags //var allExportedTaggedEntities = allTaggedEntities.Where(x => allExportedIds.Contains(x.EntityId)) // .DistinctBy(x => x.EntityId) // .OrderBy(x => x.EntityId); //foreach (var taggedEntity in allExportedTaggedEntities) //{ // foreach (var taggedProperty in taggedEntity.TaggedProperties.Where(x => x.Tags.Any())) // { // XmlNode tagProp = _packageManifest.CreateElement("TagProperty"); // var docId = _packageManifest.CreateAttribute("docId", ""); // docId.Value = taggedEntity.EntityId.ToString(CultureInfo.InvariantCulture); // tagProp.Attributes.Append(docId); // var propertyAlias = _packageManifest.CreateAttribute("propertyAlias", ""); // propertyAlias.Value = taggedProperty.PropertyTypeAlias; // tagProp.Attributes.Append(propertyAlias); // var group = _packageManifest.CreateAttribute("group", ""); // group.Value = taggedProperty.Tags.First().Group; // tagProp.Attributes.Append(group); // tagProp.AppendChild(_packageManifest.CreateCDataSection( // JsonConvert.SerializeObject(taggedProperty.Tags.Select(x => x.Text).ToArray()))); // tagProps.AppendChild(tagProp); // } //} //AppendElement(tagProps); } } //Document types.. var dtl = new List <DocumentType>(); var docTypes = _packageManifest.CreateElement("DocumentTypes"); foreach (var dtId in pack.Documenttypes) { if (int.TryParse(dtId, out outInt)) { DocumentType docT = new DocumentType(outInt); AddDocumentType(docT, ref dtl); } } foreach (DocumentType d in dtl) { docTypes.AppendChild(d.ToXml(_packageManifest)); } AppendElement(docTypes); //Templates var templates = _packageManifest.CreateElement("Templates"); foreach (var templateId in pack.Templates) { if (int.TryParse(templateId, out outInt)) { var t = new Template(outInt); templates.AppendChild(t.ToXml(_packageManifest)); } } AppendElement(templates); //Stylesheets var stylesheets = _packageManifest.CreateElement("Stylesheets"); foreach (var stylesheetName in pack.Stylesheets) { if (stylesheetName.IsNullOrWhiteSpace()) { continue; } var stylesheetXmlNode = utill.Stylesheet(stylesheetName, true, _packageManifest); if (stylesheetXmlNode != null) { stylesheets.AppendChild(stylesheetXmlNode); } } AppendElement(stylesheets); //Macros var macros = _packageManifest.CreateElement("Macros"); foreach (var macroId in pack.Macros) { if (int.TryParse(macroId, out outInt)) { macros.AppendChild(utill.Macro(int.Parse(macroId), true, localPath, _packageManifest)); } } AppendElement(macros); //Dictionary Items var dictionaryItems = _packageManifest.CreateElement("DictionaryItems"); foreach (var dictionaryId in pack.DictionaryItems) { if (int.TryParse(dictionaryId, out outInt)) { var di = new Dictionary.DictionaryItem(outInt); dictionaryItems.AppendChild(di.ToXml(_packageManifest)); } } AppendElement(dictionaryItems); //Languages var languages = _packageManifest.CreateElement("Languages"); foreach (var langId in pack.Languages) { if (int.TryParse(langId, out outInt)) { var lang = new language.Language(outInt); languages.AppendChild(lang.ToXml(_packageManifest)); } } AppendElement(languages); //Datatypes var dataTypes = _packageManifest.CreateElement("DataTypes"); foreach (var dtId in pack.DataTypes) { if (int.TryParse(dtId, out outInt)) { datatype.DataTypeDefinition dtd = new datatype.DataTypeDefinition(outInt); dataTypes.AppendChild(dtd.ToXml(_packageManifest)); } } AppendElement(dataTypes); //Files foreach (var fileName in pack.Files) { utill.AppendFileToManifest(fileName, localPath, _packageManifest); } //Load control on install... if (string.IsNullOrEmpty(pack.LoadControl) == false) { XmlNode control = _packageManifest.CreateElement("control"); control.InnerText = pack.LoadControl; utill.AppendFileToManifest(pack.LoadControl, localPath, _packageManifest); AppendElement(control); } //Actions if (string.IsNullOrEmpty(pack.Actions) == false) { try { var xdActions = new XmlDocument(); xdActions.LoadXml("<Actions>" + pack.Actions + "</Actions>"); var actions = xdActions.DocumentElement.SelectSingleNode("."); if (actions != null) { actions = _packageManifest.ImportNode(actions, true).Clone(); AppendElement(actions); } } catch { } } var manifestFileName = localPath + "/package.xml"; if (File.Exists(manifestFileName)) { File.Delete(manifestFileName); } _packageManifest.Save(manifestFileName); _packageManifest = null; //string packPath = Settings.PackagerRoot.Replace(System.IO.Path.DirectorySeparatorChar.ToString(), "/") + "/" + pack.Name.Replace(' ', '_') + "_" + pack.Version.Replace(' ', '_') + "." + Settings.PackageFileExtension; // check if there's a packages directory below media var packagesDirectory = SystemDirectories.Media + "/created-packages"; if (Directory.Exists(IOHelper.MapPath(packagesDirectory)) == false) { Directory.CreateDirectory(IOHelper.MapPath(packagesDirectory)); } var packPath = packagesDirectory + "/" + (pack.Name + "_" + pack.Version).Replace(' ', '_') + "." + Settings.PackageFileExtension; utill.ZipPackage(localPath, IOHelper.MapPath(packPath)); pack.PackagePath = packPath; if (pack.PackageGuid.Trim() == "") { pack.PackageGuid = Guid.NewGuid().ToString(); } package.Save(); //Clean up.. File.Delete(localPath + "/package.xml"); Directory.Delete(localPath, true); package.FireAfterPublish(e); } }
public void Publish() { var package = this; var pack = package.Data; try { var e = new PublishEventArgs(); package.FireBeforePublish(e); if (e.Cancel == false) { var outInt = 0; //Path checking... var localPath = IOHelper.MapPath(SystemDirectories.Media + "/" + pack.Folder); if (Directory.Exists(localPath) == false) Directory.CreateDirectory(localPath); //Init package file... CreatePackageManifest(); //Info section.. AppendElement(utill.PackageInfo(pack, _packageManifest)); //Documents... var contentNodeId = 0; if (string.IsNullOrEmpty(pack.ContentNodeId) == false && int.TryParse(pack.ContentNodeId, out contentNodeId)) { XmlNode documents = _packageManifest.CreateElement("Documents"); XmlNode documentSet = _packageManifest.CreateElement("DocumentSet"); XmlAttribute importMode = _packageManifest.CreateAttribute("importMode", ""); importMode.Value = "root"; documentSet.Attributes.Append(importMode); documents.AppendChild(documentSet); //load content from umbraco. var umbDocument = new Document(contentNodeId); documentSet.AppendChild(umbDocument.ToXml(_packageManifest, pack.ContentLoadChildNodes)); AppendElement(documents); } //Document types.. var dtl = new List<DocumentType>(); var docTypes = _packageManifest.CreateElement("DocumentTypes"); foreach (var dtId in pack.Documenttypes) { if (int.TryParse(dtId, out outInt)) { DocumentType docT = new DocumentType(outInt); AddDocumentType(docT, ref dtl); } } foreach (DocumentType d in dtl) { docTypes.AppendChild(d.ToXml(_packageManifest)); } AppendElement(docTypes); //Templates var templates = _packageManifest.CreateElement("Templates"); foreach (var templateId in pack.Templates) { if (int.TryParse(templateId, out outInt)) { var t = new Template(outInt); templates.AppendChild(t.ToXml(_packageManifest)); } } AppendElement(templates); //Stylesheets var stylesheets = _packageManifest.CreateElement("Stylesheets"); foreach (var ssId in pack.Stylesheets) { if (int.TryParse(ssId, out outInt)) { var s = new StyleSheet(outInt); stylesheets.AppendChild(s.ToXml(_packageManifest)); } } AppendElement(stylesheets); //Macros var macros = _packageManifest.CreateElement("Macros"); foreach (var macroId in pack.Macros) { if (int.TryParse(macroId, out outInt)) { macros.AppendChild(utill.Macro(int.Parse(macroId), true, localPath, _packageManifest)); } } AppendElement(macros); //Dictionary Items var dictionaryItems = _packageManifest.CreateElement("DictionaryItems"); foreach (var dictionaryId in pack.DictionaryItems) { if (int.TryParse(dictionaryId, out outInt)) { var di = new Dictionary.DictionaryItem(outInt); dictionaryItems.AppendChild(di.ToXml(_packageManifest)); } } AppendElement(dictionaryItems); //Languages var languages = _packageManifest.CreateElement("Languages"); foreach (var langId in pack.Languages) { if (int.TryParse(langId, out outInt)) { var lang = new language.Language(outInt); languages.AppendChild(lang.ToXml(_packageManifest)); } } AppendElement(languages); //Datatypes var dataTypes = _packageManifest.CreateElement("DataTypes"); foreach (var dtId in pack.DataTypes) { if (int.TryParse(dtId, out outInt)) { datatype.DataTypeDefinition dtd = new datatype.DataTypeDefinition(outInt); dataTypes.AppendChild(dtd.ToXml(_packageManifest)); } } AppendElement(dataTypes); //Files foreach (var fileName in pack.Files) { utill.AppendFileToManifest(fileName, localPath, _packageManifest); } //Load control on install... if (string.IsNullOrEmpty(pack.LoadControl) == false) { XmlNode control = _packageManifest.CreateElement("control"); control.InnerText = pack.LoadControl; utill.AppendFileToManifest(pack.LoadControl, localPath, _packageManifest); AppendElement(control); } //Actions if (string.IsNullOrEmpty(pack.Actions) == false) { try { var xdActions = new XmlDocument(); xdActions.LoadXml("<Actions>" + pack.Actions + "</Actions>"); var actions = xdActions.DocumentElement.SelectSingleNode("."); if (actions != null) { actions = _packageManifest.ImportNode(actions, true).Clone(); AppendElement(actions); } } catch { } } var manifestFileName = localPath + "/package.xml"; if (File.Exists(manifestFileName)) File.Delete(manifestFileName); _packageManifest.Save(manifestFileName); _packageManifest = null; //string packPath = Settings.PackagerRoot.Replace(System.IO.Path.DirectorySeparatorChar.ToString(), "/") + "/" + pack.Name.Replace(' ', '_') + "_" + pack.Version.Replace(' ', '_') + "." + Settings.PackageFileExtension; // check if there's a packages directory below media var packagesDirectory = SystemDirectories.Media + "/created-packages"; if (Directory.Exists(IOHelper.MapPath(packagesDirectory)) == false) { Directory.CreateDirectory(IOHelper.MapPath(packagesDirectory)); } var packPath = packagesDirectory + "/" + (pack.Name + "_" + pack.Version).Replace(' ', '_') + "." + Settings.PackageFileExtension; utill.ZipPackage(localPath, IOHelper.MapPath(packPath)); pack.PackagePath = packPath; if (pack.PackageGuid.Trim() == "") pack.PackageGuid = Guid.NewGuid().ToString(); package.Save(); //Clean up.. File.Delete(localPath + "/package.xml"); Directory.Delete(localPath, true); package.FireAfterPublish(e); } } catch (Exception ex) { LogHelper.Error<CreatedPackage>("An error occurred", ex); } }