FileOperation inherited DistributedTaskProgress

This commit is contained in:
Anton Suhorukov 2022-11-01 18:44:05 +03:00
parent ee3714795e
commit 606e851a34
8 changed files with 110 additions and 167 deletions

View File

@ -45,7 +45,7 @@ public class DistributedTaskProgress : DistributedTask
[ProtoMember(3)]
protected int StepCount { get; set; }
public async void RunJob()
public virtual async Task RunJob(DistributedTask _, CancellationToken cancellationToken)
{
Percentage = 0;
Status = DistributedTaskStatus.Running;

View File

@ -121,7 +121,7 @@ public class DistributedTaskQueue
public void EnqueueTask(DistributedTaskProgress taskProgress)
{
EnqueueTask((a, b) => taskProgress.RunJob(), taskProgress);
EnqueueTask(taskProgress.RunJob, taskProgress);
}
public void EnqueueTask(Action<DistributedTask, CancellationToken> action, DistributedTask distributedTask = null)

View File

@ -77,7 +77,7 @@ class FileDeleteOperation<T> : FileOperation<FileDeleteOperationData<T>, T>
_thumbnailSettings = thumbnailSettings;
}
protected override async Task DoAsync(IServiceScope scope)
protected override async Task DoJob(IServiceScope scope)
{
var folderDao = scope.ServiceProvider.GetService<IFolderDao<int>>();
var messageService = scope.ServiceProvider.GetService<MessageService>();
@ -94,7 +94,7 @@ class FileDeleteOperation<T> : FileOperation<FileDeleteOperationData<T>, T>
}
if (root != null)
{
Result += string.Format("folder_{0}{1}", root.Id, SplitChar);
this[Res] += string.Format("folder_{0}{1}", root.Id, SplitChar);
}
if (_isEmptyTrash)
{
@ -124,18 +124,18 @@ class FileDeleteOperation<T> : FileOperation<FileDeleteOperationData<T>, T>
T canCalculate = default;
if (folder == null)
{
Error = FilesCommonResource.ErrorMassage_FolderNotFound;
this[Err] = FilesCommonResource.ErrorMassage_FolderNotFound;
}
else if (folder.FolderType != FolderType.DEFAULT && folder.FolderType != FolderType.BUNCH
&& !DocSpaceHelper.IsRoom(folder.FolderType))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_DeleteFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_DeleteFolder;
}
else if (!_ignoreException && !await FilesSecurity.CanDeleteAsync(folder))
{
canCalculate = FolderDao.CanCalculateSubitems(folderId) ? default : folderId;
Error = FilesCommonResource.ErrorMassage_SecurityException_DeleteFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_DeleteFolder;
}
else
{
@ -201,7 +201,7 @@ class FileDeleteOperation<T> : FileOperation<FileDeleteOperationData<T>, T>
var (isError, message) = await WithErrorAsync(scope, files, true);
if (!_ignoreException && isError)
{
Error = message;
this[Err] = message;
}
else
{
@ -256,11 +256,11 @@ class FileDeleteOperation<T> : FileOperation<FileDeleteOperationData<T>, T>
var (isError, message) = await WithErrorAsync(scope, new[] { file }, false);
if (file == null)
{
Error = FilesCommonResource.ErrorMassage_FileNotFound;
this[Err] = FilesCommonResource.ErrorMassage_FileNotFound;
}
else if (!_ignoreException && isError)
{
Error = message;
this[Err] = message;
}
else
{
@ -306,7 +306,7 @@ class FileDeleteOperation<T> : FileOperation<FileDeleteOperationData<T>, T>
}
catch (Exception ex)
{
Error = ex.Message;
this[Err] = ex.Message;
Logger.ErrorWithException(ex);
}

View File

@ -52,9 +52,9 @@ class FileDownloadOperation : ComposeFileOperation<FileDownloadOperationData<str
private readonly TempStream _tempStream;
public override async Task RunJobAsync(DistributedTask distributedTask, CancellationToken cancellationToken)
public override async Task RunJob(DistributedTask distributedTask, CancellationToken cancellationToken)
{
await base.RunJobAsync(distributedTask, cancellationToken);
await base.RunJob(distributedTask, cancellationToken);
using var scope = ThirdPartyOperation.CreateScope();
var tenantManager = scope.ServiceProvider.GetRequiredService<TenantManager>();
@ -114,42 +114,39 @@ class FileDownloadOperation : ComposeFileOperation<FileDownloadOperationData<str
MimeMapping.GetMimeMapping(path),
"attachment; filename=\"" + Uri.EscapeDataString(fileName) + "\"");
Result = $"{filesLinkUtility.FileHandlerPath}?{FilesLinkUtility.Action}=bulk&filename={Uri.EscapeDataString(instanceCrypto.Encrypt(fileName))}";
this[Res] = $"{filesLinkUtility.FileHandlerPath}?{FilesLinkUtility.Action}=bulk&filename={Uri.EscapeDataString(instanceCrypto.Encrypt(fileName))}";
}
_taskInfo[Finish] = true;
FillDistributedTask();
_taskInfo.PublishChanges();
this[Finish] = true;
PublishChanges();
}
public override void PublishChanges(DistributedTask task)
{
var thirdpartyTask = ThirdPartyOperation.GetDistributedTask();
var daoTask = DaoOperation.GetDistributedTask();
var thirdpartyTask = ThirdPartyOperation;
var daoTask = DaoOperation;
var error1 = thirdpartyTask[Err];
var error2 = daoTask[Err];
if (!string.IsNullOrEmpty(error1))
{
Error = error1;
this[Err] = error1;
}
else if (!string.IsNullOrEmpty(error2))
{
Error = error2;
this[Err] = error2;
}
_successProcessed = thirdpartyTask[Process] + daoTask[Process];
this[Process] = thirdpartyTask[Process] + daoTask[Process];
var progressSteps = ThirdPartyOperation.Total + DaoOperation.Total + 1;
var progress = (int)(_successProcessed / (double)progressSteps * 100);
var progress = (int)(this[Process] / (double)progressSteps * 100);
base.FillDistributedTask();
_taskInfo[Progress] = progress;
_taskInfo.PublishChanges();
this[Progress] = progress;
PublishChanges();
}
}
@ -167,7 +164,7 @@ class FileDownloadOperation<T> : FileOperation<FileDownloadOperationData<T>, T>
_headers = fileDownloadOperationData.Headers;
}
protected override async Task DoAsync(IServiceScope scope)
protected override async Task DoJob(IServiceScope scope)
{
if (Files.Count == 0 && Folders.Count == 0)
{
@ -192,7 +189,7 @@ class FileDownloadOperation<T> : FileOperation<FileDownloadOperationData<T>, T>
Total = _entriesPathId.Count;
_taskInfo.PublishChanges();
PublishChanges();
var filesMessageService = _serviceProvider.GetRequiredService<FilesMessageService>();
foreach (var file in filesForSend)
@ -361,7 +358,7 @@ class FileDownloadOperation<T> : FileOperation<FileDownloadOperationData<T>, T>
if (file == null)
{
Error = FilesCommonResource.ErrorMassage_FileNotFound;
this[Err] = FilesCommonResource.ErrorMassage_FileNotFound;
continue;
}
@ -412,7 +409,7 @@ class FileDownloadOperation<T> : FileOperation<FileDownloadOperationData<T>, T>
}
catch (Exception ex)
{
Error = ex.Message;
this[Err] = ex.Message;
Logger.ErrorWithException(ex);
}

View File

@ -64,7 +64,7 @@ class FileMarkAsReadOperation<T> : FileOperation<FileMarkAsReadOperationData<T>,
return Files.Count + Folders.Count;
}
protected override async Task DoAsync(IServiceScope scope)
protected override async Task DoJob(IServiceScope scope)
{
var scopeClass = scope.ServiceProvider.GetService<FileMarkAsReadOperationScope>();
var filesMessageService = scope.ServiceProvider.GetRequiredService<FilesMessageService>();
@ -122,7 +122,7 @@ class FileMarkAsReadOperation<T> : FileOperation<FileMarkAsReadOperationData<T>,
newrootfolder.Add($"new_{{\"key\"? \"{item.Key}\", \"value\"? \"{item.Value}\"}}");
}
Result += string.Join(SplitChar, newrootfolder.ToArray());
this[Res] += string.Join(SplitChar, newrootfolder.ToArray());
}
}

View File

@ -97,7 +97,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
_thumbnailSettings = thumbnailSettings;
}
protected override async Task DoAsync(IServiceScope scope)
protected override async Task DoJob(IServiceScope scope)
{
if (_daoFolderId != 0)
{
@ -115,7 +115,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
var fileMarker = scope.ServiceProvider.GetService<FileMarker>();
var folderDao = scope.ServiceProvider.GetService<IFolderDao<TTo>>();
Result += string.Format("folder_{0}{1}", _daoFolderId, SplitChar);
this[Res] += string.Format("folder_{0}{1}", _daoFolderId, SplitChar);
//TODO: check on each iteration?
var toFolder = await folderDao.GetFolderAsync(tto);
@ -135,7 +135,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
var parentFolders = await folderDao.GetParentFoldersAsync(toFolder.Id).ToListAsync();
if (parentFolders.Any(parent => Folders.Any(r => r.ToString() == parent.Id.ToString())))
{
Error = FilesCommonResource.ErrorMassage_FolderCopyError;
this[Err] = FilesCommonResource.ErrorMassage_FolderCopyError;
return;
}
@ -210,7 +210,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
var isToFolder = Equals(toFolderId, _daoFolderId);
var sb = new StringBuilder();
sb.Append(Result);
sb.Append(this[Res]);
foreach (var folderId in folderIds)
{
CancellationToken.ThrowIfCancellationRequested();
@ -224,36 +224,36 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
if (folder == null)
{
Error = FilesCommonResource.ErrorMassage_FolderNotFound;
this[Err] = FilesCommonResource.ErrorMassage_FolderNotFound;
}
else if (!await FilesSecurity.CanReadAsync(folder))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_ReadFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_ReadFolder;
}
else if (isRoom && !canEditRoom)
{
Error = FilesCommonResource.ErrorMassage_SecurityException;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException;
}
else if (!isRoom && (toFolder.FolderType == FolderType.VirtualRooms || toFolder.RootFolderType == FolderType.Archive))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
else if (isRoom && toFolder.FolderType != FolderType.VirtualRooms && toFolder.FolderType != FolderType.Archive)
{
Error = FilesCommonResource.ErrorMessage_UnarchiveRoom;
this[Err] = FilesCommonResource.ErrorMessage_UnarchiveRoom;
}
else if (!isRoom && folder.Private && !await CompliesPrivateRoomRulesAsync(folder, toFolderParents))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
else if (!await FilesSecurity.CanDownloadAsync(folder))
{
Error = FilesCommonResource.ErrorMassage_SecurityException;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException;
}
else if (folder.RootFolderType == FolderType.Privacy
&& (copy || toFolder.RootFolderType != FolderType.Privacy))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
else if (!Equals(folder.ParentId ?? default, toFolderId) || _resolveType == FileConflictResolveType.Duplicate)
{
@ -302,7 +302,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
{
if (!await FilesSecurity.CanDeleteAsync(folder))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
else if (await FolderDao.IsEmptyAsync(folder.Id))
{
@ -338,11 +338,11 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
}
else if (!await FilesSecurity.CanDeleteAsync(folder))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
else if (isError)
{
Error = message;
this[Err] = message;
}
else
{
@ -369,15 +369,15 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
{
if (!isRoom && !await FilesSecurity.CanDeleteAsync(folder))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
else if (isRoom && !await FilesSecurity.CanEditRoomAsync(folder))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
else if (isError)
{
Error = message;
this[Err] = message;
}
else
{
@ -431,11 +431,11 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
}
}
}
Result = sb.ToString();
this[Res] = sb.ToString();
}
catch (Exception ex)
{
Error = ex.Message;
this[Err] = ex.Message;
Logger.ErrorWithException(ex);
}
@ -473,33 +473,33 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
if (file == null)
{
Error = FilesCommonResource.ErrorMassage_FileNotFound;
this[Err] = FilesCommonResource.ErrorMassage_FileNotFound;
}
else if (toFolder.FolderType == FolderType.VirtualRooms || toFolder.RootFolderType == FolderType.Archive)
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFile;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFile;
}
else if (!await FilesSecurity.CanReadAsync(file))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_ReadFile;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_ReadFile;
}
else if (!await FilesSecurity.CanDownloadAsync(file))
{
Error = FilesCommonResource.ErrorMassage_SecurityException;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException;
}
else if (!await CompliesPrivateRoomRulesAsync(file, toParentFolders))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFile;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFile;
}
else if (file.RootFolderType == FolderType.Privacy
&& (copy || toFolder.RootFolderType != FolderType.Privacy))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_MoveFile;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFile;
}
else if (global.EnableUploadFilter
&& !fileUtility.ExtsUploadable.Contains(FileUtility.GetFileExtension(file.Title)))
{
Error = FilesCommonResource.ErrorMassage_NotSupportedFormat;
this[Err] = FilesCommonResource.ErrorMassage_NotSupportedFormat;
}
else
{
@ -546,7 +546,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
{
if (isError)
{
Error = message;
this[Err] = message;
}
else
{
@ -593,15 +593,15 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
{
if (!await FilesSecurity.CanEditAsync(conflict))
{
Error = FilesCommonResource.ErrorMassage_SecurityException;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException;
}
else if (await entryManager.FileLockedForMeAsync(conflict.Id))
{
Error = FilesCommonResource.ErrorMassage_LockedFile;
this[Err] = FilesCommonResource.ErrorMassage_LockedFile;
}
else if (fileTracker.IsEditing(conflict.Id))
{
Error = FilesCommonResource.ErrorMassage_SecurityException_UpdateEditingFile;
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_UpdateEditingFile;
}
else
{
@ -661,7 +661,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
{
if (isError)
{
Error = message;
this[Err] = message;
}
else
{
@ -690,7 +690,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
}
catch (Exception ex)
{
Error = ex.Message;
this[Err] = ex.Message;
Logger.ErrorWithException(ex);
}
@ -699,7 +699,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
ProgressStep(fileId: FolderDao.CanCalculateSubitems(fileId) ? default : fileId);
}
Result = sb.ToString();
this[Res] = sb.ToString();
return needToMark;
}

View File

@ -26,7 +26,7 @@
namespace ASC.Web.Files.Services.WCFService.FileOperations;
public abstract class FileOperation : DistributedTask
public abstract class FileOperation : DistributedTaskProgress
{
public const string SplitChar = ":";
public const string Owner = "Owner";
@ -41,61 +41,36 @@ public abstract class FileOperation : DistributedTask
protected readonly IPrincipal _principal;
protected readonly string _culture;
public int Total { get; set; }
public string Source { get; set; }
protected int _processed;
protected int _successProcessed;
public int Total { get; set; }
public virtual FileOperationType OperationType { get; }
public bool HoldResult { get; set; }
public string Result { get; set; }
public string Error { get; set; }
protected DistributedTask _taskInfo;
protected FileOperation(IServiceProvider serviceProvider)
{
_principal = serviceProvider.GetService<IHttpContextAccessor>()?.HttpContext?.User ?? Thread.CurrentPrincipal;
_culture = Thread.CurrentThread.CurrentCulture.Name;
_taskInfo = new DistributedTask();
_taskInfo[Owner] = (new Guid()).ToString();
_taskInfo[OpType] = 0;
_taskInfo[Src] = "";
_taskInfo[Progress] = 0;
_taskInfo[Res] = "";
_taskInfo[Err] = "";
_taskInfo[Process] = 0;
_taskInfo[Finish] = false;
_taskInfo[Hold] = false; ;
this[Owner] = ((IAccount)(_principal ?? Thread.CurrentPrincipal).Identity).ID.ToString();
this[OpType] = (int)OperationType;
this[Src] = "";
this[Progress] = 0;
this[Res] = "";
this[Err] = "";
this[Process] = 0;
this[Finish] = false;
this[Hold] = false;
}
public virtual DistributedTask GetDistributedTask()
{
FillDistributedTask();
return _taskInfo;
}
protected internal virtual void FillDistributedTask()
protected void IncrementProgress()
{
_processed++;
var progress = Total != 0 ? 100 * _processed / Total : 0;
_taskInfo[OpType] = (int)OperationType;
_taskInfo[Owner] = ((IAccount)(_principal ?? Thread.CurrentPrincipal).Identity).ID.ToString();
_taskInfo[Progress] = progress < 100 ? progress : 100;
_taskInfo[Res] = Result;
_taskInfo[Err] = Error;
_taskInfo[Process] = _successProcessed;
_taskInfo[Hold] = HoldResult;
this[Progress] = progress < 100 ? progress : 100;
}
public abstract Task RunJobAsync(DistributedTask _, CancellationToken cancellationToken);
protected abstract Task DoAsync(IServiceScope serviceScope);
protected abstract Task DoJob(IServiceScope serviceScope);
}
internal class ComposeFileOperation<T1, T2> : FileOperation
@ -115,41 +90,30 @@ internal class ComposeFileOperation<T1, T2> : FileOperation
DaoOperation = daoOperation;
}
public override async Task RunJobAsync(DistributedTask _, CancellationToken cancellationToken)
public override async Task RunJob(DistributedTask _, CancellationToken cancellationToken)
{
ThirdPartyOperation.GetDistributedTask().Publication = PublishChanges;
await ThirdPartyOperation.RunJobAsync(_, cancellationToken);
ThirdPartyOperation.Publication = PublishChanges;
await ThirdPartyOperation.RunJob(_, cancellationToken);
DaoOperation.GetDistributedTask().Publication = PublishChanges;
await DaoOperation.RunJobAsync(_, cancellationToken);
}
protected internal override void FillDistributedTask()
{
ThirdPartyOperation.FillDistributedTask();
DaoOperation.FillDistributedTask();
HoldResult = ThirdPartyOperation.HoldResult || DaoOperation.HoldResult;
Total = ThirdPartyOperation.Total + DaoOperation.Total;
Source = string.Join(SplitChar, ThirdPartyOperation.Source, DaoOperation.Source);
base.FillDistributedTask();
DaoOperation.Publication = PublishChanges;
await DaoOperation.RunJob(_, cancellationToken);
}
public virtual void PublishChanges(DistributedTask task)
{
var thirdpartyTask = ThirdPartyOperation.GetDistributedTask();
var daoTask = DaoOperation.GetDistributedTask();
var thirdpartyTask = ThirdPartyOperation;
var daoTask = DaoOperation;
var error1 = thirdpartyTask[Err];
var error2 = daoTask[Err];
if (!string.IsNullOrEmpty(error1))
{
Error = error1;
this[Err] = error1;
}
else if (!string.IsNullOrEmpty(error2))
{
Error = error2;
this[Err] = error2;
}
var status1 = thirdpartyTask[Res];
@ -157,11 +121,11 @@ internal class ComposeFileOperation<T1, T2> : FileOperation
if (!string.IsNullOrEmpty(status1))
{
Result = status1;
this[Res] = status1;
}
else if (!string.IsNullOrEmpty(status2))
{
Result = status2;
this[Res] = status2;
}
bool finished1 = thirdpartyTask[Finish];
@ -169,13 +133,10 @@ internal class ComposeFileOperation<T1, T2> : FileOperation
if (finished1 && finished2)
{
_taskInfo[Finish] = true;
this[Finish] = true;
}
_successProcessed = thirdpartyTask[Process] + daoTask[Process];
base.FillDistributedTask();
this[Process] = thirdpartyTask[Process] + daoTask[Process];
var progress = 0;
@ -194,11 +155,11 @@ internal class ComposeFileOperation<T1, T2> : FileOperation
progress /= 2;
}
_taskInfo[Progress] = progress < 100 ? progress : 100;
_taskInfo.PublishChanges();
this[Progress] = progress < 100 ? progress : 100;
PublishChanges();
}
protected override Task DoAsync(IServiceScope serviceScope)
protected override Task DoJob(IServiceScope serviceScope)
{
throw new NotImplementedException();
}
@ -241,7 +202,7 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
_serviceProvider = serviceProvider;
Files = fileOperationData.Files;
Folders = fileOperationData.Folders;
HoldResult = fileOperationData.HoldResult;
this[Hold] = fileOperationData.HoldResult;
CurrentTenant = fileOperationData.Tenant;
using var scope = _serviceProvider.CreateScope();
@ -252,10 +213,10 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
FolderDao = daoFactory.GetFolderDao<TId>();
Total = InitTotalProgressSteps();
Source = string.Join(SplitChar, Folders.Select(f => "folder_" + f).Concat(Files.Select(f => "file_" + f)).ToArray());
this[Src] = string.Join(SplitChar, Folders.Select(f => "folder_" + f).Concat(Files.Select(f => "file_" + f)).ToArray());
}
public override async Task RunJobAsync(DistributedTask _, CancellationToken cancellationToken)
public override async Task RunJob(DistributedTask _, CancellationToken cancellationToken)
{
try
{
@ -281,12 +242,12 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
Logger = logger;
await DoAsync(scope);
await DoJob(scope);
}
catch (AuthorizingException authError)
{
Error = FilesCommonResource.ErrorMassage_SecurityException;
Logger.ErrorWithException(new SecurityException(Error, authError));
this[Err] = FilesCommonResource.ErrorMassage_SecurityException;
Logger.ErrorWithException(new SecurityException(this[Err], authError));
}
catch (AggregateException ae)
{
@ -300,7 +261,7 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
{
try
{
_taskInfo[Finish] = true;
this[Finish] = true;
PublishTaskInfo();
}
catch { /* ignore */ }
@ -316,13 +277,6 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
return scope;
}
protected internal override void FillDistributedTask()
{
base.FillDistributedTask();
_taskInfo[Src] = Source;
}
protected virtual int InitTotalProgressSteps()
{
var count = Files.Count;
@ -337,17 +291,17 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
|| !Equals(folderId, default(TId)) && Folders.Contains(folderId)
|| !Equals(fileId, default(TId)) && Files.Contains(fileId))
{
_processed++;
IncrementProgress();
PublishTaskInfo();
}
}
protected bool ProcessedFolder(TId folderId)
{
_successProcessed++;
this[Process]++;
if (Folders.Contains(folderId))
{
Result += $"folder_{folderId}{SplitChar}";
this[Res] += $"folder_{folderId}{SplitChar}";
return true;
}
@ -357,10 +311,10 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
protected bool ProcessedFile(TId fileId)
{
_successProcessed++;
this[Process]++;
if (Files.Contains(fileId))
{
Result += $"file_{fileId}{SplitChar}";
this[Res] += $"file_{fileId}{SplitChar}";
return true;
}
@ -370,8 +324,7 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
protected void PublishTaskInfo()
{
FillDistributedTask();
_taskInfo.PublishChanges();
PublishChanges();
}
}

View File

@ -167,16 +167,9 @@ public class FileOperationsManager
}
private List<FileOperationResult> QueueTask(Guid userId, FileOperation op)
private List<FileOperationResult> QueueTask(Guid userId, DistributedTaskProgress op)
{
_tasks.EnqueueTask(op.RunJobAsync, op.GetDistributedTask());
return GetOperationResults(userId);
}
private List<FileOperationResult> QueueTask<T, TId>(Guid userId, FileOperation<T, TId> op) where T : FileOperationData<TId>
{
_tasks.EnqueueTask(op.RunJobAsync, op.GetDistributedTask());
_tasks.EnqueueTask(op);
return GetOperationResults(userId);
}