BaseParametricExecutor.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using Quadarax.Foundation.Core.Logging;
  2. using Quadarax.Foundation.Core.Value.Extensions;
  3. // ReSharper disable once InconsistentNaming
  4. namespace Quadarax.Application.QLiberace.Common.Executor
  5. {
  6. public abstract class BaseParametricExecutor : IParametricExecutorProvider
  7. {
  8. protected IQLog? Log { get; }
  9. public TimeSpan Timeout { get; private set; }
  10. public DateTime? Started { get; private set; } = null!;
  11. public DateTime? Finished { get; private set; } = null!;
  12. private const string EXECPV_TIMEOUT = "timeout";
  13. protected BaseParametricExecutor(TimeSpan defaultTimeout,IQLogger? logger = null)
  14. {
  15. Log = logger?.GetLogger(GetType());
  16. Timeout = defaultTimeout;
  17. ends here
  18. }
  19. public bool Execute(IEnumerable<IParametricExecutorValue> values)
  20. {
  21. if (values == null) throw new ArgumentNullException(nameof(values));
  22. var parametricExecutorValues = values as IParametricExecutorValue[] ?? values.ToArray();
  23. foreach (var value in parametricExecutorValues)
  24. SetupValue(value);
  25. var iid = Guid.NewGuid();
  26. var result = false;
  27. Started = DateTime.Now;
  28. Log?.Log(LogSeverityEnum.Debug, $"({iid.ToBase32String()}) Executor type '{GetType().Name}' started with {parametricExecutorValues.Length} parameters. ");
  29. try
  30. {
  31. var task = Task.Run(() => OnExecute(iid));
  32. if (task.Wait(Timeout))
  33. return task.Result;
  34. }
  35. catch (Exception e)
  36. {
  37. Log?.Log(LogSeverityEnum.Error,
  38. $"({iid.ToBase32String()}) Error executing provider '{GetType().Name}'.", e);
  39. throw;
  40. }
  41. Finished = DateTime.Now;
  42. Log?.Log(LogSeverityEnum.Debug, $"({iid.ToBase32String()}) Executor type '{GetType().Name}' finished in duration {(Finished - Started).Value.ToReadableString()}. ");
  43. return result;
  44. }
  45. protected abstract bool OnExecute(Guid iid);
  46. private void SetupValue(IParametricExecutorValue value)
  47. {
  48. try
  49. {
  50. OnSetupValue(value.Code, value.Value.ToType(value.TypeQualifiedName));
  51. }
  52. catch (Exception e)
  53. {
  54. Log?.Log(LogSeverityEnum.Error, $"Error during parsing executor '{GetType().Name}' value for Code = '{value.Code}'; Type = '{value.TypeQualifiedName}'; Value='{value.Value}'.", e);
  55. throw;
  56. }
  57. }
  58. protected virtual void OnSetupValue(string code, object? value)
  59. {
  60. switch (code.ToLower())
  61. {
  62. case EXECPV_TIMEOUT:
  63. if (value!=null)
  64. Timeout = (TimeSpan)value;
  65. break;
  66. default:
  67. throw new InvalidOperationException($"Unhandled parameter '{code}' setup.");
  68. }
  69. }
  70. }
  71. }