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);
 }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
 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;
     }
 }
Ejemplo n.º 5
0
        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);
 }
Ejemplo n.º 7
0
 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);
        }
Ejemplo n.º 11
0
        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]);
        }
Ejemplo n.º 12
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;
        }