private SiteMapNode CheckExNodeFromScanAsPartialProvider(SiteMapNodeEx nodeEx, string[] segments) { var partialProviderExtent = nodeEx.Get <SiteMapNodePartialProviderExtent>(); if (partialProviderExtent == null) { return(null); } var newProvider = GetProviderFromName(partialProviderExtent.ProviderID); string queryPart; var tightestSegments = GetUrlSegments(nodeEx.Url, out queryPart); var partialProvider = new PartialProvider { Value = tightestSegments, SiteMapProvider = newProvider, NodeEx = nodeEx }; { _partialProviderRwLock.EnterWriteLock(); if (_partialProviders == null) { _partialProviders = new List <PartialProvider>(); } _partialProviders.Add(partialProvider); _partialProviderRwLock.ExitWriteLock(); } return(DelegateFindSiteMapNodeToChildProvider(partialProvider, segments, tightestSegments)); }
private static SiteMapNode DelegateFindSiteMapNodeToChildProvider(PartialProvider provider, string[] segments, string[] tightestSegments) { var siteMapProvider = provider.SiteMapProvider; if (siteMapProvider == null) { return(provider.NodeEx); } var tightestSegmentsLength = tightestSegments.Length; string newUrl = "/" + string.Join("/", segments, tightestSegmentsLength, segments.Length - tightestSegmentsLength); return(siteMapProvider.FindSiteMapNode(newUrl)); }
// pulled here for optimizing #region TryGetTightestMatch (optimizing) private static bool TryGetTightestMatch(List <PartialProvider> source, string[] segments, out PartialProvider tightestValue) { tightestValue = null; int tightestValuesLength = 0; foreach (var item in source) { var itemValues = item.Value; int itemValuesLength; if (Match(itemValues, segments) && (itemValuesLength = itemValues.Length) > tightestValuesLength) { tightestValue = item; tightestValuesLength = itemValuesLength; } } return(tightestValuesLength > 0); }