private void BuildEntryPointDescription( IApiDocumentation apiDocumentation, ControllerInfo entryPointControllerInfo, IHttpControllerDescriptionBuilder <EntryPointDescriptionController> entryPointControllerDescriptionBuilder) { var classUri = apiDocumentation.Context.Mappings.MappingFor(typeof(IApiDocumentation)).Classes.Select(item => item.Uri).FirstOrDefault(); var apiDocumentationClass = apiDocumentation.Context.Create <IClass>(classUri); var baseUri = apiDocumentation.Context.BaseUriSelector.SelectBaseUri(new EntityId(new Uri("/", UriKind.Relative))); foreach (OperationInfo <Verb> operation in entryPointControllerInfo.Operations) { var url = (Uri)operation.Url; if (operation.UrlTemplate != null) { var template = new UriTemplate(baseUri + operation.UrlTemplate.TrimStart('/')); var variables = operation.UnderlyingMethod.GetParameters().ToDictionary(parameter => parameter.Name, parameter => (object)parameter.DefaultValue.ToString()); url = template.ResolveUri(variables); } var operationId = new EntityId(url.Combine(baseUri)); var supportedOperation = operation.AsOperation(apiDocumentation, operationId); supportedOperation.MediaTypes.AddRange(ApiDescriptionBuilder.RdfMediaTypes); supportedOperation.Label = operation.UnderlyingMethod.Name; supportedOperation.Method.Add(operation.ProtocolSpecificCommand.ToString()); var returned = apiDocumentation.Context.Create <IClass>(apiDocumentation.CreateBlankId()); returned.SubClassOf.Add(apiDocumentationClass); supportedOperation.Returns.Add(returned); apiDocumentationClass.SupportedOperations.Add(supportedOperation); } apiDocumentation.SupportedClasses.Add(apiDocumentationClass); }
public void Teardown() { _apiDocumentation = null; _xmlDocProvider = null; _typeDescriptionBuilder = null; _namedGraphSelectorFactory = null; _descriptionBuilder = null; }
public void Setup() { Uri baseUri = new Uri("http://temp.org/"); _apiDocumentation = MockHelpers.MockEntity <IApiDocumentation>((_entityContext = SetupEntityContext(baseUri)).Object, new EntityId(new Uri(baseUri, "api"))); _xmlDocProvider = SetupXmlDocProvider(); _typeDescriptionBuilder = SetupTypeDescriptionBuilder(_entityContext); _namedGraphSelectorFactory = SetupNamedGraphSelectorFactory(baseUri); _descriptionBuilder = SetupHttpControllerDescriptionBuilder(); }
/// <inheritdoc /> public void BuildDescription(IApiDocumentation apiDocumentation, IEnumerable <Uri> profiles) { ControllerInfo entryPointControllerInfo = null; IHttpControllerDescriptionBuilder <EntryPointDescriptionController> entryPointControllerDescriptionBuilder = null; foreach (var controllerDescriptionBuilder in _controllerDescriptionBuilders) { var controllerDescriptionBuilderType = controllerDescriptionBuilder.GetType(); Type targetImplementation = null; controllerDescriptionBuilderType.GetInterfaces().FirstOrDefault(@interface => (@interface.IsGenericType) && (@interface.GetGenericTypeDefinition() == typeof(IHttpControllerDescriptionBuilder <>)) && (typeof(IController).IsAssignableFrom(targetImplementation = @interface.GetGenericArguments()[0]))); if ((targetImplementation == null) || ((targetImplementation.IsGenericType) && (targetImplementation.GetGenericTypeDefinition() == typeof(DescriptionController <>)))) { continue; } var controllerDescription = controllerDescriptionBuilder.BuildDescriptor(); if (controllerDescriptionBuilder is IHttpControllerDescriptionBuilder <EntryPointDescriptionController> ) { entryPointControllerDescriptionBuilder = (IHttpControllerDescriptionBuilder <EntryPointDescriptionController>)controllerDescriptionBuilder; entryPointControllerInfo = controllerDescription; continue; } if ((controllerDescription.EntryPoint == null) || (controllerDescription.EntryPoint.Url.ToString() != EntryPoint.ToString())) { continue; } var apiDescriptionBuilder = _apiDescriptionBuilderFactory.Create(targetImplementation); apiDescriptionBuilder.BuildDescription(apiDocumentation, profiles); } if (entryPointControllerInfo != null) { BuildEntryPointDescription(apiDocumentation, entryPointControllerInfo, entryPointControllerDescriptionBuilder); } }
/// <summary>Initializes a new instance of the <see cref="ApiDescriptionBuilder" /> class.</summary> /// <param name="descriptionBuilder">Description builder.</param> /// <param name="xmlDocProvider">The XML documentation provider.</param> /// <param name="typeDescriptionBuilders">Type description builders.</param> /// <param name="serverBehaviorAttributeVisitors">Server behavior attribute visitors.</param> /// <param name="namedGraphSelectorFactory">Named graph selector factory.</param> protected ApiDescriptionBuilder( IHttpControllerDescriptionBuilder descriptionBuilder, IXmlDocProvider xmlDocProvider, IEnumerable<ITypeDescriptionBuilder> typeDescriptionBuilders, IEnumerable<IServerBehaviorAttributeVisitor> serverBehaviorAttributeVisitors, INamedGraphSelectorFactory namedGraphSelectorFactory) { if (descriptionBuilder == null) { throw new ArgumentNullException("descriptionBuilder"); } if (xmlDocProvider == null) { throw new ArgumentNullException("xmlDocProvider"); } if (typeDescriptionBuilders == null) { throw new ArgumentNullException("typeDescriptionBuilders"); } if (!typeDescriptionBuilders.Any()) { throw new ArgumentOutOfRangeException("typeDescriptionBuilders"); } if (namedGraphSelectorFactory == null) { throw new ArgumentNullException("namedGraphSelectorFactory"); } _descriptionBuilder = descriptionBuilder; _xmlDocProvider = xmlDocProvider; _typeDescriptionBuilders = typeDescriptionBuilders; _serverBehaviorAttributeVisitors = serverBehaviorAttributeVisitors ?? new IServerBehaviorAttributeVisitor[0]; _namedGraphSelectorFactory = namedGraphSelectorFactory; }
/// <summary>Initializes a new instance of the <see cref="ApiDescriptionBuilder" /> class.</summary> /// <param name="descriptionBuilder">Description builder.</param> /// <param name="xmlDocProvider">The XML documentation provider.</param> /// <param name="typeDescriptionBuilders">Type description builders.</param> /// <param name="serverBehaviorAttributeVisitors">Server behavior attribute visitors.</param> /// <param name="namedGraphSelectorFactory">Named graph selector factory.</param> protected ApiDescriptionBuilder( IHttpControllerDescriptionBuilder descriptionBuilder, IXmlDocProvider xmlDocProvider, IEnumerable <ITypeDescriptionBuilder> typeDescriptionBuilders, IEnumerable <IServerBehaviorAttributeVisitor> serverBehaviorAttributeVisitors, INamedGraphSelectorFactory namedGraphSelectorFactory) { if (descriptionBuilder == null) { throw new ArgumentNullException("descriptionBuilder"); } if (xmlDocProvider == null) { throw new ArgumentNullException("xmlDocProvider"); } if (typeDescriptionBuilders == null) { throw new ArgumentNullException("typeDescriptionBuilders"); } if (!typeDescriptionBuilders.Any()) { throw new ArgumentOutOfRangeException("typeDescriptionBuilders"); } if (namedGraphSelectorFactory == null) { throw new ArgumentNullException("namedGraphSelectorFactory"); } _descriptionBuilder = descriptionBuilder; _xmlDocProvider = xmlDocProvider; _typeDescriptionBuilders = typeDescriptionBuilders; _serverBehaviorAttributeVisitors = serverBehaviorAttributeVisitors ?? new IServerBehaviorAttributeVisitor[0]; _namedGraphSelectorFactory = namedGraphSelectorFactory; }
private void BuildEntryPointDescription( IApiDocumentation apiDocumentation, ControllerInfo entryPointControllerInfo, IHttpControllerDescriptionBuilder<EntryPointDescriptionController> entryPointControllerDescriptionBuilder) { var classUri = apiDocumentation.Context.Mappings.MappingFor(typeof(IApiDocumentation)).Classes.Select(item => item.Uri).FirstOrDefault(); var apiDocumentationClass = apiDocumentation.Context.Create<IClass>(classUri); var baseUri = apiDocumentation.Context.BaseUriSelector.SelectBaseUri(new EntityId(new Uri("/", UriKind.Relative))); foreach (OperationInfo<Verb> operation in entryPointControllerInfo.Operations) { var url = (Uri)operation.Url; if (operation.UrlTemplate != null) { var template = new UriTemplate(baseUri + operation.UrlTemplate.TrimStart('/')); var variables = operation.UnderlyingMethod.GetParameters().ToDictionary(parameter => parameter.Name, parameter => (object)parameter.DefaultValue.ToString()); url = template.ResolveUri(variables); } var operationId = new EntityId(url.Combine(baseUri)); var supportedOperation = operation.AsOperation(apiDocumentation, operationId); supportedOperation.MediaTypes.AddRange(ApiDescriptionBuilder.RdfMediaTypes); supportedOperation.Label = operation.UnderlyingMethod.Name; supportedOperation.Method.Add(operation.ProtocolSpecificCommand.ToString()); var returned = apiDocumentation.Context.Create<IClass>(apiDocumentation.CreateBlankId()); returned.SubClassOf.Add(apiDocumentationClass); supportedOperation.Returns.Add(returned); apiDocumentationClass.SupportedOperations.Add(supportedOperation); } apiDocumentation.SupportedClasses.Add(apiDocumentationClass); }