/// <summary> /// Download files based on parameters defined in the settings. /// </summary> /// <param name="requestHandler">Request handler</param> /// <param name="settings">Download settings</param> public void DoDownload(IRequestHandler requestHandler, DownloadSettings settings) { // Create output dir var outDir = Path.Combine(settings.OutputDirectory, settings.Schema.Replace(":", "_")); // Get mapping for defined schema var mapping = _mappingFactory.GetMapping(settings.Schema); if (mapping == null) { Log.Error($"Unrecognised schema: {settings.Schema}"); return; } // Do query var response = _queryService.ExecuteQuery(requestHandler, settings.Schema, mapping.QueryFields, settings.Conditions); if (!response.Success) { Log.Error($"Query failed: {response.Message}"); return; } Log.Debug($"Query succeeded:{Environment.NewLine}{string.Join(",", response.Data)}"); foreach (var item in response.Data) { var rawCode = item.Replace(@" xmlns=""urn:xtk:queryDef""", string.Empty); Template template; try { template = mapping.ParseQueryResponse(requestHandler, rawCode); } catch (Exception ex) { Log.Error($"Query response parsing failed: {ex.Message}"); Log.Debug(ex); continue; } var metadataInserter = _metadataInserterFactory.GetInserter(template.FileExtension); var code = metadataInserter.InsertMetadata(template); var relativePath = settings.SubdirectoryMode == SubdirectoryMode.UnderscoreDelimited ? template.Metadata.Name.Name.Replace("_", @"\") : template.Metadata.Name.Name; var filePath = template.Metadata.Name.HasNamespace ? Path.Combine(outDir, template.Metadata.Name.Namespace, relativePath) : Path.Combine(outDir, relativePath); if (!filePath.EndsWith(template.FileExtension)) { filePath += template.FileExtension; } var dir = Path.GetDirectoryName(filePath); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } File.WriteAllText(filePath, code); Log.Debug($"{template.Metadata.Name} downloaded."); } Log.Info($"{response.Data.Count()} files downloaded."); }
/// <summary> /// Upload a set of files defined by the settings. /// </summary> /// <param name="requestHandler">Request handler</param> /// <param name="settings">Upload settings</param> public void DoUpload(IRequestHandler requestHandler, UploadSettings settings) { var pathList = settings.FilePaths?.SelectMany(i => { if (File.Exists(i)) { return(new[] { i }); } if (Directory.Exists(i)) { return(Directory.GetFiles(i, "*", SearchOption.AllDirectories)); } var dir = Path.GetDirectoryName(i); if (Directory.Exists(dir)) { return(Directory.GetFiles(dir, Path.GetFileName(i), SearchOption.AllDirectories)); } Log.Warn($"{i} specified for upload but no matching files found."); return(new string[0]); }).ToArray() ?? new string[0]; var templateList = pathList.Select(i => { var fileExtension = Path.GetExtension(i); var metadataExtractor = _metadataExtractorFactory.GetExtractor(fileExtension); if (metadataExtractor == null) { Log.Warn($"Unsupported filetype {i}."); return(null); } var raw = File.ReadAllText(i); var template = metadataExtractor.ExtractMetadata(raw); if (template.Metadata == null) { Log.Warn($"No metadata found in {i}."); return(new Tuple <string, Template>(i, template)); } else if (template.Metadata.Schema == null) { Log.Warn($"No schema found in {i}."); return(new Tuple <string, Template>(i, template)); } else if (template.Metadata.Name == null) { Log.Warn($"No name found in {i}."); return(new Tuple <string, Template>(i, template)); } return(new Tuple <string, Template>(i, template)); }).Where(i => i != null && i.Item2.Metadata != null && i.Item2.Metadata.Schema != null && i.Item2.Metadata.Name != null) .ToArray(); if (settings.TestMode) { Log.Info($"{templateList.Count()} files found:{Environment.NewLine}{string.Join(Environment.NewLine, templateList.Select(i => i.Item2.Metadata.Name))}"); } else { var templateTotalCount = templateList.Length; var templateProcessedCount = 0; var templateSuccessCount = 0; foreach (var item in templateList) { var filePath = item.Item1; var template = item.Item2; templateProcessedCount++; // Get mapping for defined schema, and generate object for write var mapping = _mappingFactory.GetMapping(template.Metadata.Schema.ToString()); // Get transformer, which is dependent on file type as well as entity type var templateTransformer = mapping.GetTransformer(Path.GetExtension(filePath)); // The transformer may return multiple variants, each of which should be uploaded var variants = templateTransformer != null ? templateTransformer.Transform(template, new TransformParameters { OriginalFileName = filePath, ApplyTransforms = settings.ApplyTransforms, }) : new[] { template }; // Upload each variant foreach (var variant in variants) { if (variant.Code != null && settings.Replacements != null) { foreach (var replacement in settings.Replacements) { variant.Code = variant.Code.Replace(replacement.Item1, replacement.Item2); } } var persistable = mapping.GetPersistableItem(requestHandler, variant); var response = _writeService.Write(requestHandler, persistable); if (!response.Success) { Log.Warn($"Upload of {variant.Metadata.Name} failed: {response.Message}"); } else { templateSuccessCount++; } } } Log.Info($"{templateSuccessCount} files uploaded."); // Build any schemas uploaded var schemaList = templateList.Where(i => i.Item2.Metadata.Schema.ToString() == Schema.EntitySchema).ToArray(); if (schemaList.Any()) { var schemaTotalCount = schemaList.Length; var schemaProcessedCount = 0; var schemaSuccessCount = 0; foreach (var item in schemaList) { var schema = item.Item2; schemaProcessedCount++; var response = _builderService.BuildSchema(requestHandler, schema.Metadata.Name); if (!response.Success) { Log.Warn($"Build of {schema.Metadata.Name} failed: {response.Message}"); } else { schemaSuccessCount++; } } Log.Info($"{schemaSuccessCount} schemas built."); } // If any navigation hierarchies uploaded, build navigation hierarchy if (templateList.Any(i => i.Item2.Metadata.Schema.ToString() == NavigationHierarchy.EntitySchema)) { var response = _builderService.BuildNavigationHierarchy(requestHandler); if (!response.Success) { Log.Warn($"Build of navigation hierarchy failed: {response.Message}"); } else { Log.Info("Navigation hierarchy built."); } } // if (settings.PublishDeliveryTemplates) { var response = _publishingService.PublishTriggeredMessageInstances(requestHandler); if (!response.Success) { Log.Warn($"Publishing of Message Center services failed: {response.Message}"); } else if (response.Data != null && response.Data.Any(i => !i.Value)) { Log.Warn($"Publishing of Message Center services failed for: {string.Join(", ", response.Data.Where(i => !i.Value).Select(i => i.Key))}"); } else { Log.Info("Message Center services published."); } } } }