| using BaSys40.Models.Core.AssetAdministrationShell.Generics; |
| using Swashbuckle.AspNetCore.Swagger; |
| using Swashbuckle.AspNetCore.SwaggerGen; |
| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.Runtime.Serialization; |
| |
| namespace BaSys40.Component.REST |
| { |
| internal class SchemaFilter : ISchemaFilter |
| { |
| public void Apply(Schema model, SchemaFilterContext context) |
| { |
| if (context.SystemType.IsInterface) |
| { |
| string newName = context.SystemType.Name.Substring(1, context.SystemType.Name.Length - 1); |
| model.Title = newName; |
| } |
| } |
| } |
| |
| internal class DocumentFilter : IDocumentFilter |
| { |
| public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) |
| { |
| var models = typeof(IAssetAdministrationShell).Assembly; |
| var types = models.GetTypes().Where(t => Attribute.IsDefined(t, typeof(DataContractAttribute)) && !t.IsGenericType); |
| foreach (var type in types) |
| { |
| context.SchemaRegistry.GetOrRegister(type); |
| } |
| |
| List<string> modelRemoveList = new List<string>(); |
| foreach (var model in context.SchemaRegistry.Definitions) |
| { |
| if (model.Key.StartsWith("I") && models.GetTypes().Any(t => t.Name == model.Key && t.IsInterface)) |
| modelRemoveList.Add(model.Key); |
| } |
| |
| foreach (var model in modelRemoveList) |
| { |
| //context.SchemaRegistry.Definitions.Remove(model); |
| foreach (var schema in context.SchemaRegistry.Definitions) |
| { |
| ReplaceRefInSchema(schema.Value, model); |
| } |
| } |
| |
| } |
| |
| public void ReplaceRefInSchema(Schema schema, string modelName) |
| { |
| if (!string.IsNullOrEmpty(schema.Ref)) |
| { |
| if (modelName == "IValue") |
| schema.Ref = schema.Ref.Replace("IValue", "ElementValue"); |
| else |
| schema.Ref = schema.Ref.Replace(modelName, modelName.Substring(1)); |
| } |
| if (schema.Properties != null) |
| { |
| foreach (var prop in schema.Properties) |
| { |
| ReplaceRefInSchema(prop.Value, modelName); |
| } |
| |
| } |
| if (schema.Items != null) |
| ReplaceRefInSchema(schema.Items, modelName); |
| } |
| } |
| } |