From 8af5a54ad2b3f74a9883e3f6d59366c5b7777a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 24 Apr 2020 18:42:57 +0300 Subject: [PATCH] Refactored VirtualFileTemplateContentContributor --- .../FolderLocalizedTemplateContentReader.cs | 65 ++++++++++++++ .../ILocalizedTemplateContentReader.cs | 7 ++ .../NullLocalizedTemplateContentReader.cs | 19 +++++ ...ingleFileLocalizedTemplateContentReader.cs | 20 +++++ .../VirtualFileTemplateContentContributor.cs | 85 +++++++------------ .../FileProviders/AbpFileInfoExtensions.cs | 24 ++++++ 6 files changed, 164 insertions(+), 56 deletions(-) create mode 100644 framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FolderLocalizedTemplateContentReader.cs create mode 100644 framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs create mode 100644 framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs create mode 100644 framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/SingleFileLocalizedTemplateContentReader.cs diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FolderLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FolderLocalizedTemplateContentReader.cs new file mode 100644 index 0000000000..65bb2423a8 --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FolderLocalizedTemplateContentReader.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.FileProviders; +using Volo.Abp.Localization; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.TextTemplating.VirtualFiles +{ + public class FolderLocalizedTemplateContentReader : ILocalizedTemplateContentReader + { + private Dictionary _dictionary; + + public async Task ReadContentsAsync(IVirtualFileProvider virtualFileProvider, string virtualPath) + { + _dictionary = new Dictionary(); + + var directoryInfo = virtualFileProvider.GetFileInfo(virtualPath); + if (!directoryInfo.IsDirectory) + { + throw new AbpException("Given virtual path is not a folder: " + virtualPath); + } + + foreach (var file in virtualFileProvider.GetDirectoryContents(virtualPath)) + { + if (file.IsDirectory) + { + continue; + } + + _dictionary.Add(file.Name.RemovePostFix(".tpl"), await file.ReadAsStringAsync()); + } + } + + public string GetContent(string cultureName, string defaultCultureName) + { + var content = _dictionary.GetOrDefault(cultureName); + if (content != null) + { + return content; + } + + if (cultureName.Contains("-")) + { + var baseCultureName = CultureHelper.GetBaseCultureName(cultureName); + content = _dictionary.GetOrDefault(baseCultureName); + if (content != null) + { + return content; + } + } + + if (defaultCultureName != null) + { + content = _dictionary.GetOrDefault(defaultCultureName); + if (content != null) + { + return content; + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs new file mode 100644 index 0000000000..0b028138cd --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.TextTemplating.VirtualFiles +{ + public interface ILocalizedTemplateContentReader + { + public string GetContent(string culture, string defaultCultureName = null); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs new file mode 100644 index 0000000000..0578a716ae --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs @@ -0,0 +1,19 @@ +namespace Volo.Abp.TextTemplating.VirtualFiles +{ + public class NullLocalizedTemplateContentReader : ILocalizedTemplateContentReader + { + public static NullLocalizedTemplateContentReader Instance { get; } = new NullLocalizedTemplateContentReader(); + + private NullLocalizedTemplateContentReader() + { + + } + + public string GetContent( + string culture, + string defaultCultureName = null) + { + return null; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/SingleFileLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/SingleFileLocalizedTemplateContentReader.cs new file mode 100644 index 0000000000..23e4bfc14a --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/SingleFileLocalizedTemplateContentReader.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.FileProviders; + +namespace Volo.Abp.TextTemplating.VirtualFiles +{ + public class SingleFileLocalizedTemplateContentReader : ILocalizedTemplateContentReader + { + private string _content; + + public async Task ReadContentsAsync(IFileInfo fileInfo) + { + _content = await fileInfo.ReadAsStringAsync(); + } + + public string GetContent(string culture, string defaultCultureName) + { + return _content; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs index 6d373dfec1..dea4920447 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Globalization; using System.Threading.Tasks; -using Microsoft.Extensions.FileProviders; using Volo.Abp.DependencyInjection; -using Volo.Abp.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating.VirtualFiles @@ -20,74 +17,50 @@ namespace Volo.Abp.TextTemplating.VirtualFiles _virtualFileProvider = virtualFileProvider; } - public async Task GetOrNullAsync(TemplateContentContributorContext context) + public virtual async Task GetOrNullAsync(TemplateContentContributorContext context) { - var virtualPath = context.TemplateDefinition.Properties.GetOrDefault(VirtualPathPropertyName) as string; - if (virtualPath == null) - { - return null; - } - - //TODO: Refactor: Split implementation based on single file or dictionary of culture-specific contents - var cultureName = context.Culture ?? CultureInfo.CurrentUICulture.Name; - var dictionary = GetTemplateDictionary(virtualPath); + var localizedReader = await CreateLocalizedReader(context); - var content = dictionary.GetOrDefault(cultureName); - if (content != null) - { - return content; - } + return localizedReader.GetContent( + cultureName, + context.TemplateDefinition.DefaultCultureName + ); + } + + protected async Task CreateLocalizedReader( + TemplateContentContributorContext context) + { + var virtualPath = context + .TemplateDefinition + .Properties + .GetOrDefault(VirtualPathPropertyName) as string; - if (cultureName.Contains("-")) + if (virtualPath == null) { - var baseCultureName = CultureHelper.GetBaseCultureName(cultureName); - content = dictionary.GetOrDefault(baseCultureName); - if (content != null) - { - return content; - } + return NullLocalizedTemplateContentReader.Instance; } - if (context.TemplateDefinition.DefaultCultureName != null) + var fileInfo = _virtualFileProvider.GetFileInfo(virtualPath); + if (!fileInfo.Exists) { - content = dictionary.GetOrDefault(context.TemplateDefinition.DefaultCultureName); - if (content != null) - { - return content; - } + throw new AbpException("Could not find a file/folder at the location: " + virtualPath); } - return dictionary.GetOrDefault("__default"); - } - - private Dictionary GetTemplateDictionary(string virtualPath) - { - var dictionary = new Dictionary(); - - var fileInfo = _virtualFileProvider.GetFileInfo(virtualPath); - if (!fileInfo.IsDirectory) + if (fileInfo.IsDirectory) { - //TODO: __default to consts - dictionary.Add("__default", fileInfo.ReadAsString()); + var folderReader = new FolderLocalizedTemplateContentReader(); + await folderReader.ReadContentsAsync(_virtualFileProvider, virtualPath); + return folderReader; } - else + else //File { - foreach (var file in _virtualFileProvider.GetDirectoryContents(virtualPath)) - { - if (file.IsDirectory) - { - continue; - } - - // TODO: How to normalize file names? - dictionary.Add(file.Name.RemovePostFix(".tpl"), file.ReadAsString()); - } + var singleFileReader = new SingleFileLocalizedTemplateContentReader(); + await singleFileReader.ReadContentsAsync(fileInfo); + return singleFileReader; } - - return dictionary; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs b/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs index 7d3505d616..8a6d7d57a1 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs @@ -18,6 +18,14 @@ namespace Microsoft.Extensions.FileProviders return fileInfo.ReadAsString(Encoding.UTF8); } + /// + /// Reads file content as string using encoding. + /// + public static Task ReadAsStringAsync([NotNull] this IFileInfo fileInfo) + { + return fileInfo.ReadAsStringAsync(Encoding.UTF8); + } + /// /// Reads file content as string using the given . /// @@ -34,6 +42,22 @@ namespace Microsoft.Extensions.FileProviders } } + /// + /// Reads file content as string using the given . + /// + public static async Task ReadAsStringAsync([NotNull] this IFileInfo fileInfo, Encoding encoding) + { + Check.NotNull(fileInfo, nameof(fileInfo)); + + using (var stream = fileInfo.CreateReadStream()) + { + using (var streamReader = new StreamReader(stream, encoding, true)) + { + return await streamReader.ReadToEndAsync(); + } + } + } + /// /// Reads file content as byte[]. ///