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

ImageLoadFileMetadataForArtifactBuilder

using kCura.WinEDDS; using kCura.WinEDDS.Exporters; using Relativity.DataExchange.Export.VolumeManagerV2.Directories; using Relativity.DataExchange.Export.VolumeManagerV2.Metadata.Images.Lines; using Relativity.DataExchange.Export.VolumeManagerV2.Metadata.Writers; using Relativity.DataExchange.Logger; using Relativity.Logging; using System; using System.Collections.Generic; using System.Threading; namespace Relativity.DataExchange.Export.VolumeManagerV2.Metadata.Images { public abstract class ImageLoadFileMetadataForArtifactBuilder : IImageLoadFileMetadataForArtifactBuilder { private readonly IImageLoadFileEntry _imageLoadFileEntry; private readonly ExportFile _exportSettings; private readonly IFilePathTransformer _filePathTransformer; private readonly IFullTextLoadFileEntry _fullTextLoadFileEntry; private readonly ILog _logger; protected ImageLoadFileMetadataForArtifactBuilder(ExportFile exportSettings, IFilePathTransformer filePathTransformer, IImageLoadFileEntry imageLoadFileEntry, IFullTextLoadFileEntry fullTextLoadFileEntry, ILog logger) { _exportSettings = exportSettings; _filePathTransformer = filePathTransformer; _imageLoadFileEntry = imageLoadFileEntry; _fullTextLoadFileEntry = fullTextLoadFileEntry; _logger = logger; } public void WriteLoadFileEntry(ObjectExportInfo artifact, IRetryableStreamWriter writer, CancellationToken cancellationToken) { int count = artifact.Images.Count; List<ImageExportInfo> imagesToProcess = GetImagesToProcess(artifact); _logger.LogVerbose("Number of pages in image {numberOfPages}. Actual number of images to process {imagesCount}.", new object[2] { count, imagesToProcess.Count }); bool autoGenerateNumbers = AutoGeneratePageNumbers(imagesToProcess); for (int i = 0; i < imagesToProcess.Count; i++) { if (cancellationToken.IsCancellationRequested) break; ImageExportInfo imageExportInfo = imagesToProcess[i]; _logger.LogVerbose("Processing image {image}.", new object[1] { imageExportInfo.FileName.Secure() }); int num = i + 1; long pageOffset = ((i != 0 || imageExportInfo.PageOffset.HasValue) && i != imagesToProcess.Count - 1) ? (((long?)imagesToProcess[num].PageOffset) ?? (-9223372036854775808)) : (-9223372036854775808); _logger.LogVerbose("Attempting to create full text entry for image.", Array.Empty<object>()); _fullTextLoadFileEntry.WriteFullTextLine(artifact, imageExportInfo.BatesNumber, i, pageOffset, writer, cancellationToken); string localFilePath = GetLocalFilePath(imagesToProcess, i); _logger.LogVerbose("Creating image load file entry using image file path {path}.", new object[1] { localFilePath.Secure() }); string loadFileEntry = _imageLoadFileEntry.Create(CreateUniqueBates(imageExportInfo.BatesNumber, num, autoGenerateNumbers), localFilePath, artifact.DestinationVolume, num, count); writer.WriteEntry(loadFileEntry, cancellationToken); } } protected abstract List<ImageExportInfo> GetImagesToProcess(ObjectExportInfo artifact); private bool AutoGeneratePageNumbers(List<ImageExportInfo> images) { if (images.Count > 1) return string.Compare(images[0].BatesNumber, images[1].BatesNumber, StringComparison.InvariantCultureIgnoreCase) == 0; return false; } private string GetLocalFilePath(List<ImageExportInfo> images, int i) { int baseImageIndex = GetBaseImageIndex(i); string result = images[baseImageIndex].SourceLocation; if (_exportSettings.VolumeInfo.CopyImageFilesFromRepository) result = (string.IsNullOrWhiteSpace(images[baseImageIndex].TempLocation) ? images[baseImageIndex].TempLocation : _filePathTransformer.TransformPath(images[baseImageIndex].TempLocation)); return result; } private string CreateUniqueBates(string batesNumber, int pageNumber, bool autoGenerateNumbers) { if (autoGenerateNumbers && pageNumber > 1) return $"{batesNumber}""{pageNumber}"; return batesNumber; } protected abstract int GetBaseImageIndex(int i); } }