Skip to content

Commit

Permalink
Add ISwaggerGeneratorSettingsFactory support
Browse files Browse the repository at this point in the history
  • Loading branch information
RicoSuter committed Jul 1, 2018
1 parent b8c3bfd commit 9b67824
Show file tree
Hide file tree
Showing 19 changed files with 634 additions and 337 deletions.
3 changes: 2 additions & 1 deletion src/NSwag.AspNet.Owin/Middlewares/SwaggerMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ protected virtual async Task<string> GenerateSwaggerAsync(IOwinContext context)
{
try
{
var generator = new WebApiToSwaggerGenerator(_settings.GeneratorSettings, _schemaGenerator);
var settings = await _settings.CreateGeneratorSettingsAsync(context, null);
var generator = new WebApiToSwaggerGenerator(settings, _schemaGenerator);
var document = await generator.GenerateForControllersAsync(_controllerTypes);

document.Host = context.Request.Host.Value ?? "";
Expand Down
16 changes: 4 additions & 12 deletions src/NSwag.AspNetCore/Middlewares/AspNetCoreToSwaggerMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.Extensions.Options;
using NJsonSchema;
using NSwag.SwaggerGeneration;
using NSwag.SwaggerGeneration.AspNetCore;

Expand All @@ -37,6 +36,7 @@ public class AspNetCoreToSwaggerMiddleware
/// <summary>Initializes a new instance of the <see cref="WebApiToSwaggerMiddleware"/> class.</summary>
/// <param name="nextDelegate">The next delegate.</param>
/// <param name="apiDescriptionGroupCollectionProvider">The <see cref="IApiDescriptionGroupCollectionProvider"/>.</param>
/// <param name="mvcJsonOptions">The json options.</param>
/// <param name="settings">The settings.</param>
/// <param name="schemaGenerator">The schema generator.</param>
public AspNetCoreToSwaggerMiddleware(RequestDelegate nextDelegate, IApiDescriptionGroupCollectionProvider apiDescriptionGroupCollectionProvider, IOptions<MvcJsonOptions> mvcJsonOptions, SwaggerSettings<AspNetCoreToSwaggerGeneratorSettings> settings, SwaggerJsonSchemaGenerator schemaGenerator)
Expand Down Expand Up @@ -79,17 +79,9 @@ protected virtual async Task<string> GenerateSwaggerAsync(HttpContext context)

try
{
// TODO: Move to NJS (same in other generator)
var isSerializerSettingsSpecified =
_settings.GeneratorSettings.DefaultPropertyNameHandling != PropertyNameHandling.Default ||
_settings.GeneratorSettings.DefaultEnumHandling != EnumHandling.Integer ||
_settings.GeneratorSettings.ContractResolver != null |
_settings.GeneratorSettings.SerializerSettings != null;

if (!isSerializerSettingsSpecified)
_settings.GeneratorSettings.SerializerSettings = _mvcJsonOptions.Value.SerializerSettings;

var generator = new AspNetCoreToSwaggerGenerator(_settings.GeneratorSettings, _schemaGenerator);
var serializerSettings = _mvcJsonOptions.Value.SerializerSettings;
var settings = await _settings.CreateGeneratorSettingsAsync(context.RequestServices, serializerSettings);
var generator = new AspNetCoreToSwaggerGenerator(settings, _schemaGenerator);
var document = await generator.GenerateAsync(apiDescriptionGroups);

document.Host = context.Request.Host.Value ?? "";
Expand Down
15 changes: 3 additions & 12 deletions src/NSwag.AspNetCore/Middlewares/WebApiToSwaggerMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using NJsonSchema;
using NSwag.SwaggerGeneration;
using NSwag.SwaggerGeneration.WebApi;

Expand Down Expand Up @@ -80,17 +79,9 @@ protected virtual async Task<string> GenerateSwaggerAsync(HttpContext context)
{
try
{
// TODO: Move to NJS (same in other generator)
var isSerializerSettingsSpecified =
_settings.GeneratorSettings.DefaultPropertyNameHandling != PropertyNameHandling.Default ||
_settings.GeneratorSettings.DefaultEnumHandling != EnumHandling.Integer ||
_settings.GeneratorSettings.ContractResolver != null |
_settings.GeneratorSettings.SerializerSettings != null;

if (!isSerializerSettingsSpecified)
_settings.GeneratorSettings.SerializerSettings = _mvcJsonOptions.Value.SerializerSettings;

var generator = new WebApiToSwaggerGenerator(_settings.GeneratorSettings, _schemaGenerator);
var serializerSettings = _mvcJsonOptions.Value.SerializerSettings;
var settings = await _settings.CreateGeneratorSettingsAsync(context.RequestServices, serializerSettings);
var generator = new WebApiToSwaggerGenerator(settings, _schemaGenerator);
var document = await generator.GenerateForControllersAsync(_controllerTypes);

document.Host = context.Request.Host.Value ?? "";
Expand Down
31 changes: 30 additions & 1 deletion src/NSwag.AspNetCore/SwaggerSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,20 @@
//-----------------------------------------------------------------------

using System;
using System.Threading.Tasks;
using NJsonSchema;
using NSwag.SwaggerGeneration;
using NSwag.SwaggerGeneration.WebApi;
using Newtonsoft.Json;

#if AspNetOwin
using Microsoft.Owin;

namespace NSwag.AspNet.Owin
#else
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace NSwag.AspNetCore
#endif
{
Expand All @@ -22,7 +29,7 @@ public class SwaggerSettings<T>
where T : SwaggerGeneratorSettings, new()
{
/// <summary>Initializes a new instance of the <see cref="SwaggerSettings{T}"/> class.</summary>
public SwaggerSettings ()
public SwaggerSettings()
{
GeneratorSettings = new T();

Expand All @@ -35,6 +42,13 @@ public SwaggerSettings ()
/// <summary>Gets the generator settings.</summary>
public T GeneratorSettings { get; }

/// <summary>Gets or sets the settings factory.</summary>
#if !AspNetOwin
public ISwaggerGeneratorSettingsFactory<T, IServiceProvider> SettingsFactory { get; set; }
#else
public ISwaggerGeneratorSettingsFactory<T, IOwinContext> SettingsFactory { get; set; }
#endif

/// <summary>Gets or sets the OWIN base path (when mapped via app.MapOwinPath()) (must start with '/').</summary>
public string MiddlewareBasePath { get; set; }

Expand All @@ -48,5 +62,20 @@ public SwaggerSettings ()
public TimeSpan ExceptionCacheTime { get; set; } = TimeSpan.FromSeconds(10);

internal virtual string ActualSwaggerRoute => SwaggerRoute.Substring(MiddlewareBasePath?.Length ?? 0);

#if !AspNetOwin
public async Task<T> CreateGeneratorSettingsAsync(IServiceProvider context, JsonSerializerSettings serializerSettings)
#else
public async Task<T> CreateGeneratorSettingsAsync(IOwinContext context, JsonSerializerSettings serializerSettings)
#endif
{
if (SettingsFactory != null)
return await SettingsFactory.CreateAsync(serializerSettings, context);
else
{
GeneratorSettings.TryApplySerializerSettings(serializerSettings);
return GeneratorSettings;
}
}
}
}
14 changes: 9 additions & 5 deletions src/NSwag.AssemblyLoader/AssemblyLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public AssemblyLoader()

#endif

public object CreateInstance(string typeName)
public Type GetType(string typeName)
{
try
{
Expand All @@ -48,24 +48,23 @@ public object CreateInstance(string typeName)

#if FullNet
var assembly = AppDomain.CurrentDomain.Load(new AssemblyName(assemblyName));
return Activator.CreateInstance(assembly.GetType(typeName, true));
#else
var assembly = Context.LoadFromAssemblyName(new AssemblyName(assemblyName));
return Activator.CreateInstance(assembly.GetType(typeName, true));
#endif
return assembly.GetType(typeName, true);
}

#if FullNet
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType(typeName, false, true);
if (type != null)
return Activator.CreateInstance(type);
return type;
}

throw new InvalidOperationException("Could not find the type '" + typeName + "'.");
#else
return Activator.CreateInstance(Type.GetType(typeName, true, true));
return Type.GetType(typeName, true, true);
#endif
}
catch (Exception e)
Expand All @@ -74,6 +73,11 @@ public object CreateInstance(string typeName)
}
}

public object CreateInstance(string typeName)
{
return Activator.CreateInstance(GetType(typeName));
}

protected void RegisterReferencePaths(IEnumerable<string> referencePaths)
{
var allReferencePaths = new List<string>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public class AspNetCoreToSwaggerCommand : SwaggerGeneratorCommandBase<AspNetCore
public bool NoBuild { get; set; }

[Argument(Name = nameof(Verbose), IsRequired = false, Description = "Print verbose output.")]
public bool Verbose { get; set; }
public bool Verbose { get; set; } = true;

public override async Task<object> RunAsync(CommandLineProcessor processor, IConsoleHost host)
{
Expand Down Expand Up @@ -185,20 +185,15 @@ public override async Task<object> RunAsync(CommandLineProcessor processor, ICon

protected override async Task<string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader)
{
Settings.DocumentTemplate = await GetDocumentTemplateAsync();
InitializeCustomTypes(assemblyLoader);

var assemblies = await LoadAssembliesAsync(AssemblyPaths, assemblyLoader).ConfigureAwait(false);
var startupType = assemblies.First().ExportedTypes.First(t => t.Name == "Startup"); // TODO: Use .NET Core startup lookup or provide setting

using (var testServer = new TestServer(new WebHostBuilder().UseStartup(startupType)))
using (var testServer = await CreateTestServerAsync(assemblyLoader))
{
// See https://github.com/aspnet/Mvc/issues/5690

var type = typeof(IApiDescriptionGroupCollectionProvider);
var apiDescriptionProvider = (IApiDescriptionGroupCollectionProvider)testServer.Host.Services.GetRequiredService(type);

var generator = new AspNetCoreToSwaggerGenerator(Settings);
var settings = await CreateSettingsAsync(assemblyLoader, testServer.Host);
var generator = new AspNetCoreToSwaggerGenerator(settings);
var document = await generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).ConfigureAwait(false);

return PostprocessDocument(document);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,14 @@ internal class AspNetCoreToSwaggerGeneratorCommandEntryPoint
{
public static void Process(string commandContent, string outputFile, string applicationName)
{
var serviceProvider = GetServiceProvider(applicationName);
var apiDescriptionProvider = serviceProvider.GetRequiredService<IApiDescriptionGroupCollectionProvider>();
var webHost = GetWebHost(applicationName);
var apiDescriptionProvider = webHost.Services.GetRequiredService<IApiDescriptionGroupCollectionProvider>();

var assemblyLoader = new AssemblyLoader.AssemblyLoader();

var command = JsonConvert.DeserializeObject<AspNetCoreToSwaggerCommand>(commandContent);
command.InitializeCustomTypes(assemblyLoader);

var generator = new AspNetCoreToSwaggerGenerator(command.Settings);
var settings = Task.Run(async () => await command.CreateSettingsAsync(assemblyLoader, webHost)).GetAwaiter().GetResult();
var generator = new AspNetCoreToSwaggerGenerator(settings);
var document = generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).GetAwaiter().GetResult();

command.PostprocessDocument(document);
Expand All @@ -36,7 +35,7 @@ public static void Process(string commandContent, string outputFile, string appl
File.WriteAllText(outputFile, document.ToJson());
}

private static IServiceProvider GetServiceProvider(string applicationName)
private static IWebHost GetWebHost(string applicationName)
{
var assemblyName = new AssemblyName(applicationName);
var assembly = Assembly.Load(assemblyName);
Expand Down Expand Up @@ -68,7 +67,7 @@ private static IServiceProvider GetServiceProvider(string applicationName)

if (webHost != null)
{
return webHost.Services;
return webHost;
}

throw new InvalidOperationException($"aspnet2swaggercommand requires the entry point type {entryPointType.FullName} to have " +
Expand Down
Loading

0 comments on commit 9b67824

Please sign in to comment.