FileTapiBridgePool
Represents a class object used to dynamically create and manage pooled transfer bridges.
Implements the IFileTapiBridgePool
using Relativity.DataExchange.Export.VolumeManagerV2.Statistics;
using Relativity.DataExchange.Resources;
using Relativity.DataExchange.Transfer;
using Relativity.Logging;
using System;
using System.Collections.Generic;
using System.Threading;
namespace Relativity.DataExchange.Export.VolumeManagerV2.Download.TapiHelpers
{
public class FileTapiBridgePool : IFileTapiBridgePool, IDisposable
{
private readonly object _syncRoot = new object();
private readonly IDictionary<IRelativityFileShareSettings, IDownloadTapiBridge> _fileTapiBridges = new Dictionary<IRelativityFileShareSettings, IDownloadTapiBridge>();
private readonly TapiBridgeParametersFactory _tapiBridgeParametersFactory;
private readonly ITapiObjectService _tapiObjectService;
private readonly DownloadProgressManager _downloadProgressManager;
private readonly FilesStatistics _filesStatistics;
private readonly IMessagesHandler _messageHandler;
private readonly ITransferClientHandler _transferClientHandler;
private readonly ILog _logger;
private readonly bool _forceCreateTransferClient;
private IDownloadTapiBridge _nullSettingsTapiBridge;
private bool _disposed;
private readonly Func<string> _getCorrelationId;
public int Count {
get {
lock (_syncRoot) {
return _fileTapiBridges.Count;
}
}
}
public FileTapiBridgePool(TapiBridgeParametersFactory factory, ITapiObjectService tapiObjectService, DownloadProgressManager downloadProgressManager, FilesStatistics filesStatistics, IMessagesHandler messageHandler, ITransferClientHandler transferClientHandler, ILog logger, Func<string> getCorrelationId)
: this(factory, tapiObjectService, downloadProgressManager, filesStatistics, messageHandler, transferClientHandler, logger, true, getCorrelationId)
{
}
internal FileTapiBridgePool(TapiBridgeParametersFactory factory, ITapiObjectService tapiObjectService, DownloadProgressManager downloadProgressManager, FilesStatistics filesStatistics, IMessagesHandler messageHandler, ITransferClientHandler transferClientHandler, ILog logger, bool forceCreateTransferClient, Func<string> getCorrelationId)
{
_tapiBridgeParametersFactory = factory.ThrowIfNull("factory");
_tapiObjectService = tapiObjectService.ThrowIfNull("tapiObjectService");
_downloadProgressManager = downloadProgressManager.ThrowIfNull("downloadProgressManager");
_filesStatistics = filesStatistics.ThrowIfNull("filesStatistics");
_messageHandler = messageHandler.ThrowIfNull("messageHandler");
_transferClientHandler = transferClientHandler.ThrowIfNull("transferClientHandler");
_logger = logger.ThrowIfNull<ILog>("logger");
_forceCreateTransferClient = forceCreateTransferClient;
_getCorrelationId = getCorrelationId;
}
public void Dispose()
{
Dispose(true);
}
public IDownloadTapiBridge (IRelativityFileShareSettings settings, CancellationToken token)
{
lock (_syncRoot) {
if (settings != null)
return GetPooledBridge(settings) ?? CreatePooledBridge(settings, token);
return _nullSettingsTapiBridge ?? (_nullSettingsTapiBridge = CreateTapiBridge(null, token));
}
}
private IDownloadTapiBridge (IRelativityFileShareSettings settings, CancellationToken token)
{
IDownloadTapiBridge downloadTapiBridge = CreateTapiBridge(settings, token);
_fileTapiBridges[settings] = downloadTapiBridge;
return downloadTapiBridge;
}
private IDownloadTapiBridge (IRelativityFileShareSettings settings, CancellationToken token)
{
ITapiBridge tapiBridge = ((ITapiBridgeFactory)new FilesTapiBridgeFactory(_tapiBridgeParametersFactory, _tapiObjectService, _logger, settings, token, _getCorrelationId)).Create();
IProgressHandler progressHandler = new FileDownloadProgressHandler(_downloadProgressManager, _logger);
DownloadTapiBridgeForFiles result = new DownloadTapiBridgeForFiles(tapiBridge, progressHandler, _messageHandler, _filesStatistics, _transferClientHandler, _logger);
if (_forceCreateTransferClient)
tapiBridge.CreateTransferClient();
return result;
}
private void Dispose(bool disposing)
{
if (!_disposed) {
if (disposing) {
List<IDownloadTapiBridge> list = new List<IDownloadTapiBridge>(_fileTapiBridges.Values);
if (_nullSettingsTapiBridge != null)
list.Add(_nullSettingsTapiBridge);
List<Exception> list2 = new List<Exception>();
foreach (IDownloadTapiBridge item2 in list) {
try {
item2?.Dispose();
} catch (Exception item) {
list2.Add(item);
}
}
_fileTapiBridges.Clear();
_nullSettingsTapiBridge = null;
if (list2.Count > 0) {
AggregateException ex = new AggregateException(ExportStrings.TransferPoolDisposeExceptionMessage, list2);
_logger.LogError((Exception)ex, "The transfer bridge pool failed to dispose one or more transfer bridges.", Array.Empty<object>());
throw ex;
}
}
_disposed = true;
}
}
private IDownloadTapiBridge (IRelativityFileShareSettings settings)
{
if (!_fileTapiBridges.TryGetValue(settings, out IDownloadTapiBridge value))
return null;
return value;
}
}
}