diff --git a/src/LazyStorage.Tests/PersistenceTests.cs b/src/LazyStorage.Tests/PersistenceTests.cs index a30e2ca..dfdadb9 100644 --- a/src/LazyStorage.Tests/PersistenceTests.cs +++ b/src/LazyStorage.Tests/PersistenceTests.cs @@ -19,69 +19,6 @@ public sealed class PersistenceTests : IDisposable [Theory, MemberData(nameof(StorageTypes))] public void CanSaveToStorage(ITestStorage storage) - { - _currentStorage = storage; - var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - var obj = new TestObject(); - - repo.Set(obj); - dal.Save(); - - Assert.True(repo.Get().Any(), "The object could not be added to the repository"); - } - - [Theory, MemberData(nameof(StorageTypes))] - public void StoragePersistsBetweenSessions(ITestStorage storage) - { - _currentStorage = storage; - var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - var obj = new TestObject(); - - repo.Set(obj); - dal.Save(); - - var dal2 = storage.GetStorage(); - var repo2 = dal2.GetRepository(); - - Assert.True(repo2.Get().Single().ContentEquals(obj), "The object could not be found in the persistent repo"); - } - - [Theory, MemberData(nameof(StorageTypes))] - public void StorageDoesNotPersistIfDiscarded(ITestStorage storage) - { - _currentStorage = storage; - - // Create an object in memory - var obj1 = new TestObject(); - - // Insert into the repo - var dal = storage.GetStorage(); - var repo = dal.GetRepository(); - repo.Set(obj1); - dal.Save(); - - // Make some changes - var obj2 = new TestObject - { - Id = 1, - Name = "Test" - }; - - // Update the object in the repo but discard changes - repo.Set(obj2); - dal.Discard(); - - var dal2 = storage.GetStorage(); - var repo2 = dal2.GetRepository(); - - var testObject = repo2.Get().Single(); - Assert.True(testObject.ContentEquals(obj1), "The object changes were not reverted in the repo"); - } - - [Theory, MemberData(nameof(StorageTypes))] - public void CanSaveToStorageWithConverter(ITestStorage storage) { _currentStorage = storage; var dal = storage.GetStorage(); @@ -89,7 +26,7 @@ public void CanSaveToStorageWithConverter(ITestStorage storage) var repo = storage.GetStorage().GetRepository(converter); - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = DateTime.Now, @@ -103,7 +40,7 @@ public void CanSaveToStorageWithConverter(ITestStorage storage) } [Theory, MemberData(nameof(StorageTypes))] - public void StoragePersistsBetweenSessionsWithConverter(ITestStorage storage) + public void StoragePersistsBetweenSessions(ITestStorage storage) { _currentStorage = storage; var dal = storage.GetStorage(); @@ -111,7 +48,7 @@ public void StoragePersistsBetweenSessionsWithConverter(ITestStorage storage) var repo = dal.GetRepository(converter); - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = DateTime.Now, @@ -128,7 +65,7 @@ public void StoragePersistsBetweenSessionsWithConverter(ITestStorage storage) } [Theory, MemberData(nameof(StorageTypes))] - public void StorageDoesNotPersistIfDiscardedWithConverter(ITestStorage storage) + public void StorageDoesNotPersistIfDiscarded(ITestStorage storage) { _currentStorage = storage; @@ -138,13 +75,13 @@ public void StorageDoesNotPersistIfDiscardedWithConverter(ITestStorage storage) var repo = dal.GetRepository(converter); - var obj1 = new TestObjectNotIStorable {Name = "Test"}; + var obj1 = new TestObject {Name = "Test"}; repo.Set(obj1); dal.Save(); // Make some changes - var obj2 = new TestObjectNotIStorable {Name = "Test"}; + var obj2 = new TestObject {Name = "Test"}; // Update the object in the repo but discard changes repo.Set(obj2); diff --git a/src/LazyStorage.Tests/RepositoryTests.cs b/src/LazyStorage.Tests/RepositoryTests.cs deleted file mode 100644 index 4feee31..0000000 --- a/src/LazyStorage.Tests/RepositoryTests.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using LazyStorage.InMemory; -using LazyStorage.Interfaces; -using LazyStorage.Json; -using LazyStorage.Xml; -using Xunit; - -namespace LazyStorage.Tests -{ - public class RepositoryTests - { - public static IEnumerable Repos => new[] - { - new object[] {new InMemoryRepository()}, - new object[] {new XmlRepository("RepositoryTests") }, - new object[] {new JsonRepository("RepositoryTests") } - }; - - [Theory, MemberData(nameof(Repos))] - public void CanAddToRepo(IRepository repo) - { - var obj = new TestObject(); - - repo.Set(obj); - - var repoObj = repo.Get().Single(); - - Assert.True(repoObj.ContentEquals(obj), "The object returned does not match the one added"); - } - - [Theory, MemberData(nameof(Repos))] - public void CanUpdateRepo(IRepository repo) - { - var obj = new TestObject(); - - repo.Set(obj); - - obj.Name = "Test"; - repo.Set(obj); - - var repoObj = repo.Get().Single(); - - Assert.True(repoObj.ContentEquals(obj), "The object returned does not match the one added"); - } - - [Theory, MemberData(nameof(Repos))] - public void CanDelete(IRepository repo) - { - var obj = new TestObject(); - - repo.Set(obj); - repo.Delete(obj); - - Assert.False(repo.Get().Any(), "The object could not be deleted from the repository"); - } - - [Theory, MemberData(nameof(Repos))] - public void CanGetByLinq(IRepository repo) - { - var objOne = new TestObject {Name = "one"}; - var objTwo = new TestObject {Name = "two"}; - - repo.Set(objOne); - repo.Set(objTwo); - - var result = repo.Get(x => x.Name == "one").SingleOrDefault(); - - Assert.NotNull(result); - Assert.True(result.Equals(objOne), "The object could not be retrieved from the repository"); - } - } -} \ No newline at end of file diff --git a/src/LazyStorage.Tests/RepositoryWithConverterTests.cs b/src/LazyStorage.Tests/RepositoryWithConverterTests.cs index d9c8348..0f88b0c 100644 --- a/src/LazyStorage.Tests/RepositoryWithConverterTests.cs +++ b/src/LazyStorage.Tests/RepositoryWithConverterTests.cs @@ -9,19 +9,19 @@ namespace LazyStorage.Tests { - public class RepositoryWithConverterTests + public class RepositoryTests { public static IEnumerable Repos => new[] { - new object[] {new InMemoryRepositoryWithConverter(new TestObjectStorageConverter())}, - new object[] {new XmlRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, - new object[] {new JsonRepositoryWithConverter("RepositoryWithConverterTests", new TestObjectStorageConverter())}, + new object[] {new InMemoryRepository(new TestObjectStorageConverter())}, + new object[] {new XmlRepository("RepositoryWithConverter", new TestObjectStorageConverter())}, + new object[] {new JsonRepository("RepositoryWithConverter", new TestObjectStorageConverter())}, }; [Theory, MemberData(nameof(Repos))] - public void CanAddToRepo(IRepository repo) + public void CanAddToRepo(IRepository repo) { - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = DateTime.Now, @@ -36,9 +36,9 @@ public void CanAddToRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanUpdateRepo(IRepository repo) + public void CanUpdateRepo(IRepository repo) { - var obj = new TestObjectNotIStorable + var obj = new TestObject { Name = "Test", StartDate = new DateTime(2015, 12, 31, 13, 54, 23), @@ -56,9 +56,9 @@ public void CanUpdateRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanDeleteFromRepo(IRepository repo) + public void CanDeleteFromRepo(IRepository repo) { - var obj = new TestObjectNotIStorable { Name = "Test" }; + var obj = new TestObject { Name = "Test" }; repo.Set(obj); repo.Delete(obj); @@ -67,10 +67,10 @@ public void CanDeleteFromRepo(IRepository repo) } [Theory, MemberData(nameof(Repos))] - public void CanGetByLinq(IRepository repo) + public void CanGetByLinq(IRepository repo) { - var objOne = new TestObjectNotIStorable { Name = "one" }; - var objTwo = new TestObjectNotIStorable { Name = "two" }; + var objOne = new TestObject { Name = "one" }; + var objTwo = new TestObject { Name = "two" }; repo.Set(objOne); repo.Set(objTwo); diff --git a/src/LazyStorage.Tests/TestObject.cs b/src/LazyStorage.Tests/TestObject.cs index 674a90d..277a466 100644 --- a/src/LazyStorage.Tests/TestObject.cs +++ b/src/LazyStorage.Tests/TestObject.cs @@ -1,53 +1,55 @@ using System; -using System.Collections.Generic; using LazyStorage.Interfaces; namespace LazyStorage.Tests { - public sealed class TestObject : IStorable + public class TestObject { - public int Id { get; set; } public string Name { get; set; } - private DateTime _startDate; - private DateTime _endDate; + public DateTime StartDate { get; set; } + public DateTime EndDate { get; set; } public TestObject() { Name = ""; } - public Dictionary GetStorageInfo() + public bool ContentEquals(TestObject other) { - var info = new Dictionary - { - {"Id", Id.ToString()}, - {"Name", Name}, - {"StartDate", _startDate.Ticks.ToString()}, - {"EndDate", _endDate.Ticks.ToString()} - }; - - return info; + return (other.Name == Name) + && (other.StartDate == StartDate) + && (other.EndDate == EndDate); } + } - public void InitialiseWithStorageInfo(Dictionary info) + public class TestObjectStorageConverter : IConverter + { + public StorableObject GetStorableObject(TestObject item) { - Id = int.Parse(info["Id"]); - Name = info["Name"]; - _startDate = new DateTime(long.Parse(info["StartDate"])); - _endDate = new DateTime(long.Parse(info["EndDate"])); + var storableObject = new StorableObject(); + + storableObject.Info.Add("Id", item.Name); + storableObject.Info.Add("StartDate", item.StartDate.Ticks.ToString()); + storableObject.Info.Add("EndDate", item.EndDate.Ticks.ToString()); + + return storableObject; } - public bool Equals(TestObject other) + public TestObject GetOriginalObject(StorableObject info) { - return other.Id == Id; + var orginalObject = new TestObject + { + Name = info.Info["Id"], + StartDate = new DateTime(long.Parse(info.Info["StartDate"])), + EndDate = new DateTime(long.Parse(info.Info["EndDate"])) + }; + + return orginalObject; } - public bool ContentEquals(TestObject other) + public bool IsEqual(StorableObject storageObject, TestObject realObject) { - return other.Id == Id - && other.Name == Name - && other._startDate == _startDate - && other._endDate == _endDate; + return realObject.Name == storageObject.Info["Id"]; } } } \ No newline at end of file diff --git a/src/LazyStorage.Tests/TestObjectNotIStorable.cs b/src/LazyStorage.Tests/TestObjectNotIStorable.cs deleted file mode 100644 index b63b334..0000000 --- a/src/LazyStorage.Tests/TestObjectNotIStorable.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using LazyStorage.Interfaces; - -namespace LazyStorage.Tests -{ - public class TestObjectNotIStorable - { - public string Name { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } - - public TestObjectNotIStorable() - { - Name = ""; - } - - public bool ContentEquals(TestObjectNotIStorable other) - { - return (other.Name == Name) - && (other.StartDate == StartDate) - && (other.EndDate == EndDate); - } - } - - public class TestObjectStorageConverter : IConverter - { - public StorableObject GetStorableObject(TestObjectNotIStorable item) - { - var storableObject = new StorableObject(); - - storableObject.Info.Add("Id", item.Name); - storableObject.Info.Add("StartDate", item.StartDate.Ticks.ToString()); - storableObject.Info.Add("EndDate", item.EndDate.Ticks.ToString()); - - return storableObject; - } - - public TestObjectNotIStorable GetOriginalObject(StorableObject info) - { - var orginalObject = new TestObjectNotIStorable - { - Name = info.Info["Id"], - StartDate = new DateTime(long.Parse(info.Info["StartDate"])), - EndDate = new DateTime(long.Parse(info.Info["EndDate"])) - }; - - return orginalObject; - } - - public bool IsEqual(StorableObject storageObject, TestObjectNotIStorable realObject) - { - return realObject.Name == storageObject.Info["Id"]; - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/InMemory/InMemoryRepository.cs b/src/LazyStorage/InMemory/InMemoryRepository.cs index 9565b02..ed5e06f 100644 --- a/src/LazyStorage/InMemory/InMemoryRepository.cs +++ b/src/LazyStorage/InMemory/InMemoryRepository.cs @@ -5,42 +5,53 @@ namespace LazyStorage.InMemory { - internal class InMemoryRepository : IRepository where T : IStorable, new() + internal class InMemoryRepository : IRepository { - private List _repository = new List(); + private readonly IConverter _converter; + + public InMemoryRepository(IConverter converter) + { + _converter = converter; + } + private List _repository = new List(); + public ICollection Get(Func exp = null) { - return exp != null ? _repository.Where(exp).ToList() : _repository.ToList(); + var allObjects = _repository; + + return exp != null ? allObjects.Where(exp).ToList() : allObjects.ToList(); } public void Set(T item) { - if (_repository.Contains(item)) + var storableItem = _converter.GetStorableObject(item); + var matchingItemsInStore = _repository.Where(x => _converter.IsEqual(storableItem, x)).ToList(); + + if (matchingItemsInStore.Any()) { // Update - var obj = _repository.Where(x => x.Equals(item)); - _repository.Remove(obj.First()); + _repository.Remove(matchingItemsInStore.First()); _repository.Add(item); } else { // Insert - var nextId = _repository.Any() ? _repository.Max(x => x.Id) + 1 : 1; - item.Id = nextId; _repository.Add(item); } } public void Delete(T item) { - var obj = _repository.SingleOrDefault(x => x.Id == item.Id); - _repository.Remove(obj); + var storableItem = _converter.GetStorableObject(item); + + var obj = _repository.Where(x => _converter.IsEqual(storableItem, item)); + _repository.Remove(obj.First()); } public void Save() { - var itemsInRepo = Get().Select(x => x.GetStorageInfo()); + var itemsInRepo = Get().Select(x => _converter.GetStorableObject(x).Info); InMemorySingleton.Sync(nameof(T), itemsInRepo); } @@ -51,8 +62,15 @@ public void Load() private T GetObjectFromStorageInfo(Dictionary storageInfo) { - var item = new T(); - item.InitialiseWithStorageInfo(storageInfo); + var storableItem = new StorableObject(); + + foreach(var itemInfo in storageInfo) + { + storableItem.Info.Add(itemInfo.Key, itemInfo.Value); + } + + var item = _converter.GetOriginalObject(storableItem); + return item; } } diff --git a/src/LazyStorage/InMemory/InMemoryRepositoryWithConverter.cs b/src/LazyStorage/InMemory/InMemoryRepositoryWithConverter.cs deleted file mode 100644 index a1ca374..0000000 --- a/src/LazyStorage/InMemory/InMemoryRepositoryWithConverter.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using LazyStorage.Interfaces; - -namespace LazyStorage.InMemory -{ - internal class InMemoryRepositoryWithConverter : IRepository - { - private readonly IConverter _converter; - - public InMemoryRepositoryWithConverter(IConverter converter) - { - _converter = converter; - } - - private List _repository = new List(); - - public ICollection Get(Func exp = null) - { - var allObjects = _repository; - - return exp != null ? allObjects.Where(exp).ToList() : allObjects.ToList(); - } - - public void Set(T item) - { - var storableItem = _converter.GetStorableObject(item); - var matchingItemsInStore = _repository.Where(x => _converter.IsEqual(storableItem, x)).ToList(); - - if (matchingItemsInStore.Any()) - { - // Update - _repository.Remove(matchingItemsInStore.First()); - _repository.Add(item); - } - else - { - // Insert - _repository.Add(item); - } - } - - public void Delete(T item) - { - var storableItem = _converter.GetStorableObject(item); - - var obj = _repository.Where(x => _converter.IsEqual(storableItem, item)); - _repository.Remove(obj.First()); - } - - public void Save() - { - var itemsInRepo = Get().Select(x => _converter.GetStorableObject(x).Info); - InMemorySingleton.Sync(nameof(T), itemsInRepo); - } - - public void Load() - { - _repository = InMemorySingleton.GetRepo().Select(GetObjectFromStorageInfo).ToList(); - } - - private T GetObjectFromStorageInfo(Dictionary storageInfo) - { - var storableItem = new StorableObject(); - - foreach(var itemInfo in storageInfo) - { - storableItem.Info.Add(itemInfo.Key, itemInfo.Value); - } - - var item = _converter.GetOriginalObject(storableItem); - - return item; - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/InMemory/InMemoryStorage.cs b/src/LazyStorage/InMemory/InMemoryStorage.cs index c2e92ed..fc3d579 100644 --- a/src/LazyStorage/InMemory/InMemoryStorage.cs +++ b/src/LazyStorage/InMemory/InMemoryStorage.cs @@ -12,27 +12,13 @@ public InMemoryStorage() _repos = new Dictionary(); } - public IRepository GetRepository() where T : IStorable, new() - { - var typeAsString = typeof (T).ToString(); - - if (!_repos.ContainsKey(typeAsString)) - { - var inMemoryRepository = new InMemoryRepository(); - inMemoryRepository.Load(); - _repos.Add(typeAsString, inMemoryRepository); - } - - return _repos[typeAsString] as IRepository; - } - public IRepository GetRepository(IConverter converter) { var typeAsString = typeof(T).ToString(); if (!_repos.ContainsKey(typeAsString)) { - var inMemoryRepositoryWithConverter = new InMemoryRepositoryWithConverter(converter); + var inMemoryRepositoryWithConverter = new InMemoryRepository(converter); inMemoryRepositoryWithConverter.Load(); _repos.Add(typeAsString, inMemoryRepositoryWithConverter); } diff --git a/src/LazyStorage/Interfaces/IStorable.cs b/src/LazyStorage/Interfaces/IStorable.cs deleted file mode 100644 index f6cbd13..0000000 --- a/src/LazyStorage/Interfaces/IStorable.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace LazyStorage.Interfaces -{ - public interface IStorable : IEquatable where T : new() - { - int Id { get; set; } - Dictionary GetStorageInfo(); - void InitialiseWithStorageInfo(Dictionary info); - } -} \ No newline at end of file diff --git a/src/LazyStorage/Interfaces/IStorage.cs b/src/LazyStorage/Interfaces/IStorage.cs index 8898d07..9ef0890 100644 --- a/src/LazyStorage/Interfaces/IStorage.cs +++ b/src/LazyStorage/Interfaces/IStorage.cs @@ -2,7 +2,6 @@ { public interface IStorage { - IRepository GetRepository() where T : IStorable, new(); IRepository GetRepository(IConverter converter); void Save(); void Discard(); diff --git a/src/LazyStorage/Json/JsonRepository.cs b/src/LazyStorage/Json/JsonRepository.cs index 7264b51..c2c39c6 100644 --- a/src/LazyStorage/Json/JsonRepository.cs +++ b/src/LazyStorage/Json/JsonRepository.cs @@ -7,14 +7,16 @@ namespace LazyStorage.Json { - internal class JsonRepository : IRepository where T : IStorable, new() + internal class JsonRepository : IRepository { private readonly string _uri; private List _repository = new List(); + private readonly IConverter _converter; - public JsonRepository(string storageFolder) + public JsonRepository(string storageFolder, IConverter converter) { _uri = $"{storageFolder}{typeof(T)}.json"; + _converter = converter; } public ICollection Get(Func exp = null) @@ -24,26 +26,27 @@ public ICollection Get(Func exp = null) public void Set(T item) { - if (_repository.Contains(item)) + var storableObject = _converter.GetStorableObject(item); + var matchingItemsInStore = _repository.Where(x => _converter.IsEqual(storableObject, x)).ToList(); + + if (matchingItemsInStore.Any()) { // Update - var obj = _repository.Where(x => x.Equals(item)); - _repository.Remove(obj.First()); + _repository.Remove(matchingItemsInStore.First()); _repository.Add(item); } else { // Insert - var nextId = _repository.Any() ? _repository.Max(x => x.Id) + 1 : 1; - item.Id = nextId; _repository.Add(item); } } public void Delete(T item) { - var obj = _repository.SingleOrDefault(x => x.Id == item.Id); - _repository.Remove(obj); + var storableObject = _converter.GetStorableObject(item); + var obj = _repository.Where(x => _converter.IsEqual(storableObject, x)); + _repository.Remove(obj.First()); } @@ -52,18 +55,22 @@ public void Load() if (File.Exists(_uri)) { var jsonContent = File.ReadAllText(_uri); - _repository = JsonConvert.DeserializeObject>(jsonContent); + var convertedItems = JsonConvert.DeserializeObject>(jsonContent); + + _repository = convertedItems.Select(x => _converter.GetOriginalObject(x)).ToList(); } else { _repository = new List(); } - + } public void Save() { - var fileContent = JsonConvert.SerializeObject(_repository, Formatting.Indented); + var convertedItems = _repository.Select(item => _converter.GetStorableObject(item)).ToList(); + + var fileContent = JsonConvert.SerializeObject(convertedItems, Formatting.Indented); File.WriteAllText(_uri, fileContent); } } diff --git a/src/LazyStorage/Json/JsonRepositoryWithConverter.cs b/src/LazyStorage/Json/JsonRepositoryWithConverter.cs deleted file mode 100644 index cb3679d..0000000 --- a/src/LazyStorage/Json/JsonRepositoryWithConverter.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using LazyStorage.Interfaces; -using Newtonsoft.Json; - -namespace LazyStorage.Json -{ - internal class JsonRepositoryWithConverter : IRepository - { - private readonly string _uri; - private List _repository = new List(); - private readonly IConverter _converter; - - public JsonRepositoryWithConverter(string storageFolder, IConverter converter) - { - _uri = $"{storageFolder}{typeof(T)}.json"; - _converter = converter; - } - - public ICollection Get(Func exp = null) - { - return exp != null ? _repository.Where(exp).ToList() : _repository.ToList(); - } - - public void Set(T item) - { - var storableObject = _converter.GetStorableObject(item); - var matchingItemsInStore = _repository.Where(x => _converter.IsEqual(storableObject, x)).ToList(); - - if (matchingItemsInStore.Any()) - { - // Update - _repository.Remove(matchingItemsInStore.First()); - _repository.Add(item); - } - else - { - // Insert - _repository.Add(item); - } - } - - public void Delete(T item) - { - var storableObject = _converter.GetStorableObject(item); - var obj = _repository.Where(x => _converter.IsEqual(storableObject, x)); - _repository.Remove(obj.First()); - } - - - public void Load() - { - if (File.Exists(_uri)) - { - var jsonContent = File.ReadAllText(_uri); - var convertedItems = JsonConvert.DeserializeObject>(jsonContent); - - _repository = convertedItems.Select(x => _converter.GetOriginalObject(x)).ToList(); - } - else - { - _repository = new List(); - } - - } - - public void Save() - { - var convertedItems = _repository.Select(item => _converter.GetStorableObject(item)).ToList(); - - var fileContent = JsonConvert.SerializeObject(convertedItems, Formatting.Indented); - File.WriteAllText(_uri, fileContent); - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/Json/JsonStorage.cs b/src/LazyStorage/Json/JsonStorage.cs index 09a23e0..9bf3c17 100644 --- a/src/LazyStorage/Json/JsonStorage.cs +++ b/src/LazyStorage/Json/JsonStorage.cs @@ -14,27 +14,13 @@ public JsonStorage(string storageFolder) _storageFolder = storageFolder; } - public IRepository GetRepository() where T : IStorable, new() - { - var typeAsString = typeof (T).ToString(); - - if (!_repos.ContainsKey(typeAsString)) - { - var jsonRepository = new JsonRepository(_storageFolder); - jsonRepository.Load(); - _repos.Add(typeAsString, jsonRepository); - } - - return _repos[typeAsString] as IRepository; - } - public IRepository GetRepository(IConverter converter) { var typeAsString = typeof(T).ToString(); if (!_repos.ContainsKey(typeAsString)) { - var jsonRepositoryWithConverter = new JsonRepositoryWithConverter(_storageFolder, converter); + var jsonRepositoryWithConverter = new JsonRepository(_storageFolder, converter); jsonRepositoryWithConverter.Load(); _repos.Add(typeAsString, jsonRepositoryWithConverter); } diff --git a/src/LazyStorage/StorableObject.cs b/src/LazyStorage/StorableObject.cs index 54623ba..d01d028 100644 --- a/src/LazyStorage/StorableObject.cs +++ b/src/LazyStorage/StorableObject.cs @@ -10,5 +10,10 @@ public StorableObject() { Info = new Dictionary(); } + + internal StorableObject(Dictionary info) + { + Info = info; + } } } \ No newline at end of file diff --git a/src/LazyStorage/Xml/XmlRepository.cs b/src/LazyStorage/Xml/XmlRepository.cs index 3f5bd40..d82e5d6 100644 --- a/src/LazyStorage/Xml/XmlRepository.cs +++ b/src/LazyStorage/Xml/XmlRepository.cs @@ -7,14 +7,16 @@ namespace LazyStorage.Xml { - internal class XmlRepository : IRepository where T : IStorable, new() + internal class XmlRepository : IRepository { private readonly string _uri; private List _repository = new List(); + private readonly IConverter _converter; - public XmlRepository(string storageFolder) + public XmlRepository(string storageFolder, IConverter converter) { _uri = $"{storageFolder}{typeof(T)}.xml"; + _converter = converter; } public ICollection Get(Func exp = null) @@ -24,26 +26,27 @@ public ICollection Get(Func exp = null) public void Set(T item) { - if (_repository.Contains(item)) + var storableObject = _converter.GetStorableObject(item); + var matchingItemsInStore = _repository.Where(x => _converter.IsEqual(storableObject, x)).ToList(); + + if (matchingItemsInStore.Any()) { // Update - var obj = _repository.Where(x => x.Equals(item)); - _repository.Remove(obj.First()); + _repository.Remove(matchingItemsInStore.First()); _repository.Add(item); } else { // Insert - var nextId = _repository.Any() ? _repository.Max(x => x.Id) + 1 : 1; - item.Id = nextId; _repository.Add(item); } } public void Delete(T item) { - var obj = _repository.SingleOrDefault(x => x.Id == item.Id); - _repository.Remove(obj); + var storableObject = _converter.GetStorableObject(item); + var obj = _repository.Where(x => _converter.IsEqual(storableObject, x)); + _repository.Remove(obj.First()); } @@ -70,10 +73,10 @@ private XDocument GetXmlOuput(List objects) foreach (var item in objects) { - var info = item.GetStorageInfo(); + var info = _converter.GetStorableObject(item).Info; var newElement = new XElement(typeAsString); - + foreach (var data in info) { newElement.Add(new XElement(data.Key, data.Value)); @@ -93,15 +96,14 @@ private List GetObjectsFromXml(string uri) foreach (var node in file.Element("Root").Elements()) { - var storageInfo = new Dictionary(); + var storableObject = new StorableObject(); foreach (var element in node.Descendants()) { - storageInfo.Add(element.Name.ToString(), element.Value); + storableObject.Info.Add(element.Name.ToString(), element.Value); } - var item = new T(); - item.InitialiseWithStorageInfo(storageInfo); + var item = _converter.GetOriginalObject(storableObject); found.Add(item); } diff --git a/src/LazyStorage/Xml/XmlRepositoryWithConverter.cs b/src/LazyStorage/Xml/XmlRepositoryWithConverter.cs deleted file mode 100644 index 5a01771..0000000 --- a/src/LazyStorage/Xml/XmlRepositoryWithConverter.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Xml.Linq; -using LazyStorage.Interfaces; - -namespace LazyStorage.Xml -{ - internal class XmlRepositoryWithConverter : IRepository - { - private readonly string _uri; - private List _repository = new List(); - private readonly IConverter _converter; - - public XmlRepositoryWithConverter(string storageFolder, IConverter converter) - { - _uri = $"{storageFolder}{typeof(T)}.xml"; - _converter = converter; - } - - public ICollection Get(Func exp = null) - { - return exp != null ? _repository.Where(exp).ToList() : _repository.ToList(); - } - - public void Set(T item) - { - var storableObject = _converter.GetStorableObject(item); - var matchingItemsInStore = _repository.Where(x => _converter.IsEqual(storableObject, x)).ToList(); - - if (matchingItemsInStore.Any()) - { - // Update - _repository.Remove(matchingItemsInStore.First()); - _repository.Add(item); - } - else - { - // Insert - _repository.Add(item); - } - } - - public void Delete(T item) - { - var storableObject = _converter.GetStorableObject(item); - var obj = _repository.Where(x => _converter.IsEqual(storableObject, x)); - _repository.Remove(obj.First()); - } - - - public void Load() - { - _repository = File.Exists(_uri) ? GetObjectsFromXml(_uri) : new List(); - } - - public void Save() - { - using (var writer = new FileStream(_uri, FileMode.Create)) - { - GetXmlOuput(_repository).Save(writer); - } - } - - private XDocument GetXmlOuput(List objects) - { - var file = new XDocument(new XElement("Root")); - - var typeAsString = typeof(T).ToString(); - - var rootElement = file.Element("Root"); - - foreach (var item in objects) - { - var info = _converter.GetStorableObject(item).Info; - - var newElement = new XElement(typeAsString); - - foreach (var data in info) - { - newElement.Add(new XElement(data.Key, data.Value)); - } - - rootElement.Add(newElement); - } - - return file; - } - - private List GetObjectsFromXml(string uri) - { - var file = XDocument.Load(uri); - - var found = new List(); - - foreach (var node in file.Element("Root").Elements()) - { - var storableObject = new StorableObject(); - - foreach (var element in node.Descendants()) - { - storableObject.Info.Add(element.Name.ToString(), element.Value); - } - - var item = _converter.GetOriginalObject(storableObject); - - found.Add(item); - } - - return found; - } - } -} \ No newline at end of file diff --git a/src/LazyStorage/Xml/XmlStorage.cs b/src/LazyStorage/Xml/XmlStorage.cs index 33e59ed..88b5069 100644 --- a/src/LazyStorage/Xml/XmlStorage.cs +++ b/src/LazyStorage/Xml/XmlStorage.cs @@ -14,27 +14,13 @@ public XmlStorage(string storageFolder) _repos = new Dictionary(); } - public IRepository GetRepository() where T : IStorable, new() - { - var typeAsString = typeof(T).ToString(); - - if (!_repos.ContainsKey(typeAsString)) - { - var xmlRepository = new XmlRepository(_storageFolder); - xmlRepository.Load(); - _repos.Add(typeAsString, xmlRepository); - } - - return _repos[typeAsString] as IRepository; - } - public IRepository GetRepository(IConverter converter) { var typeAsString = typeof(T).ToString(); if (!_repos.ContainsKey(typeAsString)) { - var xmlRepositoryWithConverter = new XmlRepositoryWithConverter(_storageFolder, converter); + var xmlRepositoryWithConverter = new XmlRepository(_storageFolder, converter); xmlRepositoryWithConverter.Load(); _repos.Add(typeAsString, xmlRepositoryWithConverter); }