TransferPathFactory
class TransferPathFactory
using Relativity.DataTransfer.Nodes;
using Relativity.Transfer.Paths;
using System;
using System.Text;
namespace Relativity.Transfer.Enumeration.Batches
{
internal class TransferPathFactory
{
private readonly TransferPathParameters _parameters;
public TransferPathFactory(TransferPathParameters parameters)
{
_parameters = parameters;
}
public TransferPath Create(INode node, INode rootNode, TransferDirection direction, long fileNumber = 0)
{
IDirectory directory = node as IDirectory;
if (directory != null)
return CreateTransferPathForEmptyDirectory(rootNode, directory, fileNumber, direction);
IFile file = node as IFile;
if (file != null)
return CreateFileTransferPath(rootNode, file, fileNumber, direction);
throw new ArgumentException("node");
}
private TransferPath CreateFileTransferPath(INode rootNode, IFile fileItem, long fileNumber, TransferDirection direction)
{
string targetPath = GetTargetPath(rootNode, fileItem);
return new TransferPath(fileItem.AbsolutePath, TransferPathAttributes.File, targetPath, direction, fileItem.Name, fileItem.Size) {
Order = Convert.ToInt32(fileNumber)
};
}
private TransferPath CreateTransferPathForEmptyDirectory(INode rootNode, INode emptyDirectoryNode, long fileNumber, TransferDirection direction)
{
string targetPath = GetTargetPath(rootNode, emptyDirectoryNode);
return new TransferPath(emptyDirectoryNode.AbsolutePath, TransferPathAttributes.Directory | TransferPathAttributes.Empty, targetPath, direction) {
Order = Convert.ToInt32(fileNumber)
};
}
private string GetTargetPath(INode rootNode, INode node)
{
if (!_parameters.PreserveDirectories)
return _parameters.TargetDirectory.AbsolutePath;
string subDirectory = rootNode.FindRelativePath(node);
return BuildTargetPath(_parameters.TargetDirectory.AbsolutePath, subDirectory);
}
private string BuildTargetPath(string targetPath, string subDirectory)
{
StringBuilder stringBuilder = new StringBuilder(targetPath);
if (stringBuilder.Length <= 0)
return stringBuilder.ToString();
if (!string.IsNullOrEmpty(subDirectory)) {
stringBuilder.Append(PathConstants.DirectorySeparatorAsString);
stringBuilder.Append(subDirectory);
}
if (_parameters.IsTargetPathUnix)
stringBuilder.Replace(PathConstants.DirectorySeparatorAsString, PathConstants.UnixDirectorySeparator);
else
stringBuilder.Replace(PathConstants.UnixDirectorySeparator, PathConstants.WindowsSingleCharDirectorySeparator.ToString());
return stringBuilder.ToString();
}
}
}