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
};
}
}
}