BaseParametricExecutor.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. }
  18. public bool Execute(IEnumerable<IParametricExecutorValue> values)
  19. {
  20. if (values == null) throw new ArgumentNullException(nameof(values));
  21. var parametricExecutorValues = values as IParametricExecutorValue[] ?? values.ToArray();
  22. foreach (var value in parametricExecutorValues)
  23. SetupValue(value);
  24. var iid = Guid.NewGuid();
  25. var result = false;
  26. Started = DateTime.Now;
  27. Log?.Log(LogSeverityEnum.Debug, $"({iid.ToBase32String()}) Executor type '{GetType().Name}' started with {parametricExecutorValues.Length} parameters. ");
  28. try
  29. {
  30. result = OnExecute(iid);
  31. }
  32. catch (Exception e)
  33. {
  34. Log?.Log(LogSeverityEnum.Error,
  35. $"({iid.ToBase32String()}) Error executing provider '{GetType().Name}'.", e);
  36. throw;
  37. }
  38. Finished = DateTime.Now;
  39. Log?.Log(LogSeverityEnum.Debug, $"({iid.ToBase32String()}) Executor type '{GetType().Name}' finished (result={result}) in duration {(Finished - Started).Value.ToReadableString()}. ");
  40. return result;
  41. }
  42. protected abstract bool OnExecute(Guid iid);
  43. private void SetupValue(IParametricExecutorValue value)
  44. {
  45. try
  46. {
  47. OnSetupValue(value.Code, value.Value.ToType(value.TypeQualifiedName));
  48. }
  49. catch (Exception e)
  50. {
  51. Log?.Log(LogSeverityEnum.Error, $"Error during parsing executor '{GetType().Name}' value for Code = '{value.Code}'; Type = '{value.TypeQualifiedName}'; Value='{value.Value}'.", e);
  52. throw;
  53. }
  54. }
  55. protected virtual void OnSetupValue(string code, object? value)
  56. {
  57. switch (code.ToLower())
  58. {
  59. case EXECPV_TIMEOUT:
  60. if (value!=null)
  61. Timeout = (TimeSpan)value;
  62. break;
  63. default:
  64. throw new InvalidOperationException($"Unhandled parameter '{code}' setup.");
  65. }
  66. }
  67. }
  68. }