internal static RouteHandlerLookupNode BuildRouteHandlerLookupTree(IEnumerable <Type> requestHandlers)
        {
            var tree = new RouteHandlerLookupNode();
            var knownRouteFragmentSets = new List <IList <string> >();

            foreach (var requestHandler in requestHandlers)
            {
                var routeAttributes = RequestHandlerDescriptor.GetRouteAttributes(requestHandler);
                if (routeAttributes.Count == 0)
                {
                    throw new InvalidOperationException(ExceptionMessageBuilder.BuildMissingRouteMessage(requestHandler));
                }

                var routeHandlerVerb  = RequestHandlerDescriptor.GetVerb(requestHandler);
                var routeFragmentSets = routeAttributes.Select(x => RouteIdentifierBuilder.BuildIdentifier(routeHandlerVerb, x.Template)).ToList();

                knownRouteFragmentSets.AddRange(routeFragmentSets);
                ScanForUnreachableRouteHandlers(knownRouteFragmentSets, routeAttributes.First().Template, requestHandler);
                ScanForUnreachableRouteParameters(routeFragmentSets, routeAttributes, requestHandler);

                foreach (var routeFragementSet in routeFragmentSets)
                {
                    tree.AddNode(routeFragementSet, requestHandler);
                }
            }

            return(tree);
        }
Esempio n. 2
0
        internal void AddNode(IList <string> routeTemplateFragments, Type requestHandler)
        {
            var headFragment = routeTemplateFragments.First();
            var remainingTemplateFragments = routeTemplateFragments.Skip(1).ToList();

            var childNode = FindChildNode(headFragment);

            if (childNode != null)
            {
                if (remainingTemplateFragments.Any())
                {
                    childNode.AddNode(remainingTemplateFragments, requestHandler);
                }
                else
                {
                    childNode.RequestHandler = requestHandler;
                }
            }
            else
            {
                var newChildNode = new RouteHandlerLookupNode(headFragment, remainingTemplateFragments, requestHandler);
                ChildNodes.Add(newChildNode);
                if (remainingTemplateFragments.Any())
                {
                    newChildNode.AddNode(remainingTemplateFragments, requestHandler);
                }
            }
        }