/// <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")); }