public CrawlEventCollection GenerateEvents(DescendantsTreeCollection trees) { IObjectTree <IMappedObject> storedTree = trees.StoredTree; IObjectTree <IFileSystemInfo> localTree = trees.LocalTree; IObjectTree <IFileableCmisObject> remoteTree = trees.RemoteTree; CrawlEventCollection createdEvents = new CrawlEventCollection(); List <IMappedObject> storedObjectsForRemote = storedTree.ToList(); List <IMappedObject> storedObjectsForLocal = new List <IMappedObject>(storedObjectsForRemote); Dictionary <string, Tuple <AbstractFolderEvent, AbstractFolderEvent> > eventMap = new Dictionary <string, Tuple <AbstractFolderEvent, AbstractFolderEvent> >(); createdEvents.creationEvents = this.remoteEventGenerator.CreateEvents(storedObjectsForRemote, remoteTree, eventMap); createdEvents.creationEvents.AddRange(this.localEventGenerator.CreateEvents(storedObjectsForLocal, localTree, eventMap)); createdEvents.mergableEvents = eventMap; IMappedObject rootNode = storedTree.Item; storedObjectsForLocal.Remove(rootNode); storedObjectsForRemote.Remove(rootNode); createdEvents.removedLocalObjects = this.TransformToFileSystemInfoDict(storedObjectsForLocal); createdEvents.removedRemoteObjects = this.TransformToFileSystemInfoDict(storedObjectsForRemote); return(createdEvents); }
public CrawlEventCollection GenerateEvents(DescendantsTreeCollection trees) { IObjectTree <IMappedObject> storedTree = trees.StoredTree; IObjectTree <IFileSystemInfo> localTree = trees.LocalTree; IObjectTree <IFileableCmisObject> remoteTree = trees.RemoteTree; CrawlEventCollection createdEvents = new CrawlEventCollection(); List <IMappedObject> storedObjectsForRemote = storedTree.ToList(); List <IMappedObject> storedObjectsForLocal = new List <IMappedObject>(storedObjectsForRemote); ISet <IMappedObject> handledLocalStoredObjects = new HashSet <IMappedObject>(); ISet <IMappedObject> handledRemoteStoredObjects = new HashSet <IMappedObject>(); Dictionary <string, Tuple <AbstractFolderEvent, AbstractFolderEvent> > eventMap = new Dictionary <string, Tuple <AbstractFolderEvent, AbstractFolderEvent> >(); createdEvents.creationEvents = this.remoteEventGenerator.CreateEvents(storedObjectsForRemote, remoteTree, eventMap, handledRemoteStoredObjects); createdEvents.creationEvents.AddRange(this.localEventGenerator.CreateEvents(storedObjectsForLocal, localTree, eventMap, handledLocalStoredObjects)); createdEvents.mergableEvents = eventMap; handledLocalStoredObjects.Add(storedTree.Item); handledRemoteStoredObjects.Add(storedTree.Item); foreach (var handledObject in handledLocalStoredObjects) { storedObjectsForLocal.Remove(handledObject); } foreach (var handledObject in handledRemoteStoredObjects) { storedObjectsForRemote.Remove(handledObject); } this.AddDeletedObjectsToMergableEvents(storedObjectsForLocal, eventMap, true); this.AddDeletedObjectsToMergableEvents(storedObjectsForRemote, eventMap, false); return(createdEvents); }
public CrawlEventCollection GenerateEvents(DescendantsTreeCollection trees) { IObjectTree<IMappedObject> storedTree = trees.StoredTree; IObjectTree<IFileSystemInfo> localTree = trees.LocalTree; IObjectTree<IFileableCmisObject> remoteTree = trees.RemoteTree; CrawlEventCollection createdEvents = new CrawlEventCollection(); List<IMappedObject> storedObjectsForRemote = storedTree.ToList(); List<IMappedObject> storedObjectsForLocal = new List<IMappedObject>(storedObjectsForRemote); ISet<IMappedObject> handledLocalStoredObjects = new HashSet<IMappedObject>(); ISet<IMappedObject> handledRemoteStoredObjects = new HashSet<IMappedObject>(); Dictionary<string, Tuple<AbstractFolderEvent, AbstractFolderEvent>> eventMap = new Dictionary<string, Tuple<AbstractFolderEvent, AbstractFolderEvent>>(); createdEvents.creationEvents = this.remoteEventGenerator.CreateEvents(storedObjectsForRemote, remoteTree, eventMap, handledRemoteStoredObjects); createdEvents.creationEvents.AddRange(this.localEventGenerator.CreateEvents(storedObjectsForLocal, localTree, eventMap, handledLocalStoredObjects)); createdEvents.mergableEvents = eventMap; handledLocalStoredObjects.Add(storedTree.Item); handledRemoteStoredObjects.Add(storedTree.Item); foreach (var handledObject in handledLocalStoredObjects) { storedObjectsForLocal.Remove(handledObject); } foreach (var handledObject in handledRemoteStoredObjects) { storedObjectsForRemote.Remove(handledObject); } this.AddDeletedObjectsToMergableEvents(storedObjectsForLocal, eventMap, true); this.AddDeletedObjectsToMergableEvents(storedObjectsForRemote, eventMap, false); return createdEvents; }
private void CrawlDescendants() { DescendantsTreeCollection trees = this.treebuilder.BuildTrees(); CrawlEventCollection events = this.eventGenerator.GenerateEvents(trees); this.notifier.MergeEventsAndAddToQueue(events); }
public void SetUp() { this.queue = new Mock<ISyncEventQueue>(); this.underTest = new CrawlEventNotifier(this.queue.Object); this.collection = new CrawlEventCollection() { creationEvents = new List<AbstractFolderEvent>(), mergableEvents = new Dictionary<string, Tuple<AbstractFolderEvent, AbstractFolderEvent>>() }; }
public void NoNotificationIsCreatedIfAllEventsAreEmpty() { CrawlEventCollection emptyCollection = new CrawlEventCollection() { creationEvents = new List<AbstractFolderEvent>(), mergableEvents = new Dictionary<string, Tuple<AbstractFolderEvent, AbstractFolderEvent>>() }; this.underTest.MergeEventsAndAddToQueue(emptyCollection); this.queue.Verify(q => q.AddEvent(It.IsAny<ISyncEvent>()), Times.Never()); }
public void LinearRenames() { string objectId = Guid.NewGuid().ToString(); var collection = new CrawlEventCollection(); collection.mergableEvents = new Dictionary<string, Tuple<AbstractFolderEvent, AbstractFolderEvent>>(); var doc1 = Mock.Of<IFileInfo>(d => d.Name == "C" && d.Uuid == Guid.NewGuid()); var doc2 = Mock.Of<IDocument>(d => d.Name == "B" && d.Id == objectId); FileEvent event1 = new FileEvent(doc1, null); FileEvent event2 = new FileEvent(null, doc2); collection.mergableEvents.Add(objectId, new Tuple<AbstractFolderEvent, AbstractFolderEvent>(event1, event2)); Assert.That(underTest.Detect(collection), Is.Empty); }
public void MergeEventsAndAddToQueue(CrawlEventCollection events) { if (events.creationEvents == null) { throw new ArgumentNullException("events", "Given creationEvents list is null"); } if (events.mergableEvents == null) { throw new ArgumentNullException("events", "Given mergable events are null"); } this.MergeAndSendEvents(events.mergableEvents); events.creationEvents.ForEach(e => this.queue.AddEvent(e)); }
public void MergeEventsAndAddToQueue(CrawlEventCollection events) { this.MergeAndSendEvents(events.mergableEvents); this.FindReportAndRemoveMutualDeletedObjects(events.removedRemoteObjects, events.removedLocalObjects); // Send out Events to queue this.InformAboutRemoteObjectsDeleted(events.removedRemoteObjects.Values); this.InformAboutLocalObjectsDeleted(events.removedLocalObjects.Values); events.creationEvents.ForEach(e => this.Queue.AddEvent(e)); }
private void CrawlDescendants() { try { DescendantsTreeCollection trees = this.treebuilder.BuildTrees(); if (Logger.IsDebugEnabled) { Logger.Debug(string.Format("LocalTree: {0} Elements", trees.LocalTree.ToList().Count)); Logger.Debug(string.Format("RemoteTree: {0} Elements", trees.RemoteTree.ToList().Count)); Logger.Debug(string.Format("StoredTree: {0} Elements", trees.StoredTree.ToList().Count)); } CrawlEventCollection events = this.eventGenerator.GenerateEvents(trees); this.notifier.MergeEventsAndAddToQueue(events); } catch (System.IO.PathTooLongException e) { string msg = "Crawl Sync aborted because a local path is too long. Please take a look into the log to figure out the reason."; throw new InteractionNeededException(msg, e) { Title = "Local path is too long", Description = msg }; } }
public List<List<AbstractFolderEvent>> Detect(CrawlEventCollection collection) { var result = new List<List<AbstractFolderEvent>>(); if (collection.mergableEvents == null) { return result; } foreach (var ev in collection.mergableEvents) { var item = ev.Value.Item1 ?? ev.Value.Item2; if (item.Local == MetaDataChangeType.MOVED || item.Remote == MetaDataChangeType.MOVED || item.Local == MetaDataChangeType.CHANGED || item.Remote == MetaDataChangeType.CHANGED) { string process = ev.Key; string resource = item.RemotePath; if (item is FileEvent) { var fileEvent = item as FileEvent; } else if (item is FolderEvent) { var folderEvent = item as FolderEvent; } } } return result; }
public void NoNotificationIsCreatedAndCallFailsIfEmptyStructIsPassed() { CrawlEventCollection emptyCollection = new CrawlEventCollection(); Assert.Throws<ArgumentNullException>(() => this.underTest.MergeEventsAndAddToQueue(emptyCollection)); this.queue.Verify(q => q.AddEvent(It.IsAny<ISyncEvent>()), Times.Never()); }