private static HttpRequestMessage CreateHttpRequestMessage(HttpActionDescriptor actionDescriptor, ODataRoute oDataRoute, HttpConfiguration httpConfig)
        {
            Contract.Requires(httpConfig != null);
            Contract.Requires(oDataRoute != null);
            Contract.Requires(httpConfig != null);
            Contract.Ensures(Contract.Result<HttpRequestMessage>() != null);

            Contract.Assume(oDataRoute.Constraints != null);

            var httpRequestMessage = new HttpRequestMessage(actionDescriptor.SupportedHttpMethods.First(), "http://any/");

            var requestContext = new HttpRequestContext
            {
                Configuration = httpConfig
            };
            httpRequestMessage.SetConfiguration(httpConfig);
            httpRequestMessage.SetRequestContext(requestContext);

            var httpRequestMessageProperties = httpRequestMessage.ODataProperties();
            Contract.Assume(httpRequestMessageProperties != null);
            httpRequestMessageProperties.Model = oDataRoute.GetEdmModel();
            httpRequestMessageProperties.RouteName = oDataRoute.GetODataPathRouteConstraint().RouteName;
            httpRequestMessageProperties.RoutingConventions = oDataRoute.GetODataPathRouteConstraint().RoutingConventions;
            httpRequestMessageProperties.PathHandler = oDataRoute.GetODataPathRouteConstraint().PathHandler;
            return httpRequestMessage;
        }
        private static IEnumerable<SwaggerRoute> GenerateOperationImportRoutes(ODataRoute oDataRoute)
        {
            Contract.Requires(oDataRoute != null);
            Contract.Requires(oDataRoute.Constraints != null);

            return oDataRoute.GetEdmModel()
                .EntityContainer
                .OperationImports()?
                .Select(operationImport => new SwaggerRoute(ODataSwaggerUtilities.GetPathForOperationImport(operationImport), oDataRoute, ODataSwaggerUtilities.CreateSwaggerPathForOperationImport(operationImport, oDataRoute)));
        }
        /// <summary>
        /// Initialize the operations to Swagger model.
        /// </summary>
        /// <param name="oDataRoute">The o data route.</param>
        /// <returns></returns>
        private static IEnumerable<SwaggerRoute> GenerateOperationRoutes(ODataRoute oDataRoute)
        {
            Contract.Requires(oDataRoute != null);
            Contract.Requires(oDataRoute.Constraints != null);

            var routes = new List<SwaggerRoute>();

            var edmSchemaElements = oDataRoute.GetEdmModel().SchemaElements;
            if (edmSchemaElements != null)
            {
                foreach (var operation in edmSchemaElements.OfType<IEdmOperation>())
                {
                    // skip unbound operation
                    if (!operation.IsBound)
                    {
                        continue;
                    }

                    var edmOperationParameters = operation.Parameters;
                    if (edmOperationParameters != null && edmOperationParameters.Any())
                    {
                        var boundParameter = edmOperationParameters.First();
                        Contract.Assume(boundParameter != null);

                        var boundType = boundParameter.GetOperationType().GetDefinition();

                        // skip operation bound to non entity (or entity collection)
                        if (boundType.TypeKind == EdmTypeKind.Entity)
                        {
                            var entityType = (IEdmEntityType)boundType;
                            var edmEntitySets = oDataRoute.GetEdmModel().EntityContainer.EntitySets();
                            Contract.Assume(edmEntitySets != null);
                            routes.AddRange(edmEntitySets.Where(es => es.GetEntityType().Equals(entityType)).Select(entitySet => new SwaggerRoute(ODataSwaggerUtilities.GetPathForOperationOfEntity(operation, entitySet), oDataRoute, ODataSwaggerUtilities.CreateSwaggerPathForOperationOfEntity(operation, entitySet))));
                        }
                        else if (boundType.TypeKind == EdmTypeKind.Collection)
                        {
                            var collectionType = boundType as IEdmCollectionType;

                            if (collectionType?.ElementType?.GetDefinition().TypeKind == EdmTypeKind.Entity)
                            {
                                var entityType = (IEdmEntityType)collectionType.ElementType?.GetDefinition();
                                var edmEntitySets = oDataRoute.GetEdmModel().EntityContainer.EntitySets();
                                Contract.Assume(edmEntitySets != null);
                                routes.AddRange(edmEntitySets.Where(es => es.GetEntityType().Equals(entityType)).Select(entitySet => new SwaggerRoute(ODataSwaggerUtilities.GetPathForOperationOfEntitySet(operation, entitySet), oDataRoute, ODataSwaggerUtilities.CreateSwaggerPathForOperationOfEntitySet(operation, entitySet, oDataRoute))));
                            }
                        }
                    }
                }
            }

            return routes;
        }