Skip to content

Commit dd3f13c

Browse files
committed
Add JsonSchema reference resolution to OpenApiDocument class
1 parent 74e4b4d commit dd3f13c

File tree

2 files changed

+28
-17
lines changed

2 files changed

+28
-17
lines changed

src/Microsoft.OpenApi/Models/OpenApiDocument.cs

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ public class OpenApiDocument : IOpenApiSerializable, IOpenApiExtensible, IBaseDo
9797
/// </summary>
9898
public OpenApiDocument()
9999
{
100-
// BaseUri = new Uri("http://openapi.net/document/" + Guid.NewGuid());
101-
//_docId = Guid.NewGuid().ToString();
102100
Workspace = new OpenApiWorkspace();
103101
Workspace.AddDocument("/", this);
104102
}
@@ -485,6 +483,29 @@ public IOpenApiReferenceable ResolveReference(OpenApiReference reference)
485483
return ResolveReference(reference, false);
486484
}
487485

486+
/// <summary>
487+
/// Resolves JsonSchema refs
488+
/// </summary>
489+
/// <param name="referenceUri"></param>
490+
/// <returns>A JsonSchema ref.</returns>
491+
public JsonSchema ResolveJsonSchemaReference(Uri referenceUri)
492+
{
493+
if (referenceUri == null) return null;
494+
495+
OpenApiReference reference = new OpenApiReference()
496+
{
497+
ExternalResource = referenceUri.OriginalString,
498+
Id = referenceUri.OriginalString.Split('/').Last(),
499+
Type = ReferenceType.Schema
500+
};
501+
502+
JsonSchema resolvedSchema = reference.ExternalResource.StartsWith("#")
503+
? (JsonSchema)Workspace.ResolveReference<IBaseDocument>(reference.Id, reference.Type, Components) // local ref
504+
: Workspace.ResolveReference<JsonSchema>(reference); // external ref
505+
506+
return resolvedSchema ?? throw new OpenApiException(string.Format(Properties.SRResource.InvalidReferenceId, reference.Id));
507+
}
508+
488509
/// <summary>
489510
/// Takes in an OpenApi document instance and generates its hash value
490511
/// </summary>
@@ -536,7 +557,7 @@ internal IOpenApiReferenceable ResolveReference(OpenApiReference reference, bool
536557
{
537558
throw new ArgumentException(Properties.SRResource.WorkspaceRequredForExternalReferenceResolution);
538559
}
539-
return this.Workspace.ResolveReference(reference);
560+
return this.Workspace.ResolveReference<IOpenApiReferenceable>(reference);
540561
}
541562

542563
if (!reference.Type.HasValue)
@@ -559,16 +580,8 @@ internal IOpenApiReferenceable ResolveReference(OpenApiReference reference, bool
559580
return null;
560581
}
561582

562-
IOpenApiReferenceable resolvedReference = Workspace.ResolveReference<IOpenApiReferenceable>(reference.Id, reference.Type, Components);
563-
564-
if (resolvedReference != null)
565-
{
566-
return resolvedReference;
567-
}
568-
else
569-
{
570-
throw new OpenApiException(string.Format(Properties.SRResource.InvalidReferenceId, reference.Id));
571-
}
583+
return Workspace.ResolveReference<IOpenApiReferenceable>(reference.Id, reference.Type, Components)
584+
?? throw new OpenApiException(string.Format(Properties.SRResource.InvalidReferenceId, reference.Id));
572585
}
573586

574587
/// <summary>

src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ namespace Microsoft.OpenApi.Services
1818
public class OpenApiReferenceResolver : OpenApiVisitorBase
1919
{
2020
private OpenApiDocument _currentDocument;
21-
private readonly bool _resolveRemoteReferences;
2221
private List<OpenApiError> _errors = new();
2322

2423
/// <summary>
@@ -251,9 +250,8 @@ private Dictionary<string, JsonSchema> ResolveJsonSchemas(IDictionary<string, Js
251250
/// <param name="summary">The schema's summary.</param>
252251
/// <returns></returns>
253252
public JsonSchema ResolveJsonSchemaReference(Uri reference, string description = null, string summary = null)
254-
{
255-
var refUri = $"https://registry{reference.OriginalString.Split('#').LastOrDefault()}";
256-
var resolvedSchema = (JsonSchema)SchemaRegistry.Global.Get(new Uri(refUri));
253+
{
254+
var resolvedSchema = _currentDocument.ResolveJsonSchemaReference(reference);
257255

258256
if (resolvedSchema != null)
259257
{

0 commit comments

Comments
 (0)