Skip to content

Commit d229688

Browse files
committed
Moved OpenAPIWorkspace to sync loading
1 parent 1debbf2 commit d229688

File tree

5 files changed

+56
-31
lines changed

5 files changed

+56
-31
lines changed

src/Microsoft.OpenApi.Readers/Interface/IStreamLoader.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,12 @@ public interface IInputLoader<TInput>
1919
/// <param name="uri">Identifier of some source of an OpenAPI Description</param>
2020
/// <returns>A data objext that can be processed by a reader to generate an <see cref="OpenApiDocument"/></returns>
2121
Task<TInput> LoadAsync(Uri uri);
22+
23+
/// <summary>
24+
/// Use Uri to locate data and convert into an input object.
25+
/// </summary>
26+
/// <param name="uri"></param>
27+
/// <returns></returns>
28+
TInput Load(Uri uri);
2229
}
2330
}

src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,6 @@ public class OpenApiReaderSettings
6666
/// <remarks>
6767
/// Default loader will attempt to dereference http(s) urls and file urls.
6868
/// </remarks>
69-
public Func<Uri, Task<Stream>> CustomExternalLoader { get; set; }
69+
public Func<Uri, Stream> CustomExternalLoader { get; set; }
7070
}
7171
}

src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -51,30 +51,7 @@ public OpenApiDocument Read(YamlDocument input, out OpenApiDiagnostic diagnostic
5151
// Parse the OpenAPI Document
5252
document = context.Parse(input);
5353

54-
// Resolve References if requested
55-
switch (_settings.ReferenceResolution)
56-
{
57-
case ReferenceResolutionSetting.ResolveAllReferences:
58-
var openApiWorkSpace = new OpenApiWorkspace();
59-
document.Workspace = openApiWorkSpace;
60-
var streamLoader = new DefaultStreamLoader();
61-
62-
var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, _settings.CustomExternalLoader ?? streamLoader.LoadAsync, _settings);
63-
workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource="/" }, document);
64-
65-
// TODO: Need to add ReadAsync for resolving all references.
66-
throw new ArgumentException(Properties.SRResource.CannotResolveRemoteReferencesSynchronously);
67-
case ReferenceResolutionSetting.ResolveLocalReferences:
68-
var errors = document.ResolveReferences(false);
69-
70-
foreach (var item in errors)
71-
{
72-
diagnostic.Errors.Add(item);
73-
}
74-
break;
75-
case ReferenceResolutionSetting.DoNotResolveReferences:
76-
break;
77-
}
54+
ResolveReferences(diagnostic, document);
7855
}
7956
catch (OpenApiException ex)
8057
{
@@ -93,6 +70,33 @@ public OpenApiDocument Read(YamlDocument input, out OpenApiDiagnostic diagnostic
9370

9471
return document;
9572
}
73+
74+
private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument document)
75+
{
76+
// Resolve References if requested
77+
switch (_settings.ReferenceResolution)
78+
{
79+
case ReferenceResolutionSetting.ResolveAllReferences:
80+
var openApiWorkSpace = new OpenApiWorkspace();
81+
document.Workspace = openApiWorkSpace;
82+
var streamLoader = new DefaultStreamLoader();
83+
84+
var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, _settings.CustomExternalLoader ?? streamLoader.Load, _settings);
85+
workspaceLoader.Load(new OpenApiReference() { ExternalResource = "/" }, document);
86+
break;
87+
case ReferenceResolutionSetting.ResolveLocalReferences:
88+
var errors = document.ResolveReferences(false);
89+
90+
foreach (var item in errors)
91+
{
92+
diagnostic.Errors.Add(item);
93+
}
94+
break;
95+
case ReferenceResolutionSetting.DoNotResolveReferences:
96+
break;
97+
}
98+
}
99+
96100
/// <summary>
97101
/// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element.
98102
/// </summary>

src/Microsoft.OpenApi.Readers/Services/DefaultStreamLoader.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ internal class DefaultStreamLoader : IInputLoader<Stream>
1919
{
2020
private HttpClient _httpClient = new HttpClient();
2121

22+
public Stream Load(Uri uri)
23+
{
24+
switch (uri.Scheme)
25+
{
26+
case "file":
27+
return File.OpenRead(uri.AbsolutePath);
28+
case "http":
29+
case "https":
30+
return _httpClient.GetStreamAsync(uri).GetAwaiter().GetResult();
31+
32+
default:
33+
throw new ArgumentException("Unsupported scheme");
34+
}
35+
}
36+
2237
public async Task<Stream> LoadAsync(Uri uri)
2338
{
2439
switch (uri.Scheme)
@@ -28,7 +43,6 @@ public async Task<Stream> LoadAsync(Uri uri)
2843
case "http":
2944
case "https":
3045
return await _httpClient.GetStreamAsync(uri);
31-
3246
default:
3347
throw new ArgumentException("Unsupported scheme");
3448
}

src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ namespace Microsoft.OpenApi.Readers.Services
1414
internal class OpenApiWorkspaceLoader
1515
{
1616
private OpenApiWorkspace _workspace;
17-
private Func<Uri, Task<Stream>> _loader;
17+
private Func<Uri, Stream> _loader;
1818
private OpenApiDiagnostic _diagnostics;
1919
private OpenApiReaderSettings _readerSettings;
2020

21-
public OpenApiWorkspaceLoader(OpenApiWorkspace workspace, Func<Uri,Task<Stream>> loader, OpenApiReaderSettings readerSettings)
21+
public OpenApiWorkspaceLoader(OpenApiWorkspace workspace, Func<Uri,Stream> loader, OpenApiReaderSettings readerSettings)
2222
{
2323
_workspace = workspace;
2424
_loader = loader;
2525
_readerSettings = readerSettings;
2626
}
2727

28-
internal async Task LoadAsync(OpenApiReference reference, OpenApiDocument document)
28+
internal void Load(OpenApiReference reference, OpenApiDocument document)
2929
{
3030
_workspace.AddDocument(reference.ExternalResource, document);
3131
document.Workspace = _workspace;
@@ -43,9 +43,9 @@ internal async Task LoadAsync(OpenApiReference reference, OpenApiDocument docume
4343
// If not already in workspace, load it and process references
4444
if (!_workspace.Contains(item.ExternalResource))
4545
{
46-
var input = await _loader(new Uri(item.ExternalResource));
46+
var input = _loader(new Uri(item.ExternalResource));
4747
var newDocument = reader.Read(input, out _diagnostics); // TODO merge _diagnositics
48-
await LoadAsync(item, newDocument);
48+
Load(item, newDocument);
4949
}
5050
}
5151
}

0 commit comments

Comments
 (0)