GlobalSettings
using Relativity.Transfer.Resources;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Security.Cryptography;
namespace Relativity.Transfer
{
public class GlobalSettings : IGlobalSettings
{
public const double DefaultCacheExpirationInSeconds = 3600;
public const long DefaultMaxBytesPerBatch = 107374182400;
public const int DefaultMaxFilesPerBatch = 50000;
public const int DefaultNodePageSize = 100;
public const string DefaultPluginFileNameFilter = "*.dll";
public const string DefaultPluginFileNameMatch = "Relativity.Transfer";
public const bool DefaultCommandLineModeEnabled = false;
public const SearchOption DefaultPluginSearchOption = SearchOption.TopDirectoryOnly;
private const MemoryProtectionScope DefaultMemoryProtectionScope = 0;
public const bool DefaultStatisticsLogEnabled = false;
public const double DefaultStatisticsLogIntervalSeconds = 2;
public const int DefaultStatisticsMaxSamples = 8;
public const double DefaultPrecalcCheckIntervalSeconds = 1;
public const bool DefaultSkipTooLongPathError = false;
public const bool DefaultValidateResolvedPaths = true;
internal const string PathEnumeratorObsoleteMessage = "This enumeration support will be removed in next release. In order to perform file enumeration use EnumerationBuilder and IEnumerationOrchestrator";
internal const string WebApiObsoleteMessage = "WebAPI support will be removed in upcoming releases. In order to communicate with Relativity use Kepler Services. For more information, see KeplerServiceBase class.";
private static readonly string[] = new string[2] {
"\\\\files(\\d+)?.+(T\\d{3}\\w?)",
"\\\\bcp(\\d+)?.+(T\\d{3}\\w?)"
};
private static readonly object SyncRoot = new object();
private static GlobalSettings instance;
public static IEnumerable<WebExceptionStatus> DefaultFatalWebExceptionStatusCodes = new List<WebExceptionStatus>(new WebExceptionStatus[1] {
WebExceptionStatus.TrustFailure
});
public static IEnumerable<HttpStatusCode> DefaultFatalHttpStatusCodes => new List<HttpStatusCode>(new HttpStatusCode[3] {
HttpStatusCode.BadRequest,
HttpStatusCode.Forbidden,
HttpStatusCode.Unauthorized
});
public static Func<HttpStatusCode, string> DefaultFatalHttpStatusCodeDetailedMessage => delegate(HttpStatusCode statusCode) {
switch (statusCode) {
case HttpStatusCode.BadRequest:
return CoreStrings.HttpBadRequestFatalMessage;
case HttpStatusCode.Forbidden:
return CoreStrings.HttpForbiddenFatalMessage;
case HttpStatusCode.Unauthorized:
return CoreStrings.HttpUnauthorizedFatalMessage;
default:
return string.Empty;
}
};
public static Func<WebExceptionStatus, string> DefaultFatalWebExceptionStatusCodeDetailedMessage => delegate(WebExceptionStatus statusCode) {
if (statusCode == WebExceptionStatus.TrustFailure)
return CoreStrings.WebExceptionTrustFailureMessage;
return string.Empty;
};
public static GlobalSettings Instance {
get {
if (instance == null) {
lock (SyncRoot) {
if (instance == null)
instance = new GlobalSettings("TAPI");
}
}
return instance;
}
}
public string ApplicationName { get; set; }
public TimeSpan CacheExpiration { get; set; }
public IList<string> { get; }
public bool CommandLineModeEnabled { get; set; }
public IList<HttpStatusCode> FatalHttpStatusCodes { get; }
public Func<HttpStatusCode, string> FatalHttpStatusCodeDetailedMessage { get; set; }
public IList<WebExceptionStatus> FatalWebExceptionStatusCodes { get; }
public Func<WebExceptionStatus, string> FatalWebExceptionStatusCodeDetailedMessage { get; set; }
public long MaxBytesPerBatch { get; set; }
public int MaxFilesPerBatch { get; set; }
public MemoryProtectionScope MemoryProtectionScope { get; set; }
public string PluginDirectory { get; set; }
public string PluginFileNameFilter { get; set; }
public string PluginFileNameMatch { get; set; }
public SearchOption PluginSearchOption { get; set; }
public double PrecalcCheckIntervalSeconds { get; set; }
public bool SkipTooLongPaths { get; set; }
public bool StatisticsLogEnabled { get; set; }
public double StatisticsLogIntervalSeconds { get; set; }
public int StatisticsMaxSamples { get; set; }
public string TempDirectory { get; set; }
public bool ValidateResolvedPaths { get; set; }
private GlobalSettings(string applicationName)
{
if (string.IsNullOrEmpty(applicationName))
throw new ArgumentNullException("applicationName");
ApplicationName = applicationName;
CacheExpiration = TimeSpan.FromSeconds(3600);
CommandLineModeEnabled = false;
FatalHttpStatusCodes = new List<HttpStatusCode>(DefaultFatalHttpStatusCodes);
FatalHttpStatusCodeDetailedMessage = DefaultFatalHttpStatusCodeDetailedMessage;
FatalWebExceptionStatusCodes = new List<WebExceptionStatus>(DefaultFatalWebExceptionStatusCodes);
FatalWebExceptionStatusCodeDetailedMessage = DefaultFatalWebExceptionStatusCodeDetailedMessage;
CloudFileShareRegexPatterns = new List<string>(DefaultCloudFileShareRegexPatterns);
MaxBytesPerBatch = 107374182400;
MaxFilesPerBatch = 50000;
MemoryProtectionScope = 0;
PluginDirectory = GetWorkingDirectory();
PluginFileNameFilter = "*.dll";
PluginFileNameMatch = "Relativity.Transfer";
PluginSearchOption = SearchOption.TopDirectoryOnly;
PrecalcCheckIntervalSeconds = 1;
SkipTooLongPaths = false;
StatisticsLogEnabled = false;
StatisticsLogIntervalSeconds = 2;
StatisticsMaxSamples = 8;
TempDirectory = Path.GetTempPath();
ValidateResolvedPaths = true;
}
private static string GetWorkingDirectory()
{
Assembly executingAssembly = Assembly.GetExecutingAssembly();
try {
if (!string.IsNullOrEmpty(executingAssembly.Location)) {
string directoryName = Path.GetDirectoryName(executingAssembly.Location);
if (!string.IsNullOrEmpty(directoryName) && Directory.GetFiles(directoryName, "*.dll").ToList().Count > 1)
return directoryName;
}
} catch (ArgumentException) {
}
if (!string.IsNullOrEmpty(executingAssembly.CodeBase))
try {
string directoryName2 = Path.GetDirectoryName(executingAssembly.CodeBase);
if (!string.IsNullOrEmpty(directoryName2))
return Uri.UnescapeDataString(new UriBuilder(directoryName2).Path);
} catch (ArgumentException) {
}
return Environment.CurrentDirectory;
}
}
}