/// <summary>
            /// Executes the workflow to fetch delivery options for given product and address.
            /// </summary>
            /// <param name="request">Instance of <see cref="GetProductDeliveryOptionsRequest"/>.</param>
            /// <returns>Instance of <see cref="GetProductDeliveryOptionsResponse"/>.</returns>
            protected override GetProductDeliveryOptionsResponse Process(GetProductDeliveryOptionsRequest request)
            {
                ThrowIf.Null(request, "request");
                ThrowIf.Null(request.ShippingAddress, "request.ShippingAddress");

                // Validate and resolve address
                ShippingHelper.ValidateAndResolveAddress(this.Context, request.ShippingAddress);

                // Get the delivery options
                var serviceRequest = new GetProductDeliveryOptionsServiceRequest(request.ShippingAddress, request.ItemId, request.InventoryDimensionId)
                {
                    QueryResultSettings = request.QueryResultSettings
                };
                var serviceResponse = this.Context.Execute <GetProductDeliveryOptionsServiceResponse>(serviceRequest);

                return(new GetProductDeliveryOptionsResponse(serviceResponse.DeliveryOptions));
            }
            /// <summary>
            /// Fetches the delivery options applicable for the item/inventDimId and Address.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>Delivery options applicable.</returns>
            /// <remarks>This API is typically used to display the delivery options in Item details page.</remarks>
            private static GetProductDeliveryOptionsServiceResponse GetProductDeliveryOptions(GetProductDeliveryOptionsServiceRequest request)
            {
                if (request.ShippingAddress == null)
                {
                    throw new ArgumentNullException("request", "request.ShippingAddress");
                }

                var dataServiceRequest = new GetItemDeliveryOptionsDataRequest(request.ItemId, request.InventoryDimensionId, request.ShippingAddress.ThreeLetterISORegionName, request.ShippingAddress.State);

                dataServiceRequest.QueryResultSettings = request.QueryResultSettings;
                var dataServiceResponse = request.RequestContext.Execute <EntityDataServiceResponse <DeliveryOption> >(dataServiceRequest);

                var deliveryOptions = dataServiceResponse.PagedEntityCollection;

                // Raise notification if no delivery options are found.
                if (!deliveryOptions.Results.Any())
                {
                    EmptyProductDeliveryOptionSetNotification notification = new EmptyProductDeliveryOptionSetNotification(request.ShippingAddress, request.ItemId, request.InventoryDimensionId);
                    request.RequestContext.Notify(notification);
                }

                return(new GetProductDeliveryOptionsServiceResponse(deliveryOptions));
            }