protected void GenerateSiteMapIndexFile(SiteMapOptions options, int nFiles, bool compressed)
        {
            sitemapindex   smIndex = new sitemapindex();
            sitemap        smap;
            List <sitemap> smapList = new List <sitemap>();

            for (int i = 1; i <= nFiles; i++)
            {
                smap = new sitemap();
                if (compressed)
                {
                    smap.loc = GetAbsoluteUrl("~/" + "SiteMap" + i + ".xml.gz");
                }
                else
                {
                    smap.loc = GetAbsoluteUrl("~/" + "SiteMap" + i + ".xml");
                }
                smap.lastmod = LocaleHelper.LocalNow.ToString("yyyy-MM-ddTHH:mm:sszzzzzz");
                smapList.Add(smap);
            }

            smIndex.sitemap = smapList.ToArray();

            string fileData = XmlUtility.Utf8BytesToString(XmlUtility.Serialize(smIndex));
            string fileName = Path.Combine(options.SiteMapDataPath, "SiteMapIndex.xml");

            StreamWriter SiteMapIndexWriter = File.CreateText(fileName);

            using (SiteMapIndexWriter)
            {
                SiteMapIndexWriter.Write(fileData);
                SiteMapIndexWriter.Flush();
                SiteMapIndexWriter.Close();
            }
        }
示例#2
0
        public IEnumerable <SitemapNode> GetSiteMapUrlSet(SiteMapOptions Options)
        {
            // Clean up
            Options.Path     = DataHelper.GetNotEmpty(Options.Path, "/").Replace("%", "");
            Options.SiteName = DataHelper.GetNotEmpty(Options.SiteName, SiteContext.CurrentSiteName);
            List <SitemapNode> Nodes = new List <SitemapNode>();

            if (Options.ClassNames != null && Options.ClassNames.Count() > 0)
            {
                foreach (string ClassName in Options.ClassNames)
                {
                    if (string.IsNullOrWhiteSpace(Options.UrlColumnName))
                    {
                        Nodes.AddRange(_Helper.GetSiteMapUrlSetForClass(Options.Path, ClassName, Options.SiteName, Options));
                    }
                    else
                    {
                        // Since it's not the specific node, but the page found at that url that we need, we will first get the urls, then cache on getting those items.
                        Nodes.AddRange(GetSiteMapUrlSetForClassWithUrlColumn(Options.Path, ClassName, Options.SiteName, Options));
                    }
                }
            }
            else
            {
                Nodes.AddRange(_Helper.GetSiteMapUrlSetForAllClass(Options.Path, Options.SiteName, Options));
            }

            // Clean up, remove any that are not a URL
            Nodes.RemoveAll(x => !Uri.IsWellFormedUriString(x.Url, UriKind.Absolute));
            return(Nodes);
        }
        private List <SiteMapUrl> GetSiteMapItems(SiteMapOptions options)
        {
            List <SiteMapUrl> siteMapItems = new List <SiteMapUrl>();

            //first get the ASP.NET SiteMap nodes
            System.Web.SiteMapNode rootNode = System.Web.SiteMap.RootNode;

            //PopulateAspNetSiteMapUrls(siteMapItems, rootNode, options);


            if (options.IncludeCategories)
            {
                PopulateCategoryUrls(siteMapItems, options);
            }

            if (options.IncludeProducts)
            {
                PopulateProductUrls(siteMapItems, options);
            }

            if (options.IncludeWebpages)
            {
                PopulateWebpageUrls(siteMapItems, options);
            }

            return(siteMapItems);
        }
示例#4
0
        public DocumentQuery GetDocumentQuery(string Path, SiteMapOptions Options, string ClassName = null)
        {
            var DocumentQuery = (string.IsNullOrWhiteSpace(ClassName) ? new DocumentQuery() : new DocumentQuery(ClassName));

            DocumentQuery
            .Path(Path, PathTypeEnum.Section)
            .Culture(DataHelper.GetNotEmpty(Options.CultureCode, _repoContext.CurrentCulture()))
            .OnSite(Options.SiteName)
            .Published(Options.SelectOnlyPublished);
            if (Options.CheckDocumentPermissions.HasValue)
            {
                DocumentQuery.CheckPermissions(Options.CheckDocumentPermissions.Value);
            }
            if (Options.CombineWithDefaultCulture.HasValue)
            {
                DocumentQuery.CombineWithDefaultCulture(Options.CombineWithDefaultCulture.Value);
            }
            if (Options.MaxRelativeLevel > -1)
            {
                // Get the nesting level of the give path
                IKenticoSiteMapRepositoryHelper _CachableSelfHelper = (IKenticoSiteMapRepositoryHelper)_serviceProvider.GetService(typeof(IKenticoNavigationRepositoryHelper));
                DocumentQuery.NestingLevel(Options.MaxRelativeLevel + _CachableSelfHelper.GetNodeLevel(Path, Options.SiteName));
            }

            if (!string.IsNullOrWhiteSpace(Options.WhereCondition))
            {
                DocumentQuery.Where(Options.WhereCondition);
            }
            return(DocumentQuery);
        }
示例#5
0
        protected void GenerateButton_Click(object sender, EventArgs e)
        {
            // save the configured options
            SiteMapOptions options = new SiteMapOptions();

            options.Load(new CommonSiteMapOptionKeys());
            string sitemapPath = SitemapPath.Text;

            if (!string.IsNullOrEmpty(sitemapPath))
            {
                string newPath = Path.Combine(Request.MapPath("~/"), sitemapPath);
                if (!Directory.Exists(newPath))
                {
                    Directory.CreateDirectory(newPath);
                }
                options.SiteMapDataPath = newPath;
            }
            else
            {
                options.SiteMapDataPath = Request.MapPath("~/");
            }
            options.SiteMapFileName           = "SiteMap.xml";
            options.OverwriteSiteMapFile      = true;
            options.IncludeCategories         = IndexItems.Items[0].Selected;
            options.IncludeProducts           = IndexItems.Items[1].Selected;
            options.IncludeWebpages           = IndexItems.Items[2].Selected;
            options.CompressedSiteMapFileName = "SiteMap.xml.gz";
            options.OverwriteCompressedFile   = true;
            options.DefaultUrlPriority        = 0.5M;
            options.DefaultChangeFrequency    = (changefreq)Enum.Parse(typeof(changefreq), ChangeFrequency.SelectedValue);
            options.Save(new CommonSiteMapOptionKeys());

            // generate the map
            List <string>         messages = new List <string>();
            CommonSiteMapProvider provider = new CommonSiteMapProvider();
            bool success;

            if (UseCompression.Checked)
            {
                success = provider.CreateAndCompressSiteMap(options, ref messages);
            }
            else
            {
                success = provider.CreateSiteMap(options, ref messages);
            }

            // report the outcome
            if (success)
            {
                SuccessMessage.Visible = true;
                SuccessMessage.Text    = GetMessageLiteral(messages);
            }
            else
            {
                FailureMessage.Visible = true;
                FailureMessage.Text    = GetMessageLiteral(messages);
            }
        }
        private void PopulateWebpageUrls(List <SiteMapUrl> siteMapItems, SiteMapOptions options)
        {
            Store store = AbleContext.Current.Store;

            if (store == null)
            {
                return;
            }
            string url;

            foreach (Webpage wp in store.Webpages)
            {
                if (wp.WebpageType == WebpageType.Content && wp.Visibility == CatalogVisibility.Public)
                {
                    url = UrlGenerator.GetBrowseUrl(wp.Id, CatalogNodeType.Webpage, wp.Name);
                    siteMapItems.Add(new SiteMapUrl(GetAbsoluteUrl(url), options.DefaultChangeFrequency, options.DefaultUrlPriority));
                }
            }
        }
        private void PopulateProductUrls(List <SiteMapUrl> siteMapItems, SiteMapOptions options)
        {
            Store store = AbleContext.Current.Store;

            if (store == null)
            {
                return;
            }
            string url;

            foreach (Product prod in store.Products)
            {
                if (prod.Visibility == CatalogVisibility.Public)
                {
                    url = UrlGenerator.GetBrowseUrl(prod.Id, CatalogNodeType.Product, prod.Name);
                    siteMapItems.Add(new SiteMapUrl(GetAbsoluteUrl(url), options.DefaultChangeFrequency, options.DefaultUrlPriority));
                }
            }
        }
示例#8
0
        public DocumentQuery GetDocumentQuery(string Path, SiteMapOptions Options, string ClassName = null)
        {
            List <string> Columns = new List <string>(new string[] {
                "NodeSiteID", "NodeAliasPath", "DocumentUrlPath", "DocumentCulture", "DocumentModifiedWhen", "NodeID"
            });

            if (!string.IsNullOrWhiteSpace(Options.UrlColumnName))
            {
                Columns.Add(Options.UrlColumnName);
            }
            var DocumentQuery = (string.IsNullOrWhiteSpace(ClassName) ? new DocumentQuery() : new DocumentQuery(ClassName));

            DocumentQuery
            .Path(Path, PathTypeEnum.Section)
            .Culture(DataHelper.GetNotEmpty(Options.CultureCode, cultureName))
            .OnSite(Options.SiteName)
            .Published(Options.SelectOnlyPublished)
            .Columns(Columns);
            if (Options.CheckDocumentPermissions.HasValue)
            {
                DocumentQuery.CheckPermissions(Options.CheckDocumentPermissions.Value);
            }
            if (Options.CombineWithDefaultCulture.HasValue)
            {
                DocumentQuery.CombineWithDefaultCulture(Options.CombineWithDefaultCulture.Value);
            }
            if (Options.MaxRelativeLevel > -1)
            {
                // Get the nesting level of the give path
                DocumentQuery.NestingLevel(Options.MaxRelativeLevel + DependencyResolver.Current.GetService <IKenticoSiteMapRepositoryHelper>().GetNodeLevel(Path, Options.SiteName));
            }

            if (!string.IsNullOrWhiteSpace(Options.WhereCondition))
            {
                DocumentQuery.Where(Options.WhereCondition);
            }
            return(DocumentQuery);
        }
示例#9
0
 protected void Page_Load(object sender, EventArgs e)
 {
     if (!Page.IsPostBack)
     {
         // initialize form
         SiteMapOptions options = new SiteMapOptions();
         options.Load(new CommonSiteMapOptionKeys());
         if (!string.IsNullOrEmpty(options.SiteMapDataPath))
         {
             SitemapPath.Text = options.SiteMapDataPath;
         }
         UseCompression.Checked       = true;
         IndexItems.Items[0].Selected = options.IncludeCategories;
         IndexItems.Items[1].Selected = options.IncludeProducts;
         IndexItems.Items[2].Selected = options.IncludeWebpages;
         string   changeFrequency = options.DefaultChangeFrequency.ToString();
         ListItem selectedItem    = ChangeFrequency.Items.FindByText(changeFrequency);
         if (selectedItem != null)
         {
             selectedItem.Selected = true;
         }
     }
 }
示例#10
0
        /// <summary>
        /// Gets the SitemapNodes, looking up the page they point to automatically to get the accurate Document last modified.
        /// </summary>
        /// <param name="Path">The parent Nodealiaspath</param>
        /// <param name="ClassName">The Class Name to query</param>
        /// <param name="SiteName">The SiteName</param>
        /// <param name="Options">The Options</param>
        /// <returns>The SitemapNodes</returns>
        private IEnumerable <SitemapNode> GetSiteMapUrlSetForClassWithUrlColumn(string Path, string ClassName, string SiteName, SiteMapOptions Options)
        {
            var DocumentQuery = _Helper.GetDocumentQuery(Path, Options, ClassName);
            List <SitemapNode> SiteMapItems = new List <SitemapNode>();

            foreach (var Page in DocumentQuery.TypedResult)
            {
                string Culture     = !string.IsNullOrWhiteSpace(Options.CultureCode) ? Options.CultureCode : LocalizationContext.CurrentCulture.CultureCode;
                var    RelativeUrl = Page.GetStringValue(Options.UrlColumnName, _pageUrlRetriever.Retrieve(Page.NodeAliasPath, Culture, SiteName).RelativePath);


                // Try to find page by NodeAliasPath
                var ActualPage = (TreeNode)_generalDocumentRepository.GetDocumentByPath(RelativeUrl, SiteName, Columns: new string[] { "DocumentModifiedWhen", "NodeID", "DocumentCulture" });
                if (ActualPage != null)
                {
                    SiteMapItems.Add(ConvertToSiteMapUrl(RelativeUrl, SiteName, Page.DocumentModifiedWhen));
                }
                else
                {
                    SiteMapItems.Add(ConvertToSiteMapUrl(RelativeUrl, SiteName, null));
                }
            }
            return(SiteMapItems);
        }
示例#11
0
        /// <summary>
        /// Gets the SitemapNodes, looking up the page they point to automatically to get the accurate Document last modified.
        /// </summary>
        /// <param name="Path">The parent Nodealiaspath</param>
        /// <param name="ClassName">The Class Name to query</param>
        /// <param name="SiteName">The SiteName</param>
        /// <param name="Options">The Options</param>
        /// <returns>The SitemapNodes</returns>
        private IEnumerable <SitemapNode> GetSiteMapUrlSetForClassWithUrlColumn(string Path, string ClassName, string SiteName, SiteMapOptions Options)
        {
            var DocumentQuery = _Helper.GetDocumentQuery(Path, Options, ClassName);
            List <SitemapNode> SiteMapItems = new List <SitemapNode>();

            foreach (string RelativeUrl in _Helper.GetRelativeUrls(Path, ClassName, SiteName, Options))
            {
                // Get the page, Dynamic Routing already has it's own internal Caching and adds to the output cache
                var Page = (TreeNode)_DynamicRouteHelper.GetPage(RelativeUrl, Options.CultureCode, SiteName, new string[] { "DocumentModifiedWhen", "NodeID", "DocumentCulture" }, true);
                if (Page != null)
                {
                    SiteMapItems.Add(ConvertToSiteMapUrl(Page.RelativeURL, SiteName, Page.DocumentModifiedWhen));
                }
                else
                {
                    SiteMapItems.Add(ConvertToSiteMapUrl(RelativeUrl, SiteName, null));
                }
            }
            return(SiteMapItems);
        }
 public bool CreateAndCompressSiteMap(SiteMapOptions options, ref List <string> messages)
 {
     return(DoSiteMap(options, true, ref messages));
 }
 public bool CreateSiteMap(SiteMapOptions options, ref List <string> messages)
 {
     return(DoSiteMap(options, false, ref messages));
 }
        private void PopulateAspNetSiteMapUrls(List <SiteMapUrl> siteMapItems, System.Web.SiteMapNode siteMapNode, SiteMapOptions options)
        {
            if (siteMapNode == null)
            {
                return;
            }
            string nodeUrl = GetAbsoluteUrl(siteMapNode.Url);

            siteMapItems.Add(new SiteMapUrl(nodeUrl, options.DefaultChangeFrequency, options.DefaultUrlPriority));
            if (siteMapNode.HasChildNodes)
            {
                for (int i = 0; i < siteMapNode.ChildNodes.Count; i++)
                {
                    PopulateAspNetSiteMapUrls(siteMapItems, siteMapNode.ChildNodes[i], options);
                }
            }
        }
示例#15
0
        public IEnumerable <string> GetRelativeUrls(string Path, string ClassName, string SiteName, SiteMapOptions Options)
        {
            var DocumentQuery = GetDocumentQuery(Path, Options, ClassName);

            return(DocumentQuery.TypedResult.Select(x => x.GetStringValue(Options.UrlColumnName, x.RelativeURL)));
        }
示例#16
0
        public IEnumerable <SitemapNode> GetSiteMapUrlSetForAllClass(string Path, string SiteName, SiteMapOptions Options)
        {
            var DocumentQuery = GetDocumentQuery(Path, Options);

            return(DocumentQuery.TypedResult.Select(x => ConvertNodeToSiteMapUrl(x, SiteName)));
        }
        private bool DoSiteMap(SiteMapOptions options, bool compress, ref List <string> messages)
        {
            string       SiteMapFile = Path.Combine(options.SiteMapDataPath, options.SiteMapFileName);
            string       SiteMapData;
            StreamWriter SiteMapWriter;

            //get the data items to generate SiteMap for
            List <SiteMapUrl> siteMapItems = GetSiteMapItems(options);

            int maxUrls = 50000;

            if (siteMapItems.Count > maxUrls)
            {
                //multiple sitemap files needed. It is best to devide them in equally sized files
                int nFiles         = (int)Math.Ceiling((double)siteMapItems.Count / maxUrls);
                int nItems         = (int)Math.Ceiling((double)siteMapItems.Count / nFiles);
                int nLastFileItems = siteMapItems.Count - ((nFiles - 1) * nItems);

                String fName, cfName;
                int    startIndex;

                for (int i = 0; i < nFiles; i++)
                {
                    startIndex = i * nItems;
                    fName      = Path.Combine(options.SiteMapDataPath, "SiteMap" + (i + 1).ToString() + ".xml");
                    cfName     = Path.Combine(options.SiteMapDataPath, fName + ".gz");

                    if (i == nFiles - 1)
                    {
                        //this is the last file
                        SiteMapData = GenerateSiteMap(siteMapItems, startIndex, nLastFileItems);
                    }
                    else
                    {
                        SiteMapData = GenerateSiteMap(siteMapItems, startIndex, nItems);
                    }

                    SiteMapWriter = File.CreateText(fName);
                    using (SiteMapWriter)
                    {
                        SiteMapWriter.Write(SiteMapData);
                        SiteMapWriter.Flush();
                        SiteMapWriter.Close();
                    }

                    if (compress)
                    {
                        CompressFile(fName, cfName);
                    }
                }

                messages.Add(string.Format("{0} SiteMap Files Created.", nFiles));

                GenerateSiteMapIndexFile(options, nFiles, compress);

                messages.Add("SiteMap Index File 'SiteMapIndex.xml' Created.");
            }
            else
            {
                if (File.Exists(SiteMapFile) && !options.OverwriteSiteMapFile)
                {
                    messages.Add("SiteMap File Already Exists. You should either chose to overwrite the SiteMap file or provide a different name.");
                    return(false);
                }
                //generate the site map
                SiteMapData = GenerateSiteMap(siteMapItems, 0, siteMapItems.Count);

                SiteMapWriter = File.CreateText(SiteMapFile);
                using (SiteMapWriter)
                {
                    SiteMapWriter.Write(SiteMapData);
                    SiteMapWriter.Flush();
                    SiteMapWriter.Close();
                }

                messages.Add(string.Format("SiteMap File '{0}' Created.", options.SiteMapFileName));

                if (compress)
                {
                    string compressedFile = Path.Combine(options.SiteMapDataPath, options.CompressedSiteMapFileName);
                    if (File.Exists(compressedFile) && !options.OverwriteCompressedFile)
                    {
                        messages.Add(string.Format("Compressed SiteMap File '{0}' Already Exists. You should either chose to overwrite the compressed SiteMap file or provide a different name.", compressedFile));
                        return(false);
                    }

                    CompressFile(SiteMapFile, compressedFile);
                    messages.Add(string.Format("Compressed SiteMap File '{0}' Created.", options.CompressedSiteMapFileName));
                }
            }

            return(true);
        }