private void SaveIfNotExist(RouteFacetModel facetName)
        {
            var facetNames = GetFacetModels();

            if (facetNames != null && facetNames.Any(x => x.FacetName.Equals(facetName.FacetName, StringComparison.OrdinalIgnoreCase)))
            {
                return;
            }

            var routingFacetNameStore = GetRoutingFacetNameStore();

            routingFacetNameStore.Save(facetName);
            ClearFacetNamesCache();
        }
        internal string GetUrl(IContent currentContent, RouteValueDictionary routeValues, string facetType, string facetKeyPath, string facetKey, object facetValue)
        {
            var originalRouteFacets = routeValues[RouteFacets] as ConcurrentDictionary <RouteFacetModel, HashSet <object> >;

            var routeFacets = new Dictionary <RouteFacetModel, HashSet <object> >();

            if (originalRouteFacets != null)
            {
                foreach (var routeFacetModel in originalRouteFacets.Keys)
                {
                    routeFacets.Add(routeFacetModel, new HashSet <object>());
                    foreach (var value in originalRouteFacets[routeFacetModel])
                    {
                        routeFacets[routeFacetModel].Add(value);
                    }
                }
            }

            var model = routeFacets.Select(x => x.Key).SingleOrDefault(x => x.FacetName.Equals(facetKey, StringComparison.OrdinalIgnoreCase));

            if (model != null)
            {
                routeFacets[model].Add(facetValue);
            }
            else
            {
                model = new RouteFacetModel
                {
                    FacetName = facetKey,
                    FacetPath = facetKeyPath,
                    FacetType = facetType
                };
                routeFacets.Add(model, new HashSet <object> {
                    facetValue
                });
            }

            string language        = null;
            var    languageContent = currentContent as ILocalizable;

            if (languageContent != null)
            {
                language = languageContent.Language.Name;
            }

            var url = _urlResolver.GetUrl(currentContent.ContentLink, language);

            return(url.Length > 1 ? GetUrl(url.Substring(0, url.Length - 1), routeFacets) : url);
        }
        private void AddFacetsToSegmentContext(ConcurrentDictionary <RouteFacetModel, HashSet <object> > routeFacets, SegmentContext segmentContext, RouteFacetModel[] facetNames, string nextSegment, string remaining, RouteFacetModel currentFacet)
        {
            if (String.IsNullOrEmpty(nextSegment))
            {
                return;
            }

            var value = facetNames.FirstOrDefault(x => x.FacetName.Equals(nextSegment, StringComparison.OrdinalIgnoreCase));

            if (value != null)
            {
                currentFacet = value;
            }
            else if (currentFacet != null)
            {
                var facetValue = _facetUrlCreator.GetFacetValue(facetNames, nextSegment);

                routeFacets.AddOrUpdate(currentFacet,
                                        (key) => new HashSet <object> {
                    facetValue
                },
                                        (key, list) =>
                {
                    list.Add(facetValue);
                    return(list);
                });
            }

            segmentContext.RemainingPath = remaining;

            var segmentPair = segmentContext.GetNextValue(segmentContext.RemainingPath);

            nextSegment = _facetUrlCreator.GetFacetValue(facetNames, segmentPair.Next);

            AddFacetsToSegmentContext(routeFacets, segmentContext, facetNames, nextSegment, segmentPair.Remaining, currentFacet);
        }