Exemplo n.º 1
0
        /// <summary>
        /// Serialize
        /// </summary>
        /// <param name="site">site</param>
        /// <param name="path">path</param>
        /// <returns></returns>
        public void Serialize(Site site, string path)
        {
            if (site == null)
            {
                throw new ArgumentException("site");
            }
            if (string.IsNullOrWhiteSpace(path))
            {
                throw new ArgumentException("stream");
            }

            var tempPath = Path.GetTempPath() + "site.xml";
            using (var stream = File.Create(tempPath))
            {
                var serializer = new XmlSerializer(typeof(Site));
                serializer.Serialize(stream, site);
            }

            var packagePath = path + Path.DirectorySeparatorChar + site.Name + ".wbp";
            if (File.Exists(packagePath))
            {
                File.Delete(packagePath);

            }
            using (ZipFile package = new ZipFile(packagePath, Console.Out))
            {
                package.AddFile(tempPath, string.Empty);
                package.AddFiles(site.Resources.Select(r => r.TextData).Where(File.Exists), "resources");
                package.Save();
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Renames all references in XML
        /// </summary>
        /// <param name="site">Whole site</param>
        /// <param name="propertyText">Original property text</param>
        /// <param name="oldName">Old reference to be removed</param>
        /// <param name="newName">New reference</param>
        /// <param name="typeId">Type id</param>
        /// <returns></returns>
        public void RenamePropertyReferences(Site site, string propertyText, string oldName, string newName, string typeId)
        {
            //propertyText.Replace("@Raw(Model." + oldName + ")", "@Raw(Model." + newName + ")");

            foreach (var type in site.PageTypes)
            {
                if (type.ID.ToString() == typeId)
                {
                    foreach (var definition in type.Definitions)
                    {
                        if (definition.Name == oldName)
                        {
                            definition.Name = newName;
                            definition.TemplateReference = "@Raw(Model." + newName + ")";

                        }
                    }
                }
            
                foreach (var template in site.Templates)
                {
                    if (template != null && template.ID == type.TemplateID)
                    {
                        template.Text = template.Text.Replace("@Raw(Model." + oldName + ")", "@Raw(Model." + newName + ")");
                    }
                }
            }

        }
Exemplo n.º 3
0
        /// <summary>
        /// Recursively updates all pages and their properties
        /// </summary>
        /// <param name="parent">Node from which to start updating</param>
        /// <param name="site">Whole site</param>
        /// <param name="config">Website's config</param>
        /// <returns></returns>
        public void UpdateChildren(Page parent, Site site, WebsiteModel config)
        {
            foreach (var page in parent.Children.Reverse<Page>())
            {
                var pageModel = GetPage(page.ID.ToString(), config);
                if (pageModel != null)
                {
                    page.Name = pageModel.Title;

                    if (page.Properties.Any())
                    {
                        foreach (var property in page.Properties.Reverse<Property>())
                        {
                            var propertyModel = GetProperty(property.ID.ToString(), pageModel);
                            if (propertyModel != null)
                            {
                                if (property.Name != propertyModel.Name)
                                {
                                    RenamePropertyReferences(site, property.Value, property.Name, propertyModel.Name, page.PageTypeID.ToString());
                                    //RenamePropertiesName(site.Root, property.Name, propertyModel.Name, page.PageTypeID.ToString());
                                    property.Name = propertyModel.Name;
                                }
                                property.Value = propertyModel.Html;
                            }
                            else
                            {
                                //RemovePropertiesFromPages(site.Root, property.Name, page.PageTypeID.ToString());
                                //RemovePropertyFromType(site, property.Name, page.PageTypeID.ToString());
                                
                                //RemovePropertyReferences(site, property.Name);
                                RemovePropertyFromTypeDefinition(site, property.Name, page.PageTypeID.ToString());
                                page.Properties.Remove(property);
                            }
                        }
                    }

                    if (page.Children.Any())
                    {
                        UpdateChildren(page, site, config);
                    }
                }
                else
                {
                    parent.Children.Remove(page);
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Import
        /// </summary>
        /// <param name="content">content</param>
        /// <param name="umbApplication">umb Application</param>
        /// <param name="appContext">app Context</param>
        /// <returns></returns>
        public void Import(Site site, ApplicationContext appContext)
        {
            references.Clear();
            
            var mediaService = appContext.Services.MediaService;
            var cts = appContext.Services.ContentTypeService;
            
            var folderTypeID = cts.GetMediaType(Constants.Conventions.MediaTypes.Folder).Id;
            var folders = mediaService.GetMediaOfMediaType(folderTypeID);
            foreach (var folder in folders)
            {
                if (folder.Name == site.Name)
                {
                    foreach (var media in mediaService.GetChildren(folder.Id))
                    {
                        mediaService.Delete(media);
                    }

                    mediaService.Delete(folder);
                    break;
                }
            }
            
            var serializer = new SiteSerializer();

            //Accents removal
            byte[] tempBytes;
            tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(site.Name.ToLowerInvariant());            
            string siteAlias = System.Text.Encoding.UTF8.GetString(tempBytes);
            siteAlias = siteAlias.Replace(" ", string.Empty);
            //site.Root.Name = site.Name;

            var fileService = appContext.Services.FileService;
                        
            var scriptPath = HostingEnvironment.MapPath("/scripts") + Path.DirectorySeparatorChar;
            var cssPath = HostingEnvironment.MapPath("/css") + Path.DirectorySeparatorChar;
            var resourcePath = site.Name + '/';
            
            var mediaParent = mediaService.CreateMediaWithIdentity(site.Name, -1, Constants.Conventions.MediaTypes.Folder);

            foreach (var resource in site.Resources)
            {
                var filePath = resource.TextData;
                
                if (resource.ResourceType == ResourceType.Javascript)
                {
                    try
                    {
                        var scripts = fileService.GetScripts(resource.TextData.ToLowerInvariant());
                        if (scripts != null && scripts.Any())
                        {
                            foreach (var item in scripts)
                            {
                                fileService.DeleteScript(item.Name);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.StackTrace);
                    }

                    var newPath = scriptPath + Path.GetFileName(filePath);
                    if (!newPath.EndsWith(".js"))
                    {
                        newPath = newPath + ".js";
                    }
                    
                    var script = new Script(filePath);
                    fileService.SaveScript(script);
                    System.IO.File.Copy(filePath, newPath, true);
                    AddToReferences(resource.TemplateReference, newPath, true);
                }
                else if (resource.ResourceType == ResourceType.Stylesheet)
                {
                    try
                    {
                        var stylesheets = fileService.GetStylesheets(resource.TextData.ToLowerInvariant());
                        if (stylesheets != null && stylesheets.Any())
                        {
                            foreach (var item in stylesheets)
                            {
                                fileService.DeleteStylesheet(item.Name);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.StackTrace);
                    }

                    var newPath = cssPath + Path.GetFileName(filePath);
                    if (!newPath.EndsWith(".css"))
                    {
                        newPath = newPath + ".css";
                    }
                    var stylesheet = new Stylesheet(newPath);
                    fileService.SaveStylesheet(stylesheet);
                    System.IO.File.Copy(filePath, newPath, true);
                    AddToReferences(resource.TemplateReference, newPath, true);
                }
                else if (resource.ResourceType == ResourceType.Image)
                {                    
                    var media = mediaService.CreateMedia(resource.FileName, mediaParent.Id, Constants.Conventions.MediaTypes.Image);
                    using (var fs = System.IO.File.OpenRead(filePath))
                    {
                        media.SetValue(Constants.Conventions.Media.File, resource.FileName, fs);
                    }
                    mediaService.Save(media);
                    AddToReferences(resource.TemplateReference, media.GetValue<string>(Constants.Conventions.Media.File));
                }
                else if (resource.ResourceType == ResourceType.File)
                {
                    var media = mediaService.CreateMedia(resource.FileName, mediaParent.Id, Constants.Conventions.MediaTypes.File);
                    using (var fs = System.IO.File.OpenRead(filePath))
                    {
                        media.SetValue(Constants.Conventions.Media.File, resource.FileName, fs);
                    }
                    mediaService.Save(media);
                    AddToReferences(resource.TemplateReference, media.GetValue<string>(Constants.Conventions.Media.File));
                }
            }


            var rootCT = new ContentType(-1);
            rootCT.Name = site.Name;
            rootCT.Alias = siteAlias;

            var oldCT = cts.GetContentType(rootCT.Alias);

            if (oldCT != null)
            {
                foreach (var child in cts.GetContentTypeChildren(oldCT.Id))
                {
                    cts.Delete(child);
                }

                cts.Delete(oldCT);
            }

            cts.Save(rootCT);
            
            var templatePathFormat = HostingEnvironment
                    .MapPath("/Views") + Path.DirectorySeparatorChar + "{0}.cshtml";

            var templates = new Dictionary<Guid, ITemplate>();
            var templateTexts = new Dictionary<Guid, string>();
            foreach (var template in site.Templates.WhereNotNull())
            {
                var templateAlias = siteAlias + template.Name.ToLowerInvariant();
                if (fileService.GetTemplate(templateAlias) != null)
	            {
                    fileService.DeleteTemplate(templateAlias);
	            }

                var templatePath = string.Format(templatePathFormat, templateAlias);
                var templateModel = new Umbraco.Core.Models.Template(templatePath, template.Name, templateAlias);

                fileService.SaveTemplate(templateModel);

                templateTexts.Add(template.ID, template.Text);
                templates.Add(template.ID, templateModel);
            }
                        
            var contentTypes = new Dictionary<Guid, ContentType>();
            foreach (var pageType in site.PageTypes)
            {
                var contentType = new ContentType(rootCT);
                contentType.Name = pageType.Name;
                contentType.Alias = siteAlias + pageType.Name;
                contentType.Icon = "icon-umb-content";

                cts.Save(contentType);

                contentType.AddPropertyGroup(site.Name);
                var propertyGroup = contentType.PropertyGroups[site.Name];

                bool hasTemplate = pageType.TemplateID != Guid.Empty;

                string templateBody = null;
                ITemplate contentTypeTemplate = null; 
                if (hasTemplate)
                {
                    contentTypeTemplate = templates[pageType.TemplateID];
                    templateBody = templateTexts[pageType.TemplateID];   
                }

                foreach (var definition in pageType.Definitions)
                {
                    var def = appContext.Services.DataTypeService
                        .GetDataTypeDefinitionByPropertyEditorAlias(Constants.PropertyEditors.TinyMCEAlias)
                        .First();
                    var pt = new PropertyType(def);
                    pt.Alias = siteAlias + definition.Name;
                    pt.Name = definition.Name;
                    contentType.AddPropertyType(pt, site.Name);
                    if (hasTemplate)
                    {
                        templateBody = templateBody.Replace(definition.TemplateReference, "@Umbraco.Field(\"" + pt.Alias + "\")");   
                    }
                }

                if (hasTemplate)
                {
                    contentTypeTemplate.Content = templateBody;
                    contentType.AllowedTemplates = contentTypeTemplate.AsEnumerableOfOne();
                    contentType.SetDefaultTemplate(contentTypeTemplate);

                    var templatePath = string.Format(templatePathFormat, contentTypeTemplate.Alias);
                    System.IO.File.WriteAllText(templatePath, templateBody, Encoding.UTF8);
                }
                
                cts.Save(contentType);
                contentTypes.Add(pageType.ID, contentType);
            }

            IContent root = null;
            var cs = appContext.Services.ContentService;
            var pages = new Dictionary<Guid, IContent>();
            var pageReferences = new Dictionary<string, IContent>();
            foreach (var page in site.Root.GetDescendantsAndSelf())
            {
                if(page.Name == null)
                {
                    page.Name = "unknown";
                }
                var parentID = page.ParentID == Guid.Empty ? -1 : pages[page.ParentID].Id;
                var cnt = cs.CreateContent(page.Name, parentID, contentTypes[page.PageTypeID].Alias);
                pages.Add(page.ID, cnt);
                foreach (var prop in page.Properties)
                {
                    //Accents removal
                    tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(prop.Name);
                    string propName = System.Text.Encoding.UTF8.GetString(tempBytes);
                    propName = propName.Replace(" ", string.Empty);
                    cnt.Properties[siteAlias + propName].Value = prop.Value;
                }
                cs.Save(cnt);
                if (page.ParentID == Guid.Empty)
	            {
		            root = cnt;
	            }
                if (!string.IsNullOrWhiteSpace(page.TemplateReference))
                {
                    pageReferences.Add(page.TemplateReference, cnt);   
                }
            }

            var pageRegex = new Regex(@"(@Raw\(Model\.Page\d+\))", RegexOptions.Compiled | RegexOptions.Multiline);
            var resourceRegex = new Regex(@"(@Raw\(Model\.Resource\d+\))", RegexOptions.Compiled | RegexOptions.Multiline);
            foreach (var page in root.Descendants().Where(c => c.Template != null))
	        {
		        foreach (var property in page.Properties)
	            {
                    var value = property.Value != null ? property.Value.ToString() : "";
                    value = pageRegex.Replace(value, m => "/{localLink:" + pageReferences[m.Value].Id + "}");
                    property.Value = resourceRegex.Replace(value, m => references[m.Value]);
	            }
                cs.Save(page);
	        }
            cs.PublishWithChildrenWithStatus(root, includeUnpublished: true);
            foreach (var template in templates.Values)
            {
                var sb = new StringBuilder();
                var templatePath = string.Format(templatePathFormat, template.Alias);
                var newContent = pageRegex.Replace(template.Content, m => string.Format("@Umbraco.NiceUrl({0})", pageReferences[m.Value].Id));
                newContent = resourceRegex.Replace(newContent, m => references[m.Value]);
                System.IO.File.WriteAllText(templatePath, templatePrefix + newContent, Encoding.UTF8);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Recursively creates list of pages starting with parent
        /// </summary>
        /// <param name="parent">Parent page</param>
        /// <param name="site">Site</param>
        /// <returns>
        /// List of pages
        /// </returns>
        public List<WebpackUI.Models.PageModel> AddChildren(Page parent, Site site)
        {
            var children = new List<WebpackUI.Models.PageModel>();
            foreach (var page in parent.Children)
            {
                var pageModel = new WebpackUI.Models.PageModel();
                pageModel.Id = page.ID.ToString();
                pageModel.ParentId = parent.ID.ToString();
                pageModel.Title = page.Name;
                foreach (var type in site.PageTypes)
                {
                    if (type.ID == page.PageTypeID)
                    {
                        pageModel.Type = type.Name;
                        break;
                    }
                }

                foreach (var property in page.Properties)
                {
                    var propertyModel = new PagePropertyModel();
                    propertyModel.Id = property.ID.ToString();
                    propertyModel.Name = property.Name;
                    propertyModel.Html = property.Value;

                    pageModel.Properties.Add(propertyModel);
                }

                pageModel.Children = AddChildren(page, site);

                children.Add(pageModel);
            }

            return children;
        }
Exemplo n.º 6
0
        /// <summary>
        /// Remove property from types definition
        /// </summary>
        /// <param name="site">Site</param>
        /// <param name="name">Property name</param>
        /// <param name="typeId">Type id</param>
        /// <returns></returns>
        public void RemovePropertyFromTypeDefinition(Site site, string name, string typeId)
        {
            foreach (var type in site.PageTypes)
            {
                if (type.ID.ToString() == typeId)
                {
                    foreach (var definition in type.Definitions.Reverse<Definition>())
                    {
                        if(definition.Name == name)
                        {
                            type.Definitions.Remove(definition);
                        }
                    }
                }

                // Remove references
                foreach (var template in site.Templates)
                {
                    if (template != null && template.ID == type.TemplateID)
                    {
                        template.Text = template.Text.Replace("@Raw(Model." + name + ")", "");
                    }
                }
            }
        }