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;
            }
        }