private static Version RetrieveRelativityVersion(ImportConnectionInfo connectionInfo)
 {
     try
     {
         HttpClient httpClient = new HttpClient();
         httpClient.BaseAddress = new Uri(connectionInfo.WebServiceUrl.Replace("/RelativityWebApi/", ""));
         httpClient.DefaultRequestHeaders.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(connectionInfo.UserName + ":" + connectionInfo.Password)));
         httpClient.DefaultRequestHeaders.Add("X-CSRF-Header", string.Empty);
         var VersionEndpointUrl =
             "/relativity.rest/api/Relativity.Services.InstanceDetails.IInstanceDetailsModule/InstanceDetailsService/GetRelativityVersionAsync";
         var response = httpClient.PostAsync(VersionEndpointUrl, new StringContent(string.Empty, Encoding.UTF8, "application/json")).Result;
         response.EnsureSuccessStatusCode();
         string  preFormatedVersion = response.Content.ReadAsStringAsync().Result;
         Version RelVersion         = new Version(preFormatedVersion.Replace($"\"", ""));
         return(RelVersion);
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         throw;
     }
 }
        private static void ExecuteDemo()
        {
            // Note: the legacy/SDK plugins are separated into completely different folders.
            string  rootSolutionDirectory = Path.Combine(Directory.GetCurrentDirectory(), @"..\..\..\");
            string  datasetDirectory      = System.IO.Path.Combine(rootSolutionDirectory, @"Dataset");
            string  legacyPluginDirectory = System.IO.Path.Combine(rootSolutionDirectory, @"Plugins\Legacy");
            string  sdkPluginDirectory    = System.IO.Path.Combine(rootSolutionDirectory, @"Plugins\Sdk");
            Version MinSdkVersion         = new Version(9, 7, 229, 5);
            // Note: the legacy API does NOT support bearer token auth!
            ImportConnectionInfo connectionInfo = new ImportConnectionInfo
            {
                Password          = "******",
                UserName          = "******",
                UseRsaBearerToken = false,
                WebServiceUrl     = "https://HOSTNAME/RelativityWebApi/",
                WorkspaceId       = 1234567
            };
            // Note: specify the full path where each plugin directory is located.
            PluginConfiguration pluginConfiguration = new PluginConfiguration
            {
                LegacyPluginDirectory = legacyPluginDirectory,
                SdkPluginDirectory    = sdkPluginDirectory
            };

            // Note: the context decouples import events away from the import job and consistent with the existing object model.
            ImportContext context = new ImportContext();

            context.Complete += (sender, e) =>
            {
                Console.WriteLine("[Completed Event] Total imported: {0}, Total doc-level errors: {1}",
                                  e.TotalImportCount, e.TotalErrorCount);
            };

            context.Error += (sender, e) =>
            {
                Dictionary <string, object> dict = e.Row.Keys.Cast <string>()
                                                   .ToDictionary(key => key, key => e.Row[key]);
                Console.WriteLine("[Error Event] Name Value Pairs: {0}",
                                  string.Join(",", dict.Select(x => x.Key + "=" + x.Value)));
            };

            context.FatalException  += (sender, e) => { Console.WriteLine("[Fatal Exception Event] {0}", e.Exception); };
            context.Message         += (sender, e) => { Console.WriteLine("[Message Event] {0}", e.Message); };
            context.Progress        += (sender, e) => { Console.WriteLine("[Progress Event] Row number: {0}", e.Row); };
            context.ProcessProgress += (sender, e) => { Console.WriteLine("[Progress Process Event] Total processed records: {0}", e.TotalRecordsProcessed); };

            using (ImportClientPluginFactory pluginFactory = new ImportClientPluginFactory(pluginConfiguration))
            {
                // Automatically pulls the RelativityVersion for the environment supplied in connectionInfo object
                Version relativityVersion = RetrieveRelativityVersion(connectionInfo);

                try
                {
                    // Generally good idea to utilize try catch blocks
                    IImportClient client = pluginFactory.CreateImportClient(relativityVersion, connectionInfo, context);
                    ImportNativeDocs(client, datasetDirectory);
                    ImportImages(client, datasetDirectory);
                    if (relativityVersion >= MinSdkVersion)
                    {
                        Console.WriteLine("CONSOLE - SDK Import Completed.");
                    }
                    else
                    {
                        Console.WriteLine("CONSOLE - Legacy Import Completed.");
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
        }