ProcessorStorageProvider.cs 4.6 KB

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