Skip to content

Commit 8058d24

Browse files
Merge pull request #1278 from microsoft/mk/integrate-json-schema-library
JsonSchema.NET Integration
2 parents 159138c + 1afe195 commit 8058d24

File tree

281 files changed

+8552
-7392
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

281 files changed

+8552
-7392
lines changed

.github/workflows/sonarcloud.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ jobs:
2929
name: Build
3030
runs-on: windows-latest
3131
steps:
32-
- name: Set up JDK 11
32+
- name: Set up JDK 17
3333
uses: actions/setup-java@v3
3434
with:
3535
distribution: 'adopt'
36-
java-version: 11
36+
java-version: 17
3737
- name: Setup .NET 5 # At the moment the scanner requires dotnet 5 https://www.nuget.org/packages/dotnet-sonarscanner
3838
uses: actions/setup-dotnet@v3
3939
with:

src/Microsoft.OpenApi.Hidi/OpenApiService.cs

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@
77
using System.IO;
88
using System.Net;
99
using System.Net.Http;
10+
using System.Reflection;
1011
using System.Security;
1112
using System.Text;
12-
using System.Threading.Tasks;
1313
using System.Text.Json;
14-
using Microsoft.Extensions.Logging;
14+
using System.Threading;
15+
using System.Threading.Tasks;
16+
using System.Xml;
1517
using System.Xml.Linq;
18+
using System.Xml.Xsl;
19+
using Microsoft.Extensions.Configuration;
20+
using Microsoft.Extensions.Logging;
1621
using Microsoft.OData.Edm.Csdl;
1722
using Microsoft.OpenApi.Extensions;
1823
using Microsoft.OpenApi.Models;
@@ -21,11 +26,6 @@
2126
using Microsoft.OpenApi.Services;
2227
using Microsoft.OpenApi.Writers;
2328
using static Microsoft.OpenApi.Hidi.OpenApiSpecVersionHelper;
24-
using System.Threading;
25-
using System.Xml.Xsl;
26-
using System.Xml;
27-
using System.Reflection;
28-
using Microsoft.Extensions.Configuration;
2929

3030
namespace Microsoft.OpenApi.Hidi
3131
{
@@ -98,7 +98,7 @@ CancellationToken cancellationToken
9898
}
9999
}
100100

101-
private static void WriteOpenApi(FileInfo output, bool terseOutput, bool inlineLocal, bool inlineExternal, OpenApiFormat openApiFormat, OpenApiSpecVersion openApiVersion, OpenApiDocument document, ILogger logger)
101+
private static void WriteOpenApi(FileInfo output, bool terseOutput, bool inlineLocal, bool inlineExternal, OpenApiFormat openApiFormat, OpenApiSpecVersion openApiVersion, OpenApiDocument document, ILogger logger)
102102
{
103103
using (logger.BeginScope("Output"))
104104
{
@@ -135,7 +135,7 @@ private static async Task<OpenApiDocument> GetOpenApi(string openapi, string csd
135135
{
136136
OpenApiDocument document;
137137
Stream stream;
138-
138+
139139
if (!string.IsNullOrEmpty(csdl))
140140
{
141141
var stopwatch = new Stopwatch();
@@ -168,7 +168,7 @@ private static async Task<OpenApiDocument> GetOpenApi(string openapi, string csd
168168
return document;
169169
}
170170

171-
private static async Task<OpenApiDocument> FilterOpenApiDocument(string filterbyoperationids, string filterbytags, string filterbycollection, OpenApiDocument document, ILogger logger, CancellationToken cancellationToken)
171+
private static async Task<OpenApiDocument> FilterOpenApiDocument(string filterbyoperationids, string filterbytags, string filterbycollection, OpenApiDocument document, ILogger logger, CancellationToken cancellationToken)
172172
{
173173
using (logger.BeginScope("Filter"))
174174
{
@@ -239,8 +239,8 @@ private static Stream ApplyFilterToCsdl(Stream csdlStream, string entitySetOrSin
239239
/// Implementation of the validate command
240240
/// </summary>
241241
public static async Task ValidateOpenApiDocument(
242-
string openapi,
243-
ILogger logger,
242+
string openapi,
243+
ILogger logger,
244244
CancellationToken cancellationToken)
245245
{
246246
if (string.IsNullOrEmpty(openapi))
@@ -285,7 +285,7 @@ private static async Task<ReadResult> ParseOpenApi(string openApiFile, bool inli
285285
result = await new OpenApiStreamReader(new OpenApiReaderSettings
286286
{
287287
LoadExternalRefs = inlineExternal,
288-
BaseUrl = openApiFile.StartsWith("http", StringComparison.OrdinalIgnoreCase) ?
288+
BaseUrl = openApiFile.StartsWith("http", StringComparison.OrdinalIgnoreCase) ?
289289
new Uri(openApiFile) :
290290
new Uri("file://" + new FileInfo(openApiFile).DirectoryName + Path.DirectorySeparatorChar)
291291
}
@@ -296,7 +296,7 @@ private static async Task<ReadResult> ParseOpenApi(string openApiFile, bool inli
296296
LogErrors(logger, result);
297297
stopwatch.Stop();
298298
}
299-
299+
300300
return result;
301301
}
302302

@@ -310,7 +310,7 @@ internal static IConfiguration GetConfiguration(string settingsFile)
310310

311311
return config;
312312
}
313-
313+
314314
/// <summary>
315315
/// Converts CSDL to OpenAPI
316316
/// </summary>
@@ -329,7 +329,7 @@ public static async Task<OpenApiDocument> ConvertCsdlToOpenApi(Stream csdl, stri
329329
{
330330
settings.SemVerVersion = metadataVersion;
331331
}
332-
332+
333333
config.GetSection("OpenApiConvertSettings").Bind(settings);
334334

335335
OpenApiDocument document = edmModel.ConvertToOpenApi(settings);
@@ -354,7 +354,7 @@ public static OpenApiDocument FixReferences(OpenApiDocument document)
354354

355355
return doc;
356356
}
357-
357+
358358
/// <summary>
359359
/// Takes in a file stream, parses the stream into a JsonDocument and gets a list of paths and Http methods
360360
/// </summary>
@@ -377,13 +377,13 @@ public static Dictionary<string, List<string>> ParseJsonCollectionFile(Stream st
377377
private static Dictionary<string, List<string>> EnumerateJsonDocument(JsonElement itemElement, Dictionary<string, List<string>> paths)
378378
{
379379
var itemsArray = itemElement.GetProperty("item");
380-
380+
381381
foreach (var item in itemsArray.EnumerateArray())
382382
{
383-
if(item.ValueKind == JsonValueKind.Object)
383+
if (item.ValueKind == JsonValueKind.Object)
384384
{
385-
if(item.TryGetProperty("request", out var request))
386-
{
385+
if (item.TryGetProperty("request", out var request))
386+
{
387387
// Fetch list of methods and urls from collection, store them in a dictionary
388388
var path = request.GetProperty("url").GetProperty("raw").ToString();
389389
var method = request.GetProperty("method").ToString();
@@ -395,11 +395,11 @@ private static Dictionary<string, List<string>> EnumerateJsonDocument(JsonElemen
395395
{
396396
paths[path].Add(method);
397397
}
398-
}
399-
else
400-
{
398+
}
399+
else
400+
{
401401
EnumerateJsonDocument(item, paths);
402-
}
402+
}
403403
}
404404
else
405405
{
@@ -508,11 +508,11 @@ internal static async Task<string> ShowOpenApiDocument(string openapi, string cs
508508
if (output == null)
509509
{
510510
var tempPath = Path.GetTempPath() + "/hidi/";
511-
if(!File.Exists(tempPath))
511+
if (!File.Exists(tempPath))
512512
{
513513
Directory.CreateDirectory(tempPath);
514-
}
515-
514+
}
515+
516516
var fileName = Path.GetRandomFileName();
517517

518518
output = new FileInfo(Path.Combine(tempPath, fileName + ".html"));
@@ -528,7 +528,7 @@ internal static async Task<string> ShowOpenApiDocument(string openapi, string cs
528528
process.StartInfo.FileName = output.FullName;
529529
process.StartInfo.UseShellExecute = true;
530530
process.Start();
531-
531+
532532
return output.FullName;
533533
}
534534
else // Write diagram as Markdown document to output file
@@ -540,7 +540,7 @@ internal static async Task<string> ShowOpenApiDocument(string openapi, string cs
540540
}
541541
logger.LogTrace("Created markdown document with diagram ");
542542
return output.FullName;
543-
}
543+
}
544544
}
545545
}
546546
catch (TaskCanceledException)
@@ -563,7 +563,7 @@ private static void LogErrors(ILogger logger, ReadResult result)
563563
{
564564
foreach (var error in context.Errors)
565565
{
566-
logger.LogError($"Detected error during parsing: {error}",error.ToString());
566+
logger.LogError($"Detected error during parsing: {error}", error.ToString());
567567
}
568568
}
569569
}
@@ -581,7 +581,7 @@ internal static void WriteTreeDocumentAsMarkdown(string openapiUrl, OpenApiDocum
581581
// write a span for each mermaidcolorscheme
582582
foreach (var style in OpenApiUrlTreeNode.MermaidNodeStyles)
583583
{
584-
writer.WriteLine($"<span style=\"padding:2px;background-color:{style.Value.Color};border: 2px solid\">{style.Key.Replace("_"," ")}</span>");
584+
writer.WriteLine($"<span style=\"padding:2px;background-color:{style.Value.Color};border: 2px solid\">{style.Key.Replace("_", " ")}</span>");
585585
}
586586
writer.WriteLine("</div>");
587587
writer.WriteLine();
@@ -609,7 +609,7 @@ internal static void WriteTreeDocumentAsHtml(string sourceUrl, OpenApiDocument d
609609
writer.WriteLine("<h1>" + document.Info.Title + "</h1>");
610610
writer.WriteLine();
611611
writer.WriteLine($"<h3> API Description: <a href='{sourceUrl}'>{sourceUrl}</a></h3>");
612-
612+
613613
writer.WriteLine(@"<div>");
614614
// write a span for each mermaidcolorscheme
615615
foreach (var style in OpenApiUrlTreeNode.MermaidNodeStyles)
@@ -622,8 +622,8 @@ internal static void WriteTreeDocumentAsHtml(string sourceUrl, OpenApiDocument d
622622
rootNode.WriteMermaid(writer);
623623
writer.WriteLine("</code>");
624624

625-
// Write script tag to include JS library for rendering markdown
626-
writer.WriteLine(@"<script>
625+
// Write script tag to include JS library for rendering markdown
626+
writer.WriteLine(@"<script>
627627
var config = {
628628
startOnLoad:true,
629629
theme: 'forest',
@@ -635,8 +635,8 @@ internal static void WriteTreeDocumentAsHtml(string sourceUrl, OpenApiDocument d
635635
mermaid.initialize(config);
636636
window.mermaid.init(undefined, document.querySelectorAll('.language-mermaid'));
637637
</script>");
638-
// Write script tag to include JS library for rendering mermaid
639-
writer.WriteLine("</html");
638+
// Write script tag to include JS library for rendering mermaid
639+
writer.WriteLine("</html");
640640
}
641641
}
642642
}

src/Microsoft.OpenApi.Hidi/Program.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
using System;
54
using System.CommandLine;
65
using System.CommandLine.Parsing;
7-
using System.Diagnostics;
86
using System.IO;
9-
using System.Threading;
107
using System.Threading.Tasks;
118
using Microsoft.Extensions.Logging;
129
using Microsoft.OpenApi.Hidi.Handlers;
@@ -51,7 +48,7 @@ internal static RootCommand CreateRootCommand()
5148

5249
var formatOption = new Option<OpenApiFormat?>("--format", "File format");
5350
formatOption.AddAlias("-f");
54-
51+
5552
var terseOutputOption = new Option<bool>("--terse-output", "Produce terse json output");
5653
terseOutputOption.AddAlias("--to");
5754

src/Microsoft.OpenApi.Hidi/StatsVisitor.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using Json.Schema;
67
using Microsoft.OpenApi.Models;
78
using Microsoft.OpenApi.Services;
89

@@ -19,7 +20,7 @@ public override void Visit(OpenApiParameter parameter)
1920

2021
public int SchemaCount { get; set; } = 0;
2122

22-
public override void Visit(OpenApiSchema schema)
23+
public override void Visit(ref JsonSchema schema)
2324
{
2425
SchemaCount++;
2526
}

src/Microsoft.OpenApi.Readers/Exceptions/OpenApiReaderException.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System;
55
using System.Text.Json.Nodes;
66
using Microsoft.OpenApi.Exceptions;
7-
using SharpYaml.Serialization;
87

98
namespace Microsoft.OpenApi.Readers.Exceptions
109
{
@@ -30,7 +29,8 @@ public OpenApiReaderException(string message) : base(message) { }
3029
/// </summary>
3130
/// <param name="message">Plain text error message for this exception.</param>
3231
/// <param name="context">Context of current parsing process.</param>
33-
public OpenApiReaderException(string message, ParsingContext context) : base(message) {
32+
public OpenApiReaderException(string message, ParsingContext context) : base(message)
33+
{
3434
Pointer = context.GetLocation();
3535
}
3636

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

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

4-
using System;
54
using Microsoft.OpenApi.Interfaces;
65
using Microsoft.OpenApi.Models;
76
using Microsoft.OpenApi.Readers.ParseNodes;

src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFrameworks>netstandard2.0</TargetFrameworks>
44
<LangVersion>9.0</LangVersion>
@@ -35,7 +35,10 @@
3535
</PropertyGroup>
3636

3737
<ItemGroup>
38+
<PackageReference Include="JsonSchema.Net" Version="4.1.5" />
39+
<PackageReference Include="JsonSchema.Net.OpenApi" Version="1.1.0" />
3840
<PackageReference Include="SharpYaml" Version="2.1.0" />
41+
<PackageReference Include="Yaml2JsonNode" Version="1.1.1" />
3942
<PackageReference Include="System.Text.Json" Version="7.0.2" />
4043
</ItemGroup>
4144

src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs

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

4+
using System;
5+
using System.Collections.Generic;
6+
using System.IO;
47
using Microsoft.OpenApi.Any;
58
using Microsoft.OpenApi.Interfaces;
69
using Microsoft.OpenApi.Readers.Interface;
710
using Microsoft.OpenApi.Validations;
8-
using System;
9-
using System.Collections.Generic;
10-
using System.IO;
11-
using System.Text.Json.Nodes;
1211

1312
namespace Microsoft.OpenApi.Readers
1413
{

src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public OpenApiStreamReader(OpenApiReaderSettings settings = null)
2626
{
2727
_settings = settings ?? new OpenApiReaderSettings();
2828

29-
if((_settings.ReferenceResolution == ReferenceResolutionSetting.ResolveAllReferences || _settings.LoadExternalRefs)
29+
if ((_settings.ReferenceResolution == ReferenceResolutionSetting.ResolveAllReferences || _settings.LoadExternalRefs)
3030
&& _settings.BaseUrl == null)
3131
{
3232
throw new ArgumentException("BaseUrl must be provided to resolve external references.");

src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs

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

4-
using System.Collections;
54
using System.IO;
65
using System.Linq;
76
using System.Text.Json;

0 commit comments

Comments
 (0)