private void CrawlCmisObject(ICmisObject cmisObject)
{
if (cmisObject is DotCMIS.Client.Impl.Folder)
{
var remoteSubFolder = cmisObject as IFolder;
// Look for the local equivalent.
var localFolderItem = database.GetFolderSyncItemFromRemotePath(remoteSubFolder.Path);
while (true)
{
// If other local folders have the same id, they are obsolete and must be deteled.
var foldersToDelete = database.GetAllFoldersWithCmisId(cmisObject.Id).Where(p => p.RemotePath != remoteSubFolder.Path);
foreach (var folderToDelete in foldersToDelete)
{
RemoveFolderLocally(folderToDelete.LocalPath);
};
if (localFolderItem != null || remoteSubFolder.IsRootFolder) break;
// Go up one level before performing the same thing.
remoteSubFolder = remoteSubFolder.Parents[0]; //TODO: Fix Parents[0] for multi-parent repositories
localFolderItem = database.GetFolderSyncItemFromRemotePath(remoteSubFolder.Path);
};
CrawlSync(remoteSubFolder, remoteSubFolder.Path, localFolderItem.LocalPath);
}
else if (cmisObject is DotCMIS.Client.Impl.Document)
{
var remoteDocument = cmisObject as IDocument;
// Apply the change on all paths via which it is applicable.
foreach (IFolder remoteIFolder in remoteDocument.Parents)
{
if (PathIsApplicable(remoteIFolder.Path))
{
Logger.Debug("Document change is applicable:" + remoteIFolder);
var localFolderItem = database.GetFolderSyncItemFromRemotePath(remoteIFolder.Path);
var localFolder = localFolderItem.LocalPath;
var remoteDocumentPath = CmisUtils.PathCombine(remoteIFolder.Path, repoInfo.CmisProfile.localFilename(remoteDocument));
var documentItem = SyncItemFactory.CreateFromRemoteDocument(remoteDocumentPath, remoteDocument, repoInfo, database);
CrawlRemoteDocument(remoteDocument, documentItem.RemotePath, localFolder, null);
}
}
}
}