예제 #1
0
        /// <summary>
        /// Compares two <see cref="VersionedApiDescription">API descriptions</see>.
        /// </summary>
        /// <param name="x">The <see cref="VersionedApiDescription">API descriptions</see> to compare.</param>
        /// <param name="y">The <see cref="VersionedApiDescription">API descriptions</see> to compare against.</param>
        /// <returns>0 if the objects are equal, 1 if <paramref name="x"/> is greater than <paramref name="y"/>,
        /// or -1 if <paramref name="x"/> is less than <paramref name="y"/>.</returns>
        public virtual int Compare(VersionedApiDescription x, VersionedApiDescription y)
        {
            if (x == null)
            {
                return(y == null ? 0 : -1);
            }
            else if (y == null)
            {
                return(1);
            }

            var result = CompareStrings(x.HttpMethod?.Method, y.HttpMethod?.Method);

            if (result == 0)
            {
                result = CompareStrings(x.RelativePath, y.RelativePath);

                if (result == 0)
                {
                    result = CompareVersions(x.ApiVersion, y.ApiVersion);
                }
            }

            return(result);
        }
        void PopulateActionDescriptions(
            HttpActionDescriptor actionDescriptor,
            IHttpRoute route,
            ODataRouteBuilderContext routeBuilderContext,
            string relativePath,
            Collection <VersionedApiDescription> apiDescriptions,
            ApiVersion apiVersion)
        {
            Contract.Requires(actionDescriptor != null);
            Contract.Requires(route != null);
            Contract.Requires(relativePath != null);
            Contract.Requires(apiDescriptions != null);
            Contract.Requires(apiVersion != null);

            var documentation       = DocumentationProvider?.GetDocumentation(actionDescriptor);
            var responseDescription = CreateResponseDescriptionWithRoute(actionDescriptor, route);
            var responseType        = responseDescription.ResponseType ?? responseDescription.DeclaredType;
            var requestFormatters   = new List <MediaTypeFormatter>();
            var responseFormatters  = new List <MediaTypeFormatter>();
            var supportedMethods    = GetHttpMethodsSupportedByAction(route, actionDescriptor);
            var model      = actionDescriptor.GetApiVersionModel();
            var deprecated = !model.IsApiVersionNeutral && model.DeprecatedApiVersions.Contains(apiVersion);

            PopulateMediaTypeFormatters(actionDescriptor, routeBuilderContext.ParameterDescriptions, route, responseType, requestFormatters, responseFormatters);

            foreach (var method in supportedMethods)
            {
                var apiDescription = new VersionedApiDescription()
                {
                    Documentation       = documentation,
                    HttpMethod          = method,
                    RelativePath        = relativePath,
                    ActionDescriptor    = actionDescriptor,
                    Route               = route,
                    ResponseDescription = responseDescription,
                    ApiVersion          = apiVersion,
                    IsDeprecated        = deprecated,
                    Properties          = { [typeof(IEdmModel)] = routeBuilderContext.EdmModel },
                };

                if (routeBuilderContext.EntitySet != null)
                {
                    apiDescription.Properties[typeof(IEdmEntitySet)] = routeBuilderContext.EntitySet;
                }

                if (routeBuilderContext.Operation != null)
                {
                    apiDescription.Properties[typeof(IEdmOperation)] = routeBuilderContext.Operation;
                }

                apiDescription.ParameterDescriptions.AddRange(routeBuilderContext.ParameterDescriptions);
                apiDescription.SupportedRequestBodyFormatters.AddRange(requestFormatters);
                apiDescription.SupportedResponseFormatters.AddRange(responseFormatters);
                PopulateApiVersionParameters(apiDescription, apiVersion);
                apiDescriptions.Add(apiDescription);
            }
        }
예제 #3
0
        public void shadowed_ResponseDescription_property_should_set_internal_value()
        {
            // arrange
            var apiDescription      = new VersionedApiDescription();
            var responseDescription = new ResponseDescription()
            {
                Documentation = "Test"
            };

            // act
            apiDescription.ResponseDescription = responseDescription;

            // assert
            apiDescription.ResponseDescription.Should().BeSameAs(responseDescription);
        }
예제 #4
0
        void PopulateActionDescriptions(HttpActionDescriptor actionDescriptor, IHttpRoute route, string localPath, Collection <VersionedApiDescription> apiDescriptions, ApiVersion apiVersion)
        {
            var parameterDescriptions = CreateParameterDescriptions(actionDescriptor, route);
            var context = new ODataRouteBuilderContext(Configuration, localPath, (ODataRoute)route, actionDescriptor, parameterDescriptions);

            if (context.EdmModel.EntityContainer == null)
            {
                return;
            }

            var relativePath        = new ODataRouteBuilder(context).Build();
            var documentation       = DocumentationProvider?.GetDocumentation(actionDescriptor);
            var responseDescription = CreateResponseDescription(actionDescriptor);
            var responseType        = responseDescription.ResponseType ?? responseDescription.DeclaredType;
            var requestFormatters   = new List <MediaTypeFormatter>();
            var responseFormatters  = new List <MediaTypeFormatter>();
            var supportedMethods    = GetHttpMethodsSupportedByAction(route, actionDescriptor);
            var deprecated          = actionDescriptor.ControllerDescriptor.GetApiVersionModel().DeprecatedApiVersions.Contains(apiVersion);

            PopulateMediaTypeFormatters(actionDescriptor, parameterDescriptions, route, responseType, requestFormatters, responseFormatters);

            foreach (var method in supportedMethods)
            {
                var apiDescription = new VersionedApiDescription()
                {
                    Documentation       = documentation,
                    HttpMethod          = method,
                    RelativePath        = relativePath,
                    ActionDescriptor    = actionDescriptor,
                    Route               = route,
                    ResponseDescription = responseDescription,
                    ApiVersion          = apiVersion,
                    IsDeprecated        = deprecated,
                    Properties          =
                    {
                        [typeof(IEdmModel)] = context.EdmModel
                    }
                };

                apiDescription.ParameterDescriptions.AddRange(parameterDescriptions);
                apiDescription.SupportedRequestBodyFormatters.AddRange(requestFormatters);
                apiDescription.SupportedResponseFormatters.AddRange(responseFormatters);
                PopulateApiVersionParameters(apiDescription, apiVersion);
                apiDescriptions.Add(apiDescription);
            }
        }
예제 #5
0
        /// <summary>
        /// Determines whether the two <see cref="VersionedApiDescription">API descriptions</see> are equal.
        /// </summary>
        /// <param name="x">The <see cref="VersionedApiDescription">API descriptions</see> to compare.</param>
        /// <param name="y">The <see cref="VersionedApiDescription">API descriptions</see> to compare against.</param>
        /// <returns>True if the two API descriptions are equal; otherwise, false.</returns>
        public virtual bool Equals(VersionedApiDescription x, VersionedApiDescription y)
        {
            if (x == null)
            {
                return(y == null);
            }
            else if (y == null)
            {
                return(false);
            }

            if (string.Equals(x.ID, y.ID, OrdinalIgnoreCase))
            {
                return(x.ApiVersion == y.ApiVersion);
            }

            return(false);
        }
예제 #6
0
        /// <summary>
        /// Returns a hash code for the especified <see cref="VersionedApiDescription">API description</see>.
        /// </summary>
        /// <param name="obj">The object to get a hash code for.</param>
        /// <returns>The hash code of the specified object.</returns>
        public virtual int GetHashCode(VersionedApiDescription obj)
        {
            if (obj == null)
            {
                return(0);
            }

            var id = obj.ID;

            if (id == null)
            {
                return(0);
            }

            var hash       = comparer.GetHashCode(id);
            var apiVersion = obj.ApiVersion;

            return((hash * 397) ^ apiVersion?.GetHashCode() ?? 0);
        }