Skip to content

Commit 464bd21

Browse files
committed
Register local refs within external documents with unique GUID
1 parent dbfcf0a commit 464bd21

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
56
using Microsoft.OpenApi.Interfaces;
67
using Microsoft.OpenApi.Models;
@@ -14,6 +15,7 @@ namespace Microsoft.OpenApi.Reader.Services
1415
internal class OpenApiRemoteReferenceCollector : OpenApiVisitorBase
1516
{
1617
private readonly Dictionary<string, OpenApiReference> _references = new();
18+
private Guid _guid = new();
1719

1820
/// <summary>
1921
/// List of external references collected from OpenApiDocument
@@ -32,19 +34,30 @@ public IEnumerable<OpenApiReference> References
3234
/// <param name="referenceable"></param>
3335
public override void Visit(IOpenApiReferenceable referenceable)
3436
{
35-
AddReference(referenceable.Reference);
37+
AddExternalReference(referenceable.Reference);
38+
AddLocalReference(referenceable.Reference);
3639
}
3740

3841
/// <summary>
3942
/// Collect external reference
4043
/// </summary>
41-
private void AddReference(OpenApiReference reference)
44+
private void AddExternalReference(OpenApiReference reference)
4245
{
4346
if (reference is {IsExternal: true} &&
4447
!_references.ContainsKey(reference.ExternalResource))
4548
{
4649
_references.Add(reference.ExternalResource, reference);
4750
}
4851
}
52+
53+
private void AddLocalReference(OpenApiReference reference)
54+
{
55+
if (reference is { IsExternal: false } &&
56+
!_references.ContainsKey(reference.ReferenceV3))
57+
{
58+
reference.ExternalResource = _guid.ToString();
59+
_references.Add(reference.ReferenceV3, reference);
60+
}
61+
}
4962
}
5063
}

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,32 @@ internal async Task<OpenApiDiagnostic> LoadAsync(OpenApiReference reference,
3939
// Walk references
4040
foreach (var item in referenceCollector.References)
4141
{
42+
4243
// If not already in workspace, load it and process references
4344
if (!_workspace.Contains(item.ExternalResource))
4445
{
45-
var input = await _loader.LoadAsync(new(item.ExternalResource, UriKind.RelativeOrAbsolute));
46-
var result = await OpenApiDocument.LoadAsync(input, format, _readerSettings, cancellationToken);
47-
// Merge diagnostics
48-
if (result.OpenApiDiagnostic != null)
46+
if (!Guid.TryParse(item.ExternalResource, out _))
4947
{
50-
diagnostic.AppendDiagnostic(result.OpenApiDiagnostic, item.ExternalResource);
48+
var input = await _loader.LoadAsync(new(item.ExternalResource, UriKind.RelativeOrAbsolute));
49+
var result = await OpenApiDocument.LoadAsync(input, format, _readerSettings, cancellationToken);
50+
// Merge diagnostics
51+
if (result.OpenApiDiagnostic != null)
52+
{
53+
diagnostic.AppendDiagnostic(result.OpenApiDiagnostic, item.ExternalResource);
54+
}
55+
if (result.OpenApiDocument != null)
56+
{
57+
var loadDiagnostic = await LoadAsync(item, result.OpenApiDocument, format, diagnostic, cancellationToken);
58+
diagnostic = loadDiagnostic;
59+
}
5160
}
52-
if (result.OpenApiDocument != null)
61+
else // local ref in an external file, add this to the documents registry
5362
{
54-
var loadDiagnostic = await LoadAsync(item, result.OpenApiDocument, format, diagnostic, cancellationToken);
55-
diagnostic = loadDiagnostic;
56-
}
63+
if (!_workspace.Contains(item.ExternalResource))
64+
{
65+
_workspace.AddDocument(reference.ExternalResource, document);
66+
}
67+
}
5768
}
5869
}
5970

0 commit comments

Comments
 (0)