ImageLoadFileMetadataForArtifactBuilder
public abstract class ImageLoadFileMetadataForArtifactBuilder : IImageLoadFileMetadataForArtifactBuilder
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);
}
}