public void GetOfflineChanges_ItemsNoItemsInTheCurrentRepository() { ChangePublisher changePublisher = new ChangePublisher(); SynchItem newTree = new SynchItem(); var listOfChanges = changePublisher.GetOfflineChanges(newTree); Assert.IsNotNull(listOfChanges); Assert.AreEqual(listOfChanges.Count,listOfChanges.Count(c=>c.Value==OperationType.Delete)); Assert.AreEqual(11,listOfChanges.Count); }
public static void AddItem(SynchItem topSynchItem, string absolutePathtoNewItem, long size) { if (string.IsNullOrEmpty(absolutePathtoNewItem)) return; if (topSynchItem == null || topSynchItem.Items==null) return; var parrent=GetItemLowestAvailableParrent(topSynchItem, absolutePathtoNewItem); if (parrent.SynchItemData.Identifier == absolutePathtoNewItem) return; AddNewItemTree(parrent, absolutePathtoNewItem,size); }
public static List<SynchItemData> FlattenTree(SynchItem tree) { List<SynchItemData> synchItems=new List<SynchItemData>(); if (tree.Items == null || tree.Items.Count==0) { synchItems.Add(tree.SynchItemData); return synchItems; } foreach(SynchItem synchItem in tree.Items) synchItems.AddRange(FlattenTree(synchItem)); return synchItems; }
public static void DeleteItem(SynchItem topSynchItem, string absolutePathtoNewItem) { if (string.IsNullOrEmpty(absolutePathtoNewItem)) return; if (topSynchItem == null || topSynchItem.Items==null) return; var currentItem = GetItemLowestAvailableParrent(topSynchItem, absolutePathtoNewItem); if (currentItem.SynchItemData.Identifier == absolutePathtoNewItem) { var parenttem = GetParentItem(new List<SynchItem> {topSynchItem}, absolutePathtoNewItem); parenttem.Items.Remove(currentItem); return; } }
internal static SynchItem GetItemLowestAvailableParrent(SynchItem topSynchItem, string itemId) { string[] levels = itemId.Split(new char[] { '\\' }); SynchItem parentItem = topSynchItem; SynchItem currentItem = topSynchItem; string currentLevel = string.Empty; var list = new List<SynchItem> {topSynchItem}; foreach (string level in levels) { currentLevel = (string.IsNullOrEmpty(currentLevel)) ? level : string.Format("{0}\\{1}", currentLevel, level); currentItem = list.FirstOrDefault(i => i.SynchItemData.Identifier == currentLevel); if (currentItem == null) return parentItem; parentItem = currentItem; list = parentItem.Items; } return parentItem; }
public void GetOfflineChanges_ItemsToBeDeleted() { ChangePublisher changePublisher = new ChangePublisher(); SynchItem newTree = new SynchItem{SynchItemData = new SynchItemData{Name="root",Identifier="root"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="100",Identifier=@"root\100"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="110",Identifier=@"root\100\110"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="112",Identifier=@"root\100\110\112"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="120",Identifier=@"root\100\120"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="121",Identifier=@"root\100\120\121"}}, new SynchItem{SynchItemData=new SynchItemData{Name="122",Identifier=@"root\100\120\122"}}, new SynchItem{SynchItemData=new SynchItemData{Name="123",Identifier=@"root\100\120\123"}}}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="200",Identifier=@"root\200"}}, new SynchItem{SynchItemData=new SynchItemData{Name="300",Identifier=@"root\300"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="330",Identifier=@"root\300\330"}, Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"root\300\330\331"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"root\300\330\331\331"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332"}, Items= new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332\332"}}}}}}}}}}; var listOfChanges = changePublisher.GetOfflineChanges(newTree); Assert.IsNotNull(listOfChanges); Assert.AreEqual(listOfChanges.Count, listOfChanges.Count(c => c.Value == OperationType.Delete)); Assert.AreEqual(4, listOfChanges.Count); }
private static void AddNewItemTree(SynchItem parrent, string absolutePathtoNewItem,long size) { string[] restOfLevels = absolutePathtoNewItem.Replace(parrent.SynchItemData.Identifier +"\\", "").Split(new char[] {'\\'}); foreach (string level in restOfLevels) { var current = new SynchItem { SynchItemData = new SynchItemData {Name = level, Identifier = parrent.SynchItemData.Identifier + @"\" + level} }; if (parrent.Items == null) parrent.Items=new List<SynchItem>(); parrent.Items.Add(current); parrent = current; } if (parrent.Items==null || parrent.Items.Count == 0) parrent.SynchItemData.Size = size; }
public void GetOfflineChanges_WrongBackup() { ChangePublisher changePublisher = new ChangePublisher(); SynchItem newTree = new SynchItem { SynchItemData = new SynchItemData { Name = "newroot", Identifier = "newroot" }, Items = new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="100",Identifier=@"newroot\100"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="110",Identifier=@"newroot\100\110"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="111",Identifier=@"newroot\100\110\111",Size=2}}, new SynchItem{SynchItemData=new SynchItemData{Name="112",Identifier=@"newroot\100\110\112"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="120",Identifier=@"newroot\100\120"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="123",Identifier=@"newroot\100\120\123"}}}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="200",Identifier=@"newroot\200"}}, new SynchItem{SynchItemData=new SynchItemData{Name="300",Identifier=@"newroot\300"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="310",Identifier=@"newroot\300\310",Size=0}}, new SynchItem{SynchItemData=new SynchItemData{Name="320",Identifier=@"newroot\300\320"}}, new SynchItem{SynchItemData=new SynchItemData{Name="330",Identifier=@"newroot\300\330"}, Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"newroot\300\330\331"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"newroot\300\330\331\331"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"newroot\300\330\332"}, Items= new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"newroot\300\330\332\332"}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"newroot\300\330\332\334"}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"newroot\300\330\332\335"}}, new SynchItem{SynchItemData=new SynchItemData{Name="333", Identifier=@"newroot\300\330\332\333",Size=34}}}}}}}}} }; changePublisher.GetOfflineChanges(newTree); }
public void GetOfflineChanges_NoBackupFile() { if(File.Exists("backup.xml")) { File.Copy("backup.xml","backup1.xml",true); File.Delete("backup.xml"); } try { ChangePublisher changePublisher = new ChangePublisher(); SynchItem newTree = new SynchItem { SynchItemData = new SynchItemData { Name = "root", Identifier = "root" }, Items = new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="100",Identifier=@"root\100"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="110",Identifier=@"root\100\110"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="111",Identifier=@"root\100\110\111",Size=2}}, new SynchItem{SynchItemData=new SynchItemData{Name="112",Identifier=@"root\100\110\112"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="120",Identifier=@"root\100\120"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="123",Identifier=@"root\100\120\123"}}}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="200",Identifier=@"root\200"}}, new SynchItem{SynchItemData=new SynchItemData{Name="300",Identifier=@"root\300"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="310",Identifier=@"root\300\310",Size=0}}, new SynchItem{SynchItemData=new SynchItemData{Name="320",Identifier=@"root\300\320"}}, new SynchItem{SynchItemData=new SynchItemData{Name="330",Identifier=@"root\300\330"}, Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"root\300\330\331"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"root\300\330\331\331"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332"}, Items= new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332\332"}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332\334"}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332\335"}}, new SynchItem{SynchItemData=new SynchItemData{Name="333", Identifier=@"root\300\330\332\333",Size=34}}}}}}}}} }; var listOfChanges = changePublisher.GetOfflineChanges(newTree); Assert.IsEmpty(listOfChanges); } catch (Exception) { throw; } finally { if (File.Exists("backup1.xml")) { File.Copy("backup1.xml", "backup.xml", true); File.Delete("backup1.xml"); } } }
public void GetOfflineChanges_MixtureOfItems() { ChangePublisher changePublisher = new ChangePublisher(); SynchItem newTree = new SynchItem { SynchItemData = new SynchItemData { Name = "root", Identifier = "root" }, Items = new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="100",Identifier=@"root\100"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="110",Identifier=@"root\100\110"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="111",Identifier=@"root\100\110\111",Size=2}}, new SynchItem{SynchItemData=new SynchItemData{Name="112",Identifier=@"root\100\110\112"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="120",Identifier=@"root\100\120"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="123",Identifier=@"root\100\120\123"}}}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="200",Identifier=@"root\200"}}, new SynchItem{SynchItemData=new SynchItemData{Name="300",Identifier=@"root\300"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="310",Identifier=@"root\300\310",Size=0}}, new SynchItem{SynchItemData=new SynchItemData{Name="320",Identifier=@"root\300\320"}}, new SynchItem{SynchItemData=new SynchItemData{Name="330",Identifier=@"root\300\330"}, Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"root\300\330\331"},Items=new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="331",Identifier=@"root\300\330\331\331"}}}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332"}, Items= new List<SynchItem>{ new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332\332"}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332\334"}}, new SynchItem{SynchItemData=new SynchItemData{Name="332", Identifier=@"root\300\330\332\335"}}, new SynchItem{SynchItemData=new SynchItemData{Name="333", Identifier=@"root\300\330\332\333",Size=34}}}}}}}}} }; var listOfChanges = changePublisher.GetOfflineChanges(newTree); Assert.IsNotNull(listOfChanges); Assert.AreEqual(3, listOfChanges.Count(c => c.Value == OperationType.Update)); Assert.AreEqual(2, listOfChanges.Count(c => c.Value == OperationType.Insert)); Assert.AreEqual(2, listOfChanges.Count(c => c.Value == OperationType.Delete)); Assert.AreEqual(7, listOfChanges.Count); }
internal SortedList<string, OperationType> GetOfflineChanges(SynchItem currentRepository) { LoggingManager.Debug("Getting the offline changes based on file: " + _backupFileName); if(currentRepository==null) throw new ArgumentNullException("currentRepository"); var oldRepository = Serializer.DeserializeFromFile<SynchItem>(_backupFileName); if(oldRepository.Count==0) return new SortedList<string, OperationType>(); return GetDifferencesBetweenTrees(currentRepository, (oldRepository.Count==0)?new SynchItem(): oldRepository[0]); }
internal static SortedList<string, OperationType> GetDifferencesBetweenTrees(SynchItem newTree, SynchItem oldTree) { LoggingManager.Debug("Getting the differences between trees"); List<SynchItemData> newTreeFlatten = SynchItemManager.FlattenTree(newTree); List<SynchItemData> oldTreeFlatten = SynchItemManager.FlattenTree(oldTree); SortedList<string,OperationType> result = new SortedList<string, OperationType>(); if(newTree.Items==null) { if (oldTree.Items == null) return new SortedList<string, OperationType>(); else { foreach (SynchItemData synchItemData in oldTreeFlatten) result.Add(synchItemData.Identifier, OperationType.Delete); return result; } } else { if (oldTree.Items == null) { foreach(SynchItemData synchItemData in newTreeFlatten) result.Add(synchItemData.Identifier,OperationType.Insert); return result; } } if(newTree.SynchItemData.Identifier!=oldTree.SynchItemData.Identifier) throw new PublisherSetupException(newTree.SynchItemData.Identifier,"The backup does not belong to the root folder"); foreach(string key in newTreeFlatten.Except(oldTreeFlatten,new SynchItemDataEqualityComparer()).Select(o=>o.Identifier)) result.Add(key,OperationType.Insert); foreach (string key in newTreeFlatten.Join(oldTreeFlatten, n => n.Identifier, o => o.Identifier, (n, o) => new { Identifier = n.Identifier, Name = n.Name, NewSize = n.Size, OldSize = o.Size }). Where(c => c.NewSize != c.OldSize).Select(c => c.Identifier)) result.Add(key,OperationType.Update); foreach (string key in oldTreeFlatten.Except(newTreeFlatten, new SynchItemDataEqualityComparer()).Select(n => n.Identifier)) result.Add(key,OperationType.Delete); LoggingManager.Debug("Differences calculated."); return result; }