From 8d59e1d6ae1deaf44502eabcdf922e678f25dc7e Mon Sep 17 00:00:00 2001 From: Suha Can Date: Wed, 14 Apr 2010 16:46:14 -0700 Subject: [PATCH] - Starting implementing a file based topology descriptor cache. - Adding FileExists to AppDataFolder. - Unit tests. --HG-- branch : dev --- .../Configuration/AppDataFolderTests.cs | 16 +++++++--- .../DefaultTopologyDescriptorCacheTests.cs | 13 ++++++++ .../Configuration/AppDataFolder.cs | 9 +++++- .../DefaultTopologyDescriptorCache.cs | 30 ++++++++++++++++++- 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/Orchard.Tests/Environment/Configuration/AppDataFolderTests.cs b/src/Orchard.Tests/Environment/Configuration/AppDataFolderTests.cs index bbde69cee..5790f5820 100644 --- a/src/Orchard.Tests/Environment/Configuration/AppDataFolderTests.cs +++ b/src/Orchard.Tests/Environment/Configuration/AppDataFolderTests.cs @@ -1,8 +1,5 @@ -using System; -using System.Collections.Generic; -using System.IO; +using System.IO; using System.Linq; -using System.Text; using NUnit.Framework; using Orchard.Environment.Configuration; @@ -91,5 +88,16 @@ this is a test")); } + + [Test] + public void FileExistsReturnsFalseForNonExistingFile() { + Assert.That(_appDataFolder.FileExists("notexisting"), Is.False); + } + + [Test] + public void FileExistsReturnsTrueForExistingFile() { + _appDataFolder.CreateFile("alpha\\foo\\bar.txt", ""); + Assert.That(_appDataFolder.FileExists("alpha\\foo\\bar.txt"), Is.True); + } } } diff --git a/src/Orchard.Tests/Environment/Topology/DefaultTopologyDescriptorCacheTests.cs b/src/Orchard.Tests/Environment/Topology/DefaultTopologyDescriptorCacheTests.cs index 833d728d6..1f60f76af 100644 --- a/src/Orchard.Tests/Environment/Topology/DefaultTopologyDescriptorCacheTests.cs +++ b/src/Orchard.Tests/Environment/Topology/DefaultTopologyDescriptorCacheTests.cs @@ -11,14 +11,27 @@ namespace Orchard.Tests.Environment.Topology { [TestFixture] public class DefaultTopologyDescriptorCacheTests { private IContainer _container; + private string _tempFolder; + private IAppDataFolder _appDataFolder; [SetUp] public void Init() { + _tempFolder = Path.GetTempFileName(); + File.Delete(_tempFolder); + Directory.CreateDirectory(_tempFolder); + _appDataFolder = new AppDataFolder(); + _appDataFolder.SetBasePath(_tempFolder); var builder = new ContainerBuilder(); + builder.RegisterInstance(_appDataFolder).As(); builder.RegisterType().As(); _container = builder.Build(); } + [TearDown] + public void Term() { + Directory.Delete(_tempFolder, true); + } + [Test] public void FetchReturnsNullForCacheMiss() { var service = _container.Resolve(); diff --git a/src/Orchard/Environment/Configuration/AppDataFolder.cs b/src/Orchard/Environment/Configuration/AppDataFolder.cs index 6f6c592c0..050ef0b71 100644 --- a/src/Orchard/Environment/Configuration/AppDataFolder.cs +++ b/src/Orchard/Environment/Configuration/AppDataFolder.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Web.Hosting; @@ -16,6 +17,7 @@ namespace Orchard.Environment.Configuration { void CreateFile(string path, string content); string ReadFile(string path); void DeleteFile(string path); + bool FileExists(string path); string CreateDirectory(string path); @@ -51,6 +53,11 @@ namespace Orchard.Environment.Configuration { File.Delete(Path.Combine(_basePath, path)); } + public bool FileExists(string path) { + var filePath = Path.Combine(_basePath, path); + return File.Exists(filePath); + } + public IEnumerable ListFiles(string path) { var directoryPath = Path.Combine(_basePath, path); if (!Directory.Exists(directoryPath)) diff --git a/src/Orchard/Environment/Topology/DefaultTopologyDescriptorCache.cs b/src/Orchard/Environment/Topology/DefaultTopologyDescriptorCache.cs index 7d2d3643c..e68f11dc8 100644 --- a/src/Orchard/Environment/Topology/DefaultTopologyDescriptorCache.cs +++ b/src/Orchard/Environment/Topology/DefaultTopologyDescriptorCache.cs @@ -1,17 +1,45 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using Orchard.Environment.Configuration; using Orchard.Environment.Topology.Models; +using Orchard.Localization; +using Orchard.Logging; namespace Orchard.Environment.Topology { public class DefaultTopologyDescriptorCache : ITopologyDescriptorCache { readonly IDictionary _cache= new Dictionary(); + private readonly IAppDataFolder _appDataFolder; + private const string TopologyCacheFileName = "cache.dat"; + + public DefaultTopologyDescriptorCache(IAppDataFolder appDataFolder) { + _appDataFolder = appDataFolder; + T = NullLocalizer.Instance; + Logger = NullLogger.Instance; + + } + + public ILogger Logger { get; set; } + private Localizer T { get; set; } + + #region Implementation of ITopologyDescriptorCache public ShellTopologyDescriptor Fetch(string name) { + VerifyCacheFile(); ShellTopologyDescriptor value; return _cache.TryGetValue(name, out value) ? value : null; } public void Store(string name, ShellTopologyDescriptor descriptor) { + VerifyCacheFile(); _cache[name] = descriptor; } + + #endregion + + private void VerifyCacheFile() { + if (!_appDataFolder.FileExists(TopologyCacheFileName)) { + _appDataFolder.CreateFile(TopologyCacheFileName, String.Empty); + } + } } }