Esempio n. 1
0
        /// <summary>
        /// Get the sub-folders of a particular CMIS folder.
        /// </summary>
        /// <returns>Full path of each sub-folder, including leading slash.</returns>
        static public string[] GetSubfolders(CmisRepoCredentials credentials, string path)
        {
            List <string> result = new List <string>();

            // Connect to the CMIS repository.
            Dictionary <string, string> cmisParameters = GetCmisParameters(credentials);
            SessionFactory factory = SessionFactory.NewInstance();
            ISession       session = factory.CreateSession(cmisParameters);

            // Get the folder.
            IFolder folder;

            try {
                folder = (IFolder)session.GetObjectByPath(path);
            } catch (Exception ex) {
                Logger.Warn(string.Format("CmisUtils | exception when session GetObjectByPath for {0}: {1}", path, Utils.ToLogString(ex)));
                return(result.ToArray());
            }

            // Debug the properties count, which allows to check whether a particular CMIS implementation is compliant or not.
            // For instance, IBM Connections is known to send an illegal count.
            Logger.Info("CmisUtils | folder.Properties.Count:" + folder.Properties.Count.ToString());

            // Get the folder's sub-folders.
            IItemEnumerable <ICmisObject> children = folder.GetChildren();

            // Return the full path of each of the sub-folders.
            foreach (var subfolder in children.OfType <IFolder>())
            {
                result.Add(subfolder.Path);
            }

            return(result.ToArray());
        }
Esempio n. 2
0
        public void SmokeTestRootFolder()
        {
            ICmisObject rootFolderObject = Session.GetRootFolder();

            Assert.NotNull(rootFolderObject);
            Assert.NotNull(rootFolderObject.Id);
            Assert.True(rootFolderObject is IFolder);

            IFolder rootFolder = (IFolder)rootFolderObject;

            Assert.AreEqual("/", rootFolder.Path);
            Assert.AreEqual(1, rootFolder.Paths.Count);

            Assert.NotNull(rootFolder.AllowableActions);
            Assert.True(rootFolder.AllowableActions.Actions.Contains(Actions.CanGetProperties));
            Assert.False(rootFolder.AllowableActions.Actions.Contains(Actions.CanGetFolderParent));

            IItemEnumerable <ICmisObject> children = rootFolder.GetChildren();

            Assert.NotNull(children);
            foreach (ICmisObject child in children)
            {
                Assert.NotNull(child);
                Assert.NotNull(child.Id);
                Assert.NotNull(child.Name);
                Console.WriteLine(child.Name + " (" + child.Id + ")");
            }
        }
Esempio n. 3
0
        static public string[] GetSubfolders(string repositoryId, string path,
                                             string address, string user, string password)
        {
            List <string> result = new List <string>();

            Dictionary <string, string> cmisParameters = new Dictionary <string, string>();

            cmisParameters[SessionParameter.BindingType]  = BindingType.AtomPub;
            cmisParameters[SessionParameter.AtomPubUrl]   = address;
            cmisParameters[SessionParameter.User]         = user;
            cmisParameters[SessionParameter.Password]     = password;
            cmisParameters[SessionParameter.RepositoryId] = repositoryId;

            SessionFactory factory = SessionFactory.NewInstance();
            ISession       session = factory.CreateSession(cmisParameters);

            IFolder folder = (IFolder)session.GetObjectByPath(path);

            Logger.Info("Sync | folder.Properties.Count:" + folder.Properties.Count);
            IItemEnumerable <ICmisObject> children = folder.GetChildren();

            foreach (var subfolder in children.OfType <IFolder>())
            {
                result.Add(subfolder.Path);
            }
            return(result.ToArray());
        }
Esempio n. 4
0
        /// <summary>
        /// Get the sub-folders of a particular CMIS folder.
        /// </summary>
        /// <returns>Full path of each sub-folder, including leading slash.</returns>
        static public string[] GetSubfolders(string repositoryId, string path,
                                             string url, string user, string password)
        {
            List <string> result = new List <string>();

            // Connect to the CMIS repository.
            ISession session = Auth.Auth.GetCmisSession(url, user, password, repositoryId);

            // Get the folder.
            IFolder folder;

            try
            {
                folder = (IFolder)session.GetObjectByPath(path);
            }
            catch (Exception ex)
            {
                Logger.Warn(String.Format("CmisUtils | exception when session GetObjectByPath for {0}", path), ex);
                return(result.ToArray());
            }

            // Debug the properties count, which allows to check whether a particular CMIS implementation is compliant or not.
            // For instance, IBM Connections is known to send an illegal count.
            Logger.Info("CmisUtils | folder.Properties.Count:" + folder.Properties.Count.ToString());

            // Get the folder's sub-folders.
            IItemEnumerable <ICmisObject> children = folder.GetChildren();

            // Return the full path of each of the sub-folders.
            foreach (var subfolder in children.OfType <IFolder>())
            {
                result.Add(subfolder.Path);
            }
            return(result.ToArray());
        }
Esempio n. 5
0
        public List <CMISFolder> GetFoldersByPath(string path, string checkPublishInEvolveFilter)
        {
            DocumentList      documents = new DocumentList();
            List <CMISFolder> folders   = new List <CMISFolder>();
            CMISFolder        folder    = new CMISFolder(path);

            folders.Add(folder);
            string pathString = Utilities.CMISUtilities.AddCMISNamespaceToPath(path);

            // get documents
            folder.ContainedDocuments = this.GetDocumentsByPath(path, checkPublishInEvolveFilter);
            //get sub folders
            IItemEnumerable <IQueryResult> qr = CMISQuery.SelectFoldersByPath(pathString);

            foreach (IQueryResult hit in qr)
            {
                Dictionary <string, string> FolderProperties = this.GetProperties(hit);

                string subFolderPath = FolderProperties["path"];
                string slicedPath    = Utilities.CMISUtilities.sliceDocumentLibraryPath(subFolderPath);

                CMISFolder subFolder = new CMISFolder(slicedPath);

                subFolder.ContainedDocuments = this.GetDocumentsByPath(slicedPath, checkPublishInEvolveFilter);

                folders.Add(subFolder);
            }
            return(folders);
        }
Esempio n. 6
0
        public DocumentList GetDocumentsByPath(string path, string checkPublishInEvolveFilter)
        {
            string pathString = Utilities.CMISUtilities.AddCMISNamespaceToPath(path);
            List <DocumentInfo>         documents       = new List <DocumentInfo>();
            Dictionary <string, string> propertiesByKey = new Dictionary <string, string>();
            Dictionary <string, DocumentPropertyMetaData> propertyMetaData = null;
            IItemEnumerable <IQueryResult> qr = CMISQuery.SelectDocumentsByPath(pathString, checkPublishInEvolveFilter);

            foreach (IQueryResult hit in qr)
            {
                DocumentInfo doc = new DocumentInfo(hit["d.cmis:objectId"].FirstValue.ToString(), hit["d.cmis:name"].FirstValue.ToString());
                doc.Properties = this.GetProperties(hit);
                doc.Path       = path;


                documents.Add(doc);
                if (propertyMetaData == null)
                {
                    propertyMetaData = this.GetDocumentPropertyMetaData(hit);
                }
            }
            return(new DocumentList
            {
                Documents = documents,
                DocumentPropertyMetaData = propertyMetaData
            });
        }
Esempio n. 7
0
        public void Init()
        {
            source = new List <int>();
            for (int i = 0; i < 100; i++)
            {
                source.Add(i);
            }

            PageFetcher <int> .FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)
            {
                IList <int> page = new List <int>();

                for (int i = (int)skipCount; i < skipCount + maxNumItems; i++)
                {
                    if (source.Count <= i)
                    {
                        break;
                    }
                    page.Add(source[i]);
                }

                return(new PageFetcher <int> .Page <int>(page, source.Count, skipCount + maxNumItems < source.Count));
            };

            testEnumerable = new CollectionEnumerable <int>(new PageFetcher <int>(PageSize, fetchPageDelegate));
        }
Esempio n. 8
0
        /// <summary>
        /// Get the sub-folders of a particular CMIS folder.
        /// </summary>
        /// <returns>Full path of each sub-folder, including leading slash.</returns>
        static public string[] GetSubfolders(string repositoryId, string path,
                                             string address, string user, string password)
        {
            List <string> result = new List <string>();

            // Connect to the CMIS repository.
            Dictionary <string, string> cmisParameters = new Dictionary <string, string>();

            cmisParameters[SessionParameter.BindingType]  = BindingType.AtomPub;
            cmisParameters[SessionParameter.AtomPubUrl]   = address;
            cmisParameters[SessionParameter.User]         = user;
            cmisParameters[SessionParameter.Password]     = password;
            cmisParameters[SessionParameter.RepositoryId] = repositoryId;
            SessionFactory factory = SessionFactory.NewInstance();
            ISession       session = factory.CreateSession(cmisParameters);

            // Get the folder.
            IFolder folder = (IFolder)session.GetObjectByPath(path);

            // Debug the properties count, which allows to check whether a particular CMIS implementation is compliant or not.
            // For instance, IBM Connections is known to send an illegal count.
            Logger.Info("CmisUtils | folder.Properties.Count:" + folder.Properties.Count.ToString());

            // Get the folder's sub-folders.
            IItemEnumerable <ICmisObject> children = folder.GetChildren();

            // Return the full path of each of the sub-folders.
            foreach (var subfolder in children.OfType <IFolder>())
            {
                result.Add(subfolder.Path);
            }
            return(result.ToArray());
        }
Esempio n. 9
0
        public void WriteThenRead(string canonical_name, string localPath, string remoteFolderPath,
                                  string url, string user, string password, string repositoryId)
        {
            string fileName       = "test.txt";
            var    cmisParameters = new Dictionary <string, string>();

            cmisParameters[SessionParameter.BindingType]  = BindingType.AtomPub;
            cmisParameters[SessionParameter.AtomPubUrl]   = url;
            cmisParameters[SessionParameter.User]         = user;
            cmisParameters[SessionParameter.Password]     = Crypto.Deobfuscate(password);
            cmisParameters[SessionParameter.RepositoryId] = repositoryId;

            SessionFactory factory = SessionFactory.NewInstance();
            ISession       session = factory.GetRepositories(cmisParameters)[0].CreateSession();

            // IFolder root = session.GetRootFolder();
            IFolder root = (IFolder)session.GetObjectByPath(remoteFolderPath);

            Dictionary <string, object> properties = new Dictionary <string, object>();

            properties.Add(PropertyIds.Name, fileName);
            properties.Add(PropertyIds.ObjectTypeId, "cmis:document");

            ContentStream contentStream = new ContentStream();

            contentStream.FileName = fileName;
            contentStream.MimeType = MimeType.GetMIMEType(fileName); // Should CmisSync try to guess?
            byte[] bytes = Encoding.UTF8.GetBytes("Hello,world!");
            contentStream.Stream = new MemoryStream(bytes);
            contentStream.Length = bytes.Length;

            // Create file.
            DotCMIS.Enums.VersioningState?state = null;
            if (true != session.RepositoryInfo.Capabilities.IsAllVersionsSearchableSupported)
            {
                state = DotCMIS.Enums.VersioningState.None;
            }
            session.CreateDocument(properties, root, contentStream, state);

            // Check whether file is present.
            IItemEnumerable <ICmisObject> children = root.GetChildren();
            bool found = false;

            foreach (ICmisObject child in children)
            {
                string childFileName = (string)child.GetPropertyValue(PropertyIds.Name);
                Console.WriteLine(childFileName);
                if (childFileName.Equals(fileName))
                {
                    found = true;
                }
            }
            Assert.True(found);

            // Clean.
            IDocument doc = (IDocument)session.GetObjectByPath((remoteFolderPath + "/" + fileName).Replace("//", "/"));

            doc.DeleteAllVersions();
        }
Esempio n. 10
0
        public void WriteThenRead(string canonical_name, string localPath, string remoteFolderPath,
                                  string url, string user, string password, string repositoryId)
        {
            string fileName       = "test.txt";
            var    cmisParameters = new Dictionary <string, string>();

            cmisParameters[SessionParameter.BindingType]  = BindingType.AtomPub;
            cmisParameters[SessionParameter.AtomPubUrl]   = url;
            cmisParameters[SessionParameter.User]         = user;
            cmisParameters[SessionParameter.Password]     = password;
            cmisParameters[SessionParameter.RepositoryId] = repositoryId;

            SessionFactory factory = SessionFactory.NewInstance();
            ISession       session = factory.GetRepositories(cmisParameters)[0].CreateSession();

            // IFolder root = session.GetRootFolder();
            IFolder root = (IFolder)session.GetObjectByPath(remoteFolderPath);

            Dictionary <string, object> properties = new Dictionary <string, object>();

            properties.Add(PropertyIds.Name, fileName);
            properties.Add(PropertyIds.ObjectTypeId, "cmis:document");

            ContentStream contentStream = new ContentStream();

            contentStream.FileName = fileName;
            contentStream.MimeType = MimeType.GetMIMEType(fileName); // Should CmisSync try to guess?
            contentStream.Stream   = File.OpenRead("../../../TestLibraryRunner/Program.cs");

            // Create file.
            session.CreateDocument(properties, root, contentStream, null);

            // Check whether file is present.
            IItemEnumerable <ICmisObject> children = root.GetChildren();
            bool found = false;

            foreach (ICmisObject child in children)
            {
                string childFileName = (string)child.GetPropertyValue(PropertyIds.Name);
                Console.WriteLine(childFileName);
                if (childFileName.Equals(fileName))
                {
                    found = true;
                }
            }
            Assert.True(found);

            // Clean.
            IDocument doc = (IDocument)session.GetObjectByPath(remoteFolderPath + "/" + fileName);

            doc.DeleteAllVersions();
        }
        public void RenameAlfrescoDirectory(string OldName, string NewName)
        {
            Master = (IFolder)session.GetObject("8a4fec83-a7db-4636-8e84-9ed0babac107");
            IItemEnumerable <ICmisObject> Children = Master.GetChildren();

            foreach (var child in Children)
            {
                if (child.Name == OldName)
                {
                    child.Rename(NewName);
                }
            }
        }
        public IDocument Post(string DocumentName, string DocumentType, byte[] File, string FolderName)
        {
            //IFolder folder = session.GetRootFolder();
            Master = (IFolder)session.GetObject("8a4fec83-a7db-4636-8e84-9ed0babac107");

            var Exists = Master.GetChildren(operationContext).Any(child => child.Name.Equals(FolderName));

            if (Exists)
            {
                IItemEnumerable <ICmisObject> Children = Master.GetChildren();

                foreach (var child in Children)
                {
                    if (child.Name == FolderName)
                    {
                        WorkingDirectory = child as IFolder;
                    }
                }
            }
            else
            {
                WorkingDirectory = CreateFolder(Master, FolderName);
            }


            // define dictionary
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Add(PropertyIds.Name, DocumentName);
            properties.Add(PropertyIds.ObjectTypeId, "cmis:document");
            ContentStream contentStream = new ContentStream
            {
                FileName = DocumentName,
                MimeType = DocumentType,
                Length   = File.Length,
                Stream   = new MemoryStream(File)
            };


            if (FileExists(WorkingDirectory, DocumentName))
            {
                IItemEnumerable <ICmisObject> Files = WorkingDirectory.GetChildren();
                DeleteFile(Files, DocumentName);
            }

            return(WorkingDirectory.CreateDocument(properties, contentStream, null));
        }
Esempio n. 13
0
        public Dictionary <string, DocumentPropertyMetaData> GetDocumentPropertyMetaData()
        {
            Dictionary <string, DocumentPropertyMetaData> propertyMetaData = null;
            IItemEnumerable <IQueryResult> qr = CMISQuery.SelectDocumentsByKey("");

            foreach (IQueryResult hit in qr)
            {
                if (propertyMetaData == null)
                {
                    propertyMetaData = this.GetDocumentPropertyMetaData(hit);
                }
                else
                {
                    break;
                }
            }
            return(propertyMetaData);
        }
Esempio n. 14
0
        public void SmokeTestQuery()
        {
            IItemEnumerable <IQueryResult> qr = Session.Query("SELECT * FROM cmis:document", false);

            Assert.NotNull(qr);

            foreach (IQueryResult hit in qr)
            {
                Assert.NotNull(hit);
                Assert.NotNull(hit["cmis:objectId"]);
                Console.WriteLine(hit.GetPropertyValueById(PropertyIds.Name) + " (" + hit.GetPropertyValueById(PropertyIds.ObjectId) + ")");

                foreach (IPropertyData prop in hit.Properties)
                {
                    string name  = prop.QueryName;
                    object value = prop.FirstValue;
                }
            }
        }
        public bool Delete(string DocumentName, string FolderName)
        {
            Master = (IFolder)session.GetObject("8a4fec83-a7db-4636-8e84-9ed0babac107");

            var Exists = Master.GetChildren(operationContext).Any(child => child.Name.Equals(FolderName));

            if (Exists)
            {
                IItemEnumerable <ICmisObject> Children = Master.GetChildren();

                foreach (var child in Children)
                {
                    if (child.Name == FolderName)
                    {
                        WorkingDirectory = child as IFolder;
                    }
                }
            }
            else
            {
                WorkingDirectory = CreateFolder(Master, FolderName);
            }

            if (FileExists(WorkingDirectory, DocumentName))
            {
                IItemEnumerable <ICmisObject> Files = WorkingDirectory.GetChildren();

                try
                {
                    DeleteFile(Files, DocumentName);
                    return(true);
                }
                catch (Exception ex)
                {
                    return(false);

                    throw ex as Exception;
                }
            }

            return(true);
        }
        public bool DeleteFile(IItemEnumerable <ICmisObject> Files, string FileName)
        {
            bool prop = false;

            foreach (var file in Files)
            {
                try
                {
                    if (file.Name == FileName)
                    {
                        file.Delete(true);
                    }

                    prop = true;
                }
                catch (Exception e)
                {
                    throw e as Exception;
                }
            }

            return(prop);
        }
Esempio n. 17
0
        public void Init()
        {
            source = new List<int>();
            for (int i = 0; i < 100; i++)
            {
                source.Add(i);
            }

            PageFetcher<int>.FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)
            {
                IList<int> page = new List<int>();

                for (int i = (int)skipCount; i < skipCount + maxNumItems; i++)
                {
                    if (source.Count <= i) { break; }
                    page.Add(source[i]);
                }

                return new PageFetcher<int>.Page<int>(page, source.Count, skipCount + maxNumItems < source.Count);
            };

            testEnumerable = new CollectionEnumerable<int>(new PageFetcher<int>(PageSize, fetchPageDelegate));
        }
Esempio n. 18
0
        /// <summary>
        /// the key links a document to a cm instance
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public DocumentList GetDocumentsByKey(string key)
        {
            List <DocumentInfo>         documents       = new List <DocumentInfo>();
            Dictionary <string, string> propertiesByKey = new Dictionary <string, string>();
            Dictionary <string, DocumentPropertyMetaData> propertyMetaData = null;
            IItemEnumerable <IQueryResult> qr = CMISQuery.SelectDocumentsByKey(key);

            foreach (IQueryResult hit in qr)
            {
                DocumentInfo doc = new DocumentInfo(hit["d.cmis:objectId"].FirstValue.ToString(), hit["d.cmis:name"].FirstValue.ToString());
                doc.Properties = this.GetProperties(hit);
                documents.Add(doc);
                if (propertyMetaData == null)
                {
                    propertyMetaData = this.GetDocumentPropertyMetaData(hit);
                }
            }

            return(new DocumentList
            {
                Documents = documents,
                DocumentPropertyMetaData = propertyMetaData
            });
        }
Esempio n. 19
0
        public void DotCmisToIBMConnections(string canonical_name, string localPath, string remoteFolderPath,
                                            string url, string user, string password, string repositoryId)
        {
            var cmisParameters = new Dictionary <string, string>();

            cmisParameters[SessionParameter.BindingType]  = BindingType.AtomPub;
            cmisParameters[SessionParameter.AtomPubUrl]   = url;
            cmisParameters[SessionParameter.User]         = user;
            cmisParameters[SessionParameter.Password]     = Crypto.Deobfuscate(password);
            cmisParameters[SessionParameter.RepositoryId] = repositoryId;

            SessionFactory factory = SessionFactory.NewInstance();
            ISession       session = factory.GetRepositories(cmisParameters)[0].CreateSession();

            Console.WriteLine("Depth: 1");
            IFolder root = session.GetRootFolder();
            IItemEnumerable <ICmisObject> children = root.GetChildren();

            foreach (var folder in children.OfType <IFolder>())
            {
                Console.WriteLine(folder.Path);
            }

            Console.WriteLine("Depth: 2");
            root     = session.GetRootFolder();
            children = root.GetChildren();
            foreach (var folder in children.OfType <IFolder>())
            {
                Console.WriteLine(folder.Path);
                IItemEnumerable <ICmisObject> subChildren = folder.GetChildren();
                foreach (var subFolder in subChildren.OfType <IFolder>()) // Exception happens here, see https://issues.apache.org/jira/browse/CMIS-593
                {
                    Console.WriteLine(subFolder.Path);
                }
            }
        }
Esempio n. 20
0
        public void SmokeTestTypes()
        {
            // getTypeDefinition
            IObjectType documentType = Session.GetTypeDefinition("cmis:document");

            Assert.NotNull(documentType);
            Assert.True(documentType is DocumentType);
            Assert.AreEqual("cmis:document", documentType.Id);
            Assert.AreEqual(BaseTypeId.CmisDocument, documentType.BaseTypeId);
            Assert.True(documentType.IsBaseType);
            Assert.IsNullOrEmpty(documentType.ParentTypeId);
            Assert.NotNull(documentType.PropertyDefinitions);
            Assert.True(documentType.PropertyDefinitions.Count >= 9);

            IObjectType folderType = Session.GetTypeDefinition("cmis:folder");

            Assert.NotNull(folderType);
            Assert.True(folderType is FolderType);
            Assert.AreEqual("cmis:folder", folderType.Id);
            Assert.AreEqual(BaseTypeId.CmisFolder, folderType.BaseTypeId);
            Assert.True(folderType.IsBaseType);
            Assert.IsNullOrEmpty(folderType.ParentTypeId);
            Assert.NotNull(folderType.PropertyDefinitions);
            Assert.True(folderType.PropertyDefinitions.Count >= 9);

            // getTypeChildren
            Session.Clear();

            IItemEnumerable <IObjectType> children = Session.GetTypeChildren(null, true);

            Assert.NotNull(children);

            int count;

            count = 0;
            foreach (IObjectType type in children)
            {
                Assert.NotNull(type);
                Assert.NotNull(type.Id);
                Assert.True(type.IsBaseType);
                Assert.IsNullOrEmpty(type.ParentTypeId);
                Assert.NotNull(type.PropertyDefinitions);

                Session.Clear();
                IObjectType type2 = Session.GetTypeDefinition(type.Id);
                AssertAreEqual(type, type2);

                Session.GetTypeChildren(type.Id, true);

                count++;
            }

            Assert.True(count >= 2);
            Assert.True(count <= 4);

            // getTypeDescendants
            Session.Clear();

            IList <ITree <IObjectType> > descendants = Session.GetTypeDescendants(null, -1, true);

            count = 0;
            foreach (ITree <IObjectType> tree in descendants)
            {
                Assert.NotNull(tree);
                Assert.NotNull(tree.Item);

                IObjectType type = tree.Item;
                Assert.NotNull(type);
                Assert.NotNull(type.Id);
                Assert.True(type.IsBaseType);
                Assert.IsNullOrEmpty(type.ParentTypeId);
                Assert.NotNull(type.PropertyDefinitions);

                Session.Clear();
                IObjectType type2 = Session.GetTypeDefinition(type.Id);
                AssertAreEqual(type, type2);

                Session.GetTypeDescendants(type.Id, 2, true);

                count++;
            }

            Assert.True(count >= 2);
            Assert.True(count <= 4);
        }
Esempio n. 21
0
 public ShopIterator(IItemEnumerable item)
 {
     this.item = item;
 }
Esempio n. 22
0
            /// <summary>
            /// Crawl remote content, syncing down if needed.
            /// Meanwhile, cache remoteFiles and remoteFolders, they are output parameters that are used in CrawlLocalFiles/CrawlLocalFolders
            /// </summary>
            private bool CrawlRemote(IFolder remoteFolder, string remotePath, string localFolder, IList <string> localFilenameTranslationOfExistingRemoteDocuments, IList <string> remoteFolders)
            {
                bool success = true;

                SleepWhileSuspended();

                // Remember seen names, and depending on the profile ignore the ones that have appeared already.
                // For instance, if the CMIS server has a file called Hello and a folder called HELLO, then on Windows the paths would conflict.
                // Store lowercase file and folder names inside.
                HashSet <string> names = new HashSet <string>();

                // Get all remote children.
                // TODO: use paging
                IOperationContext operationContext = session.CreateOperationContext();

                operationContext.FilterString            = "*";
                operationContext.IncludeAllowableActions = true;
                operationContext.IncludePolicies         = true;
                operationContext.IncludeRelationships    = IncludeRelationshipsFlag.Both;
                operationContext.IncludeAcls             = true;
                // renditionFilter=* not available in DotCMIS
                this.repoInfo.CmisProfile.ConfigureOperationContext(operationContext);
                operationContext.MaxItemsPerPage = Int32.MaxValue;

                // Get children.
                IItemEnumerable <ICmisObject> childrenEnumeration = remoteFolder.GetChildren(operationContext);

                // Log.

                /*IList<ICmisObject> children = childrenEnumeration.ToList(); // Because we need to enumerate twice (log+crawl).
                 * StringBuilder logBuilder = new StringBuilder();
                 * foreach (ICmisObject cmisObject in children)
                 * {
                 *  logBuilder.Append(cmisObject.Name + " (" + cmisObject.GetType().Name + ") ");
                 * }
                 * Logger.Debug("Content of " + remotePath + ": " + logBuilder);*/

                // Crawl.
                foreach (ICmisObject cmisObject in childrenEnumeration /*children*/)
                {
                    try
                    {
                        if (cmisObject is DotCMIS.Client.Impl.Folder)
                        {
                            // It is a CMIS folder.
                            IFolder remoteSubFolder = (IFolder)cmisObject;
                            string  remoteSubPath   = CmisUtils.PathCombine(remotePath, remoteSubFolder.Name);

                            // Ignore edgy folders.
                            if (repoInfo.CmisProfile.IgnoreIfSameLowercaseNames && names.Contains(remoteSubFolder.Name.ToLowerInvariant()))
                            {
                                Logger.Warn("Ignoring " + remoteSubFolder.Name + "because other file or folder has the same name when ignoring lowercase/uppercase");
                                continue;
                            }
                            if (!repoInfo.CmisProfile.RemoteObjectWorthSyncing(remoteSubFolder))
                            {
                                continue;
                            }

                            CrawlRemoteFolder(remoteSubFolder, remoteSubPath, localFolder, remoteFolders);
                            names.Add(remoteSubFolder.Name.ToLowerInvariant());
                        }
                        else if (cmisObject is DotCMIS.Client.Impl.Document)
                        {
                            // It is a CMIS document.
                            IDocument remoteDocument     = (IDocument)cmisObject;
                            string    remoteDocumentPath = CmisUtils.PathCombine(remotePath, remoteDocument.Name);

                            // Ignore edgy documents.
                            if (repoInfo.CmisProfile.IgnoreIfSameLowercaseNames &&
                                names.Contains(repoInfo.CmisProfile.localFilename(remoteDocument).ToLowerInvariant()))
                            {
                                Logger.Warn("Ignoring " + repoInfo.CmisProfile.localFilename(remoteDocument) + "because other file or folder has the same name when ignoring lowercase/uppercase");
                                continue;
                            }
                            if (!repoInfo.CmisProfile.RemoteObjectWorthSyncing(remoteDocument))
                            {
                                continue;
                            }

                            CrawlRemoteDocument(remoteDocument, remoteDocumentPath, localFolder, localFilenameTranslationOfExistingRemoteDocuments);
                            names.Add(remoteDocument.Name.ToLowerInvariant());
                        }
                        else if (isLink(cmisObject))
                        {
                            Logger.Debug("Ignoring file '" + remoteFolder + "/" + cmisObject.Name + "' of type '" +
                                         cmisObject.ObjectType.Description + "'. Links are not currently handled.");
                        }
                        else
                        {
                            Logger.Warn("Unknown object type: '" + cmisObject.ObjectType.Description + "' (" + cmisObject.ObjectType.DisplayName
                                        + ") for object " + remoteFolder + "/" + cmisObject.Name);
                        }
                    }
                    catch (CmisBaseException e)
                    {
                        ProcessRecoverableException("Could not access remote object: " + cmisObject.Name, e);
                        success = false;
                    }
                }
                return(success);
            }