/// <summary>
        ///     Processes folders, their subfolders and files for creating the TOC of the DIP package.
        /// </summary>
        /// <param name="ordnerListe">The ordner liste.</param>
        /// <param name="repositoryFolder">The repository folder.</param>
        private void ProcessFolder(List <OrdnerDIP> ordnerListe, RepositoryFolder repositoryFolder)
        {
            var ordner = new OrdnerDIP
            {
                Id           = $"{repositoryFolder.SipId}_D", // Adding suffix _D so we have unique names. Otherwise the folder has the same id like the dossier
                Name         = repositoryFolder.PhysicalName,
                OriginalName = repositoryFolder.LogicalName
            };

            ProcessFiles(ordner.Datei, repositoryFolder.Files);
            foreach (var folder in repositoryFolder.Folders)
            {
                ProcessFolder(ordner.Ordner, folder);
            }

            ordnerListe.Add(ordner);
        }
        public async Task CreateMetadataXml(string folderName, RepositoryPackage package, List <RepositoryFile> filesToIgnore)
        {
            // Make sure folder name exists
            if (!Directory.Exists(folderName))
            {
                Directory.CreateDirectory(folderName);
            }

            CopyXsdFiles(folderName);

            // Lesen der Bestellposition und aller Kinder aus dem Elastic Index.
            var getArchiveRecordsForPackageRequest = new GetArchiveRecordsForPackageRequest {
                PackageId = package.PackageId
            };
            var response = await indexClient.GetResponse <GetArchiveRecordsForPackageResponse>(getArchiveRecordsForPackageRequest);

            var indexRecords = response.Message?.Result;

            Log.Debug($"Found the following archive records for pack" +
                      $"ageId {package.PackageId}: {JsonConvert.SerializeObject(indexRecords)}");

            // If using the Alfresco Repository, then we simply return a "hard coded" file
            if (repositoryAccess.GetRepositoryName().StartsWith("Alfresco", StringComparison.InvariantCultureIgnoreCase))
            {
                var defaultMetadata = GetFileFromRessource();
                File.WriteAllText(Path.Combine(folderName, "metadata.xml"), defaultMetadata);
                return;
            }

            // Einlesen aller Folder Objekte aus dem DIR. Einerseit vom Einstiegspunkt hinauf bis zur Ablieferung
            // andererseits nach unten bis in die tiefste Ebene.
            InitFolders(package);

            var dip = new PaketDIP
            {
                SchemaVersion      = SchemaVersion.Item41,
                Generierungsdatum  = DateTime.Today,
                Bestellinformation = null // Info nur für Benutzungskopie von Vecteur
            };

            // Schreibe die Daten in die Schema-Struktur, ausgehend vom "obersten" Ordner, der Ablieferung.
            var root = FoldersTreeList.Find(f => f.Parent == null);

            if (root == null)
            {
                throw new InvalidOperationException("Unable to find root folder for exporting metadata.");
            }

            AddFolderData(root, null, dip, indexRecords.ToList(), package.PackageId, filesToIgnore);


            // Generiere noch das Inhaltsverzeichnis
            var contentRoot = new OrdnerDIP
            {
                Id           = $"contentRoot{DateTime.Now.Ticks}",
                Name         = "content",
                OriginalName = "content"
            };

            dip.Inhaltsverzeichnis.Ordner.Add(contentRoot);
            foreach (var folder in package.Folders)
            {
                ProcessFolder(contentRoot.Ordner, folder);
            }

            ProcessFiles(contentRoot.Datei, package.Files);


            // Save data to disk
            dip.SchemaLocation = "http://bar.admin.ch/gebrauchskopie/v1 gebrauchskopie.xsd";
            ((Paket)dip).SaveToFile(Path.Combine(folderName, "metadata.xml"));
        }