FileOperation inherited DistributedTaskProgress
This commit is contained in:
parent
ee3714795e
commit
606e851a34
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user