diff --git a/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs b/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs index 1307339b5..551fffe5b 100644 --- a/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs +++ b/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs @@ -125,7 +125,7 @@ Features: public IEnumerable AvailableExtensions() { foreach (var e in Manifests) { string name = e.Key; - yield return ExtensionFolders.GetDescriptorForExtension("~/", name, DefaultExtensionTypes.Module, Manifests[name]); + yield return ExtensionHarvester.GetDescriptorForExtension("~/", name, DefaultExtensionTypes.Module, Manifests[name]); } } } diff --git a/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs b/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs index 540d8f922..372cba562 100644 --- a/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs +++ b/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs @@ -62,7 +62,8 @@ namespace Orchard.Tests.Modules.Recipes.Services { } var builder = new ContainerBuilder(); - _folders = new ModuleFolders(new[] { _tempFolderName }, new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + _folders = new ModuleFolders(new[] { _tempFolderName }, harvester); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/DataMigration/DataMigrationTests.cs b/src/Orchard.Tests/DataMigration/DataMigrationTests.cs index ae4b65864..9697aa0aa 100644 --- a/src/Orchard.Tests/DataMigration/DataMigrationTests.cs +++ b/src/Orchard.Tests/DataMigration/DataMigrationTests.cs @@ -92,7 +92,7 @@ namespace Orchard.Tests.DataMigration { public IEnumerable AvailableExtensions() { foreach (var e in Manifests) { string name = e.Key; - yield return ExtensionFolders.GetDescriptorForExtension("~/", name, DefaultExtensionTypes.Module, Manifests[name]); + yield return ExtensionHarvester.GetDescriptorForExtension("~/", name, DefaultExtensionTypes.Module, Manifests[name]); } } } diff --git a/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs b/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs index 9fddee3d5..bf677980d 100644 --- a/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs +++ b/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs @@ -49,7 +49,8 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void IdsFromFoldersWithModuleTxtShouldBeListed() { - IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var ids = folders.AvailableExtensions().Select(d => d.Id); Assert.That(ids.Count(), Is.EqualTo(5)); Assert.That(ids, Has.Some.EqualTo("Sample1")); // Sample1 - obviously @@ -61,7 +62,8 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void ModuleTxtShouldBeParsedAndReturnedAsYamlDocument() { - IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var sample1 = folders.AvailableExtensions().Single(d => d.Id == "Sample1"); Assert.That(sample1.Id, Is.Not.Empty); Assert.That(sample1.Author, Is.EqualTo("Bertrand Le Roy")); // Sample1 @@ -69,7 +71,8 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void NamesFromFoldersWithModuleTxtShouldFallBackToIdIfNotGiven() { - IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var names = folders.AvailableExtensions().Select(d => d.Name); Assert.That(names.Count(), Is.EqualTo(5)); Assert.That(names, Has.Some.EqualTo("Le plug-in français")); // Sample1 @@ -81,7 +84,8 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void PathsFromFoldersWithModuleTxtShouldFallBackAppropriatelyIfNotGiven() { - IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var paths = folders.AvailableExtensions().Select(d => d.Path); Assert.That(paths.Count(), Is.EqualTo(5)); Assert.That(paths, Has.Some.EqualTo("Sample1")); // Sample1 - Id, Name invalid URL segment diff --git a/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs b/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs index a88a7576e..c9b62564a 100644 --- a/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs +++ b/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs @@ -46,7 +46,7 @@ namespace Orchard.Tests.Environment.Extensions { public IEnumerable AvailableExtensions() { foreach (var e in Manifests) { string name = e.Key; - yield return ExtensionFolders.GetDescriptorForExtension("~/", name, _extensionType, Manifests[name]); + yield return ExtensionHarvester.GetDescriptorForExtension("~/", name, _extensionType, Manifests[name]); } } } diff --git a/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs b/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs index 4f7b6245b..0b62c0c47 100644 --- a/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs +++ b/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs @@ -51,7 +51,7 @@ namespace Orchard.Tests.Environment.Extensions { public IEnumerable AvailableExtensions() { foreach (var e in Manifests) { string name = e.Key; - yield return ExtensionFolders.GetDescriptorForExtension("~/", name, _extensionType, Manifests[name]); + yield return ExtensionHarvester.GetDescriptorForExtension("~/", name, _extensionType, Manifests[name]); } } } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs index ea8ac6aac..77b4660d9 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs @@ -78,7 +78,7 @@ namespace Orchard.Packaging.Services { if (packageFile != null) { string extensionId = Path.GetFileName(Path.GetDirectoryName(packageFile.Path).TrimEnd('/', '\\')); using (StreamReader streamReader = new StreamReader(packageFile.GetStream())) { - return ExtensionFolders.GetDescriptorForExtension("", extensionId, extensionType, streamReader.ReadToEnd()); + return ExtensionHarvester.GetDescriptorForExtension("", extensionId, extensionType, streamReader.ReadToEnd()); } } diff --git a/src/Orchard/Environment/Extensions/Folders/ExtensionFolders.cs b/src/Orchard/Environment/Extensions/Folders/ExtensionHarvester.cs similarity index 89% rename from src/Orchard/Environment/Extensions/Folders/ExtensionFolders.cs rename to src/Orchard/Environment/Extensions/Folders/ExtensionHarvester.cs index 466494348..fbd25ee4e 100644 --- a/src/Orchard/Environment/Extensions/Folders/ExtensionFolders.cs +++ b/src/Orchard/Environment/Extensions/Folders/ExtensionHarvester.cs @@ -10,7 +10,7 @@ using Orchard.Logging; using Orchard.Utility.Extensions; namespace Orchard.Environment.Extensions.Folders { - public class ExtensionFolders : IExtensionFolders { + public class ExtensionHarvester : IExtensionHarvester { private const string NameSection = "name"; private const string PathSection = "path"; private const string DescriptionSection = "description"; @@ -29,23 +29,10 @@ namespace Orchard.Environment.Extensions.Folders { private const string PrioritySection = "priority"; private const string FeaturesSection = "features"; - private readonly IEnumerable _paths; - private readonly string _manifestName; - private readonly string _extensionType; - private readonly bool _manifestIsOptional; private readonly ICacheManager _cacheManager; private readonly IWebSiteFolder _webSiteFolder; - protected ExtensionFolders( - IEnumerable paths, - string manifestName, - bool manifestIsOptional, - ICacheManager cacheManager, - IWebSiteFolder webSiteFolder) { - _paths = paths; - _manifestName = manifestName; - _extensionType = manifestName == "Theme.txt" ? DefaultExtensionTypes.Theme : DefaultExtensionTypes.Module; - _manifestIsOptional = manifestIsOptional; + public ExtensionHarvester(ICacheManager cacheManager, IWebSiteFolder webSiteFolder) { _cacheManager = cacheManager; _webSiteFolder = webSiteFolder; Logger = NullLogger.Instance; @@ -55,24 +42,30 @@ namespace Orchard.Environment.Extensions.Folders { public Localizer T { get; set; } public ILogger Logger { get; set; } - public IEnumerable AvailableExtensions() { - return _paths - .SelectMany(path => _cacheManager.Get(path, ctx => { - ctx.Monitor(_webSiteFolder.WhenPathChanges(ctx.Key)); - return AvailableExtensionsInFolder(ctx.Key); - })) + public IEnumerable HarvestExtensions(IEnumerable paths, string extensionType, string manifestName, bool manifestIsOptional) { + return paths + .SelectMany(path => HarvestExtensions(path, extensionType, manifestName, manifestIsOptional)) .ToList(); } - private List AvailableExtensionsInFolder(string path) { + private IEnumerable HarvestExtensions(string path, string extensionType, string manifestName, bool manifestIsOptional) { + string key = string.Format("{0}-{1}-{2}", path, manifestName, extensionType); + + return _cacheManager.Get(key, ctx => { + ctx.Monitor(_webSiteFolder.WhenPathChanges(path)); + return AvailableExtensionsInFolder(path, extensionType, manifestName, manifestIsOptional); + }); + } + + private List AvailableExtensionsInFolder(string path, string extensionType, string manifestName, bool manifestIsOptional) { Logger.Information("Start looking for extensions in '{0}'...", path); var subfolderPaths = _webSiteFolder.ListDirectories(path); var localList = new List(); foreach (var subfolderPath in subfolderPaths) { var extensionId = Path.GetFileName(subfolderPath.TrimEnd('/', '\\')); - var manifestPath = Path.Combine(subfolderPath, _manifestName); + var manifestPath = Path.Combine(subfolderPath, manifestName); try { - var descriptor = GetExtensionDescriptor(path, extensionId, manifestPath); + var descriptor = GetExtensionDescriptor(path, extensionId, extensionType, manifestPath, manifestIsOptional); if (descriptor == null) continue; @@ -124,12 +117,12 @@ namespace Orchard.Environment.Extensions.Folders { return extensionDescriptor; } - private ExtensionDescriptor GetExtensionDescriptor(string locationPath, string extensionId, string manifestPath) { + private ExtensionDescriptor GetExtensionDescriptor(string locationPath, string extensionId, string extensionType, string manifestPath, bool manifestIsOptional) { return _cacheManager.Get(manifestPath, context => { context.Monitor(_webSiteFolder.WhenPathChanges(manifestPath)); var manifestText = _webSiteFolder.ReadFile(manifestPath); if (manifestText == null) { - if (_manifestIsOptional) { + if (manifestIsOptional) { manifestText = string.Format("Id: {0}", extensionId); } else { @@ -137,14 +130,10 @@ namespace Orchard.Environment.Extensions.Folders { } } - return GetDescriptorForExtension(locationPath, extensionId, manifestText); + return GetDescriptorForExtension(locationPath, extensionId, extensionType, manifestText); }); } - private ExtensionDescriptor GetDescriptorForExtension(string locationPath, string extensionId, string manifestText) { - return GetDescriptorForExtension(locationPath, extensionId, _extensionType, manifestText); - } - private static Dictionary ParseManifest(string manifestText) { var manifest = new Dictionary(); diff --git a/src/Orchard/Environment/Extensions/Folders/IExtensionHarvester.cs b/src/Orchard/Environment/Extensions/Folders/IExtensionHarvester.cs new file mode 100644 index 000000000..5afa502af --- /dev/null +++ b/src/Orchard/Environment/Extensions/Folders/IExtensionHarvester.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; +using Orchard.Environment.Extensions.Models; + +namespace Orchard.Environment.Extensions.Folders { + public interface IExtensionHarvester { + IEnumerable HarvestExtensions(IEnumerable paths, string extensionType, string manifestName, bool manifestIsOptional); + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/Extensions/Folders/ModuleFolders.cs b/src/Orchard/Environment/Extensions/Folders/ModuleFolders.cs index dd8569f41..b504661df 100644 --- a/src/Orchard/Environment/Extensions/Folders/ModuleFolders.cs +++ b/src/Orchard/Environment/Extensions/Folders/ModuleFolders.cs @@ -1,11 +1,18 @@ using System.Collections.Generic; -using Orchard.Caching; -using Orchard.FileSystems.WebSite; +using Orchard.Environment.Extensions.Models; namespace Orchard.Environment.Extensions.Folders { - public class ModuleFolders : ExtensionFolders { - public ModuleFolders(IEnumerable paths, ICacheManager cacheManager, IWebSiteFolder webSiteFolder) : - base(paths, "Module.txt", false/*isManifestOptional*/, cacheManager, webSiteFolder) { + public class ModuleFolders : IExtensionFolders { + private readonly IEnumerable _paths; + private readonly IExtensionHarvester _extensionHarvester; + + public ModuleFolders(IEnumerable paths, IExtensionHarvester extensionHarvester) { + _paths = paths; + _extensionHarvester = extensionHarvester; + } + + public IEnumerable AvailableExtensions() { + return _extensionHarvester.HarvestExtensions(_paths, DefaultExtensionTypes.Module, "Module.txt", false/*isManifestOptional*/); } } } \ No newline at end of file diff --git a/src/Orchard/Environment/Extensions/Folders/ThemeFolders.cs b/src/Orchard/Environment/Extensions/Folders/ThemeFolders.cs index b832514ad..c8a607e56 100644 --- a/src/Orchard/Environment/Extensions/Folders/ThemeFolders.cs +++ b/src/Orchard/Environment/Extensions/Folders/ThemeFolders.cs @@ -1,11 +1,18 @@ using System.Collections.Generic; -using Orchard.Caching; -using Orchard.FileSystems.WebSite; +using Orchard.Environment.Extensions.Models; namespace Orchard.Environment.Extensions.Folders { - public class ThemeFolders : ExtensionFolders { - public ThemeFolders(IEnumerable paths, ICacheManager cacheManager, IWebSiteFolder webSiteFolder) : - base(paths, "Theme.txt", false/*manifestIsOptional*/, cacheManager, webSiteFolder) { + public class ThemeFolders : IExtensionFolders { + private readonly IEnumerable _paths; + private readonly IExtensionHarvester _extensionHarvester; + + public ThemeFolders(IEnumerable paths, IExtensionHarvester extensionHarvester) { + _paths = paths; + _extensionHarvester = extensionHarvester; + } + + public IEnumerable AvailableExtensions() { + return _extensionHarvester.HarvestExtensions(_paths, DefaultExtensionTypes.Theme, "Theme.txt", false/*isManifestOptional*/); } } } \ No newline at end of file diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index 7480ec7f3..4e7533c3d 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -81,6 +81,7 @@ namespace Orchard.Environment { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); { + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance() .WithParameter(new NamedParameter("paths", new[] { "~/Core", "~/Modules" })); builder.RegisterType().As().SingleInstance() diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 0adf5fcb3..bedebd48f 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -178,6 +178,7 @@ + @@ -710,7 +711,7 @@ - +