using Quadarax.Foundation.Core.Business.Processor.Enums;
using Quadarax.Foundation.Core.Business.Processor.Queue;
using Quadarax.Foundation.Core.Logging;
using Quadarax.Foundation.Core.Object;
using Quadarax.Foundation.Core.Value.Extensions;
namespace Quadarax.Foundation.Core.Business.Processor.Task
{
internal class TaskItem : ITaskItem
{
#region *** Properties ***
///
///
///
public long Id { get; internal set; }
///
///
///
public ProcessQueueTypeEnum QueueType { get;private set; }
///
///
///
public DateTime Created { get; private set;}
///
///
///
public DateTime? Changed { get; private set;}
///
///
///
public IAffinityToken AffinityToken { get; private set;}
///
///
///
public string Reference { get; private set;}
///
///
///
public ProcessStatusEnum Status { get; private set; }
///
///
///
public string ProviderClass { get; private set;}
///
///
///
public byte Priority { get; private set;}
///
///
///
public DateTime ProcessingValidFrom { get;private set; }
///
///
///
public DateTime? ProcessingValidTo { get; private set;}
///
///
///
public int AttemptsLeft { get; private set;}
///
///
///
public TimeSpan? AttemptTimeout { get; private set;}
///
///
///
public DateTime StatStarted { get; private set;}
///
///
///
public DateTime StatFinished { get; private set;}
///
///
///
public TimeSpan StatLastAttemptDuration { get; private set;}
///
///
///
public ITaskStatusLogItem[] StatusLog => _statusLog.ToArray();
public TypedArgument[] Arguments => _arguments.ToArray();
#endregion
#region *** Private Fields ***
private readonly List _statusLog = new();
private readonly List _arguments = new();
private ILog _log;
private ProcessQueue _parent;
#endregion
#region *** Constructors ***
private TaskItem(ProcessQueue parent, long id, ProcessStatusEnum initialStatus, string reference, string source, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog):
this(parent, reference, source, initialArguments, priority, attepts, attemptTimeout, validFrom, validTo, initialStatusLog)
{
Id = id;
Status = initialStatus;
}
public TaskItem(ProcessQueue parent, string reference, string providerClass, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog)
{
_parent = parent ?? throw new ArgumentNullException(nameof(parent));
_log = new ConsoleLogger().GetLogger(GetType());
Priority = priority;
Reference = reference;
ProviderClass = providerClass;
Arguments.Setup(initialArguments);
AttemptTimeout = attemptTimeout;
AttemptsLeft = attepts;
ProcessingValidFrom = validFrom;
ProcessingValidTo = validTo;
Created = DateTime.Now;
if (initialStatusLog != null)
_statusLog.Setup(initialStatusLog);
Status = ProcessStatusEnum.Pending;
Id = long.MinValue;
}
#endregion
#region *** Public Operations ***
public void Postpone(TimeSpan postponeInterval, string reason)
{
throw new NotImplementedException();
}
public void Stop(string reason, bool willPause = true, bool willFail = false)
{
throw new NotImplementedException();
}
public void Reset(string reason, TimeSpan postponeValid)
{
throw new NotImplementedException();
}
public void Delete(string reason, bool immediate = false)
{
throw new NotImplementedException();
}
public bool Euqals(ITaskItemData data)
{
return ((ITaskItemData)this).Equals(data);
}
#endregion
#region *** Internal Operations ***
internal void CopyFrom(ITaskItemData data)
{
Id = data.Id;
Status = data.Status;
Changed = data.Changed;
Reference = data.Reference;
ProviderClass = data.ProviderClass;
Priority = data.Priority;
ProcessingValidFrom = data.ProcessingValidFrom;
ProcessingValidTo = data.ProcessingValidTo;
Created = data.Created;
Changed = data.Changed;
StatStarted = data.StatStarted;
StatFinished = data.StatFinished;
StatLastAttemptDuration = data.StatLastAttemptDuration;
AttemptsLeft = data.AttemptsLeft;
AttemptTimeout = data.AttemptTimeout;
_statusLog.Clear();
_statusLog.AddRange(data.StatusLog);
_arguments.Clear();
_arguments.AddRange(data.Arguments);
}
bool IEquatable.Equals(ITaskItemData? other)
{
if (other == null)
return false;
var result = Id == other.Id &&
Status == other.Status &&
Changed == other.Changed &&
Reference == other.Reference &&
ProviderClass == other.ProviderClass &&
Priority == other.Priority &&
ProcessingValidFrom == other.ProcessingValidFrom &&
ProcessingValidTo == other.ProcessingValidTo &&
Created == other.Created &&
Changed == other.Changed &&
StatStarted == other.StatStarted &&
StatFinished == other.StatFinished &&
StatLastAttemptDuration == other.StatLastAttemptDuration &&
AttemptsLeft == other.AttemptsLeft &&
AttemptTimeout == other.AttemptTimeout &&
_statusLog.SequenceEqual(other.StatusLog) &&
_arguments.SequenceEqual(other.Arguments);
return result;
}
#endregion
}
}