/// <summary>
        /// Sets routeCollection for models that do not have a controller defined
        /// </summary>
        /// <param CustomPropertyName="routeCollection"></param>
        /// <param name="routeCollection">The route collection for the mvc application.</param>
        public void SetDynamicRoutes(RouteCollection routeCollection)
        {
            var newRouteCollection = new RouteCollection();
            var firstRoute         = routeCollection.First();

            newRouteCollection.Add(firstRoute);
            foreach (var dynamicEntityMetadata in DynamicMVCContext.DynamicEntityMetadatas)
            {
                if (dynamicEntityMetadata.ControllerExists)
                {
                    newRouteCollection.MapRoute(
                        name: "Dynamic" + dynamicEntityMetadata.TypeName,
                        url: dynamicEntityMetadata.TypeName + "/{action}/{id}",
                        defaults: new { controller = dynamicEntityMetadata.TypeName, action = "Index", id = UrlParameter.Optional, typeName = dynamicEntityMetadata.TypeName }
                        );
                }
                else
                {
                    newRouteCollection.MapRoute(
                        name: "Dynamic" + dynamicEntityMetadata.TypeName,
                        url: dynamicEntityMetadata.TypeName + "/{action}/{id}",
                        defaults: new { controller = "Dynamic", action = "Index", id = UrlParameter.Optional, typeName = dynamicEntityMetadata.TypeName }
                        );
                }
            }
            foreach (var oldRoute in routeCollection.Where(x => x != firstRoute))
            {
                newRouteCollection.Add(oldRoute);
            }
            routeCollection.Clear();
            foreach (var newRoute in newRouteCollection)
            {
                routeCollection.Add(newRoute);
            }
        }
Beispiel #2
0
        public void ContentRoute_IsAdded()
        {
            RouteCollection rc = new RouteCollection();
            rc.MapContentRoute("content", MockRepository.GenerateStub<IEngine>());

            Assert.That(rc.Count, Is.EqualTo(1));
            Assert.That(rc.First(), Is.InstanceOf<ContentRoute>());
        }
Beispiel #3
0
        public void ContentRoute_IsInsertedBefore_NonContentRoute()
        {
            RouteCollection rc = new RouteCollection();
            rc.MapRoute("mvc", "{controller}/{action}");
            rc.MapContentRoute("content", MockRepository.GenerateStub<IEngine>());

            Assert.That(rc.Count, Is.EqualTo(2));
            Assert.That(rc.First(), Is.InstanceOf<ContentRoute>());
        }
        public void ContentRoute_IsAdded()
        {
            RouteCollection rc = new RouteCollection();

            rc.MapContentRoute("content", MockRepository.GenerateStub <IEngine>());

            Assert.That(rc.Count, Is.EqualTo(1));
            Assert.That(rc.First(), Is.InstanceOf <ContentRoute>());
        }
Beispiel #5
0
        public void GenericContentRoute_IsntPushedBackBy_ContentRoute()
        {
            RouteCollection rc = new RouteCollection();
            rc.MapContentRoute<Models.RegularPage>("area", MockRepository.GenerateStub<IEngine>());
            rc.MapContentRoute("content", MockRepository.GenerateStub<IEngine>());

            Assert.That(rc.Count, Is.EqualTo(2));
            Assert.That(rc.First(), Is.InstanceOf<ContentRoute<Models.RegularPage>>());
            Assert.That(rc.Skip(1).First(), Is.InstanceOf<ContentRoute>());
        }
        public void ContentRoute_IsInsertedBefore_NonContentRoute()
        {
            RouteCollection rc = new RouteCollection();

            rc.MapRoute("mvc", "{controller}/{action}");
            rc.MapContentRoute("content", MockRepository.GenerateStub <IEngine>());

            Assert.That(rc.Count, Is.EqualTo(2));
            Assert.That(rc.First(), Is.InstanceOf <ContentRoute>());
        }
Beispiel #7
0
        public void RoutesAreEvaluatedInOrder()
        {
            routes.Clear();
            routes.MapRoute(null, "{a}/{b}", new { b = "c" });
            routes.MapRoute(null, "{a}");

            var httpContextMock = new Mock <HttpContextBase>();

            httpContextMock.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/x");

            Assert.IsTrue(
                Object.ReferenceEquals(
                    routes.GetVirtualPath(Url.RequestContext, new RouteValueDictionary(new { a = "x" })).Route,
                    routes.First()
                    )
                );

            Assert.IsTrue(
                Object.ReferenceEquals(
                    routes.GetRouteData(httpContextMock.Object).Route,
                    routes.First()
                    )
                );

            var lastRoute = routes.Last();

            routes.Remove(lastRoute);
            routes.Insert(0, lastRoute);

            Assert.IsTrue(
                Object.ReferenceEquals(
                    routes.GetVirtualPath(Url.RequestContext, new RouteValueDictionary(new { a = "x" })).Route,
                    routes.First()
                    )
                );

            Assert.IsTrue(
                Object.ReferenceEquals(
                    routes.GetRouteData(httpContextMock.Object).Route,
                    routes.First()
                    )
                );
        }
Beispiel #8
0
        public void RegisterRoutes_IgnoresAxd()
        {
            RouteCollection routes = new RouteCollection();
            config.RegisterRoutes(routes);

            Route expected = new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler());
            Route actual = routes.First() as Route;

            Assert.Equal(expected.RouteHandler.GetType(), actual.RouteHandler.GetType());
            Assert.Equal(expected.Url, actual.Url);
        }
        public void GenericContentRoute_IsntPushedBackBy_ContentRoute()
        {
            RouteCollection rc = new RouteCollection();

            rc.MapContentRoute <Models.RegularPage>("area", MockRepository.GenerateStub <IEngine>());
            rc.MapContentRoute("content", MockRepository.GenerateStub <IEngine>());

            Assert.That(rc.Count, Is.EqualTo(2));
            Assert.That(rc.First(), Is.InstanceOf <ContentRoute <Models.RegularPage> >());
            Assert.That(rc.Skip(1).First(), Is.InstanceOf <ContentRoute>());
        }
Beispiel #10
0
        public void ContentRoute_IsInsertedBetween_OtherContentRoutes_AndNonContentRoute()
        {
            RouteCollection rc = new RouteCollection();
            rc.MapRoute("mvc", "{controller}/{action}");
            rc.MapContentRoute<Models.RegularPage>("area", MockRepository.GenerateStub<IEngine>());
            rc.MapContentRoute("content", MockRepository.GenerateStub<IEngine>());

            Assert.That(rc.Count, Is.EqualTo(3));
            Assert.That(rc.First(), Is.InstanceOf<ContentRoute<Models.RegularPage>>());
            Assert.That(rc.Skip(1).First(), Is.InstanceOf<ContentRoute>());
        }
Beispiel #11
0
        public void RegisterRoutes_IgnoresAxdRoute()
        {
            RouteCollection routes = new RouteCollection();

            RouteConfig.RegisterRoutes(routes);

            Route expected = new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler());
            Route actual   = routes.First() as Route;

            Assert.AreEqual(expected.RouteHandler.GetType(), actual.RouteHandler.GetType());
            Assert.AreEqual(expected.Url, actual.Url);
        }
        public void ContentRoute_IsInsertedBetween_OtherContentRoutes_AndNonContentRoute()
        {
            RouteCollection rc = new RouteCollection();

            rc.MapRoute("mvc", "{controller}/{action}");
            rc.MapContentRoute <Models.RegularPage>("area", MockRepository.GenerateStub <IEngine>());
            rc.MapContentRoute("content", MockRepository.GenerateStub <IEngine>());

            Assert.That(rc.Count, Is.EqualTo(3));
            Assert.That(rc.First(), Is.InstanceOf <ContentRoute <Models.RegularPage> >());
            Assert.That(rc.Skip(1).First(), Is.InstanceOf <ContentRoute>());
        }
 /// <summary>
 /// 发布前。
 /// </summary>
 /// <param name="routeDescriptors">路由描述符。</param>
 public void Publishing(IEnumerable<RouteDescriptor> routeDescriptors)
 {
     var preloading = new RouteCollection();
     foreach (var routeDescriptor in routeDescriptors)
     {
         // WebApi 路由注册
         var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
         if (httpRouteDescriptor == null)
             continue;
         var httpRouteCollection = new RouteCollection();
         httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults, httpRouteDescriptor.Constraints);
         routeDescriptor.Route = httpRouteCollection.First();
         preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
     }
 }
Beispiel #14
0
        /// <summary>
        /// 发布前。
        /// </summary>
        /// <param name="routeDescriptors">路由描述符。</param>
        public void Publishing(IEnumerable <RouteDescriptor> routeDescriptors)
        {
            var preloading = new RouteCollection();

            foreach (var routeDescriptor in routeDescriptors)
            {
                // WebApi 路由注册
                var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
                if (httpRouteDescriptor == null)
                {
                    continue;
                }
                var httpRouteCollection = new RouteCollection();
                httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults, httpRouteDescriptor.Constraints);
                routeDescriptor.Route = httpRouteCollection.First();
                preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
            }
        }
Beispiel #15
0
        public void Publish(IEnumerable<RouteDescriptor> routes) {
            var routesArray = routes
                .OrderByDescending(r => r.Priority)
                .ToArray();

            // this is not called often, but is intended to surface problems before
            // the actual collection is modified
            var preloading = new RouteCollection();
            foreach (var routeDescriptor in routesArray) {

                // extract the WebApi route implementation
                var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
                if (httpRouteDescriptor != null) {
                    var httpRouteCollection = new RouteCollection();
                    httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults);
                    routeDescriptor.Route = httpRouteCollection.First();
                }

                preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
            }
                

            using (_routeCollection.GetWriteLock()) {
                // existing routes are removed while the collection is briefly inaccessable
                var cropArray = _routeCollection
                    .OfType<ShellRoute>()
                    .Where(sr => sr.ShellSettingsName == _shellSettings.Name)
                    .ToArray();

                foreach(var crop in cropArray) {
                    _routeCollection.Remove(crop);
                }

                // new routes are added
                foreach (var routeDescriptor in routesArray) {
                    // Loading session state information. 
                    var defaultSessionState = SessionStateBehavior.Default;

                    ExtensionDescriptor extensionDescriptor = null;
                    if(routeDescriptor.Route is Route) {
                        object extensionId;
                        var route = routeDescriptor.Route as Route;
                        if(route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) || 
                           route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId)) {
                            extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString()); 
                        }
                    }
                    else if(routeDescriptor.Route is IRouteWithArea) {
                        var route = routeDescriptor.Route as IRouteWithArea;
                        extensionDescriptor = _extensionManager.GetExtension(route.Area); 
                    }

                    if (extensionDescriptor != null) {
                        // if session state is not define explicitly, use the one define for the extension
                        if (routeDescriptor.SessionState == SessionStateBehavior.Default) {
                            Enum.TryParse(extensionDescriptor.SessionState, true /*ignoreCase*/, out defaultSessionState);
                        }
                    }

                    // Route-level setting overrides module-level setting (from manifest).
                    var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default ? defaultSessionState : routeDescriptor.SessionState ;

                    var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable) {
                        IsHttpRoute = routeDescriptor is HttpRouteDescriptor,
                        SessionState = sessionStateBehavior
                    };
                    _routeCollection.Add(routeDescriptor.Name, shellRoute);
                }
            }
        }
Beispiel #16
0
        public void Publish(IEnumerable <RouteDescriptor> routes)
        {
            var routesArray = routes
                              .OrderByDescending(r => r.Priority)
                              .ToArray();

            // this is not called often, but is intended to surface problems before
            // the actual collection is modified
            var preloading = new RouteCollection();

            foreach (var routeDescriptor in routesArray)
            {
                // extract the WebApi route implementation
                var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
                if (httpRouteDescriptor != null)
                {
                    var httpRouteCollection = new RouteCollection();
                    httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults);
                    routeDescriptor.Route = httpRouteCollection.First();
                }

                preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
            }

            using (routeCollection.GetWriteLock())
            {
                // existing routes are removed while the collection is briefly inaccessable
                var cropArray = routeCollection
                                .OfType <ShellRoute>()
                                .Where(sr => sr.ShellSettingsName == shellSettings.Name)
                                .ToArray();

                foreach (var crop in cropArray)
                {
                    routeCollection.Remove(crop);
                }

                // new routes are added
                foreach (var routeDescriptor in routesArray)
                {
                    // Loading session state information.
                    var defaultSessionState = SessionStateBehavior.Default;

                    ExtensionDescriptor extensionDescriptor = null;
                    if (routeDescriptor.Route is Route)
                    {
                        object extensionId;
                        var    route = routeDescriptor.Route as Route;
                        if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) ||
                            route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId))
                        {
                            extensionDescriptor = extensionManager.GetExtension(extensionId.ToString());
                        }
                    }
                    else if (routeDescriptor.Route is IRouteWithArea)
                    {
                        var route = routeDescriptor.Route as IRouteWithArea;
                        extensionDescriptor = extensionManager.GetExtension(route.Area);
                    }

                    if (extensionDescriptor != null)
                    {
                        // if session state is not define explicitly, use the one define for the extension
                        if (routeDescriptor.SessionState == SessionStateBehavior.Default)
                        {
                            Enum.TryParse(extensionDescriptor.SessionState, true /*ignoreCase*/, out defaultSessionState);
                        }
                    }

                    // Route-level setting overrides module-level setting (from manifest).
                    var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default ? defaultSessionState : routeDescriptor.SessionState;

                    var shellRoute = new ShellRoute(routeDescriptor.Route, shellSettings, workContextAccessor, runningShellTable)
                    {
                        IsHttpRoute  = routeDescriptor is HttpRouteDescriptor,
                        SessionState = sessionStateBehavior
                    };
                    routeCollection.Add(routeDescriptor.Name, shellRoute);
                }
            }
        }
Beispiel #17
0
        public void Publish(IEnumerable <RouteDescriptor> routes, Func <IDictionary <string, object>, Task> pipeline = null)
        {
            var routesArray = routes
                              .OrderByDescending(r => r.Priority)
                              .ToArray();

            // this is not called often, but is intended to surface problems before
            // the actual collection is modified
            var preloading = new RouteCollection();

            foreach (var routeDescriptor in routesArray)
            {
                // extract the WebApi route implementation
                var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
                if (httpRouteDescriptor != null)
                {
                    var httpRouteCollection = new RouteCollection();
                    httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults, httpRouteDescriptor.Constraints);
                    routeDescriptor.Route = httpRouteCollection.First();
                }

                preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
            }

            using (_routeCollection.GetWriteLock())
            {
                // HACK: For inserting names in internal dictionary when inserting route to RouteCollection.
                var routeCollectionType = typeof(RouteCollection);
                var namedMap            = (Dictionary <string, RouteBase>)routeCollectionType.GetField("_namedMap", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_routeCollection);

                // new routes are added
                foreach (var routeDescriptor in routesArray)
                {
                    // Loading session state information.
                    var    defaultSessionState = SessionStateBehavior.Default;
                    object extensionId         = default(object);
                    if (routeDescriptor.Route is System.Web.Routing.Route)
                    {
                        var route = routeDescriptor.Route as System.Web.Routing.Route;
                        if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) ||
                            route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId))
                        {
                            //TODO Extension Handler
                            //extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString());
                        }
                    }
                    var shellRoute = new ShellRoute(routeDescriptor.Route, _iocManager, pipeline)
                    {
                        IsHttpRoute = routeDescriptor is HttpRouteDescriptor,
                        // SessionState = sessionStateBehavior
                    };
                    var area = extensionId != null?extensionId.ToString() : string.Empty;

                    if (!namedMap.Any(t => t.Key == area))

                    {
                        if (routeDescriptor.Route != null)
                        {
                            _routeCollection.Add(shellRoute);
                        }
                        namedMap[routeDescriptor.Name] = shellRoute;
                    }
                }
            }
        }
        public void Publish(IEnumerable <RouteDescriptor> routes, Func <IDictionary <string, object>, Task> env)
        {
            var routesArray = routes
                              .OrderByDescending(r => r.Priority)
                              .ToArray();

            // this is not called often, but is intended to surface problems before
            // the actual collection is modified
            var preloading = new RouteCollection();

            foreach (var routeDescriptor in routesArray)
            {
                // extract the WebApi route implementation
                var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
                if (httpRouteDescriptor != null)
                {
                    var httpRouteCollection = new RouteCollection();
                    httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults, httpRouteDescriptor.Constraints);
                    routeDescriptor.Route = httpRouteCollection.First();
                }

                preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
            }


            using (_routeCollection.GetWriteLock()) {
                // existing routes are removed while the collection is briefly inaccessable
                _routeCollection
                .OfType <HubRoute>()
                .ToList().ForEach(x => x.ReleaseShell(_shellSettings));

                // HACK: For inserting names in internal dictionary when inserting route to RouteCollection.
                var routeCollectionType = typeof(RouteCollection);
                var namedMap            = (Dictionary <string, RouteBase>)routeCollectionType.GetField("_namedMap", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_routeCollection);

                // new routes are added
                foreach (var routeDescriptor in routesArray)
                {
                    // Loading session state information.
                    var defaultSessionState = SessionStateBehavior.Default;

                    ExtensionDescriptor extensionDescriptor = null;
                    if (routeDescriptor.Route is Route)
                    {
                        object extensionId;
                        var    route = routeDescriptor.Route as Route;
                        if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) ||
                            route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId))
                        {
                            extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString());
                        }
                    }
                    else if (routeDescriptor.Route is IRouteWithArea)
                    {
                        var route = routeDescriptor.Route as IRouteWithArea;
                        extensionDescriptor = _extensionManager.GetExtension(route.Area);
                    }

                    if (extensionDescriptor != null)
                    {
                        // if session state is not define explicitly, use the one define for the extension
                        if (routeDescriptor.SessionState == SessionStateBehavior.Default)
                        {
                            Enum.TryParse(extensionDescriptor.SessionState, true /*ignoreCase*/, out defaultSessionState);
                        }
                    }

                    // Route-level setting overrides module-level setting (from manifest).
                    var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default ? defaultSessionState : routeDescriptor.SessionState;

                    var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable, env)
                    {
                        IsHttpRoute  = routeDescriptor is HttpRouteDescriptor,
                        SessionState = sessionStateBehavior
                    };

                    var area = extensionDescriptor == null ? "" : extensionDescriptor.Id;

                    var matchedHubRoute = _routeCollection.FirstOrDefault(x => {
                        var hubRoute = x as HubRoute;
                        if (hubRoute == null)
                        {
                            return(false);
                        }

                        return(routeDescriptor.Priority == hubRoute.Priority && hubRoute.Area.Equals(area, StringComparison.OrdinalIgnoreCase) && hubRoute.Name == routeDescriptor.Name);
                    }) as HubRoute;

                    if (matchedHubRoute == null)
                    {
                        matchedHubRoute = new HubRoute(routeDescriptor.Name, area, routeDescriptor.Priority, _runningShellTable);

                        int index;
                        for (index = 0; index < _routeCollection.Count; index++)
                        {
                            var hubRoute = _routeCollection[index] as HubRoute;
                            if (hubRoute == null)
                            {
                                continue;
                            }
                            if (hubRoute.Priority < matchedHubRoute.Priority)
                            {
                                break;
                            }
                        }

                        _routeCollection.Insert(index, matchedHubRoute);

                        // HACK: For inserting names in internal dictionary when inserting route to RouteCollection.
                        if (!string.IsNullOrEmpty(matchedHubRoute.Name) && !namedMap.ContainsKey(matchedHubRoute.Name))
                        {
                            namedMap[matchedHubRoute.Name] = matchedHubRoute;
                        }
                    }

                    matchedHubRoute.Add(shellRoute, _shellSettings);
                }
            }
        }
        public void Publish(IEnumerable<RouteDescriptor> routes)
        {
            var routesArray = routes
                .OrderByDescending(r => r.Priority)
                .ToArray();

            // this is not called often, but is intended to surface problems before
            // the actual collection is modified
            var preloading = new RouteCollection();
            foreach (var routeDescriptor in routesArray) {

                // extract the WebApi route implementation
                var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
                if (httpRouteDescriptor != null) {
                    var httpRouteCollection = new RouteCollection();
                    httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults, httpRouteDescriptor.Constraints);
                    routeDescriptor.Route = httpRouteCollection.First();
                }

                preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
            }

            using (_routeCollection.GetWriteLock()) {
                // existing routes are removed while the collection is briefly inaccessable
                _routeCollection
                    .OfType<HubRoute>()
                    .ForEach(x => x.ReleaseShell(_shellSettings));

                // new routes are added
                foreach (var routeDescriptor in routesArray) {
                    // Loading session state information.
                    var defaultSessionState = SessionStateBehavior.Default;

                    ExtensionDescriptor extensionDescriptor = null;
                    if(routeDescriptor.Route is Route) {
                        object extensionId;
                        var route = routeDescriptor.Route as Route;
                        if(route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) ||
                           route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId)) {
                            extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString());
                        }
                    }
                    else if(routeDescriptor.Route is IRouteWithArea) {
                        var route = routeDescriptor.Route as IRouteWithArea;
                        extensionDescriptor = _extensionManager.GetExtension(route.Area);
                    }

                    if (extensionDescriptor != null) {
                        // if session state is not define explicitly, use the one define for the extension
                        if (routeDescriptor.SessionState == SessionStateBehavior.Default) {
                            Enum.TryParse(extensionDescriptor.SessionState, true /*ignoreCase*/, out defaultSessionState);
                        }
                    }

                    // Route-level setting overrides module-level setting (from manifest).
                    var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default ? defaultSessionState : routeDescriptor.SessionState ;

                    var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable) {
                        IsHttpRoute = routeDescriptor is HttpRouteDescriptor,
                        SessionState = sessionStateBehavior
                    };

                    var area = extensionDescriptor == null ? "" : extensionDescriptor.Id;

                    var matchedHubRoute = _routeCollection.FirstOrDefault(x => {
                        var hubRoute = x as HubRoute;
                        if (hubRoute == null) {
                            return false;
                        }

                        return routeDescriptor.Priority == hubRoute.Priority && hubRoute.Area.Equals(area, StringComparison.OrdinalIgnoreCase) && hubRoute.Name == routeDescriptor.Name;
                    }) as HubRoute;

                    if (matchedHubRoute == null) {
                        matchedHubRoute = new HubRoute(routeDescriptor.Name, area, routeDescriptor.Priority, _runningShellTable);

                        int index;
                        for (index = 0; index < _routeCollection.Count; index++) {
                            var hubRoute = _routeCollection[index] as HubRoute;
                            if (hubRoute == null) {
                                continue;
                            }
                            if (hubRoute.Priority < matchedHubRoute.Priority) {
                                break;
                            }
                        }

                        _routeCollection.Insert(index, matchedHubRoute);
                    }

                    matchedHubRoute.Add(shellRoute, _shellSettings);
                }
            }
        }