/// <summary> /// Checks is the given Event is a content change event and filters it, if it has been handled already. /// </summary> /// <param name="e">Sync event</param> /// <returns><c>true</c> if the event has been already handled, otherwise <c>false</c></returns> public override bool Handle(ISyncEvent e) { if (e is ContentChangeEvent) { ContentChangeEvent change = e as ContentChangeEvent; switch (change.Type) { case ChangeType.Created: return(this.storage.GetObjectByRemoteId(change.ObjectId) != null); case ChangeType.Deleted: return(this.storage.GetObjectByRemoteId(change.ObjectId) == null); case ChangeType.Security: goto case ChangeType.Updated; case ChangeType.Updated: var mappedObject = this.storage.GetObjectByRemoteId(change.ObjectId); if (mappedObject == null || mappedObject.LastChangeToken == null) { return(false); } else { if (change.CmisObject == null) { try { change.UpdateObject(this.session); } catch (DotCMIS.Exceptions.CmisBaseException) { return(false); } } var cmisObject = change.CmisObject; string cmisParentId = cmisObject is IFolder ? (cmisObject as IFolder).ParentId : cmisObject is IDocument ? (cmisObject as IDocument).Parents[0].Id : null; if (mappedObject.LastChangeToken == cmisObject.ChangeToken && mappedObject.ParentId == cmisParentId) { Logger.Debug(string.Format("Ignoring remote change because the ChangeToken \"{0}\" is equal to the stored one", mappedObject.LastChangeToken)); return(true); } else { return(false); } } default: return(false); } } else { return(false); } }
private ContentChangeEvent PrepareFolderEvent(DotCMIS.Enums.ChangeType type) { var e = new ContentChangeEvent(type, Id); var remoteObject = new Mock <IFolder>(); var session = new Mock <ISession>(); session.Setup(s => s.GetObject(It.IsAny <string>(), It.IsAny <IOperationContext>())).Returns(remoteObject.Object); e.UpdateObject(session.Object); return(e); }
public void ChangedEventForUnchangedIgnoredStateObject() { this.SetUpMocks(); var changedObject = MockOfIFolderUtil.CreateRemoteFolderMock(this.folderId, this.folderName, this.remotePath, Guid.NewGuid().ToString()); var changeEvent = new ContentChangeEvent(ChangeType.Updated, this.folderId); this.session.Setup(s => s.GetObject(It.IsAny <string>(), It.IsAny <IOperationContext>())).Returns(changedObject.Object); changeEvent.UpdateObject(this.session.Object); Assert.That(this.underTest.Handle(changeEvent), Is.False); this.ignoreStorage.Verify(s => s.AddOrUpdateEntryAndDeleteAllChildrenFromStorage(It.IsAny <IIgnoredEntity>()), Times.Never()); this.queue.VerifyThatNoEventIsAdded(); }
private ContentChangeEvent PrepareEvent(DotCMIS.Enums.ChangeType type, bool hasContentStream, byte[] contentHash = null) { var e = new ContentChangeEvent(type, Id); var remoteObject = MockOfIDocumentUtil.CreateRemoteDocumentMock(hasContentStream ? "streamId" : null, Id, "name", (string)null); if (contentHash != null) { remoteObject.SetupContentStreamHash(contentHash); } var session = new Mock <ISession>(); session.Setup(s => s.GetObject(It.IsAny <string>(), It.IsAny <IOperationContext>())).Returns(remoteObject.Object); e.UpdateObject(session.Object); return(e); }
public void ChangeEventForFormerIgnoredObjectAndNowNotIgnoredObject() { this.SetUpMocks(); var changedObject = MockOfIFolderUtil.CreateRemoteFolderMock(this.folderId, this.folderName, this.remotePath, Guid.NewGuid().ToString()); var changeEvent = new ContentChangeEvent(ChangeType.Updated, this.folderId); this.session.Setup(s => s.GetObject(It.IsAny <string>(), It.IsAny <IOperationContext>())).Returns(changedObject.Object); this.ignoreStorage.Setup(i => i.IsIgnoredId(this.folderId)).Returns(IgnoredState.IGNORED); changeEvent.UpdateObject(this.session.Object); Assert.That(this.underTest.Handle(changeEvent), Is.False); this.ignoreStorage.Verify(s => s.AddOrUpdateEntryAndDeleteAllChildrenFromStorage(It.IsAny <IIgnoredEntity>()), Times.Never()); this.ignoreStorage.Verify(s => s.Remove(this.folderId)); this.queue.Verify(q => q.AddEvent(It.Is <StartNextSyncEvent>(e => e.FullSyncRequested == true)), Times.Once()); this.queue.VerifyThatNoOtherEventIsAddedThan <StartNextSyncEvent>(); }
public void TransformContentChangeEventFromChangeToDeleteIfTargetIsInsideAnIgnoredFolder() { this.SetupMocks(); var objectId = Guid.NewGuid().ToString(); var folderObject = Mock.Of <IFolder>(f => f.Id == objectId); var contentChangeEvent = new ContentChangeEvent(DotCMIS.Enums.ChangeType.Updated, objectId); var session = new Mock <ISession>(); session.Setup(s => s.GetObject(objectId, It.IsAny <IOperationContext>())).Returns(folderObject); contentChangeEvent.UpdateObject(session.Object); this.ignores.Setup(i => i.IsIgnored(folderObject)).Returns(IgnoredState.INHERITED); Assert.That(this.underTest.Handle(contentChangeEvent), Is.True); this.queue.VerifyThatNoOtherEventIsAddedThan <ContentChangeEvent>(); this.queue.Verify(q => q.AddEvent(It.Is <ContentChangeEvent>(e => e.ObjectId == objectId && e.Type == DotCMIS.Enums.ChangeType.Deleted))); }
public void DocumentAlreadyAccumulatedIsNotAccumulatedAgain() { var session = new Mock <ISession>(); var remoteObject = Mock.Of <ICmisObject>(); var newRemoteObject = Mock.Of <ICmisObject>(); session.Setup(s => s.GetObject(It.IsAny <string>(), It.IsAny <IOperationContext>())).Returns(remoteObject); var accumulator = new ContentChangeEventAccumulator(session.Object, new Mock <ISyncEventQueue>().Object); var contentChange = new ContentChangeEvent(DotCMIS.Enums.ChangeType.Created, Id); contentChange.UpdateObject(session.Object); session.Setup(s => s.GetObject(It.IsAny <string>(), It.IsAny <IOperationContext>())).Returns(newRemoteObject); Assert.That(accumulator.Handle(contentChange), Is.False); Assert.That(contentChange.CmisObject, Is.EqualTo(remoteObject)); Assert.That(contentChange.CmisObject, Is.Not.EqualTo(newRemoteObject)); }
public void CreatedEventForIgnoredObject() { this.SetUpMocks(); var createdObject = MockOfIFolderUtil.CreateRemoteFolderMock(this.folderId, this.folderName, this.remotePath, Guid.NewGuid().ToString()); createdObject.SetupIgnore("*"); var createdEvent = new ContentChangeEvent(ChangeType.Created, this.folderId); this.session.Setup(s => s.GetObject(It.IsAny <string>(), It.IsAny <IOperationContext>())).Returns(createdObject.Object); createdEvent.UpdateObject(this.session.Object); this.matcher.Setup(m => m.CanCreateLocalPath(createdObject.Object)).Returns(true); this.matcher.Setup(m => m.CreateLocalPath(createdObject.Object)).Returns(this.localPath); Assert.That(this.underTest.Handle(createdEvent), Is.False); this.ignoreStorage.Verify(s => s.AddOrUpdateEntryAndDeleteAllChildrenFromStorage(It.Is <IIgnoredEntity>(e => e.LocalPath == this.localPath && e.ObjectId == this.folderId))); this.queue.VerifyThatNoEventIsAdded(); }