private DescriptionContext(IApiDocumentation apiDocumentation, ITypeDescriptionBuilder typeDescriptionBuilder, Type type, IDictionary<Type, Tuple<IClass, bool, bool>> typeDefinitions) { if (apiDocumentation == null) { throw new ArgumentNullException("apiDocumentation"); } if (typeDescriptionBuilder == null) { throw new ArgumentNullException("typeDescriptionBuilder"); } if (type == null) { throw new ArgumentNullException("type"); } if (typeDefinitions == null) { throw new ArgumentNullException("typeDefinitions"); } ApiDocumentation = apiDocumentation; TypeDescriptionBuilder = typeDescriptionBuilder; Type = type; _typeDefinitions = typeDefinitions; }
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); }
private DescriptionContext(IApiDocumentation apiDocumentation, ITypeDescriptionBuilder typeDescriptionBuilder, Type type, IDictionary <Type, Tuple <IClass, bool, bool> > typeDefinitions) { if (apiDocumentation == null) { throw new ArgumentNullException("apiDocumentation"); } if (typeDescriptionBuilder == null) { throw new ArgumentNullException("typeDescriptionBuilder"); } if (type == null) { throw new ArgumentNullException("type"); } if (typeDefinitions == null) { throw new ArgumentNullException("typeDefinitions"); } ApiDocumentation = apiDocumentation; TypeDescriptionBuilder = typeDescriptionBuilder; Type = type; _typeDefinitions = typeDefinitions; }
private IApiDocumentation BuildApiDocumentation(string fileExtension, Uri entityId) { ((ResponseInfo)Response).Headers.ContentDisposition = String.Format("inline; filename=\"{0}.{1}\"", FileName, fileExtension); IApiDocumentation result = _entityContextProvider.EntityContext.Create <IApiDocumentation>(new EntityId(entityId)); _apiDescriptionBuilder.BuildDescription(result, RequestedMediaTypeProfiles); _entityContextProvider.EntityContext.Commit(); return(result); }
/// <summary>Builds an API description.</summary> /// <param name="apiDocumentation">API documentation.</param> /// <param name="profiles">Requested media type profiles.</param> public void BuildDescription(IApiDocumentation apiDocumentation, IEnumerable <Uri> profiles) { if (apiDocumentation == null) { throw new ArgumentNullException("apiDocumentation"); } if (SpecializationType == typeof(object)) { return; } var typeDescriptionBuilder = GetTypeDescriptionBuilder(profiles); var context = DescriptionContext.ForType(apiDocumentation, SpecializationType, typeDescriptionBuilder); IClass specializationType = context.BuildTypeDescription(); BuildDescription(context, specializationType); }
public static DescriptionContext ForType(IApiDocumentation apiDocumentation, Type type, ITypeDescriptionBuilder typeDescriptionBuilder) { if (apiDocumentation == null) { throw new ArgumentNullException("apiDocumentation"); } if (typeDescriptionBuilder == null) { throw new ArgumentNullException("typeDescriptionBuilder"); } if (type == null) { throw new ArgumentNullException("type"); } return new DescriptionContext(apiDocumentation, typeDescriptionBuilder, type, new Dictionary<Type, Tuple<IClass, bool, bool>>()); }
public static DescriptionContext ForType(IApiDocumentation apiDocumentation, Type type, ITypeDescriptionBuilder typeDescriptionBuilder) { if (apiDocumentation == null) { throw new ArgumentNullException("apiDocumentation"); } if (typeDescriptionBuilder == null) { throw new ArgumentNullException("typeDescriptionBuilder"); } if (type == null) { throw new ArgumentNullException("type"); } return(new DescriptionContext(apiDocumentation, typeDescriptionBuilder, type, new Dictionary <Type, Tuple <IClass, bool, bool> >())); }
internal static IOperation AsOperation <T>(this OperationInfo <T> operation, IApiDocumentation apiDocumentation, EntityId id = null) { var methodId = id ?? operation.CreateId(apiDocumentation.Context.BaseUriSelector.SelectBaseUri(new EntityId(new Uri("/", UriKind.Relative)))); if (operation.IsWriteControllerOperation()) { switch (operation.UnderlyingMethod.Name) { case "Delete": return(apiDocumentation.Context.Create <IDeleteResourceOperation>(methodId)); case "Update": return(apiDocumentation.Context.Create <IReplaceResourceOperation>(methodId)); case "Create": return(apiDocumentation.Context.Create <ICreateResourceOperation>(methodId)); } } return(apiDocumentation.Context.Create <IOperation>(methodId)); }
/// <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); } }
/// <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); } }
public override async Task TheTest() { ApiDocumentation = await Client.GetApiDocumentation(Url); }
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); }
/// <summary>Retrieves an API's entry point resource.</summary> /// <param name="apiDocumentation">API documentation.</param> /// <param name="cancellationToken">Cancellation token.</param> /// <returns>Task with entry point obtained as an instance of the <see cref="IHypermediaContainer" />.</returns> public static async Task <IHypermediaContainer> GetEntryPoint(IApiDocumentation apiDocumentation, CancellationToken cancellationToken) { return(await((IHydraClient)apiDocumentation.Unwrap() .GetProperty(HypermediaProcessorBase.ClientPropertyInfo)) .GetResource(apiDocumentation.EntryPoint)); }
/// <summary>Retrieves an API's entry point resource.</summary> /// <param name="apiDocumentation">API documentation.</param> /// <returns>Task with entry point obtained as an instance of the <see cref="IHypermediaContainer" />.</returns> public static Task <IHypermediaContainer> GetEntryPoint(IApiDocumentation apiDocumentation) { return(GetEntryPoint(apiDocumentation, CancellationToken.None)); }
/// <summary>Builds an API description.</summary> /// <param name="apiDocumentation">API documentation.</param> /// <param name="profiles">Requested media type profiles.</param> public void BuildDescription(IApiDocumentation apiDocumentation, IEnumerable<Uri> profiles) { if (apiDocumentation == null) { throw new ArgumentNullException("apiDocumentation"); } if (SpecializationType == typeof(object)) { return; } var typeDescriptionBuilder = GetTypeDescriptionBuilder(profiles); var context = DescriptionContext.ForType(apiDocumentation, SpecializationType, typeDescriptionBuilder); IClass specializationType = context.BuildTypeDescription(); BuildDescription(context, specializationType); }