public virtual ActionResult GetNavigationSubtree(string sitemapItemId)
        {
            using (new Tracer(sitemapItemId))
            {
                NavigationFilter navFilter = new NavigationFilter
                {
                    IncludeAncestors = GetRequestParameter <bool>("includeAncestors")
                };

                int descendantLevels;
                if (TryGetRequestParameter("descendantLevels", out descendantLevels))
                {
                    navFilter.DescendantLevels = descendantLevels;
                }

                IOnDemandNavigationProvider onDemandNavigationProvider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider;
                if (onDemandNavigationProvider == null)
                {
                    Log.Warn("Request for Navigation subtree received, but current Navigation Provider ({0}) does not implement interface {1}",
                             SiteConfiguration.NavigationProvider.GetType().Name, typeof(IOnDemandNavigationProvider).Name);
                    return(new EmptyResult());
                }

                IEnumerable <SitemapItem> model = onDemandNavigationProvider.GetNavigationSubtree(sitemapItemId, navFilter, WebRequestContext.Localization);
                return(Json(model, JsonRequestBehavior.AllowGet));
            }
        }
Esempio n. 2
0
        public SitemapItem SiteMap(Common.Configuration.Localization localization)
        {
            return(SiteConfiguration.CacheProvider.GetOrAdd(
                       $"sitemap-{localization.Id ?? "full"}", CacheRegion.Sitemap,
                       () =>
            {
                // Workaround: Currently the content service is not returning a sitemap for Docs only content
                // so the workaround is for each publication get the entire subtree and merge the results.
                // This will cause several requests to be issued and results in quite a slow performance.
                IOnDemandNavigationProvider provider =
                    SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider;

                if (provider == null)
                {
                    return null;
                }

                NavigationFilter navigationFilter = new NavigationFilter
                {
                    DescendantLevels = -1,
                    IncludeAncestors = false
                };

                List <SitemapItem> sitemapItems = new List <SitemapItem>();
                if (!string.IsNullOrEmpty(localization?.Id))
                {
                    sitemapItems.AddRange(provider.GetNavigationSubtree(null, navigationFilter, localization));
                }
                else
                {
                    var pubs = new PublicationProvider().PublicationList;
                    foreach (var pub in pubs)
                    {
                        var items = provider.GetNavigationSubtree(null, navigationFilter,
                                                                  new DocsLocalization(int.Parse(pub.Id)));
                        foreach (var item in items)
                        {
                            sitemapItems.AddRange(item.Items);
                        }
                    }
                }

                return new SitemapItem {
                    Items = FixupSitemap(sitemapItems, false, false)
                };
            }));
        }
Esempio n. 3
0
        public IEnumerable <SitemapItem> GetToc(int publicationId, string sitemapItemId, bool includeAncestors,
                                                int descendantLevels)
        {
            bool caching = ServiceCacheProvider.Instance.DisableCaching;

            ServiceCacheProvider.Instance.DisableCaching = true;
            IOnDemandNavigationProvider onDemandNavigationProvider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider;
            NavigationFilter            navigationFilter           = new NavigationFilter
            {
                DescendantLevels = descendantLevels,
                IncludeAncestors = includeAncestors
            };

            ILocalization localization = WebRequestContext.Localization;

            localization.Id = publicationId.ToString();

            var result = onDemandNavigationProvider.GetNavigationSubtree(sitemapItemId, navigationFilter, localization);

            ServiceCacheProvider.Instance.DisableCaching = caching;
            return(result);
        }
Esempio n. 4
0
        public IEnumerable <SitemapItem> GetToc(Common.Configuration.Localization localization, string sitemapItemId, bool includeAncestors,
                                                int descendantLevels)
        {
            return(SiteConfiguration.CacheProvider.GetOrAdd(
                       $"toc-{localization.Id}-{sitemapItemId}-{includeAncestors}-{WebRequestContext.CacheKeySalt}", CacheRegion.Toc,
                       () =>
            {
                new PublicationProvider().CheckPublicationOnline(int.Parse(localization.Id));

                IOnDemandNavigationProvider provider =
                    SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider;

                NavigationFilter navigationFilter = new NavigationFilter
                {
                    DescendantLevels = descendantLevels,
                    IncludeAncestors = includeAncestors
                };

                var sitemapItems =
                    provider.GetNavigationSubtree(sitemapItemId, navigationFilter, localization).ToList();

                if (sitemapItems.Count == 0)
                {
                    throw new DxaItemNotFoundException("No sitemap items found.");
                }

                if (includeAncestors)
                {
                    // if we are including ancestors we also need to get all the direct siblings for each
                    // level in the hirarchy.

                    SitemapItem node = FindNode(sitemapItems, sitemapItemId);

                    // for each parent node get sibling nodes
                    while (node.Parent != null)
                    {
                        var siblings = provider.GetNavigationSubtree(node.Parent.Id,
                                                                     new NavigationFilter {
                            DescendantLevels = 1, IncludeAncestors = false
                        }, localization);

                        HashSet <string> children = new HashSet <string>();
                        foreach (var item in node.Parent.Items)
                        {
                            children.Add(item.Id);
                        }
                        // filter out duplicates and Page types since we don't wish to include them in TOC
                        foreach (
                            var sibling in
                            siblings.Where(
                                sibling =>
                                sibling.Id != node.Id && sibling.Type != "Page" &&
                                !children.Contains(sibling.Id)))
                        {
                            node.Parent.Items.Add(sibling);
                        }

                        node = node.Parent;
                    }
                }
                return FixupSitemap(sitemapItems, true, true);
            }));
        }