ProcessorStorageProvider.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. 
  2. using Quadarax.Foundation.Core.Business.Processor.Enums;
  3. using Quadarax.Foundation.Core.Business.Processor.Task;
  4. using Quadarax.Foundation.Core.Logging;
  5. using Quadarax.Foundation.Core.Object;
  6. namespace Quadarax.Foundation.Core.Business.Processor.Providers;
  7. public abstract class ProcessorStorageProvider : DisposableObject, IProcessorStorageProvider
  8. {
  9. #region *** Properties ***
  10. public bool IsOpen { get; private set; }
  11. #endregion
  12. #region *** Fields ***
  13. private readonly ILog _log;
  14. #endregion
  15. #region *** Constructors ***
  16. protected ProcessorStorageProvider()
  17. {
  18. _log = new ConsoleLogger().GetLogger(GetType());
  19. }
  20. #endregion
  21. public void Open()
  22. {
  23. if (IsOpen) throw new InvalidOperationException("Storage provider has been already opened.");
  24. OnOpen();
  25. IsOpen = true;
  26. Log(LogSeverityEnum.Debug, "Storage provider has been opened.");
  27. }
  28. public void Close()
  29. {
  30. if (!IsOpen) throw new InvalidOperationException("Storage provider has been already closed.");
  31. OnClose();
  32. IsOpen = false;
  33. Log(LogSeverityEnum.Debug, "Storage provider has been closed.");
  34. }
  35. public bool EnsureStorage()
  36. {
  37. var result = OnEnsureStorage();
  38. Log(LogSeverityEnum.Debug, $"Storage provider has been ensured with result '{result}'.");
  39. return result;
  40. }
  41. public ITaskIdentifier Create(ITaskItemData item)
  42. {
  43. if (item == null) throw new ArgumentNullException(nameof(item));
  44. EnsureOpen();
  45. var result = OnCreate(item);
  46. Log(LogSeverityEnum.Debug, $"Task item '{result}' has been created in storage.");
  47. return result;
  48. }
  49. public ITaskItemData[] Get(params ITaskIdentifier[] ids)
  50. {
  51. if (ids == null) throw new ArgumentNullException(nameof(ids));
  52. if (ids.Length > 0) throw new ArgumentOutOfRangeException(nameof(ids), "must have at least one element in array.");
  53. EnsureOpen();
  54. var result = OnGet(ids);
  55. Log(LogSeverityEnum.Debug, $"Gets {result.Length} items by {ids.Length} identifiers from storage.");
  56. return result;
  57. }
  58. public void Set(params ITaskItemData[] items)
  59. {
  60. if (items == null) throw new ArgumentNullException(nameof(items));
  61. if (items.Length > 0) throw new ArgumentOutOfRangeException(nameof(items), "must have at least one element in array.");
  62. EnsureOpen();
  63. var storedItems = OnGet(items.Select(x => x as ITaskIdentifier).ToArray());
  64. var cntUpdated = 0;
  65. var cntSkipped = 0;
  66. foreach (var storedItem in storedItems)
  67. {
  68. var item = items.First(x => x.Id == storedItem.Id);
  69. if (item != storedItem)
  70. {
  71. OnSetOne(item);
  72. cntUpdated++;
  73. Log(LogSeverityEnum.Debug, $"Task item '{item}' has been updated in storage.");
  74. }
  75. else
  76. {
  77. cntSkipped++;
  78. Log(LogSeverityEnum.Debug, $"Task item '{item}' skip to update. No relevant changes detected.");
  79. }
  80. }
  81. Log(LogSeverityEnum.Debug, $"Task items has been updated ({cntUpdated} or {items.Length}) in storage (skipped {cntSkipped} of {items.Length}).");
  82. }
  83. public void Delete(params ITaskIdentifier[] ids)
  84. {
  85. if (ids == null) throw new ArgumentNullException(nameof(ids));
  86. if (ids.Length > 0) throw new ArgumentOutOfRangeException(nameof(ids), "must have at least one element in array.");
  87. EnsureOpen();
  88. var items = OnGet(ids);
  89. foreach (var item in items)
  90. {
  91. OnDeleteOne(item);
  92. Log(LogSeverityEnum.Debug, $"Task item '{item}' has been deleted from storage.");
  93. }
  94. }
  95. public abstract IQueryable<ITaskItemData> Query(params ProcessStatusEnum[] statuses);
  96. #region *** Private Operations & Virtuals ***
  97. protected virtual void Log(LogSeverityEnum type, string message, Exception? e = null)
  98. {
  99. _log.Log(type, message, e);
  100. }
  101. protected void EnsureOpen()
  102. {
  103. if (!IsOpen) Open();
  104. }
  105. protected abstract void OnOpen();
  106. protected abstract void OnClose();
  107. protected abstract bool OnEnsureStorage();
  108. protected abstract ITaskIdentifier OnCreate(ITaskItemData item);
  109. protected abstract ITaskItemData[] OnGet(ITaskIdentifier[] ids);
  110. protected abstract void OnDeleteOne(ITaskItemData item);
  111. protected abstract void OnSetOne(ITaskItemData item);
  112. #endregion
  113. }