private async Task LoadMetadata() { using (LogicalThreadContext.Stacks["NDC"].Push(_configuration.Url)) { File.Delete(Filename); Log.Info($"Loading API metadata from: {_configuration.Url}"); using (var writer = new StreamWriter(Filename)) { var metadataBlock = new BufferBlock <KeyValuePair <string, SwaggerDocument> >(); var documentsBlock = new TransformManyBlock <KeyValuePair <string, SwaggerDocument>, JsonModelMetadata>( x => { var jsonModelMetadatas = new List <JsonModelMetadata>(); foreach (var definition in x.Value.definitions) { var schema = definition.Value; if (schema == null) { continue; } var modelPath = GetPathForModel(x.Value, definition.Key); var properties = GetProperties( schema, x.Key, definition.Key, PathToSchema(modelPath)); jsonModelMetadatas.AddRange(properties); } return(jsonModelMetadatas); }); var outputBlock = new ActionBlock <JsonModelMetadata>( async x => await writer.WriteLineAsync(JsonConvert.SerializeObject(x, Formatting.None)) .ConfigureAwait(false)); // link blocks metadataBlock.LinkTo( documentsBlock, new DataflowLinkOptions { PropagateCompletion = true }); documentsBlock.LinkTo( outputBlock, new DataflowLinkOptions { PropagateCompletion = true }); // prime the pipeline var metadata = await _swaggerRetriever.LoadMetadata(); foreach (var m in metadata) { await metadataBlock.SendAsync(m); } metadataBlock.Complete(); await outputBlock.Completion; writer.Close(); } } }
public async Task <bool> PerformTest() { try { var metadata = await _retriever.LoadMetadata(); var t = new[] { "Resources", "Descriptors" }; foreach (var key in metadata.Keys.Where(k => t.Contains(k))) { var doc = metadata[key]; _swaggerDocuments[key] = doc; var uniqueSchemaNames = doc.paths.Keys .Select(GetSchemaNameFromPath) .Distinct() .ToList(); foreach (var path in doc.paths) { if (_resources.ContainsKey(path.Key)) { continue; } _resources[path.Key] = new Resource { Name = GetResoucePath(path.Key, path.Value), BasePath = doc.basePath, Path = path.Value, Schema = GetSchemaNameFromPath(path.Key), Definition = doc .definitions .FirstOrDefault( d => TypeNameHelper.CompareTypeNames(path.Key, d.Key, "_", uniqueSchemaNames)) .Value }; } foreach (var definition in doc.definitions) { if (_entities.ContainsKey(definition.Key)) { continue; } string[] nameParts = definition.Key.Split('_'); _entities[definition.Key] = new Entity { Name = definition.Key.Replace("_", string.Empty), Schema = nameParts[0], Definition = definition.Value }; } foreach (var schemaName in uniqueSchemaNames) { if (!_schemaNames.Contains(schemaName)) { _schemaNames.Add(schemaName); } } Log.Info("Success"); } return(true); } catch (Exception ex) { Log.Error(ex); throw; } }