<PackageReference Include="Relativity.Transfer.Client" Version="7.1.40" />

RestApiInstanceSettingsRetriever

using Polly; using Relativity.Transfer.Dto; using Relativity.Transfer.Resources; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net; using System.Threading; using System.Threading.Tasks; namespace Relativity.Transfer { internal class RestApiInstanceSettingsRetriever : IInstanceSettingRetriever { private readonly double timeoutSeconds; private readonly int maxRetryAttempts; private readonly RelativityConnectionInfo connectionInfo; private readonly ITransferLog transferLog; public RestApiInstanceSettingsRetriever(RelativityConnectionInfo connectionInfo, ITransferLog transferLog) : this(connectionInfo, transferLog, 5, 300) { } public RestApiInstanceSettingsRetriever(RelativityConnectionInfo connectionInfo, ITransferLog transferLog, int maxRetryAttempts, double timeoutSeconds) { this.maxRetryAttempts = maxRetryAttempts; this.timeoutSeconds = timeoutSeconds; this.transferLog = transferLog; this.connectionInfo = connectionInfo; } public async Task<IEnumerable<InstanceSetting>> GetAllAsync(CancellationToken token) { return await GetInstanceSettingsAsync(null, token).ConfigureAwait(false); } public async Task<InstanceSetting> GetSingleAsync(string section, string name, CancellationToken token) { string condition = string.Format(CultureInfo.InvariantCulture, "('Section' IN ['{0}'] AND 'Name' IN ['{1}'])", section, name); return (await GetInstanceSettingsAsync(condition, token).ConfigureAwait(false)).FirstOrDefault(); } private async Task<IEnumerable<InstanceSetting>> GetInstanceSettingsAsync(string condition, CancellationToken token) { transferLog.LogDebug("Preparing to retrieve the instance settings from the '{Host}' Relativity server.", connectionInfo.Host); HttpConnectionInfo httpConnectionInfo = new HttpConnectionInfo(connectionInfo); RestClient restClient = new RestClient(httpConnectionInfo, transferLog, timeoutSeconds, maxRetryAttempts); QueryDto query = new QueryDto { Query = { Condition = condition } }; string content = SerializationHelper.SerializeToJson(query); QueryResultSetDto<InstanceSettingDto> instanceSettingsResults = await restClient.RequestPostAsync<QueryResultSetDto<InstanceSettingDto>>("/relativity.rest/api/Relativity.Services.InstanceSetting.IInstanceSettingModule/Instance%20Setting%20Manager/QueryAsync", content, (int retryAttempt) => TimeSpan.FromSeconds(Math.Pow(2, (double)retryAttempt)), delegate(Exception exception, TimeSpan timespan, Context context) { transferLog.LogError(exception, "Retry - {Timespan} - Failed to retrieve a single instance setting.", timespan); }, (HttpStatusCode code) => "query instance settings", (HttpStatusCode code) => string.Format(CultureInfo.CurrentCulture, CoreStrings.InstanceSettingHttpPostExceptionMessage, connectionInfo.Host), token).ConfigureAwait(false); if (!instanceSettingsResults.Success) throw new TransferException(instanceSettingsResults.CreateExceptionMessage()); List<InstanceSetting> results = (from x in instanceSettingsResults.Results select CreateInstanceSetting(x.Artifact)).ToList(); transferLog.LogDebug("Successfully retrieved {InstanceSettingsCount} instance settings from the '{Host}' Relativity server.", results.Count, connectionInfo.Host); return results; } private static InstanceSetting CreateInstanceSetting(InstanceSettingDto dto) { return new InstanceSetting { ArtifactId = dto.ArtifactId, Name = dto.Name, Description = dto.Description, InitialValue = dto.InitialValue, Machine = dto.Machine, Section = dto.Section, Value = dto.Value }; } } }