예제 #1
0
        public void Harvest(string extensionId)
        {
            var extensionDescriptor = _extensionManager.GetExtension(extensionId);

            if (extensionDescriptor == null)
            {
                Context.Output.WriteLine(T("Could not discover recipes because extension '{0}' was not found.", extensionId));
                return;
            }

            var recipes = _recipeHarvester.HarvestRecipes(extensionId);

            if (recipes.Count() == 0)
            {
                Context.Output.WriteLine(T("No recipes found for extension '{0}'.", extensionId));
                return;
            }

            Context.Output.WriteLine(T("List of available recipes"));
            Context.Output.WriteLine(T("--------------------------"));
            Context.Output.WriteLine();

            foreach (var recipe in recipes)
            {
                Context.Output.WriteLine(T("Recipe: {0}", recipe.Name));
                Context.Output.WriteLine(T("  Version:     {0}", recipe.Version));
                Context.Output.WriteLine(T("  Tags:        {0}", recipe.Tags));
                Context.Output.WriteLine(T("  Description: {0}", recipe.Description));
                Context.Output.WriteLine(T("  Author:      {0}", recipe.Author));
                Context.Output.WriteLine(T("  Website:     {0}", recipe.WebSite));
            }
        }
예제 #2
0
        public void HarvestRecipes(string extensionId)
        {
            ExtensionDescriptor extensionDescriptor = _extensionManager.GetExtension(extensionId);

            if (extensionDescriptor == null)
            {
                throw new OrchardException(T("Could not discover recipes because module '{0}' was not found.", extensionId));
            }

            IEnumerable <Recipe> recipes = _recipeHarvester.HarvestRecipes(extensionId);

            if (recipes == null)
            {
                throw new OrchardException(T("No recipes found for extension {0}.", extensionId));
            }

            Context.Output.WriteLine(T("List of available recipes"));
            Context.Output.WriteLine(T("--------------------------"));
            Context.Output.WriteLine();

            foreach (Recipe recipe in recipes)
            {
                Context.Output.WriteLine(T("Recipe: {0}", recipe.Name));
                Context.Output.WriteLine(T("  Version:     {0}", recipe.Version));
                Context.Output.WriteLine(T("  Tags:        {0}", recipe.Tags));
                Context.Output.WriteLine(T("  Description: {0}", recipe.Description));
                Context.Output.WriteLine(T("  Author:      {0}", recipe.Author));
                Context.Output.WriteLine(T("  Website:     {0}", recipe.WebSite));
            }
        }
예제 #3
0
        public ExtensionDescriptor GetRequestTheme(RequestContext requestContext)
        {
            var requestThemes = themeSelectors
                                .Select(x => x.GetTheme(requestContext))
                                .Where(x => x != null)
                                .OrderByDescending(x => x.Priority);

            if (!requestThemes.Any())
            {
                return(extensionManager.GetExtension("Default"));
            }

            foreach (var theme in requestThemes)
            {
                var t = extensionManager.GetExtension(theme.Name);
                if (t != null && t.Name == "Dashboard" && theme.IsDashboard)
                {
                    return(t);
                }

                if (t != null && shellDescriptor.Features.Any(x => x.Name == t.Id) && !theme.IsDashboard)
                {
                    return(t);
                }
            }

            return(extensionManager.GetExtension("Default"));
        }
예제 #4
0
        public void DisableThemeFeatures(string themeName)
        {
            var themes = new Queue <string>();

            while (themeName != null)
            {
                if (themes.Contains(themeName))
                {
                    throw new InvalidOperationException(T("The theme \"{0}\" is already in the stack of themes that need features disabled.", themeName).Text);
                }
                var theme = _extensionManager.GetExtension(themeName);
                if (theme == null)
                {
                    break;
                }
                themes.Enqueue(themeName);

                themeName = !string.IsNullOrWhiteSpace(theme.BaseTheme)
                    ? theme.BaseTheme
                    : null;
            }

            var currentTheme = _siteThemeService.GetCurrentThemeName();

            while (themes.Count > 0)
            {
                var themeId = themes.Dequeue();

                // Not disabling base theme if it's the current theme.
                if (themeId != currentTheme)
                {
                    _featureManager.DisableFeatures(new[] { themeId });
                }
            }
        }
예제 #5
0
        public async Task DisableThemeFeaturesAsync(string themeName)
        {
            var themes = new Queue <string>();

            while (themeName != null)
            {
                if (themes.Contains(themeName))
                {
                    throw new InvalidOperationException(H["The theme \"{0}\" is already in the stack of themes that need features disabled.", themeName].ToString());
                }
                var theme = _extensionManager.GetExtension(themeName);
                if (theme == null)
                {
                    break;
                }
                themes.Enqueue(themeName);

                themeName = !string.IsNullOrWhiteSpace(theme.Manifest.Name)
                    ? theme.Manifest.Name
                    : null;
            }

            var currentTheme = await _siteThemeService.GetCurrentThemeNameAsync();

            while (themes.Count > 0)
            {
                var themeId = themes.Dequeue();

                // Not disabling base theme if it's the current theme.
                if (themeId != currentTheme)
                {
                    await DisableFeaturesAsync(new[] { themeId }, true);
                }
            }
        }
예제 #6
0
        public IEnumerable <Recipe> HarvestRecipes(string extensionId)
        {
            var recipes = new List <Recipe>();

            var extension = _extensionManager.GetExtension(extensionId);

            if (extension != null)
            {
                var recipeLocation = Path.Combine(extension.Location, extensionId, "Recipes");
                var recipeFiles    = _webSiteFolder.ListFiles(recipeLocation, true);

                recipeFiles.Where(r => r.EndsWith(".recipe.xml", StringComparison.OrdinalIgnoreCase)).ToList().ForEach(r => {
                    try {
                        recipes.Add(_recipeParser.ParseRecipe(_webSiteFolder.ReadFile(r)));
                    }
                    catch (Exception ex) {
                        Logger.Error(ex, "Error while parsing recipe file '{0}'.", r);
                    }
                });
            }
            else
            {
                Logger.Error("Could not discover recipes because module '{0}' was not found.", extensionId);
            }

            return(recipes);
        }
예제 #7
0
        public async Task <ExtensionDescriptor> GetThemeAsync()
        {
            // For performance reason, processes the current theme only once per scope (request).
            // This can't be cached as each request gets a different value.
            if (_theme == null)
            {
                var allThemeResults = await Task.WhenAll(_themeSelectors.Select(async x => await x.GetThemeAsync().ConfigureAwait(false))).ConfigureAwait(false);

                var requestTheme = allThemeResults
                                   .Where(x => x != null)
                                   .OrderByDescending(x => x.Priority)
                                   .ToList();

                if (requestTheme.Count == 0)
                {
                    return(null);
                }

                // Try to load the theme to ensure it's present
                foreach (var theme in requestTheme)
                {
                    var t = _extensionManager.GetExtension(theme.ThemeName);
                    if (t != null)
                    {
                        return(_theme = t);
                    }
                }

                // No valid theme. Don't save the result right now.
                return(null);
            }

            return(_theme);
        }
예제 #8
0
        public IEnumerable <string> GetZones()
        {
            var theme = _siteThemeService.GetSiteTheme();
            IEnumerable <string> zones = new List <string>();

            // get the zones for this theme
            if (theme.Zones != null)
            {
                zones = theme.Zones.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(x => x.Trim())
                        .Distinct()
                        .ToList();
            }

            // if this theme has no zones defined then walk the BaseTheme chain until we hit a theme which defines zones
            while (!zones.Any() && theme != null && !string.IsNullOrWhiteSpace(theme.BaseTheme))
            {
                string baseTheme = theme.BaseTheme;
                theme = _extensionManager.GetExtension(baseTheme);
                if (theme != null && theme.Zones != null)
                {
                    zones = theme.Zones.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                            .Select(x => x.Trim())
                            .Distinct()
                            .ToList();
                }
            }

            return(zones);
        }
예제 #9
0
        /// <inheritdoc />
        public virtual IEnumerable <string> ExpandViewLocations(ViewLocationExpanderContext context,
                                                                IEnumerable <string> viewLocations)
        {
            if (context.ActionContext.ActionDescriptor is PageActionDescriptor page)
            {
                var pageViewLocations = PageViewLocations().ToList();
                pageViewLocations.AddRange(viewLocations);
                return(pageViewLocations);

                IEnumerable <string> PageViewLocations()
                {
                    yield return(page.RelativePath.Substring(0, page.RelativePath.IndexOf("/Pages/"))
                                 + "/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
                }
            }

            // Get Extension, and then add in the relevant views.
            var extension = _extensionManager.GetExtension(context.AreaName);

            if (!extension.Exists)
            {
                return(viewLocations);
            }

            var result = new List <string>();

            var extensionViewsPath = '/' + extension.SubPath.Replace('\\', '/').Trim('/') + "/Views";

            result.Add(extensionViewsPath + "/{1}/{0}" + RazorViewEngine.ViewExtension);
            result.Add(extensionViewsPath + "/Shared/{0}" + RazorViewEngine.ViewExtension);

            result.AddRange(viewLocations);

            return(result);
        }
예제 #10
0
        private IEnumerable <string> ExtractLayoutNames(ExtensionDescriptor theme)
        {
            var views = Directory.EnumerateFiles(HttpContext.Current.Server.MapPath(
                                                     string.Format("{0}/{1}/Views/", theme.Location, theme.Name.Replace(" ", ""))), "*.cshtml").Select(template =>
            {
                var f = new FileInfo(template);

                if (f.Name.StartsWith("Layout-"))
                {
                    string fname = f.Name.Replace("Layout-", "")
                                   .Replace("-", " ")
                                   .Replace(f.Extension, "");

                    if (fname.Length > 0)
                    {
                        return(fname);
                    }
                }
                return(null);
            }).Where(n => n != null);

            // Traverse base themes
            if (!String.IsNullOrWhiteSpace(theme.BaseTheme))
            {
                var baseTheme = _extensionManager.GetExtension(theme.BaseTheme);
                // Concat not Union since Distinct is enforce in service anyway
                views = views.Concat(ExtractLayoutNames(baseTheme));
            }
            return(views);
        }
예제 #11
0
        public TransformalizeResponse Run(TransformalizeRequest request)
        {
            var moduleVersion = _extensionManager.GetExtension("Transformalize.Orchard").Version;
            var logger        = new TransformalizeLogger(request.Part.Title(), request.Part.LogLevel, Logger, OrchardVersion, moduleVersion);
            var processes     = new List <Process>();

            //transitioning to using TflRoot instead of string configuration
            if (request.Root != null)
            {
                processes.AddRange(ProcessFactory.Create(request.Root, logger, request.Options));
            }
            else      //legacy
            {
                processes.AddRange(ProcessFactory.Create(request.Configuration, logger, request.Options, request.Query));
            }

            for (var i = 0; i < processes.Count; i++)
            {
                var process = processes[i];
                CreateInputOperation(process, request);
                process.ExecuteScaler();
            }

            return(new TransformalizeResponse()
            {
                Processes = processes.ToArray(),
                Log = logger.Dump().ToList()
            });
        }
예제 #12
0
        public IEnumerable <string> GetZones(ExtensionDescriptor theme)
        {
            IEnumerable <string> zones = new List <string>();

            // get the zones for this theme
            if (theme.Zones != null)
            {
                zones = theme.Zones.Split(',')
                        .Distinct()
                        .Select(x => x.Trim())
                        .ToList();
            }

            // if this theme has no zones defined then walk the BaseTheme chain until we hit a theme which defines zones
            while (zones.Count() == 0 && theme != null && !string.IsNullOrWhiteSpace(theme.BaseTheme))
            {
                string baseTheme = theme.BaseTheme;
                theme = _extensionManager.GetExtension(baseTheme);
                if (theme != null && theme.Zones != null)
                {
                    zones = theme.Zones.Split(',')
                            .Distinct()
                            .Select(x => x.Trim())
                            .ToList();
                }
            }

            return(zones);
        }
예제 #13
0
        public ExtensionDescriptor GetSiteTheme()
        {
            var    site             = _workContextAccessor.GetContext().CurrentSite;
            string currentThemeName = site.As <ThemeSiteSettingsPart>().CurrentThemeName;

            return(string.IsNullOrEmpty(currentThemeName) ? null : _extensionManager.GetExtension(currentThemeName));
        }
예제 #14
0
        /// <summary>
        /// 获取当前请求的主题。
        /// </summary>
        /// <param name="requestContext">请求上下文。</param>
        /// <returns>主题。</returns>
        public ExtensionDescriptorEntry GetRequestTheme(RequestContext requestContext)
        {
            var requestTheme = _themeSelectors
                               .Select(x => x.GetTheme(requestContext))
                               .Where(x => x != null)
                               .OrderByDescending(x => x.Priority);

            if (!requestTheme.Any())
            {
                return(null);
            }

            var theme =
                requestTheme.Select(t => _extensionManager.GetExtension(t.ThemeName)).FirstOrDefault(t => t != null);

            return(theme ?? _extensionManager.GetExtension("SafeMode"));
        }
예제 #15
0
 public AdminController(IOrchardServices orchardServices, IExtensionManager extensionManager, ILightboxService lightboxService)
 {
     _orchardServices = orchardServices;
     var moduleDescriptor = extensionManager.GetExtension("Duk.Lightbox.Orchard");
     _modulePath = VirtualPathUtility.AppendTrailingSlash(VirtualPathUtility.Combine(
         VirtualPathUtility.AppendTrailingSlash(VirtualPathUtility.ToAbsolute(moduleDescriptor.Location)), 
         moduleDescriptor.Path));
     _lightboxService = lightboxService;
 }
예제 #16
0
        public async Task <ExtensionDescriptor> GetSiteThemeAsync()
        {
            string currentThemeName = await GetCurrentThemeNameAsync();

            if (String.IsNullOrEmpty(currentThemeName))
            {
                return(null);
            }

            return(_extensionManager.GetExtension(currentThemeName));
        }
예제 #17
0
        public async Task <IExtensionInfo> GetAdminThemeAsync()
        {
            string currentThemeName = await GetAdminThemeNameAsync();

            if (String.IsNullOrEmpty(currentThemeName))
            {
                return(null);
            }

            return(_extensionManager.GetExtension(currentThemeName));
        }
예제 #18
0
        public async Task <IEnumerable <RecipeDescriptor> > HarvestRecipesAsync(string extensionId)
        {
            var descriptor = _extensionManager.GetExtension(extensionId);

            if (descriptor != null)
            {
                return(await HarvestRecipesAsync(descriptor));
            }

            Logger.LogError(T["Could not discover recipes because extension '{0}' was not found.", extensionId]);
            return(Enumerable.Empty <RecipeDescriptor>());
        }
예제 #19
0
        public Task <IEnumerable <RecipeDescriptor> > HarvestRecipesAsync(string extensionId)
        {
            var descriptor = _extensionManager.GetExtension(extensionId);

            if (descriptor.Exists)
            {
                return(Task.FromResult(HarvestRecipes(descriptor)));
            }

            Logger.LogError(T["Could not discover recipes because extension '{0}' was not found.", extensionId]);
            return(Task.FromResult(Enumerable.Empty <RecipeDescriptor>()));
        }
예제 #20
0
        public IEnumerable <Recipe> HarvestRecipes(string extensionId)
        {
            var extension = _extensionManager.GetExtension(extensionId);

            if (extension != null)
            {
                return(HarvestRecipes(extension));
            }

            Logger.Error("Could not discover recipes because module '{0}' was not found.", extensionId);
            return(Enumerable.Empty <Recipe>());
        }
예제 #21
0
        /// <summary>
        /// 删除程序集。
        /// </summary>
        /// <param name="moduleName">模块名称。</param>
        public void DeleteAssembly(string moduleName)
        {
            var descriptor = _extensionManager.GetExtension(moduleName);

            if (descriptor == null)
            {
                return;
            }

            /*            var paths = GetModuleAssemblyPaths(descriptor);
             *          if (paths == null)
             *              return;
             *
             *          foreach (var assembly in paths.Select(item => item.Key))
             *          {
             *              Logger.Information("为模块 \"{0}\" 删除来自探测目录的程序集", moduleName);
             *              DeleteAssembly(assembly);
             *          }*/

            Logger.Information("为模块 \"{0}\" 删除来自探测目录的程序集", moduleName);
            DeleteAssembly(new AssemblyDescriptor(moduleName));
        }
예제 #22
0
        public void BuildManifests(ResourceManifestBuilder builder)
        {
            var manifest = builder.Add();

            manifest.DefineStyle("WorkflowsAdmin").SetUrl("orchard-workflows-admin.css").SetDependencies("~/Themes/TheAdmin/Styles/Site.css");

            manifest.DefineScript("jsPlumb").SetUrl("jquery.jsPlumb-1.4.1-all-min.js").SetDependencies("jQueryUI");


            // Trying to find a matching activity CSS for each activity in the extensions they come from.
            var resourceNamesAndPaths = _cacheManager.Get("Orchard.Workflows.ActivityResourceNames", context => {
                var resourceNameAndPathList = new List <Tuple <string, string> >();

                foreach (var activity in _activitiesManager.Value.GetActivities())
                {
                    var assemblyName = activity.GetType().Assembly.GetName().Name;
                    var extension    = _extensionManager.GetExtension(assemblyName);
                    if (extension == null)
                    {
                        continue;
                    }

                    var stylesPath   = _virtualPathProvider.Combine(extension.VirtualPath, "Styles");
                    var resourceName = "WorkflowsActivity-" + activity.Name;
                    var filename     = resourceName.HtmlClassify() + ".css";
                    var filePath     = _virtualPathProvider.Combine(_hostEnvironment.MapPath(stylesPath), filename);

                    if (File.Exists(filePath))
                    {
                        /* Since stylesheets are shapes, we don't need to create the resource with the full path to the CSS file,
                         * because extensions can override those shapes by file name if they reference Orchard.Workflows,
                         * even when they don't exist in Orchard.Workflows. */
                        resourceNameAndPathList.Add(Tuple.Create(resourceName, filename));
                    }
                }

                return(resourceNameAndPathList);
            });

            foreach (var resourceNameAndPath in resourceNamesAndPaths)
            {
                manifest
                .DefineStyle(resourceNameAndPath.Item1)
                .SetUrl(resourceNameAndPath.Item2)
                .SetDependencies("WorkflowsAdmin");
            }

            manifest
            .DefineStyle("WorkflowsActivities")
            .SetDependencies(resourceNamesAndPaths.Select(resourceNameAndPath => resourceNameAndPath.Item1).ToArray());
        }
예제 #23
0
        public ExtensionDescriptor GetRequestTheme(RequestContext requestContext)
        {
            var requestTheme = _themeSelectors
                               .Select(x => x.GetTheme(requestContext))
                               .Where(x => x != null)
                               .OrderByDescending(x => x.Priority).ToList();

            if (!requestTheme.Any())
            {
                return(null);
            }

            foreach (var theme in requestTheme)
            {
                var t = _extensionManager.GetExtension(theme.ThemeName);
                if (t != null)
                {
                    return(t);
                }
            }

            return(_extensionManager.GetExtension("SafeMode"));
        }
예제 #24
0
 public ApiController(
     ITransformalizeService transformalize,
     IApiService apiService,
     IExtensionManager extensionManager,
     IJobsQueueService jobQueueService
 ) {
     _stopwatch.Start();
     _transformalize = transformalize;
     _apiService = apiService;
     _jobQueueService = jobQueueService;
     _moduleVersion = extensionManager.GetExtension("Transformalize.Orchard").Version;
     T = NullLocalizer.Instance;
     Logger = NullLogger.Instance;
 }
예제 #25
0
 public ApiController(
     ITransformalizeService transformalize,
     IApiService apiService,
     IExtensionManager extensionManager,
     IJobsQueueService jobQueueService
     )
 {
     _stopwatch.Start();
     _transformalize  = transformalize;
     _apiService      = apiService;
     _jobQueueService = jobQueueService;
     _moduleVersion   = extensionManager.GetExtension("Transformalize.Orchard").Version;
     T      = NullLocalizer.Instance;
     Logger = NullLogger.Instance;
 }
예제 #26
0
        public async Task <IExtensionInfo> GetThemeAsync()
        {
            // 由于性能原因,每个域(请求)只处理当前主题一次。
            //这不能缓存,因为每个请求获得不同的值。

            // For performance reason, processes the current theme only once per scope (request).
            // This can't be cached as each request gets a different value.
            if (_theme == null)
            {
                var themeResults = new List <ThemeSelectorResult>();
                foreach (var themeSelector in _themeSelectors)
                {
                    var themeResult = await themeSelector.GetThemeAsync();

                    if (themeResult != null)
                    {
                        themeResults.Add(themeResult);
                    }
                }

                themeResults.Sort((x, y) => y.Priority.CompareTo(x.Priority));

                if (themeResults.Count == 0)
                {
                    return(null);
                }

                // Try to load the theme to ensure it's present尝试加载主题,以确保它的存在。
                foreach (var theme in themeResults)
                {
                    var t = _extensionManager.GetExtension(theme.ThemeName);

                    if (t.Exists)
                    {
                        return(_theme = new ThemeExtensionInfo(t));
                    }
                }

                // No valid theme. Don't save the result right now.
                return(null);
            }

            return(_theme);
        }
예제 #27
0
        public IEnumerable <Recipe> HarvestRecipes(string extensionId)
        {
            var recipes   = new List <Recipe>();
            var extension = _extensionManager.GetExtension(extensionId);

            if (extension != null)
            {
                var recipeLocation = Path.Combine(extension.Location, extensionId, "Recipes");
                var recipeFiles    = _webSiteFolder.ListFiles(recipeLocation, true);
                recipes.AddRange(
                    from recipeFile in recipeFiles
                    where recipeFile.EndsWith(".recipe.xml", StringComparison.OrdinalIgnoreCase)
                    select _recipeParser.ParseRecipe(_webSiteFolder.ReadFile(recipeFile)));
            }
            else
            {
                Logger.Error("Could not discover recipes because module '{0}' was not found.", extensionId);
            }

            return(recipes);
        }
예제 #28
0
        public async Task <ExtensionDescriptor> GetThemeAsync()
        {
            // For performance reason, processes the current theme only once per scope (request).
            // This can't be cached as each request gets a different value.
            if (_theme == null)
            {
                var themeResults = new List <ThemeSelectorResult>();
                foreach (var themeSelector in _themeSelectors)
                {
                    var themeResult = await themeSelector.GetThemeAsync();

                    if (themeResult != null)
                    {
                        themeResults.Add(themeResult);
                    }
                }

                themeResults.Sort((x, y) => y.Priority.CompareTo(x.Priority));

                if (themeResults.Count == 0)
                {
                    return(null);
                }

                // Try to load the theme to ensure it's present
                foreach (var theme in themeResults)
                {
                    var t = _extensionManager.GetExtension(theme.ThemeName);
                    if (t != null)
                    {
                        return(_theme = t);
                    }
                }

                // No valid theme. Don't save the result right now.
                return(null);
            }

            return(_theme);
        }
        /// <inheritdoc />
        public virtual IEnumerable <string> ExpandViewLocations(ViewLocationExpanderContext context,
                                                                IEnumerable <string> viewLocations)
        {
            // Get Extension, and then add in the relevant views.
            var extension = _extensionManager.GetExtension(context.AreaName);

            if (!extension.Exists)
            {
                return(viewLocations);
            }

            var result = new List <string>();

            var extensionViewsPath =
                Path.Combine(Path.DirectorySeparatorChar + extension.SubPath, "Views");

            result.Add(Path.Combine(extensionViewsPath, "{1}", "{0}.cshtml"));
            result.Add(Path.Combine(extensionViewsPath, "Shared", "{0}.cshtml"));

            result.AddRange(viewLocations);

            return(result);
        }
예제 #30
0
        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);
                }
            }
        }
예제 #31
0
        public void ShouldReturnNotFoundExtensionInfoWhenNotFound()
        {
            var extension = ModuleThemeScopedExtensionManager.GetExtension("NotFound");

            Assert.False(extension.Exists);
        }
        public ExtensionDescriptor GetSiteTheme()
        {
            string currentThemeName = GetCurrentThemeName();

            return(string.IsNullOrEmpty(currentThemeName) ? null : _extensionManager.GetExtension(GetCurrentThemeName()));
        }