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); }
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 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(); }