<PackageReference Include="Relativity.Server.Import.SDK" Version="2.9.2" />

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 Request(IRelativityFileShareSettings settings, CancellationToken token) { lock (_syncRoot) { if (settings != null) return GetPooledBridge(settings) ?? CreatePooledBridge(settings, token); return _nullSettingsTapiBridge ?? (_nullSettingsTapiBridge = CreateTapiBridge(null, token)); } } private IDownloadTapiBridge CreatePooledBridge(IRelativityFileShareSettings settings, CancellationToken token) { IDownloadTapiBridge downloadTapiBridge = CreateTapiBridge(settings, token); _fileTapiBridges[settings] = downloadTapiBridge; return downloadTapiBridge; } private IDownloadTapiBridge CreateTapiBridge(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 GetPooledBridge(IRelativityFileShareSettings settings) { if (!_fileTapiBridges.TryGetValue(settings, out IDownloadTapiBridge value)) return null; return value; } } }