private void AddEntryToTree(UrlMatchingTree tree, TreeRouteMatchingEntry entry) { var current = tree.Root; for (var i = 0; i < entry.RouteTemplate.Segments.Count; i++) { var segment = entry.RouteTemplate.Segments[i]; if (!segment.IsSimple) { // Treat complex segments as a constrained parameter if (current.ConstrainedParameters == null) { current.ConstrainedParameters = new UrlMatchingNode(length: i + 1); } current = current.ConstrainedParameters; continue; } Debug.Assert(segment.Parts.Count == 1); var part = segment.Parts[0]; if (part.IsLiteral) { UrlMatchingNode next; if (!current.Literals.TryGetValue(part.Text, out next)) { next = new UrlMatchingNode(length: i + 1); current.Literals.Add(part.Text, next); } current = next; continue; } if (part.IsParameter && (part.IsOptional || part.IsCatchAll)) { current.Matches.Add(entry); } if (part.IsParameter && part.InlineConstraints.Any() && !part.IsCatchAll) { if (current.ConstrainedParameters == null) { current.ConstrainedParameters = new UrlMatchingNode(length: i + 1); } current = current.ConstrainedParameters; continue; } if (part.IsParameter && !part.IsCatchAll) { if (current.Parameters == null) { current.Parameters = new UrlMatchingNode(length: i + 1); } current = current.Parameters; continue; } if (part.IsParameter && part.InlineConstraints.Any() && part.IsCatchAll) { if (current.ConstrainedCatchAlls == null) { current.ConstrainedCatchAlls = new UrlMatchingNode(length: i + 1); } current = current.ConstrainedCatchAlls; continue; } if (part.IsParameter && part.IsCatchAll) { if (current.CatchAlls == null) { current.CatchAlls = new UrlMatchingNode(length: i + 1); } current = current.CatchAlls; continue; } Debug.Fail("We shouldn't get here."); } current.Matches.Add(entry); current.Matches.Sort((x, y) => { var result = x.Precedence.CompareTo(y.Precedence); return result == 0 ? x.RouteTemplate.TemplateText.CompareTo(y.RouteTemplate.TemplateText) : result; }); }
private TreeRouteMatchingEntry CreateMatchingEntry(string template) { var mockConstraint = new Mock<IRouteConstraint>(); mockConstraint.Setup(c => c.Match( It.IsAny<HttpContext>(), It.IsAny<IRouter>(), It.IsAny<string>(), It.IsAny<RouteValueDictionary>(), It.IsAny<RouteDirection>())) .Returns(true); var mockConstraintResolver = new Mock<IInlineConstraintResolver>(); mockConstraintResolver.Setup(r => r.ResolveConstraint( It.IsAny<string>())) .Returns(mockConstraint.Object); var entry = new TreeRouteMatchingEntry(); entry.Target = new StubRouter(); entry.RouteTemplate = TemplateParser.Parse(template); return entry; }
public void Add(TreeRouteMatchingEntry entry) { _matchingEntries.Add(entry); }
private static TreeRouteMatchingEntry CreateMatchingEntry(IRouter router, string template, int order) { var routeGroup = string.Format("{0}&&{1}", order, template); var entry = new TreeRouteMatchingEntry(); entry.Target = router; entry.RouteTemplate = TemplateParser.Parse(template); var parsedRouteTemplate = TemplateParser.Parse(template); entry.TemplateMatcher = new TemplateMatcher( parsedRouteTemplate, new RouteValueDictionary(new { test_route_group = routeGroup })); entry.Precedence = RoutePrecedence.ComputeMatched(parsedRouteTemplate); entry.Order = order; entry.Constraints = GetRouteConstriants(CreateConstraintResolver(), template, parsedRouteTemplate); return entry; }