public void SetCatalogPageFilter(ICatalogPageFilter filter)
 {
     if (this.catalogPageFilter != null)
     {
         throw new InvalidOperationException("Catalog page filter is already defined.");
     }
     this.catalogPageFilter = filter;
     this.catalogPageItem   = currentItem;
     if (context.HasCatalogUrl && filter.Validate(context.CatalogUrlSegments))
     {
         object resolvedItem = filter.Execute(context.CatalogUrlSegments);
         if (resolvedItem == null)
         {
             this.catalogPageMode = CatalogPageMode.ItemNotFound;
         }
         else if (resolvedItem.GetType().GetEnumeratedType() != null)
         {
             catalogItems.AddRange(((IEnumerable)resolvedItem).OfType <object>());
             this.catalogPageMode = CatalogPageMode.Listing;
         }
         else
         {
             this.currentItem     = resolvedItem;
             this.catalogPageMode = CatalogPageMode.Item;
             if (this.currentItem is ISeoMetaProvider)
             {
                 seoMeta.Insert(0, (ISeoMetaProvider)currentItem);
             }
         }
     }
     else
     {
         this.catalogPageMode = CatalogPageMode.Listing;
     }
 }
        /// <summary>
        /// Sets the catalog page filter explicitly to create context for catalog page.
        /// </summary>
        /// <param name="filter"></param>
        public static void SetCatalogPageFilter(ICatalogPageFilter filter)
        {
            CommonHelper.ConfirmNotNull(filter, "filter");
            TaxonomyNavigationRequestContext instance = CommonHelper.HttpContextSingleton <TaxonomyNavigationRequestContext>();

            instance.SetCatalogPageFilter(filter);
        }
        public TaxonomyNavigationRequestContext()
        {
            this.context   = TaxonomyNavigationContext.Current;
            this.variation = VariationContext.Current;
            if (context.HasNavigationContext)
            {
                this.navigationTerm = context.NavigationTerm;
            }
            else
            {
                using (new SPSecurity.GrantAdditionalPermissionsInScope(SPBasePermissions.FullMask)) {
                    SPWeb  currentWeb = SPContext.Current.Web;
                    string url        = TaxonomyNavigationHelper.ResolveFriendlyUrl(currentWeb, SPUrlUtility.CombineUrl(currentWeb.ServerRelativeUrl, currentWeb.RootFolder.WelcomePage));
                    TaxonomyNavigationHelper.TryGetNavigationTerm(url, out this.navigationTerm, out url);
                }
            }
            if (this.navigationTerm == null)
            {
                NavigationTermSet termSet;
                TaxonomyNavigationHelper.IsRequestingNavigationTermSet(out termSet);
                this.navigationTermSetItem = termSet;
            }
            else
            {
                this.navigationTermSetItem = navigationTerm;
            }

            if (context.HasFriendlyUrl || context.HasCatalogUrl)
            {
                this.serverRelativeRequestUrl = context.ResolvedDisplayUrl;
            }
            else if (navigationTermSetItem != null)
            {
                this.serverRelativeRequestUrl = navigationTermSetItem.GetResolvedDisplayUrl(null);
            }
            else
            {
                this.serverRelativeRequestUrl = SPUtility.OriginalServerRelativeRequestPath;
            }
            this.variationRelativeRequestUrl = PublishingWebHelper.TrimVariationFromPath(serverRelativeRequestUrl);

            this.query = HttpUtility.ParseQueryString(HttpContext.Current.Request.Url.Query);
            query.Remove(null);
            query.Remove("TermStoreId");
            query.Remove("TermSetId");
            query.Remove("TermId");
            this.queryString = query.AllKeys.Length > 0 ? "?" + query : String.Empty;

            SPListItem listItem = SPContext.Current.ListItem;

            if (listItem != null)
            {
                this.currentItem = SPModel.TryCreate(listItem);
            }
            if (currentItem is ICatalogPage)
            {
                ICatalogPageFilter filter = CommonHelper.AccessNotNull(((ICatalogPage)currentItem).Filter, "Filter");
                SetCatalogPageFilter(filter);
            }
            if (currentItem is ISeoMetaProvider)
            {
                seoMeta.Add((ISeoMetaProvider)currentItem);
            }
            seoMeta.Add(new SeoMetaListItem(listItem));
            for (NavigationTerm t = navigationTerm; t != null; t = t.Parent)
            {
                seoMeta.Add(new SeoMetaNavigationTerm(listItem.Web, t));
            }
        }