Exemple #1
0
        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;
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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;
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        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>>());
        }
Exemple #7
0
        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> >()));
        }
Exemple #8
0
        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));
        }
Exemple #9
0
        /// <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);
        }
Exemple #13
0
 /// <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));
 }
Exemple #14
0
 /// <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);
        }