Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 5
0
        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>();
        }
Ejemplo n.º 6
0
        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)));
        }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
0
        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();
        }