private static string DetermineVirtualPath(InheritedThemeFileResult resolveResult)
 {
     if (resolveResult.RelativePath.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase))
     {
         // ASP.NET BuildManager requires the original path for razor views,
         // otherwise an exception is thrown
         return(resolveResult.OriginalVirtualPath);
     }
     else
     {
         return(resolveResult.ResultVirtualPath);
     }
 }
 public InheritedVirtualThemeFile(InheritedThemeFileResult resolveResult)
     : base(DetermineVirtualPath(resolveResult))
 {
     ResolveResult = resolveResult;
 }
Esempio n. 3
0
        /// <summary>
        /// Tries to resolve a file up in the current theme's hierarchy chain.
        /// </summary>
        /// <param name="virtualPath">The original virtual path of the theme file</param>
        /// <returns>
        /// If the current working themme is based on another theme AND the requested file
        /// was physically found in the theme's hierarchy chain, an instance of <see cref="InheritedThemeFileResult" /> will be returned.
        /// In any other case the return value is <c>null</c>.
        /// </returns>
        public InheritedThemeFileResult Resolve(string virtualPath)
        {
            Guard.NotEmpty(virtualPath, nameof(virtualPath));

            if (virtualPath[0] != '~')
            {
                virtualPath = VirtualPathUtility.ToAppRelative(virtualPath);
            }

            if (!ThemeHelper.PathIsInheritableThemeFile(virtualPath))
            {
                return(null);
            }

            bool isExplicit = false;

            virtualPath = ThemeHelper.TokenizePath(virtualPath, out var requestedThemeName, out var relativePath, out var query);

            Func <InheritedThemeFileResult> nullOrFile = () =>
            {
                return(isExplicit
                                        ? new InheritedThemeFileResult {
                    IsExplicit = true, OriginalVirtualPath = virtualPath, Query = query
                }
                                        : null);
            };

            ThemeManifest currentTheme = ResolveTheme(requestedThemeName, relativePath, query, out isExplicit);

            if (currentTheme?.BaseTheme == null)
            {
                // dont't bother resolving files: the current theme is not inherited.
                // Let the current VPP do the work.
                return(nullOrFile());
            }

            if (!currentTheme.ThemeName.Equals(requestedThemeName, StringComparison.OrdinalIgnoreCase))
            {
                if (!_themeRegistry.IsChildThemeOf(currentTheme.ThemeName, requestedThemeName))
                {
                    return(nullOrFile());
                }
            }
            else if (isExplicit && currentTheme.BaseTheme != null)
            {
                // A file from the base theme has been requested
                currentTheme = currentTheme.BaseTheme;
            }

            var fileKey = new FileKey(currentTheme.ThemeName, relativePath, query);
            InheritedThemeFileResult result;

            using (_rwLock.GetUpgradeableReadLock())
            {
                if (!_files.TryGetValue(fileKey, out result))
                {
                    using (_rwLock.GetWriteLock())
                    {
                        // ALWAYS begin the search with the current working theme's location!
                        string actualLocation = LocateFile(currentTheme.ThemeName, relativePath, out var resultVirtualPath, out var resultPhysicalPath);

                        if (actualLocation != null)
                        {
                            result = new InheritedThemeFileResult
                            {
                                RelativePath        = relativePath,
                                OriginalVirtualPath = virtualPath,
                                ResultVirtualPath   = resultVirtualPath,
                                ResultPhysicalPath  = resultPhysicalPath,
                                OriginalThemeName   = requestedThemeName,
                                ResultThemeName     = actualLocation,
                                IsExplicit          = isExplicit,
                                Query = query
                            };
                        }

                        _files[fileKey] = result;
                    }
                }
            }

            if (result == null)
            {
                return(nullOrFile());
            }

            return(result);
        }