From 502f80313a30bcf023ecef58af0783523e5047fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Fri, 18 Feb 2022 17:15:11 +0100 Subject: [PATCH] Remove Type from Differece, CopyCommand refactor --- src/Core/FileTime.Core/Command/CopyCommand.cs | 64 ++++++------------- .../Command/CreateContainerCommand.cs | 2 +- .../Command/CreateElementCommand.cs | 2 +- .../FileTime.Core/Command/DeleteCommand.cs | 2 - .../FileTime.Core/Command/RenameCommand.cs | 16 ++--- .../Extensions/TimelineExtensions.cs | 15 ----- .../FileTime.Core/Helper/CommandHelper.cs | 27 ++++++++ src/Core/FileTime.Core/Timeline/Difference.cs | 5 +- .../Timeline/DifferenceItemType.cs | 9 --- .../FileTime.Core/Timeline/TimeContainer.cs | 8 +-- 10 files changed, 61 insertions(+), 89 deletions(-) delete mode 100644 src/Core/FileTime.Core/Extensions/TimelineExtensions.cs create mode 100644 src/Core/FileTime.Core/Helper/CommandHelper.cs delete mode 100644 src/Core/FileTime.Core/Timeline/DifferenceItemType.cs diff --git a/src/Core/FileTime.Core/Command/CopyCommand.cs b/src/Core/FileTime.Core/Command/CopyCommand.cs index 85bb7f7..81aa1e8 100644 --- a/src/Core/FileTime.Core/Command/CopyCommand.cs +++ b/src/Core/FileTime.Core/Command/CopyCommand.cs @@ -64,33 +64,25 @@ namespace FileTime.Core.Command var newDiffs = new List(); - _copyOperation = async (_, to, _, _) => + _copyOperation = (_, to, _, _) => { - var target = await to.GetParent().ResolveAsync(); - newDiffs.Add(new Difference( - target is IElement - ? DifferenceItemType.Element - : DifferenceItemType.Container, - DifferenceActionType.Create, - to - )); + newDiffs.Add(new Difference(DifferenceActionType.Create, to)); + return Task.CompletedTask; }; - _createContainer = async (IContainer target, string name) => + _createContainer = (IContainer target, string name) => { var newContainerDiff = new Difference( - DifferenceItemType.Container, DifferenceActionType.Create, AbsolutePath.FromParentAndChildName(target, name, AbsolutePathType.Container) ); newDiffs.Add(newContainerDiff); - return (IContainer)(await newContainerDiff.AbsolutePath.ResolveAsync())!; + return Task.FromResult((IContainer)null!); }; - var resolvedTarget = (IContainer)(await Target.ResolveAsync())!; - await TraverseTree(Sources, resolvedTarget, TransportMode.Value); + await TraverseTree(Sources, Target, TransportMode.Value); return startPoint.WithDifferences(newDiffs); } @@ -127,8 +119,7 @@ namespace FileTime.Core.Command } }; - var resolvedTarget = (IContainer)(await Target.ResolveAsync())!; - await TraverseTree(Sources, resolvedTarget, TransportMode.Value); + await TraverseTree(Sources, Target, TransportMode.Value); } private async Task CalculateProgress() @@ -156,26 +147,33 @@ namespace FileTime.Core.Command } }; - var resolvedTarget = (IContainer)(await Target.ResolveAsync())!; - await TraverseTree(Sources, resolvedTarget, TransportMode.Value); + await TraverseTree(Sources, Target, TransportMode.Value); _operationStatuses = operationStatuses; } private async Task TraverseTree( IEnumerable sources, - IContainer target, + AbsolutePath target, TransportMode transportMode) { if (_copyOperation == null) throw new ArgumentException("No copy operation were given."); if (_createContainer == null) throw new ArgumentException("No container creation function were given."); + var resolvedTarget = (IContainer?)await target.ResolveAsync(); + foreach (var source in sources) { var item = await source.ResolveAsync(); if (item is IContainer container) { - var targetContainer = (await target.GetContainers())?.FirstOrDefault(d => d.Name == container.Name) ?? (await _createContainer?.Invoke(target, container.Name)!); + var targetContainer = target.GetChild(item.Name, AbsolutePathType.Container); + if (_createContainer != null + && resolvedTarget != null + && !await resolvedTarget.IsExistsAsync(item.Name)) + { + await _createContainer.Invoke(resolvedTarget, container.Name); + } var childDirectories = (await container.GetContainers())!.Select(d => new AbsolutePath(d)); var childFiles = (await container.GetElements())!.Select(f => new AbsolutePath(f)); @@ -185,32 +183,12 @@ namespace FileTime.Core.Command } else if (item is IElement element) { - var targetName = element.Name; - - var targetNameExists = await target.IsExistsAsync(targetName); - if (transportMode == Command.TransportMode.Merge) - { - for (var i = 0; targetNameExists; i++) - { - targetName = element.Name + (i == 0 ? "_" : $"_{i}"); - targetNameExists = await target.IsExistsAsync(targetName); - } - } - else if (transportMode == Command.TransportMode.Skip && targetNameExists) - { - continue; - } + var targetName = await Helper.CommandHelper.GetNewNameAsync(resolvedTarget, element.Name, transportMode); + if (targetName == null) continue; OperationProgress? operation = null; var targetFolderPath = new AbsolutePath(target); - var targetElementPath = AbsolutePath.FromParentAndChildName(target, targetName, AbsolutePathType.Element); - - foreach (var asd in _operationStatuses.Keys) - { - var hash1 = asd.GetHashCode(); - var hash2 = targetFolderPath.GetHashCode(); - var eq = asd == targetFolderPath; - } + var targetElementPath = target.GetChild(targetName, AbsolutePathType.Element); if (_operationStatuses.TryGetValue(targetFolderPath, out var targetPathOperations)) { diff --git a/src/Core/FileTime.Core/Command/CreateContainerCommand.cs b/src/Core/FileTime.Core/Command/CreateContainerCommand.cs index b70feb0..c54bf7b 100644 --- a/src/Core/FileTime.Core/Command/CreateContainerCommand.cs +++ b/src/Core/FileTime.Core/Command/CreateContainerCommand.cs @@ -39,7 +39,7 @@ namespace FileTime.Core.Command { var newDifferences = new List() { - new Difference(DifferenceItemType.Container, DifferenceActionType.Create, Container.GetChild(NewContainerName, AbsolutePathType.Container)) + new Difference(DifferenceActionType.Create, Container.GetChild(NewContainerName, AbsolutePathType.Container)) }; return Task.FromResult(startPoint.WithDifferences(newDifferences)); } diff --git a/src/Core/FileTime.Core/Command/CreateElementCommand.cs b/src/Core/FileTime.Core/Command/CreateElementCommand.cs index c685a6a..8873439 100644 --- a/src/Core/FileTime.Core/Command/CreateElementCommand.cs +++ b/src/Core/FileTime.Core/Command/CreateElementCommand.cs @@ -36,7 +36,7 @@ namespace FileTime.Core.Command { var newDifferences = new List() { - new Difference(DifferenceItemType.Element, DifferenceActionType.Create, Container.GetChild(NewElementName, AbsolutePathType.Element)) + new Difference(DifferenceActionType.Create, Container.GetChild(NewElementName, AbsolutePathType.Element)) }; return Task.FromResult(startPoint.WithDifferences(newDifferences)); } diff --git a/src/Core/FileTime.Core/Command/DeleteCommand.cs b/src/Core/FileTime.Core/Command/DeleteCommand.cs index 301f16c..9fa4cae 100644 --- a/src/Core/FileTime.Core/Command/DeleteCommand.cs +++ b/src/Core/FileTime.Core/Command/DeleteCommand.cs @@ -27,7 +27,6 @@ namespace FileTime.Core.Command _deleteContainer = (c) => { newDifferences.Add(new Difference( - DifferenceItemType.Container, DifferenceActionType.Delete, new AbsolutePath(c) )); @@ -37,7 +36,6 @@ namespace FileTime.Core.Command _deleteElement = (e) => { newDifferences.Add(new Difference( - DifferenceItemType.Element, DifferenceActionType.Delete, new AbsolutePath(e) )); diff --git a/src/Core/FileTime.Core/Command/RenameCommand.cs b/src/Core/FileTime.Core/Command/RenameCommand.cs index 18f27f1..744bd7e 100644 --- a/src/Core/FileTime.Core/Command/RenameCommand.cs +++ b/src/Core/FileTime.Core/Command/RenameCommand.cs @@ -1,6 +1,4 @@ using AsyncEvent; -using FileTime.Core.Extensions; -using FileTime.Core.Interactions; using FileTime.Core.Models; using FileTime.Core.Timeline; @@ -33,20 +31,18 @@ namespace FileTime.Core.Command } } - public async Task SimulateCommand(PointInTime startPoint) + public Task SimulateCommand(PointInTime startPoint) { - var item = await Source.ResolveAsync(); - if (item == null) throw new FileNotFoundException(); var newDifferences = new List() { - new Difference(item.ToDifferenceItemType(), + new Difference( DifferenceActionType.Delete, Source), - new Difference(item.ToDifferenceItemType(), - DifferenceActionType.Delete, - Source) + new Difference( + DifferenceActionType.Create, + Source.GetParent().GetChild(Target, Source.Type)) }; - return startPoint.WithDifferences(newDifferences); + return Task.FromResult(startPoint.WithDifferences(newDifferences)); } public async Task CanRun(PointInTime startPoint) diff --git a/src/Core/FileTime.Core/Extensions/TimelineExtensions.cs b/src/Core/FileTime.Core/Extensions/TimelineExtensions.cs deleted file mode 100644 index 2ad9a08..0000000 --- a/src/Core/FileTime.Core/Extensions/TimelineExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using FileTime.Core.Models; -using FileTime.Core.Timeline; - -namespace FileTime.Core.Extensions -{ - public static class TimelineExtensions - { - public static DifferenceItemType ToDifferenceItemType(this IItem? item) - { - if (item is IContainer) return DifferenceItemType.Container; - else if (item is IElement) return DifferenceItemType.Element; - else return DifferenceItemType.Unknown; - } - } -} \ No newline at end of file diff --git a/src/Core/FileTime.Core/Helper/CommandHelper.cs b/src/Core/FileTime.Core/Helper/CommandHelper.cs new file mode 100644 index 0000000..d28b74c --- /dev/null +++ b/src/Core/FileTime.Core/Helper/CommandHelper.cs @@ -0,0 +1,27 @@ +using FileTime.Core.Models; + +namespace FileTime.Core.Helper +{ + public static class CommandHelper + { + public static async Task GetNewNameAsync(IContainer? resolvedTarget, string name, Command.TransportMode transportMode) + { + var newName = name; + var targetNameExists = resolvedTarget != null && await resolvedTarget.IsExistsAsync(newName); + if (transportMode == Command.TransportMode.Merge && resolvedTarget != null) + { + for (var i = 0; targetNameExists; i++) + { + newName = name + (i == 0 ? "_" : $"_{i}"); + targetNameExists = await resolvedTarget.IsExistsAsync(newName); + } + } + else if (transportMode == Command.TransportMode.Skip && targetNameExists) + { + return null; + } + + return newName; + } + } +} \ No newline at end of file diff --git a/src/Core/FileTime.Core/Timeline/Difference.cs b/src/Core/FileTime.Core/Timeline/Difference.cs index 242de65..b8ad8d5 100644 --- a/src/Core/FileTime.Core/Timeline/Difference.cs +++ b/src/Core/FileTime.Core/Timeline/Difference.cs @@ -5,14 +5,12 @@ namespace FileTime.Core.Timeline { public class Difference { - public DifferenceItemType Type { get; } public string Name { get; } public AbsolutePath AbsolutePath { get; } public DifferenceActionType Action { get; } - public Difference(DifferenceItemType type, DifferenceActionType action, AbsolutePath absolutePath) + public Difference(DifferenceActionType action, AbsolutePath absolutePath) { - Type = type; AbsolutePath = absolutePath; Action = action; @@ -22,7 +20,6 @@ namespace FileTime.Core.Timeline public Difference WithVirtualContentProvider(IContentProvider? virtualContentProvider) { return new Difference( - Type, Action, new AbsolutePath(AbsolutePath.ContentProvider, AbsolutePath.Path, AbsolutePath.Type, virtualContentProvider) ); diff --git a/src/Core/FileTime.Core/Timeline/DifferenceItemType.cs b/src/Core/FileTime.Core/Timeline/DifferenceItemType.cs deleted file mode 100644 index e75b4a3..0000000 --- a/src/Core/FileTime.Core/Timeline/DifferenceItemType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FileTime.Core.Timeline -{ - public enum DifferenceItemType - { - Container, - Element, - Unknown - } -} \ No newline at end of file diff --git a/src/Core/FileTime.Core/Timeline/TimeContainer.cs b/src/Core/FileTime.Core/Timeline/TimeContainer.cs index a73555c..cd4e6b8 100644 --- a/src/Core/FileTime.Core/Timeline/TimeContainer.cs +++ b/src/Core/FileTime.Core/Timeline/TimeContainer.cs @@ -77,7 +77,7 @@ namespace FileTime.Core.Timeline (IReadOnlyList?)_pointInTime .Differences .Where(d => - d.Type == DifferenceItemType.Container + d.AbsolutePath.Type == AbsolutePathType.Container && GetParentPath(d.AbsolutePath.Path) == FullName) .Select(MapContainer) .ToList() @@ -89,7 +89,7 @@ namespace FileTime.Core.Timeline (IReadOnlyList?)_pointInTime .Differences .Where(d => - d.Type == DifferenceItemType.Element + d.AbsolutePath.Type == AbsolutePathType.Element && GetParentPath(d.AbsolutePath.Path) == FullName) .Select(MapElement) .ToList() @@ -116,13 +116,13 @@ namespace FileTime.Core.Timeline private IContainer MapContainer(Difference containerDiff) { - if (containerDiff.Type != DifferenceItemType.Container) throw new ArgumentException($"{nameof(containerDiff)}'s {nameof(Difference.Type)} property is not {DifferenceItemType.Container}."); + if (containerDiff.AbsolutePath.Type != AbsolutePathType.Container) throw new ArgumentException($"{nameof(containerDiff)}'s {nameof(AbsolutePath.Type)} property is not {AbsolutePathType.Container}."); return new TimeContainer(containerDiff.Name, this, Provider, containerDiff.AbsolutePath.VirtualContentProvider ?? containerDiff.AbsolutePath.ContentProvider, _pointInTime); } private IElement MapElement(Difference elementDiff) { - if (elementDiff.Type != DifferenceItemType.Container) throw new ArgumentException($"{elementDiff}'s {nameof(Difference.Type)} property is not {DifferenceItemType.Element}."); + if (elementDiff.AbsolutePath.Type != AbsolutePathType.Element) throw new ArgumentException($"{elementDiff}'s {nameof(AbsolutePath.Type)} property is not {AbsolutePathType.Element}."); return new TimeElement(elementDiff.Name, this, Provider, elementDiff.AbsolutePath.VirtualContentProvider ?? elementDiff.AbsolutePath.ContentProvider); } public Task CanOpenAsync() => Task.FromResult(true);