MultiPageImagesRollup
using kCura.WinEDDS;
using kCura.WinEDDS.Exceptions;
using kCura.WinEDDS.Exporters;
using Relativity.DataExchange.Io;
using Relativity.DataExchange.Logger;
using Relativity.DataExchange.Media;
using Relativity.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Relativity.DataExchange.Export.VolumeManagerV2.ImagesRollup
{
public abstract class MultiPageImagesRollup : IImagesRollup
{
private const string _TEMP_FILE_EXTENSION = ".tmp";
private readonly ExportFile _exportSettings;
private readonly IFile _fileWrapper;
private readonly IStatus _status;
private readonly ILog _logger;
protected readonly IImage ImageConverter;
protected MultiPageImagesRollup(ExportFile exportSettings, IFile fileWrapper, IStatus status, ILog logger, IImage imageConverter)
{
_exportSettings = exportSettings;
_fileWrapper = fileWrapper;
_status = status;
_logger = logger;
ImageConverter = imageConverter;
}
public void RollupImages(ObjectExportInfo artifact)
{
if (artifact.Images.Count == 0)
_logger.LogVerbose("No images found for artifact {artifactId}. Skipping rollup.", new object[1] {
artifact.ArtifactID
});
else {
ImageExportInfo imageExportInfo = (ImageExportInfo)artifact.Images[0];
IList<string> list = (from ImageExportInfo x in artifact.Images
select x.TempLocation).ToList();
string tempLocation = GetTempLocation();
try {
_logger.LogVerbose("Attempting to rollup images in temporary location {tempLocation}. List of images {images}.", new object[2] {
tempLocation.Secure(),
string.Join(",", list).Secure()
});
ConvertImage(list, tempLocation);
_logger.LogVerbose("Attempting to delete images.", Array.Empty<object>());
DeleteImages(list);
_logger.LogVerbose("Attempting to update images location.", Array.Empty<object>());
UpdateImageLocation(imageExportInfo);
_logger.LogVerbose("Attempting to move temporary image {tempImage} to destination location {destinationLocation}.", new object[2] {
tempLocation.Secure(),
imageExportInfo.TempLocation.Secure()
});
MoveFileFromTempToDestination(imageExportInfo, tempLocation);
} catch (ImageConversionException ex) {
HandleImageRollupException(artifact, ex, tempLocation);
artifact.DocumentError = true;
return;
}
_logger.LogVerbose("Images rollup finished.", Array.Empty<object>());
imageExportInfo.SuccessfulRollup = true;
}
}
private string GetTempLocation()
{
string path = Path.ChangeExtension(Guid.NewGuid().ToString(), ".tmp");
string text = Path.Combine(_exportSettings.FolderPath, path);
_logger.LogVerbose("Temp file {tempFile} for images rollup created.", new object[1] {
text.Secure()
});
return text;
}
protected abstract void ConvertImage(IList<string> imageList, string tempLocation);
private void DeleteImages(IEnumerable<string> imageList)
{
foreach (string image in imageList) {
_logger.LogVerbose("Removing image {image}.", new object[1] {
image.Secure()
});
_fileWrapper.Delete(image);
}
}
private void UpdateImageLocation(ImageExportInfo image)
{
string extension = GetExtension();
image.TempLocation = Path.ChangeExtension(image.TempLocation, extension);
image.FileName = Path.ChangeExtension(image.FileName, extension);
}
private void MoveFileFromTempToDestination(ImageExportInfo image, string rollupTempLocation)
{
if (_fileWrapper.Exists(image.TempLocation)) {
if (_exportSettings.Overwrite) {
_logger.LogVerbose("Overwriting image {image} with image from {tempLocation}.", new object[2] {
image.TempLocation.Secure(),
rollupTempLocation.Secure()
});
_fileWrapper.Delete(image.TempLocation);
_fileWrapper.Move(rollupTempLocation, image.TempLocation);
} else {
_logger.LogWarning("File {file} exists - skipping. Removing temp file.", new object[1] {
image.TempLocation.Secure()
});
_status.WriteWarning("File exists - file copy skipped: " + image.TempLocation);
_fileWrapper.Delete(rollupTempLocation);
}
} else {
_logger.LogVerbose("Moving file from {tempLocation} to {destinationLocation}.", new object[2] {
rollupTempLocation.Secure(),
image.TempLocation.Secure()
});
_fileWrapper.Move(rollupTempLocation, image.TempLocation);
}
}
private void HandleImageRollupException(ObjectExportInfo artifact, ImageConversionException ex, string rollupTempLocation)
{
_logger.LogError((Exception)ex, "Error occurred during image rollup.", Array.Empty<object>());
try {
if (!string.IsNullOrEmpty(rollupTempLocation) && _fileWrapper.Exists(rollupTempLocation)) {
_logger.LogVerbose("Removing unfinished image {image}.", new object[1] {
rollupTempLocation.Secure()
});
_fileWrapper.Delete(rollupTempLocation);
}
_status.WriteImgProgressError(artifact, ex.PageNumber, ex, "Document exported in single-page image mode.");
} catch (IOException ex2) {
_logger.LogError((Exception)ex2, "Failed to delete image temp file {tempFile}.", new object[1] {
rollupTempLocation.Secure()
});
throw new FileWriteException(FileWriteException.DestinationFile.Errors, ex2);
}
}
protected abstract string GetExtension();
}
}